Скачать MetaTrader 5

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

Авторизуйтесь или зарегистрируйтесь, чтобы добавить комментарий
luxerman
113
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();
            }
          }

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

Vladimir Paukas
4099
Vladimir Paukas  
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  если ордер закрылся, его там искать надо.
luxerman
113
luxerman  
paukas:

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

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

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

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

Vladimir Paukas
4099
Vladimir Paukas  
AlexeyVik:

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

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

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

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

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

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

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

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

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

В каком смысле?  Удаляется с графика, а потом снова появляется?
Не правильно сформулировал. Эксперт не удаляется. Заново запускается OrderSend.
Vladimir Paukas
4099
Vladimir Paukas  
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");

}

luxerman
113
luxerman  
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();

Авторизуйтесь или зарегистрируйтесь, чтобы добавить комментарий