Советник работает на H4. При получении торгового сигнала от индикатора открывает ордер. Например, через час этот ордер закрывает, но т.к. торговый сигнал будет продолжать действовать до конца текущего таймфрейма, сразу же открывается новый ордер. Мне нужно, чтобы до конца этого таймфрейма больше ордеров не открывалось. Попробовал сделать через iBarShift(NULL,0,OrderOpenTime())!=0 (естественно, предварительно выбрав OrderSelect для выбора в истории закрытого ордера), но почему-то все равно в этом же таймфрейме открываются повторные ордера. Посоветуйте, как лучше решить эту проблему.
Вот здесь посмотрите. Это уже было недавно
Функция Кима должна помочь:
//+----------------------------------------------------------------------------+ //| Возвращает номер бара открытия последней позиции или -1. | //| Параметры: | //| sym - наименование инструмента ("" - текущий символ) | //| tf - таймфрейм ( 0 - текущий таймфрейм) | //| op - операция (-1 - любая позиция) | //| mn - MagicNumber (-1 - любой магик) | //+----------------------------------------------------------------------------+ int NumberOfBarOpenLastPos(string sym="", int tf=0, int op=-1, int mn=-1) { datetime oot; int i, k=OrdersTotal(); if (sym=="") sym=Symbol(); for (i=0; i<k; i++) { if (OrderSelect(i, SELECT_BY_POS, MODE_TRADES)) { if (OrderSymbol()==sym) { if (OrderType()==OP_BUY || OrderType()==OP_SELL) { if (op<0 || OrderType()==op) { if (mn<0 || OrderMagicNumber()==mn) { if (oot<OrderOpenTime()) oot=OrderOpenTime(); } } } } } } return(iBarShift(sym, tf, oot, True)); }
Пример использования:
if (NumberOfBarOpenLastPos()>0) { // Можно открывать позиции }
Ну тогда ок. Просто функция Кима - более общий вариант. И если речь идет только о текущем баре, то она реально не нужна.
Достаточно проверить равенство переменной OrderBarM15 с количеством баров iBars
if(OpenBuy==1 && OrderBarM15!=iBars("GBPUSD",PERIOD_M15)) { SL=Bd-StopLoss*Point; TP=As+TakeProfit*Point; SL=NormalizeDouble(SL, Digits); TP=NormalizeDouble(TP, Digits); ticket=OpenPosition(OP_BUY,Lots,SL,TP,MagicBuy); if(ticket>0) { if(OrderSelect(ticket,SELECT_BY_TICKET,MODE_TRADES)) { OrderBarM15=iBars("GBPUSD",PERIOD_M15); Print("BUY GBPUSD M15 order opened : ",OrderOpenPrice()); } } }
Достаточно проверить равенство переменной OrderBarM15 с количеством баров iBars
Если пренебречь рисками внезапного изменения значения переменной iBars("GBPUSD",PERIOD_M15);
при возможной подкачке истории на текущем баре, то вполне рабочая конструкция.
Да и изначально не отвергал Ваш вариант, предложил функцию Кима в качестве надёжной проверенной альтернативы.
Функция полезная, но она предназначена для определения номера бара последней открытой позиции. Меня же интересуют уже закрытые позиции. Простой заменой MODE_TRADES на MODE_HISTORY вопрос не решается, т.к. тут может быть вариант, когда по данному инструменту не открыто еще ни одной позиции, и следовательно ни один ордер в истории не будет выбран; а может быть другой вариант, когда в истории уже есть закрытые ордера. Какие изменения необходимо внести в эту функцию, чтобы она работала при всех вариантах?
![MQL5 - Язык торговых стратегий для клиентского терминала MetaTrader 5](https://c.mql5.com/i/registerlandings/logo-2.png)
- Бесплатные приложения для трейдинга
- 8 000+ сигналов для копирования
- Экономические новости для анализа финансовых рынков
Вы принимаете политику сайта и условия использования
Советник работает на H4. При получении торгового сигнала от индикатора открывает ордер. Например, через час этот ордер закрывает, но т.к. торговый сигнал будет продолжать действовать до конца текущего таймфрейма, сразу же открывается новый ордер. Мне нужно, чтобы до конца этого таймфрейма больше ордеров не открывалось. Попробовал сделать через iBarShift(NULL,0,OrderOpenTime())!=0 (естественно, предварительно выбрав OrderSelect для выбора в истории закрытого ордера), но почему-то все равно в этом же таймфрейме открываются повторные ордера. Посоветуйте, как лучше решить эту проблему.