//+------------------------------------------------------------------+
//| Lida1.mq4 |
//| Copyright © 2009, xroot |
//| http://pycckue.org |
//+------------------------------------------------------------------+
#property copyright "Copyright © 2009, Lida1 v0.4 by xroot"
#property link "xroot@pycckue.org"
#property indicator_separate_window
#define MAX_PAIRS 20
string open_trade_symbols[MAX_PAIRS];
int num_sell_orders[MAX_PAIRS];
int num_buy_orders[MAX_PAIRS];
double total_sell_amount[MAX_PAIRS];
double total_buy_amount[MAX_PAIRS];
double avg_sell[MAX_PAIRS];
double avg_buy[MAX_PAIRS];
double commissions[MAX_PAIRS]; //commissions are the same for both order types
double sell_lots[MAX_PAIRS];
double buy_lots[MAX_PAIRS];
double swap[MAX_PAIRS]; // swaps are the same for both order types
color txt_color = Gray;
color neutral_color = Gray;
color negative_color = Red;
color positive_color = Green;
string font_str = "Courier New";
int window_index = -1;
string ind_name = "Lida 0.4";
// column offsets
int col_symbol = 40;
int col_plsell = 100;
int col_samtk = 160;
int col_avgsell = 215;
int col_avgbuy = 270;
int col_bamtk = 330;
int col_plbuy = 395;
int col_amtk = 460;
int col_grosspl = 520;
int col_netpl = 600;
int col_commissions = 650;
int col_swap = 710;
//+------------------------------------------------------------------+
//| Custom indicator initialization function |
//+------------------------------------------------------------------+
int init()
{
IndicatorShortName(ind_name);
return(0);
}
//+------------------------------------------------------------------+
//| Custom indicator deinitialization function |
//+------------------------------------------------------------------+
int deinit()
{
ObjectsDeleteAll(WindowFind(ind_name));
return(0);
}
// aligns numbers
//
string
align_str( double x, int num_digits)
{
int rc = 3;
string str = "";
double x1 =0;
string final_str = "";
if (num_digits >= 4) {
num_digits = 4;
rc -= 2;
}
if (num_digits == 3) {
num_digits = 2;
}
if (x < 0)
rc--;
if ( x == 0)
rc += num_digits;
x1 = MathAbs(x);
x1 /= 10;
while( x1 >= 1) {
rc -= 1;
x1 /= 10;
}
for (int i=0; i<rc; i++) {
str = StringConcatenate(str, " ");
}
if (x == 0)
final_str = StringConcatenate( str, "-");
else
final_str = StringConcatenate(str, DoubleToStr(x, num_digits));
return (final_str);
}
void
doit()
{
// put blanks in
//ArrayInitialize(open_trade_symbols, "");
for (int r=0;r<MAX_PAIRS;r++) {
open_trade_symbols[r] = "XXX";
num_sell_orders[r] = 0;
num_buy_orders[r] = 0;
total_sell_amount[r] = 0;
total_buy_amount[r] = 0;
avg_sell[r] = 0;
avg_buy[r] = 0;
commissions[r] = 0;
buy_lots[r] = 0;
sell_lots[r] = 0;
swap[r] = 0;
}
// populate open_trade_symbols[] with currency pairs of open Orders
for ( int i = 0; i < OrdersTotal(); i++) {
if ( OrderSelect(i,SELECT_BY_POS,MODE_TRADES)) {
for ( int j =0; j < MAX_PAIRS; j++) {
if ( open_trade_symbols[j] == OrderSymbol()) {
break;
}
if ( open_trade_symbols[j] == "XXX") {
open_trade_symbols[j] = OrderSymbol();
break;
}
}
}
}
// for each currency pair count count the number of trades
for ( int ij = 0; ij < OrdersTotal(); ij++)
{
if ( OrderSelect(ij,SELECT_BY_POS,MODE_TRADES))
{
for (int ii = 0;ii<MAX_PAIRS;ii++) {
if (open_trade_symbols[ii] != "XXX")
{
if ( open_trade_symbols[ii] == OrderSymbol() )
{
if ( OrderType() == OP_SELL)
{
num_sell_orders[ii]++;
total_sell_amount[ii] += OrderProfit();
commissions[ii] += OrderCommission();
sell_lots[ii] += OrderLots();
avg_sell[ii] += OrderLots() * OrderOpenPrice();
swap[ii] += OrderSwap();
} else if ( OrderType() == OP_BUY) {
num_buy_orders[ii]++;
total_buy_amount[ii] += OrderProfit();
commissions[ii] += OrderCommission();
buy_lots[ii] += OrderLots();
avg_buy[ii] += OrderLots() * OrderOpenPrice();
swap[ii] += OrderSwap();
} else {
// stop and limit orders here
}
}
}
}
}
}
// calculate the average buy/sell values
for (int k=0; k< MAX_PAIRS; k++) {
if (open_trade_symbols[k] != "XXX") {
if (buy_lots[k] > 0)
avg_buy[k] = avg_buy[k] / buy_lots[k];
if (sell_lots[k] > 0)
avg_sell[k] = avg_sell[k] / sell_lots[k];
}
}
}
void make_headers()
{
txt_color = DimGray;
ObjectCreate("Symbol", OBJ_LABEL, window_index, 0, 0);
ObjectSetText("Symbol","Symbol", 8, font_str, txt_color);
ObjectSet("Symbol", OBJPROP_CORNER, 0);
ObjectSet("Symbol", OBJPROP_XDISTANCE, col_symbol);
ObjectSet("Symbol", OBJPROP_YDISTANCE, 2);
ObjectCreate("plsell", OBJ_LABEL, window_index, 0, 0);
ObjectSetText("plsell","P/L Sell", 8, font_str, txt_color);
ObjectSet("plsell", OBJPROP_CORNER, 0);
ObjectSet("plsell", OBJPROP_XDISTANCE, col_plsell);
ObjectSet("plsell", OBJPROP_YDISTANCE, 2);
ObjectCreate("S Amt (K)", OBJ_LABEL, window_index, 0, 0);
ObjectSetText("S Amt (K)","S Amt(K)", 8, font_str, txt_color);
ObjectSet("S Amt (K)", OBJPROP_CORNER, 0);
ObjectSet("S Amt (K)", OBJPROP_XDISTANCE, col_samtk);
ObjectSet("S Amt (K)", OBJPROP_YDISTANCE, 2);
ObjectCreate("Avg Sell", OBJ_LABEL, window_index, 0, 0);
ObjectSetText("Avg Sell","Avg Sell", 8, font_str, txt_color);
ObjectSet("Avg Sell", OBJPROP_CORNER, 0);
ObjectSet("Avg Sell", OBJPROP_XDISTANCE, col_avgsell);
ObjectSet("Avg Sell", OBJPROP_YDISTANCE, 2);
ObjectCreate("Avg Buy", OBJ_LABEL, window_index, 0, 0);
ObjectSetText("Avg Buy","Avg Buy", 8, font_str, txt_color);
ObjectSet("Avg Buy", OBJPROP_CORNER, 0);
ObjectSet("Avg Buy", OBJPROP_XDISTANCE, col_avgbuy);
ObjectSet("Avg Buy", OBJPROP_YDISTANCE, 2);
ObjectCreate("B Amt (K)", OBJ_LABEL, window_index, 0, 0);
ObjectSetText("B Amt (K)","B Amt(K)", 8, font_str, txt_color);
ObjectSet("B Amt (K)", OBJPROP_CORNER, 0);
ObjectSet("B Amt (K)", OBJPROP_XDISTANCE, col_bamtk);
ObjectSet("B Amt (K)", OBJPROP_YDISTANCE, 2);
ObjectCreate("P/L Buy", OBJ_LABEL, window_index, 0, 0);
ObjectSetText("P/L Buy","P/L Buy", 8, font_str, txt_color);
ObjectSet("P/L Buy", OBJPROP_CORNER, 0);
ObjectSet("P/L Buy", OBJPROP_XDISTANCE, col_plbuy);
ObjectSet("P/L Buy", OBJPROP_YDISTANCE, 2);
ObjectCreate("AMT (K)", OBJ_LABEL, window_index, 0, 0);
ObjectSetText("AMT (K)","AMT(K)", 8, font_str, txt_color);
ObjectSet("AMT (K)", OBJPROP_CORNER, 0);
ObjectSet("AMT (K)", OBJPROP_XDISTANCE, col_amtk);
ObjectSet("AMT (K)", OBJPROP_YDISTANCE, 2);
ObjectCreate("Gross P/L", OBJ_LABEL, window_index, 0, 0);
ObjectSetText("Gross P/L","Gross P/L", 8, font_str, txt_color);
ObjectSet("Gross P/L", OBJPROP_CORNER, 0);
ObjectSet("Gross P/L", OBJPROP_XDISTANCE, col_grosspl);
ObjectSet("Gross P/L", OBJPROP_YDISTANCE, 2);
ObjectCreate("Net P/L", OBJ_LABEL, window_index, 0, 0);
ObjectSetText("Net P/L","Net P/L", 8, font_str, txt_color);
ObjectSet("Net P/L", OBJPROP_CORNER, 0);
ObjectSet("Net P/L", OBJPROP_XDISTANCE, col_netpl);
ObjectSet("Net P/L", OBJPROP_YDISTANCE, 2);
ObjectCreate("Commissions", OBJ_LABEL, window_index, 0, 0);
ObjectSetText("Commissions","Commiss", 8, font_str, txt_color);
ObjectSet("Commissions", OBJPROP_CORNER, 0);
ObjectSet("Commissions", OBJPROP_XDISTANCE, col_commissions+8); // :-)
ObjectSet("Commissions", OBJPROP_YDISTANCE, 2);
ObjectCreate("Swap", OBJ_LABEL, window_index, 0, 0);
ObjectSetText("Swap","Swap", 8, font_str, txt_color);
ObjectSet("Swap", OBJPROP_CORNER, 0);
ObjectSet("Swap", OBJPROP_XDISTANCE, col_swap+15); // ;-)
ObjectSet("Swap", OBJPROP_YDISTANCE, 2);
}
void
displayit()
{
int hpos = 0; // accumulates position of the column
int vpos = 0; // accumulates position of the line
int digits = 2;
for (int i=0;i<MAX_PAIRS;i++) {
txt_color = DimGray;
if ( open_trade_symbols[i] != "XXX") {
ObjectCreate("Symbol"+ DoubleToStr(i,0), OBJ_LABEL, window_index, 0, 0);
ObjectSetText("Symbol"+ DoubleToStr(i,0),open_trade_symbols[i], 8, font_str, txt_color);
ObjectSet("Symbol"+ DoubleToStr(i,0), OBJPROP_CORNER, 0);
ObjectSet("Symbol"+ DoubleToStr(i,0), OBJPROP_XDISTANCE, col_symbol);
ObjectSet("Symbol"+ DoubleToStr(i,0), OBJPROP_YDISTANCE, i*10+14); // :-)
txt_color = neutral_color;
ObjectCreate("plsell"+ DoubleToStr(i,0), OBJ_LABEL, window_index, 0, 0);
if (total_sell_amount[i]< 0) {
txt_color = negative_color;
} else if (total_sell_amount[i] == 0) {
txt_color = neutral_color;
} else {
txt_color = positive_color;
}
digits = 2;
ObjectSetText("plsell"+ DoubleToStr(i,0), align_str(total_sell_amount[i], digits), 8, font_str, txt_color);
ObjectSet("plsell"+ DoubleToStr(i,0), OBJPROP_CORNER, 0);
ObjectSet("plsell"+ DoubleToStr(i,0), OBJPROP_XDISTANCE, col_plsell);
ObjectSet("plsell"+ DoubleToStr(i,0), OBJPROP_YDISTANCE, i*10+14);
txt_color = neutral_color;
digits = 0;
ObjectCreate("S Amt (K)"+ DoubleToStr(i,0), OBJ_LABEL, window_index, 0, 0);
ObjectSetText("S Amt (K)"+ DoubleToStr(i,0),align_str(sell_lots[i]*100, digits), 8, font_str, txt_color);
ObjectSet("S Amt (K)"+ DoubleToStr(i,0), OBJPROP_CORNER, 0);
ObjectSet("S Amt (K)"+ DoubleToStr(i,0), OBJPROP_XDISTANCE, col_samtk);
ObjectSet("S Amt (K)"+ DoubleToStr(i,0), OBJPROP_YDISTANCE, i*10+14);
digits = MarketInfo(open_trade_symbols[i], MODE_DIGITS);
ObjectCreate("Avg Sell"+ DoubleToStr(i,0), OBJ_LABEL, window_index, 0, 0);
ObjectSetText("Avg Sell"+ DoubleToStr(i,0),align_str(avg_sell[i], digits), 8, font_str, txt_color);
ObjectSet("Avg Sell"+ DoubleToStr(i,0), OBJPROP_CORNER, 0);
ObjectSet("Avg Sell"+ DoubleToStr(i,0), OBJPROP_XDISTANCE, col_avgsell);
ObjectSet("Avg Sell"+ DoubleToStr(i,0), OBJPROP_YDISTANCE, i*10+14);
digits = MarketInfo(open_trade_symbols[i], MODE_DIGITS);
ObjectCreate("Avg Buy"+ DoubleToStr(i,0), OBJ_LABEL, window_index, 0, 0);
ObjectSetText("Avg Buy"+ DoubleToStr(i,0),align_str(avg_buy[i], digits), 8, font_str, txt_color);
ObjectSet("Avg Buy"+ DoubleToStr(i,0), OBJPROP_CORNER, 0);
ObjectSet("Avg Buy"+ DoubleToStr(i,0), OBJPROP_XDISTANCE, col_avgbuy);
ObjectSet("Avg Buy"+ DoubleToStr(i,0), OBJPROP_YDISTANCE, i*10+14);
ObjectCreate("B Amt (K)"+ DoubleToStr(i,0), OBJ_LABEL, window_index, 0, 0);
ObjectSetText("B Amt (K)"+ DoubleToStr(i,0),align_str(buy_lots[i]*100, 0), 8, font_str, txt_color);
ObjectSet("B Amt (K)"+ DoubleToStr(i,0), OBJPROP_CORNER, 0);
ObjectSet("B Amt (K)"+ DoubleToStr(i,0), OBJPROP_XDISTANCE, col_bamtk);
ObjectSet("B Amt (K)"+ DoubleToStr(i,0), OBJPROP_YDISTANCE, i*10+14);
ObjectCreate("P/L Buy"+ DoubleToStr(i,0), OBJ_LABEL, window_index, 0, 0);
if (total_buy_amount[i]< 0) {
txt_color = negative_color;
} else if (total_buy_amount[i] == 0) {
txt_color = neutral_color;
} else {
txt_color = positive_color;
}
ObjectSetText("P/L Buy"+ DoubleToStr(i,0),align_str(total_buy_amount[i], 2), 8, font_str, txt_color);
ObjectSet("P/L Buy"+ DoubleToStr(i,0), OBJPROP_CORNER, 0);
ObjectSet("P/L Buy"+ DoubleToStr(i,0), OBJPROP_XDISTANCE, col_plbuy);
ObjectSet("P/L Buy"+ DoubleToStr(i,0), OBJPROP_YDISTANCE, i*10+14);
txt_color = positive_color;
ObjectCreate("AMT (K)"+ DoubleToStr(i,0), OBJ_LABEL, window_index, 0, 0);
if ((buy_lots[i]-sell_lots[i])< 0) {
txt_color = negative_color;
} else if ((buy_lots[i]-sell_lots[i]) == 0) {
txt_color = neutral_color;
} else {
txt_color = positive_color;
}
ObjectSetText("AMT (K)"+ DoubleToStr(i,0),align_str((buy_lots[i]-sell_lots[i])*100, 0), 8, font_str, txt_color);
ObjectSet("AMT (K)"+ DoubleToStr(i,0), OBJPROP_CORNER, 0);
ObjectSet("AMT (K)"+ DoubleToStr(i,0), OBJPROP_XDISTANCE, col_amtk);
ObjectSet("AMT (K)"+ DoubleToStr(i,0), OBJPROP_YDISTANCE, i*10+14);
txt_color = neutral_color;
ObjectCreate("Gross P/L"+ DoubleToStr(i,0), OBJ_LABEL, window_index, 0, 0);
if ((total_sell_amount[i]+total_buy_amount[i])< 0) {
txt_color = negative_color;
} else if ((total_sell_amount[i]+total_buy_amount[i]) == 0){
txt_color = neutral_color;
} else {
txt_color = positive_color;
}
ObjectSetText("Gross P/L"+ DoubleToStr(i,0),align_str((total_sell_amount[i]+total_buy_amount[i]), 2), 8, font_str, txt_color);
ObjectSet("Gross P/L"+ DoubleToStr(i,0), OBJPROP_CORNER, 0);
ObjectSet("Gross P/L"+ DoubleToStr(i,0), OBJPROP_XDISTANCE, col_grosspl);
ObjectSet("Gross P/L"+ DoubleToStr(i,0), OBJPROP_YDISTANCE, i*10+14);
txt_color = neutral_color;
ObjectCreate("Net P/L"+ DoubleToStr(i,0), OBJ_LABEL, window_index, 0, 0);
if ((total_sell_amount[i]+total_buy_amount[i]+commissions[i]+swap[i])< 0) {
txt_color = negative_color;
} else if ((total_sell_amount[i]+total_buy_amount[i]+commissions[i]+swap[i]) == 0) {
txt_color = neutral_color;
} else {
txt_color = positive_color;
}
ObjectSetText("Net P/L"+ DoubleToStr(i,0),align_str((total_sell_amount[i]+total_buy_amount[i])+commissions[i]+swap[i], 2), 8, font_str, txt_color);
ObjectSet("Net P/L"+ DoubleToStr(i,0), OBJPROP_CORNER, 0);
ObjectSet("Net P/L"+ DoubleToStr(i,0), OBJPROP_XDISTANCE, col_netpl);
ObjectSet("Net P/L"+ DoubleToStr(i,0), OBJPROP_YDISTANCE, i*10+14);
txt_color = neutral_color;
ObjectCreate("Commissions"+ DoubleToStr(i,0), OBJ_LABEL, window_index, 0, 0);
if (commissions[i] < 0) {
txt_color = negative_color;
} else if (commissions[i] == 0) {
txt_color = neutral_color;
} else {
txt_color = positive_color;
}
ObjectSetText("Commissions"+ DoubleToStr(i,0),align_str(commissions[i], 2), 8, font_str, txt_color);
ObjectSet("Commissions"+ DoubleToStr(i,0), OBJPROP_CORNER, 0);
ObjectSet("Commissions"+ DoubleToStr(i,0), OBJPROP_XDISTANCE, col_commissions);
ObjectSet("Commissions"+ DoubleToStr(i,0), OBJPROP_YDISTANCE, i*10+14);
txt_color = neutral_color;
ObjectCreate("Swap"+ DoubleToStr(i,0), OBJ_LABEL, window_index, 0, 0);
if (swap[i] < 0) {
txt_color = negative_color;
} else if (swap[i] == 0) {
txt_color = neutral_color;
} else {
txt_color = positive_color;
}
ObjectSetText("Swap"+ DoubleToStr(i,0),align_str(swap[i], 2), 8, font_str, txt_color);
ObjectSet("Swap"+ DoubleToStr(i,0), OBJPROP_CORNER, 0);
ObjectSet("Swap"+ DoubleToStr(i,0), OBJPROP_XDISTANCE, col_swap);
ObjectSet("Swap"+ DoubleToStr(i,0), OBJPROP_YDISTANCE, i*10+14);
txt_color = neutral_color;
}
}
}
int start()
{
window_index = WindowFind(ind_name);
if (window_index < 0) {
Print("could not find indicator window");
return (-1);
}
ObjectsDeleteAll(window_index);
make_headers();
doit();
displayit();
return(0);
}
Comments