Скачать MetaTrader 5

Вложеный оператор

Авторизуйтесь или зарегистрируйтесь, чтобы добавить комментарий
Делись ссылками на форуме. Теперь они имеют Rich Content!
protr
358
protr 2015.10.17 21:02 

Здравствуйте. Подскажите пожалуста как правильно... со скобками или без? а то пишет постоянно код ошибки 0... или не там ищу... Спасибо

вариант 1

 

 if (OrderSelect(buystop,SELECT_BY_TICKET,MODE_TRADES) == true && OrderType() == OP_BUYSTOP && OrderOpenPrice() > Ask + TS*Point)
               bool res_1 = OrderModify(buystop,Ask + TS*Point,Ask + TS*Point-SL*Point,Ask + TS*Point+TP*Point,0,DeepSkyBlue);
            if(!res_1)
               Print("Ошибка модификации ордера. Код ошибки=",GetLastError());
            else
               Print("Цена Stop Loss ордера успешно модифицирована.");

вариата 2

   if (OrderSelect(buystop,SELECT_BY_TICKET,MODE_TRADES) == true && OrderType() == OP_BUYSTOP 
    && OrderOpenPrice() > Ask + TS*Point){
               bool res_1 = OrderModify(buystop,Ask + TS*Point,Ask + TS*Point-SL*Point,Ask + TS*Point+TP*Point,0,DeepSkyBlue);
            if(!res_1)
               Print("Ошибка модификации ордера. Код ошибки=",GetLastError());
            else
               Print("Цена Stop Loss ордера успешно модифицирована.");
               }
Alexey Volchanskiy
16684
Alexey Volchanskiy 2015.10.18 00:38  
protr:

Здравствуйте. Подскажите пожалуста как правильно... со скобками или без? а то пишет постоянно код ошибки 0... или не там ищу... Спасибо


А пробовали выделить отдельно? Какой код ошибки конкретно?

if (OrderSelect(buystop,SELECT_BY_TICKET,MODE_TRADES) == true)
{
// дальше все остальное
}
Vitaly Muzichenko
3496
Vitaly Muzichenko 2015.10.18 02:13  
protr:

   Подскажите пожалуста как правильно... со скобками или без?

Вообще, хорошим тоном является все разделять скобками, да и случайная ошибка не вылезет рано или поздно, что приведет к неправильной работе программной части.

 if(OrderSelect(buystop,SELECT_BY_TICKET,MODE_TRADES) == true)
  {
  if(OrderType() == OP_BUYSTOP && (OrderOpenPrice() > (Ask + TS*Point)))
   {
    bool res_1 = OrderModify(buystop,Ask + TS*Point,Ask + TS*Point-SL*Point,Ask + TS*Point+TP*Point,0,DeepSkyBlue);
     if(!res_1)
      {
       Print("Ошибка модификации ордера. Код ошибки=",GetLastError());
       } else {
        Print("Цена Stop Loss ордера успешно модифицирована.");
      }
    }
  }

 

В вашем случае ответ дан предыдущим оратором )

Alexey Kozitsyn
6437
Alexey Kozitsyn 2015.10.18 09:07  
protr:

Здравствуйте. Подскажите пожалуста как правильно... со скобками или без? а то пишет постоянно код ошибки 0... или не там ищу... Спасибо

вариант 1

 

вариата 2

Здравствуйте. Скорее всего. не там ищите. Как минимум нужно нормализовать все цены, переданные в функцию модификации ордера.

Далее вопрос к этой строке OrderOpenPrice() > Ask + TS*Point. Цена аск может повторяться несколько раз, а значит Вы будете модифицировать ордер на ту же цену. Нужно добавить проверку, что ТП или СЛ уже модифицированы по текущей цене аск.

Да, второй вариант, приведенный Вами, правильнее. 

 

Artyom Trishkin
Модератор
75873
Artyom Trishkin 2015.10.18 09:19  
protr:

Здравствуйте. Подскажите пожалуста как правильно... со скобками или без? а то пишет постоянно код ошибки 0... или не там ищу... Спасибо

вариант 1

 

вариата 2

1. При выделении ордера по тикету pool игнорируется - MODE_TRADES не имеет никакого значения и он тут не нужен (его использование не является ошибкой, но говорит о том, что программист не совсем понимает что он делает)

2. Для того, чтобы понять из какого списка выбран ордер, нужно проверить время его закрытия: если == 0 --> значит ордер в списке открытых, если не равен нулю - ордер уже закрыт, и находится в списке закрытых, соответственно, и модифицировать его уже бесполезно.

3. Сначала сделайте правильно выбор, потом уже пробуйте модифицировать. Ну и со скобками - всё, что должно происходить при истинности условия - всё в скобки. За скобки выносите всё, что должно быть в случае "иначе"

ghost_master
22
ghost_master 2015.10.18 09:31  
Artyom Trishkin:

1. При выделении ордера по тикету pool игнорируется - MODE_TRADES не имеет никакого значения и он тут не нужен (его использование не является ошибкой, но говорит о том, что программист не совсем понимает что он делает)

2. Для того, чтобы понять из какого списка выбран ордер, нужно проверить время его закрытия: если == 0 --> значит ордер в списке открытых, если не равен нулю - ордер уже закрыт, и находится в списке закрытых, соответственно, и модифицировать его уже бесполезно.

3. Сначала сделайте правильно выбор, потом уже пробуйте модифицировать. Ну и со скобками - всё, что должно происходить при истинности условия - всё в скобки. За скобки выносите всё, что должно быть в случае "иначе"

Спасибо. 

1. Понял

2. А так что происходит попытка модифицировать ордер из истории? :) Я думаю этот параметр при выборе такое исключает MODE_TRADES (по умолчанию) - ордер выбирается среди открытых и отложенных ордеров.

3. тогда else за скобки? 

ghost_master
22
ghost_master 2015.10.18 09:32  
Код ошибки 0... ето при модификации ордерор... непосредственно при исполнении программы. Спасибо.
Alexander Puzanov
29612
Alexander Puzanov 2015.10.18 09:42  
ghost_master:
Код ошибки 0... ето при модификации ордерор... непосредственно при исполнении программы. Спасибо.
В этом разе err #0 это попытка задать ордеру те же самые параметры, которые у него и так есть
protr
358
protr 2015.10.18 10:41  

Alexander Puzanov:
В этом разе err #0 это попытка задать ордеру те же самые параметры, которые у него и так есть

 

 

 

 При этом когда ошибка 0 - серверу отсылается запрос на модификацию?

 

Вот в етом и причина того что терминал жрет ресурс впса... а как можно обойти этот момент... ?  

Alexander Puzanov
29612
Alexander Puzanov 2015.10.18 10:47  
protr:

Вот в етом и причина того что терминал жрет ресурс впса... а как можно обойти этот момент... ?  

Елементарно - сверяйте 3 новых параметра с существующими до отправки заявки OrderModify
protr
358
protr 2015.10.18 11:13  

Alexander Puzanov:
Елементарно - сверяйте 3 новых параметра с существующими до отправки заявки OrderModify

 

 

 

 

Спасибо. Но мне кажется что етот параметр проверки исключает отсылку цены равной или меньше.

OrderOpenPrice() > Ask + TS*Point

Спасибо. 

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