profit777 0 Share Posted May 21, 2014 Здравствуйте. Есть два закрытых ордера - один бай один селл Можно ли таким методом определить лотность и профит последних двух закрытых ордеров среди которых один бай один сел. и присвоить значения Oder_Profit_B Oder_Profit_S Lot_B Lot_S. Ордера могут идти в разном порядке. if (OrdersHistoryTotal()>0) { for (int i=1; i>=0; i--) { if (OrderSelect(i, SELECT_BY_POS, MODE_HISTORY)) if (OrderSymbol() == Symbol() && OrderMagicNumber() == Magic) { if (OrderType()== OP_BUY) { Oder_Profit_B = NormalizeDouble (OrderProfit(),Digits); Lot_B = OrderLots(); break; } else if (OrderType()== OP_SELL) { Oder_Profit_S = NormalizeDouble (OrderProfit(),Digits); Lot_S = NormalizeDouble (OrderLots(),Digits); break; } } } } Спасибо Link to post Share on other sites
Circle 147 Share Posted May 21, 2014 (edited) Здравствуйте. Есть два закрытых ордера - один бай один селл Можно ли таким методом определить лотность и профит последних двух закрытых ордеров среди которых один бай один сел. и присвоить значения Oder_Profit_B Oder_Profit_S Lot_B Lot_S. Ордера могут идти в разном порядке. ...... Спасибо Так нельзя. int GetLastCloseOrderTicket(int MN,string Smb) { datetime tclose=0; int i=0,ticket=0; for (i=0; i<OrdersHistoryTotal(); i++) { if (!OrderSelect(i, SELECT_BY_POS, MODE_HISTORY)) continue; if (MN!=0) if (OrderMagicNumber()!=MN) continue; if (OrderSymbol()!=Smb) continue; if (tclose<OrderCloseTime()) { tclose=OrderCloseTime(); ticket=OrderTicket(); } } if (OrderSelect(ticket,SELECT_BY_TICKET)) return(OrderTicket()); else return(-1); } Функция возвращает тикет последнего закрытого ордера если такого нет то -1 Edited May 21, 2014 by Circle Что такое форекс? Это там где деньги лежат. Link to post Share on other sites
profit777 0 Author Share Posted May 21, 2014 Так нельзя. и даже при двух проходах цикла? Спасибо Link to post Share on other sites
Circle 147 Share Posted May 21, 2014 (edited) и даже при двух проходах цикла? Спасибо Судя по вашему коду цикл у вас будет выполнятся пока не найдет первый попавшийся закрытый ордер, а вот когда он был закрыт неизвестно и после чего оператором break у вас будет выход из цикла. Вообщем фигня получится. ... Вот пример использования функции что я вам предложил. int Magik = 1234; int Ticet = GetLastOrderTicet(Magik,"EURUSD"); if (Ticet>0) { if (OrderType()==OP_SELL) { double lotSell = OrderLost(); double ProfitSell = OrderProfit(); } if (OrderType()==OP_BUY) { double lotBuy = OrderLost(); double ProfitBuy = OrderProfit(); } } P.S. Функция перебирает все ордера в истории и для того что бы сократить время ее работы рекомендую в истории счета отображать не всю историю, а только за последний месяц. Edited May 21, 2014 by Circle Что такое форекс? Это там где деньги лежат. Link to post Share on other sites
profit777 0 Author Share Posted May 21, 2014 (edited) Может такого и действительно не реально сделать... А может не правильно описал... Проблемка в том что открывается 2 ордера... и закрывается два...(с тикетами напутаю) и вот уже в истории из этих последних двух ордеров нужно вытащить лотность и профит ... это можно сделать циклом? я старался описать такую процедуру 1) Выбираем последний закрытый ордер из истории и если он бай то заполняем лотность и профит для бая а если нет то заполняем сел 2) При следующем проходе цыкла выбирается уже второй ордер в истории (предпоследний закрытый) если он бай то заполняем лотность и профит для бая а если нет то заполняем сел В любом случае среди последних двух есть один бай и один сел. Спасибо. Edited May 21, 2014 by profit777 Link to post Share on other sites
Circle 147 Share Posted May 21, 2014 Может такого и действительно не реально сделать... А может не правильно описал... Проблемка в том что открывается 2 ордера... и закрывается два...(с тикетами напутаю) и вот уже в истории из этих последних двух ордеров нужно вытащить лотность и профит ... это можно сделать циклом? я старался описать такую процедуру 1) Выбираем последний закрытый ордер из истории и если он бай то заполняем лотность и профит для бая а если нет то заполняем сел 2) При следующем проходе цыкла выбирается уже второй ордер в истории (предпоследний закрытый) если он бай то заполняем лотность и профит для бая а если нет то заполняем сел В любом случае среди последних двух есть один бай и один сел. Спасибо. Я вам вроде в личку писал ответ. Может у вас переполнен "ящик" личных сообщений. В исходящих ответ почему то не сохранился. Там я вам предложил поместить все ордера в массив и отсортировать их по времени закрытия ордера. Тогда у вас первый ордер в массиве будет последним закрытым, а второй соответственно предпоследним. Ни чего другого на ум не приходит. Что такое форекс? Это там где деньги лежат. Link to post Share on other sites
Voldemar227 113 Share Posted May 21, 2014 понимаю что поздно но мож кому пригодиться //+------------------------------------------------------------------+ //| 123456.mq4 | //| "Copyright 2013, [url]*[/url] Project." | //| "http://*" | //+------------------------------------------------------------------+ #property copyright "Copyright 2013, [url]*[/url] Project." #property link "http://*" #property strict input int Magic=0; // Меджик номер //+------------------------------------------------------------------+ int OnInit() { Comment(""); return(INIT_SUCCEEDED); } //+------------------------------------------------------------------+ void OnTick() { double buylastlot=0,buylastprofit=0,sellastlot=0,sellastprofit=0; // создадим и обнулим на каждом тике переменные history(OP_BUY ,buylastlot,buylastprofit); // Вызов функции для закрытых бай ордеров history(OP_SELL,sellastlot,sellastprofit); // Вызов функции для закрытых сел ордеров // проверим результат Comment( "\n","Last Buy", "\n","Last lot ",DoubleToStr(buylastlot,2), "\n","Last profit ",DoubleToStr(buylastprofit,2), "\n", "\n","Last Sell", "\n","Last lot ",DoubleToStr(sellastlot,2), "\n","Last profit ",DoubleToStr(sellastprofit,2) ); } //+------------------------------------------------------------------+ void history(const int typ, // Принимает тип ордера double &lot, // Принимает переменную для сохранения лота double &profit // Принимает переменную для сохранения профита ) { datetime time= 0; // Обнулим переменную тайм for(int i=OrdersHistoryTotal()-1; i>=0; i--) // запустим цикл перебора ордеров по истории начиная с последнего if(OrderSelect(i,SELECT_BY_POS,MODE_HISTORY)) // Разбор исторического ордера if(OrderMagicNumber()==Magic) // Если по нашему меджику if(OrderSymbol()==_Symbol) // Если по нашему символу if(OrderType()==typ) // Если по нашему типу ордера if(OrderCloseTime()>time || time==0) // если последний по времени { time=OrderCloseTime(); // Запомним время profit=OrderProfit(); // Запомним профит lot=OrderLots(); // Запомним лот } } //+------------------------------------------------------------------+ Трейдер и программист ... Мой блог Мой профиль Link to post Share on other sites
Circle 147 Share Posted May 23, 2014 понимаю что поздно но мож кому пригодиться ...... void history(const int typ, // Принимает тип ордера double &lot, // Принимает переменную для сохранения лота double &profit // Принимает переменную для сохранения профита ) { datetime time= 0; // Обнулим переменную тайм for(int i=OrdersHistoryTotal()-1; i>=0; i--) // запустим цикл перебора ордеров по истории начиная с последнего if(OrderSelect(i,SELECT_BY_POS,MODE_HISTORY)) // Разбор исторического ордера if(OrderMagicNumber()==Magic) // Если по нашему меджику Зачем все остальные проверки если это не наш магик? Для оптимизации скорости выполнения кода лучше будет if(OrderMagicNumber()!=Magic) continue; и т.д. для других условных операторов. if(OrderSymbol()==_Symbol) // Если по нашему символу if(OrderType()==typ) // Если по нашему типу ордера if(OrderCloseTime()>time || time==0) // если последний по времени { time=OrderCloseTime(); // Запомним время profit=OrderProfit(); // Запомним профит lot=OrderLots(); // Запомним лот } } //+------------------------------------------------------------- Что такое форекс? Это там где деньги лежат. Link to post Share on other sites
Recommended Posts