результаты работы стоп приказов

 

доброго времени суток))) пишу советника, который открывает ордера со стоп-лоссами, запоминает номер тикета, дальше отслеживает торговые критерии на покупку/продажу и при их появлении (критериев) закрывает ордер с запомненым тикетом. но если этот ордер закрывается по стопу (т.е. не советником), то советник зацикливается на: "ошибка при закрытии ордера buy 0/sell 0" и "OrderClose error 4051"

подскажите как исправить этй проблему

 
ApoloGET >>:

доброго времени суток))) пишу советника, который открывает ордера со стоп-лоссами, запоминает номер тикета, дальше отслеживает торговые критерии на покупку/продажу и при их появлении (критериев) закрывает ордер с запомненым тикетом. но если этот ордер закрывается по стопу (т.е. не советником), то советник зацикливается на: "ошибка при закрытии ордера buy 0/sell 0" и "OrderClose error 4051"

подскажите как исправить этй проблему


ERR_INVALID_FUNCTION_PARAMVALUE 4051 Недопустимое значение параметра функции
 
Перед тем как закрывать позицию просто проверяйте есть ли она вообще. OrderSelect вполне подойдет.
 
khorosh >>:

ERR_INVALID_FUNCTION_PARAMVALUE 4051 Недопустимое значение п
khorosh >>:

ERR_INVALID_FUNCTION_PARAMVALUE 4051 Недопустимое значение параметра функции

спасибо, я знаю, где посмотреть что значат коды ошибок))))) как решить мою проблему? откуда берётся ордер с номером 0?
 
Это значит что вы пытаетесь закрыть позицию которой нет. Перед тем как закрывать позицию выбирите ее при помощи OrderSelect (тикет выпомните). Если функция не найдет ордера среди открытых, значит закрывать ничего не нужно.
 
ApoloGET >>:

доброго времени суток))) пишу советника, который открывает ордера со стоп-лоссами, запоминает номер тикета, дальше отслеживает торговые критерии на покупку/продажу и при их появлении (критериев) закрывает ордер с запомненым тикетом. но если этот ордер закрывается по стопу (т.е. не советником), то советник зацикливается на: "ошибка при закрытии ордера buy 0/sell 0" и "OrderClose error 4051"

подскажите как исправить этй проблему


    Очень просто. Перед тем, как отдавать приказ на закрытие ордера, нужно прверить, а существует ли такой ордер в списке рыночных одеров. Если не ордер селект,  то континьюэ. В результате цикл просто проскочит мимо несуществующего ордера.

hasayama дал(дала) верное решение. Я лишь развернул его. 

 
=) а Хасяма вполне себе он)
 
hasayama >>:
=) а Хасяма вполне себе он)

таки да...

Она бы промолчала. и на вопрос. и на реплику.

;)

 
   // Учёт ордеров
   Symb=Symbol();                               // Название фин.инстр.
   Total=0;                                     // Количество ордеров
   for(int i=1; i<=OrdersTotal(); i++)          // Цикл перебора ордер
     {
      if (OrderSelect(i-1,SELECT_BY_POS)==true) // Если есть следующий
        {                                       // Анализ ордеров:
         if (OrderSymbol()!=Symb)continue;      // Не наш фин. инструм
         if (OrderType()>1)                     // Попался отложенный
           {
            Alert("Обнаружен отложенный ордер. Эксперт не работает.");
            return;                             // Выход из start()
           }
         Total++;                               // Счётчик рыночн. орд
         if (Total>1)                           // Не более одного орд
           {
            Alert("Несколько рыночных ордеров. Эксперт не работает.");
            return;                             // Выход из start()
           }
         if (Total==0)                          // если открытых ордеров нет (закрылся по стопу)
           {
           Working=false;                       // эксперт не работает с ордерами
           }
           
         Ticket=OrderTicket();                  // Номер выбранн. орд.
         Tip   =OrderType();                    // Тип выбранного орд.
         Lot   =OrderLots();                    // Количество лотов
        }
     }
   
вот такой у меня учёт ордеров. на тесте советник открывает позицию, потом закрывает её согласно условий, а потом зацыкливается на попытке закрыть ордер Buy 0
 

Думаю уместнее будет привести пример кода открытия и закрытия сделок. Из этого куска не понять почему он циклится.

Кстати, а зачем такие жесткие условия на выход? Не проще ли просто использовать break или тот же continue?

 

вот они изучатели языка машин =)))

сории за офф топ

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