Суть проблемы: с утра выставляются стоповые отложки, они стоят, всё хорошо, ничего не происходит. А когда срабатывает какая-то из них, например, BuyStop, то робот пытается пропихнуть бесконечное количество отолженных ордеров.
Магик в коде есть:
Но используя CTrade в mql5 при установке BuyStop у меня в списке аргументов нет ведь магика:
У меня есть счётчик отложенных ордеров, вот его код:
Есть так же счётчик рыночных позиций:
Самые обычные счётчики. Я там строки с магиком закомментил, чисто для проверки, изменится что-то или нет.
Вот проверка условия на вход:
Счётчик отложенных кстати, возвращает 1, хотя ордеров стоит два.
Как можно решить проблемы?
Документацию читайте…
- www.mql5.com
Счётчик отложенных кстати, возвращает 1, хотя ордеров стоит два.
Правильно, у тебя он считает только байстопы и баи.
if(CountPendingOrders(ORDER_TYPE_BUY_STOP) == 0 && CountPos(POSITION_TYPE_BUY) == 0)
Хотя тут только фрагменты кода, лучше выкладывать весь код целиком т.к. еще какие-то кастомные функции типа
Burner()
Правильно, у тебя он считает только байстопы и баи.
Хотя тут только фрагменты кода, лучше выкладывать весь код целиком т.к. еще какие-то кастомные функции типа
Burner() это булевая функция поиска определённой свечи на графике, не думаю, что она влияет
Полный код онтика:
//+------------------------------------------------------------------+ //| Expert tick function | //+------------------------------------------------------------------+ void OnTick() { timeStart = iTime(_Symbol, PERIOD_D1, 0) + TimeToStart * 3600; timeStop = iTime(_Symbol, PERIOD_D1, 0) + TimeToClose * 3600; if(Burner() == true) { if(TimeCurrent() > timeStart && TimeCurrent() < timeStop) { double high = iHigh(_Symbol, PERIOD_D1, 1); double low = iLow(_Symbol, PERIOD_D1, 1); double ask = SymbolInfoDouble(_Symbol, SYMBOL_ASK); double bid = SymbolInfoDouble(_Symbol, SYMBOL_BID); if(CountPendingOrders(ORDER_TYPE_BUY_STOP) == 0 && CountPos(POSITION_TYPE_BUY) == 0) { if(ask < high) { if(trade.BuyStop(Lot, NormalizeDouble(high + (Step * _Point), _Digits), _Symbol, low) != true) { Print("Error pending order ", GetLastError()); } } } if(CountPendingOrders(ORDER_TYPE_SELL_STOP) == 0 && CountPos(POSITION_TYPE_SELL) == 0) { if(bid > low) { if(trade.SellStop(Lot, NormalizeDouble(low - (Step * _Point), _Digits), _Symbol, high) != true) { Print("Error pending order. Open market", GetLastError()); trade.Sell(Lot, _Symbol, SymbolInfoDouble(_Symbol, SYMBOL_BID), high); } } } } } if(TimeCurrent() > timeStop) { DeletePending(); } ControlPositions(); ClosePositions(); }
Функция ComtrolPositions() (если открылась отложка, то удалить другую отложку):
//+------------------------------------------------------------------+ //| контороль открытых позиций | //+------------------------------------------------------------------+ void ControlPositions() { int count = 0; for(int i = PositionsTotal() - 1; i >= 0; i--) { ulong ticket = PositionGetTicket(i); if(ticket != 0) { if(PositionGetString(POSITION_SYMBOL) == _Symbol && PositionGetInteger(POSITION_MAGIC) == Magic) { count++; } } } if(count > 0) { DeletePending(); } }
Ну и напоследок ClosePositions()
//+------------------------------------------------------------------+ //| Закрываемся по таймингу | //+------------------------------------------------------------------+ void ClosePositions() { datetime stopTime = iTime(_Symbol, PERIOD_D1, 0) + TimeToClose * 3600; datetime currentTime = TimeCurrent(); if(currentTime > stopTime) { for(int i = PositionsTotal() - 1; i >= 0; i--) { ulong ticket = PositionGetTicket(i); if(ticket != 0) { trade.PositionClose(ticket); } } } }
верно - но я тут противоречие в справке только что нашёл где указано что
PositionGetTicketPositionGetTicket
Функция возвращает тикет позиции по индексу в списке открытых позиций и автоматически выбирает эту позицию для дальнейшей работы с ней при помощи функций PositionGetDouble, PositionGetInteger, PositionGetString.
а если перейти на описание этих самых PositionGetDouble, PositionGetInteger, PositionGetString. - то там в описании нет обратной ссылки указывающей на PositionGetTicket и заполнение от него
пример -
PositionGetDouble
Функция возвращает запрошенное свойство открытой позиции, предварительно выбранной при помощи функции PositionGetSymbol или PositionSelect. - нету тут PositionGetTicket, не указан
- Бесплатные приложения для трейдинга
- 8 000+ сигналов для копирования
- Экономические новости для анализа финансовых рынков
Вы принимаете политику сайта и условия использования
Суть проблемы: с утра выставляются стоповые отложки, они стоят, всё хорошо, ничего не происходит. А когда срабатывает какая-то из них, например, BuyStop, то робот пытается пропихнуть бесконечное количество отолженных ордеров.
Магик в коде есть:
Но используя CTrade в mql5 при установке BuyStop у меня в списке аргументов нет ведь магика:
У меня есть счётчик отложенных ордеров, вот его код:
Есть так же счётчик рыночных позиций:
Самые обычные счётчики. Я там строки с магиком закомментил, чисто для проверки, изменится что-то или нет.
Вот проверка условия на вход:
Счётчик отложенных кстати, возвращает 1, хотя ордеров стоит два.
Как можно решить проблемы?