Как выключить эксперт после срабатывания стоплосс?

 

Не срабатывает функция ExpertRemove();

if(BuyCnt == 0)//запуск только одного ордера
{

ticket = OrderSend(Symb, OP_BUY, 1.0, Ask, 3, StopLossLevel, 0, "First expert");

}

if(OrderSelect(ticket, SELECT_BY_POS)==true){
       double stopper = OrderStopLoss();   //стоплосс этого ордера
          if(Price <= stopper){     //Price это Bid, тут условие если B
              ExpertRemove();
            }
          }

При таком варианте эта функция не срабатывает

 
luxerman:

Не срабатывает функция ExpertRemove();

if(BuyCnt == 0)//запуск только одного ордера
{

ticket = OrderSend(Symb, OP_BUY, 1.0, Ask, 3, StopLossLevel, 0, "First expert");

}

if(OrderSelect(ticket, SELECT_BY_POS)==true){
       double stopper = OrderStopLoss();   //стоплосс этого ордера
          if(Price <= stopper){     //Price это Bid, тут условие если B
              ExpertRemove();
            }
          }

При таком варианте эта функция не срабатывает



OrderSelect надо делать по MODE_HISTORY  если ордер закрылся, его там искать надо.
 
paukas:

OrderSelect надо делать по MODE_HISTORY  если ордер закрылся, его там искать надо.
А более подробнее можете, я просто новичок в этом
 

paukas по невнимательности дал неправильный совет. Бывает. Выбор ордера по тикету не зависит от места его положения, в истории или в рынке.

Просто у тебя всё в одну кучу... Пытаешься выбрать по тикету и по позиции в списке открытых одновременно. Правильно будет так

if(OrderSelect(ticket, SELECT_BY_TICKET)) // == true можно не писать

 
AlexeyVik:

paukas по невнимательности дал неправильный совет. Бывает. Выбор ордера по тикету не зависит от места его положения, в истории или в рынке.

Просто у тебя всё в одну кучу... Пытаешься выбрать по тикету и по позиции в списке открытых одновременно. Правильно будет так

if(OrderSelect(ticket, SELECT_BY_TICKET)) // == true можно не писать

Переменная ticket например при обрыве связи не обнулится ли? Может тыркнуть на кнопку другого тф, временно отключиться электричество, случайно закрыть терминал. По истории надежней проверять.
 
AlexeyVik:

paukas по невнимательности дал неправильный совет. Бывает. Выбор ордера по тикету не зависит от места его положения, в истории или в рынке.

Просто у тебя всё в одну кучу... Пытаешься выбрать по тикету и по позиции в списке открытых одновременно. Правильно будет так

if(OrderSelect(ticket, SELECT_BY_TICKET)) // == true можно не писать

Всеравно перезапускается эксперт
 
luxerman:
Всеравно перезапускается эксперт

В каком смысле?  Удаляется с графика, а потом снова появляется?
 
paukas:

В каком смысле?  Удаляется с графика, а потом снова появляется?
Не правильно сформулировал. Эксперт не удаляется. Заново запускается OrderSend.
 
luxerman:
Не правильно сформулировал. Эксперт не удаляется. Заново запускается OrderSend.

Правильно. OrderSend  же  у вас впереди  стоит, вот первым и выполняется. Поставвьте в конец,

Сначала проверьте нужно ли удалять, а  потом уже запускайте новый ордер. Вот так


if(OrderSelect(ticket, SELECT_BY_POS)){
       double stopper = OrderStopLoss();   //стоплосс этого ордера
          if(Price <= stopper){     //Price это Bid, тут условие если B
              ExpertRemove();

            }

f(BuyCnt == 0)//запуск только одного ордера
{

ticket = OrderSend(Symb, OP_BUY, 1.0, Ask, 3, StopLossLevel, 0, "First expert");

}

 
paukas:

Правильно. OrderSend  же  у вас впереди  стоит, вот первым и выполняется. Поставвьте в конец,

Сначала проверьте нужно ли удалять, а  потом уже запускайте новый ордер. Вот так


if(OrderSelect(ticket, SELECT_BY_POS)){
       double stopper = OrderStopLoss();   //стоплосс этого ордера
          if(Price <= stopper){     //Price это Bid, тут условие если B
              ExpertRemove();

            }

f(BuyCnt == 0)//запуск только одного ордера
{

ticket = OrderSend(Symb, OP_BUY, 1.0, Ask, 3, StopLossLevel, 0, "First expert");

}


Так не работает

Тут просто не срабатывает условие

(BuyCnt == 0)//запуск только одного ордера
{

ticket = OrderSend(Symb, OP_BUY, 1.0, Ask, 3, StopLossLevel, 0, "First expert");

}

ExpertRemove();

Так работает и неважно где находится ExpertRemove();

Причина обращения: