в мт5 закрытия нет
есть выход из рынка
(ENUM_DEAL_ENTRY)HistoryDealGetInteger(ticket,DEAL_ENTRY)==DEAL_ENTRY_OUT
Да я понимаю, но у выход может произойти по стопам или ручной поэтому на прямую использовать сравнение с DEAL_ENTRY_OUT я не могу так как у сделки которая обеспечивает этот выход magic_number может не совпадать с magic_number советника. Поэтому я ищу вход (DEAL_ENTRY_IN) что-бы понять что эта группа ордеров относится к одной позиции и пытаюсь получить последний ордер позиции:
long positionId = HistoryDealGetInteger(ticket, DEAL_POSITION_ID); HistorySelectByPosition(positionId); outOrderTicket = HistoryOrderGetTicket(HistoryOrdersTotal() - 1);
И с этим идентификатором уже получить время этой последней сделки HistoryOrderGetInteger(outOrderTicket, ORDER_TIME_DONE)
Но что-то идет не так а вот что в этом и есть вопрос.
Да я понимаю, но у выход может произойти по стопам или ручной поэтому на прямую использовать сравнение с DEAL_ENTRY_OUT я не могу так как у сделки которая обеспечивает этот выход magic_number может не совпадать с magic_number советника. Поэтому я ищу вход (DEAL_ENTRY_IN) что-бы понять что эта группа ордеров относится к одной позиции и пытаюсь получить последний ордер позиции:
И с этим идентификатором уже получить время этой последней сделки HistoryOrderGetInteger(outOrderTicket, ORDER_TIME_DONE)
Но что-то идет не так а вот что в этом и есть вопрос.
Тогда выбирайте ордера и сделки по ID позиции.
bool HistorySelectByPosition( long position_id // идентификатор позиции - POSITION_IDENTIFIER );тогда проверка магика ордеров и сделок отпадает.
input ENUM_TIMEFRAMES TimeFrame = PERIOD_M5; // Только одна сделка на выбранный ТФ
//+------------------------------------------------------------------------------------++ bool HistoryTrade() { datetime start_1 = iTime(m_symbol.Name(),TimeFrame,0); datetime stop_1 = start_1 + TimeFrame*60; if(!HistorySelect(start_1,stop_1)) return(false); uint total=HistoryDealsTotal(); ulong ticket=0; //--- for all deals for(uint i=0;i<total;i++) { //--- try to get deals ticket if((ticket=HistoryDealGetTicket(i))>0) { if(HistoryDealGetString(ticket,DEAL_SYMBOL)==m_symbol.Name()) // check the symbol if(HistoryDealGetInteger(ticket,DEAL_MAGIC)==MagicNumber) // check the magic if((ENUM_DEAL_ENTRY)HistoryDealGetInteger(ticket,DEAL_ENTRY)==DEAL_ENTRY_OUT && ExistPositions()==0) // check entry return(true); } } return(false); } //++X--------------------------------------------------------------++X //| ВОЗВРАЩАЕТ ФЛАГ СУЩЕСТВОВАНИЯ ПОЗИЦИИ | //++X--------------------------------------------------------------++X //+------------------------------------------------------------------------------------++ bool ExistPositions() { datetime ot=0; if(PositionSelect(m_symbol.Name())){ long create_time_msc=PositionGetInteger(POSITION_TIME_MSC); if (ot<=create_time_msc) return(true); } return(false); }//end //*---*---*---*---*---*---*---*---*---*---*---*---*---*---*---*---*---*---*---*---*---*---*---*---*---*---*---*---*---*---*---*---*---
HistoryTrade()==false
вставляешь перед вызовом функции открытия ордеров, если на этом баре в моменте не было сделок, он окроет, если была, будет ждать следующего бара что выставил в настройках по ТФ
- Бесплатные приложения для трейдинга
- 8 000+ сигналов для копирования
- Экономические новости для анализа финансовых рынков
Вы принимаете политику сайта и условия использования
Необходимо получить время закрытия ордера и узнать соответствует ли текущий бар тому на котором последний ордер был закрыт. Цель - не допустить что бы следующий ордер открывался на том же баре на котором предыдущий закрылся.
Есть функция которая должна возвращать свободен ли бар от операции закрытия. Для этого берется время закрытия последнего ордера в секундах и к нему прибавляется (int)timeframe * 60 в расчете на то что один бар уже прошел.
Но почему-то это не работает, и сделки все равно открываются впритык, помогите найти в чем ошибка:
Вызов этой функции простой в духе: if (IsBarFree()) { OpenPosition(); }
Пробовал еще такое вариант концовки но тоже не работает:
В расчете на то что бар просто не должен быть последним.
Думаю проблема в том что я не верно получаю outOrderTicket. Но в чем проблема не понимаю.
PS Может я перемудрил и есть способ проще решить эту проблему?