Скачать MetaTrader 5

OrderType() неправильно определяет тип ордера

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

Дорогие товарищи программисты! У меня беда, помогите пожалуйста.

Совсем уже голову сломал об этот код.

//В условии прописано что работаем с 
if(OrderType() == OP_BUY){}
//, но метатрейдер почему то игнорирует это условие, и работает только с OP_SELLLIMIT

Вот вся функция:

//+------------------------------------------------------------------+
//| Модифицируем стоплоссы                                           |
//+------------------------------------------------------------------+   
void modify_stoploss()
  {
   for(int i=0; i<=OrdersTotal(); i++)
     {
      if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES))
        {
         if(OrderSymbol()==Symbol())
           {
            if(OrderMagicNumber()==magic)
              {
               if(OrderType() == OP_BUY)
                 {
                  if(chek_way()==1)
                    {
                     double stoploss=NormalizeDouble(pre_openPrice(OP_BUY),Digits);
                     Print("Стоплосс для Бай ",OrderTicket()," = ", stoploss);
                     OrderModify(OrderTicket(),OrderOpenPrice(),stoploss,OrderTakeProfit(),0,CLR_NONE);
                    }
                 }
               if(OrderType() == OP_SELL)
                 {
                  if(chek_way()==0)
                    {
                     stoploss=NormalizeDouble(pre_openPrice(OP_SELL),Digits);
                     Print("Стоплосс для Cелл ",OrderTicket()," = ", stoploss);
                     OrderModify(OrderTicket(),OrderOpenPrice(),stoploss,OrderTakeProfit(),0,CLR_NONE);
                    }
                 }
              }
           }
        }
     }
  }

Доходит до Print и вот что он выдает:


В то время как тикет: 225299700 является тикетом ордера OP_SELLLIMIT.

И дальше все как положено модифицирует стоплосс этого выбранного ордера. А OP_BUY в упор не видит, хотя они конечно же есть:

В чем может быть проблема? Помогите разобраться пожалуйста!

Alexey Viktorov
13981
Alexey Viktorov  

А что-же ты скрин обрезал так, что не видно какой СЛ поставлен ордеру sell limit

И удали знак = в цикле. Ордера, но нумеруются с нуля до OrdersTotal() - 1 следовательно ордера с индексом OrdersTotal() быть не может.

ivan777
50
ivan777  
AlexeyVik:

А что-же ты скрин обрезал так, что не видно какой СЛ поставлен ордеру sell limit

И удали знак = в цикле. Ордера, но нумеруются с нуля до OrdersTotal() - 1 следовательно ордера с индексом OrdersTotal() быть не может.


Стоп лосс ему не поставился, т.к. этот sell limit выше желаемого стоплосса. Зато ему поставился Тейкпрофит аналогичной функцией, которая также не должна работать с лимитными ордерами.

знак = то я уже от безвыходности поставил. он как бы ничего не меняет, уже убрал. Сам факт почему выбирает лимитный ордер, когда ограничение четко стоит на OP_BUY или OP_SELL.

Vitalie Postolache
12445
Vitalie Postolache  
Попробуйте перебирать ордера в цикле в обратном порядке. И что за chek_way()?
ivan777
50
ivan777  
evillive:
Попробуйте перебирать ордера в цикле в обратном порядке. И что за chek_way()?
да я пробовал в обратном, не помогает.

chek_way() определяет направление торговли. но как она может влиять, если попросту игнорируется условие на работу с рыночными ордерами.

//+------------------------------------------------------------------+
//| Проверяем направление торговли                                   |
//+------------------------------------------------------------------+ 
int chek_way()
  {
   int up_down;
   for(int i=0; i<OrdersTotal(); i++)
     {
      if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES))
        {
         if(OrderSymbol()==Symbol())
           {
            if(OrderMagicNumber()==magic)
              {
               if(OrderType()==OP_BUY || OrderType()==OP_SELL)
                 {
                  if(OrderComment()=="1_BUYSTOP")
                    {up_down=1;}
                  if(OrderComment()=="1_SELLSTOP")
                    {up_down=0;}
                 }
              }
           }
        }
     }
   return(up_down);
  }
Vitalie Postolache
12445
Vitalie Postolache  
В обратном порядке это не то что вы показываете...
Alexey Viktorov
13981
Alexey Viktorov  
evillive:
В обратном порядке это не то что вы показываете...
Не поможет это. Порядок перебора влияет при закрытии ордеров, когда после закрытия ордера индексация оставшихся нарушается.

Lazarechek:

Стоп лосс ему не поставился, т.к. этот sell limit выше желаемого стоплосса. Зато ему поставился Тейкпрофит аналогичной функцией, которая также не должна работать с лимитными ордерами.

знак = то я уже от безвыходности поставил. он как бы ничего не меняет, уже убрал. Сам факт почему выбирает лимитный ордер, когда ограничение четко стоит на OP_BUY или OP_SELL.

Что-то сдаётся мне что в коде есть ещё аналогичная функция для работы с лимитниками. Не может-же терминал одновременно путать рыночные ордера с лимитными и сл с тп

Попробуй изменить текст принта, и если текст останется прежним, значит модифай не от сюда.

ivan777
50
ivan777  
evillive:
В обратном порядке это не то что вы показываете...

for(i = OrdersTotal(); i =0; i--)

так? бестолку

Vitalie Postolache
12445
Vitalie Postolache  
Lazarechek:

так? бестолку

считать-то кто будет? обратный порядок полезен всегда при работе с ордерами, не только при закрытии.
for(i = OrdersTotal()-1; i >=0; i--)
ivan777
50
ivan777  
AlexeyVik:
Не поможет это. Порядок перебора влияет при закрытии ордеров, когда после закрытия ордера индексация оставшихся нарушается.

Что-то сдаётся мне что в коде есть ещё аналогичная функция для работы с лимитниками.

Попробуй изменить текст принта, и если текст останется прежним, значит модифай не от сюда.



Принт идет именно с этой функции. Вот изменил:



Alexey Viktorov
13981
Alexey Viktorov  
evillive:
считать-то кто будет? обратный порядок полезен всегда при работе с ордерами, не только при закрытии.
Ну доказывать-то я не стану. Если не трудно объясни в чём разница?
Я-же сказал причину при закрытии ордеров.
12
Авторизуйтесь или зарегистрируйтесь, чтобы добавить комментарий