дима123 0 Share Posted July 27, 2014 Здравствуйте! Подскажите пожалуйста: как найти тип последнего закрытого ордера и если он закрылся по тейкпрофиту одно условие если по стоплоссу другое условие. За ранние всех благодарю. Link to post Share on other sites
AntFX 6,474 Share Posted July 27, 2014 во-первых, последовательность выдачи ордеров из истории происходит обычно по порядку их номеров тикетов, который может отличаться от порядка их закрытия, поэтому сначала нужно отсортировать последние ордера в истории по времени их закрытия. после того, как последний закрытый ордер будет найден, нужно сравнить его комментарий со строками "[sl]" или "[tp]", только так можно достоверно узнать, что ордер был закрыт по стопу или по тейку, а не вручную. Правда, у некоторых брокеров эта отметка не ставится. Но другого способа надежно определить, что ордер был закрыт именно по стопу или тейку, в MQL4 нет 1 Link to post Share on other sites
Wowa 8 Share Posted July 29, 2014 Правда, у некоторых брокеров эта отметка не ставится. Но другого способа надежно определить, что ордер был закрыт именно по стопу или тейку, в MQL4 нет Насколько я понял, ручное закрытие здесь исключено, ордер всегда закрыт или по SL, или по TP. В этом случае достаточно сравнить эти величины с ценой закрытия ордера Мы сами знаем, что проблема не имеет решения. Мы хотим знать, как ее решать. (с) К. Хунта Link to post Share on other sites
AntFX 6,474 Share Posted July 29, 2014 Насколько я понял, ручное закрытие здесь исключено, ордер всегда закрыт или по SL, или по TP. В этом случае достаточно сравнить эти величины с ценой закрытия ордера Величины сравнивать нельзя, потому что есть проскальзывание. Но можно просто сравнить результат больше или меньше нуля. Обычно в простейших случаях так и делается. Но исключить ручное закрытие никогда нельзя, кто гарантирует, что трейдер не закроет ордер руками? Или брокер по стопауту. 1 Link to post Share on other sites
дима123 0 Author Share Posted July 29, 2014 я не совсем понел ответ возможно потому что не корректно написал вопрос попытаюсь перефразировать я учусь писать советник мне нужно найти последний закрытый ордер я буду это делать так: for (int i = OrderHistoryTotal()-1; i>=0; i--) (я ищу всегда с конца так сокращается время на поиск ведь ордеров может быть много) если что то не так скажите дальше я его выбираю if (OrderSelect(i, ORDER_BY_POS, MODE_HISTORY)) далее мне нужно узнать какой у этого ордера тип далее мне нужно узнать как он закрылся по тейкпрофиту или по стоплоссу потом написать условие: если ордер закрылся по тейкпрофиту одно условие если по стоплоссу другое условие. P.S Спасибо что откликнулись. Link to post Share on other sites
Ugar68 372 Share Posted July 29, 2014 (edited) Если ордер закрылся по тейк профит if(StringFind(OrderComment(),"[tp",0)>=0) { } Если ордер закрылся по стоп лосс или стоп трейд if(StringFind(OrderComment(),"[sl",0)>=0) { }Такая конструкция работает на многих ДЦ, но не на всех. Edited July 29, 2014 by Ugar68 Пишу советники и индикаторы по вашим алгоритмам. Пишите в личку. Чужие программы не переделываю. Link to post Share on other sites
дима123 0 Author Share Posted July 29, 2014 Если ордер закрылся по тейк профит if(StringFind(OrderComment(),"[tp",0)>=0) { } Если ордер закрылся по стоп лосс или стоп трейд if(StringFind(OrderComment(),"[sl",0)>=0) { } Такая конструкция работает на многих ДЦ, но не на всех. А между скобками я могу писать условия правильно я понел? Link to post Share on other sites
Ugar68 372 Share Posted July 29, 2014 А между скобками я могу писать условия правильно я понел? Между фигурными скобками пишется действие которое должно выполниться, или дополнительные условия потом действия. Пишу советники и индикаторы по вашим алгоритмам. Пишите в личку. Чужие программы не переделываю. Link to post Share on other sites
Circle 147 Share Posted August 8, 2014 (edited) Здравствуйте! Подскажите пожалуйста: как найти тип последнего закрытого ордера и если он закрылся по тейкпрофиту одно условие если по стоплоссу другое условие. За ранние всех благодарю. Попробуйте вот эту функцию. Функция возвращает тикет последнего закрытого ордера или -1 если таких ордеров нет. После чего вы можете получить всю необходимую информацию по этому ордеру. И соответственно установить был ли закрыть ордер по тейк профиту или по стоп лосу. Как это сделать советовали выше. GetLastCloseOrderTicket(string Smb, int MN) { 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); } Edited August 8, 2014 by Circle Что такое форекс? Это там где деньги лежат. Link to post Share on other sites
Ugar68 372 Share Posted August 8, 2014 Попробуйте вот эту функцию. Функция возвращает тикет последнего закрытого ордера или -1 если таких ордеров нет. После чего вы можете получить всю необходимую информацию по этому ордеру. И соответственно установить был ли закрыть ордер по тейк профиту или по стоп лосу. Как это сделать советовали выше. GetLastCloseOrderTicket(string Smb, int MN) { 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); } Зачем последний выбор ордера, если надо вернуть тикет и он уже найден? Почему бы сразу не присвоить int i=0,ticket=-1;, а закончить return(ticket);? Пишу советники и индикаторы по вашим алгоритмам. Пишите в личку. Чужие программы не переделываю. Link to post Share on other sites
Circle 147 Share Posted August 8, 2014 Зачем последний выбор ордера, если надо вернуть тикет и он уже найден? Почему бы сразу не присвоить int i=0,ticket=-1;, а закончить return(ticket);? Можно конечно и так, но я почему то реализовал это в таком виде. Что такое форекс? Это там где деньги лежат. Link to post Share on other sites
Ugar68 372 Share Posted August 8, 2014 (edited) Можно конечно и так, но я почему то реализовал это в таком виде. Так обычно делают, когда надо вернуть какой то другой параметр ордера. Например лот или тип. Хотя и эти параметры можно сразу найти в цикле, но при большом количестве ордеров в истории и извлекаемых параметров, так быстрее. Edited August 8, 2014 by Ugar68 Пишу советники и индикаторы по вашим алгоритмам. Пишите в личку. Чужие программы не переделываю. Link to post Share on other sites
Circle 147 Share Posted August 8, 2014 Так обычно делают, когда надо вернуть какой то другой параметр ордера. Например лот или тип. Хотя и эти параметры можно сразу найти в цикле, но при большом количестве ордеров в истории и извлекаемых параметров, так быстрее. Я скорее всего подстраховался и OrderSelect использовал для проверки существования ордера перед тем как вернуть его тикет. И уже в последующем коде не надо было вызывать OrderSelect Например: int ticet = GetLastCloseOrderTicket(Smb, MN); if (ticet>0) { Print(OrderOpenPrice()); .... и всякие другие манипуляции с ордером. } А если точнее то уже не помню зачем это надо было. Что такое форекс? Это там где деньги лежат. Link to post Share on other sites
Recommended Posts