Скачать MetaTrader 5

Номер тиккета не записывается в переменную. MQL4

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

Ребята, кто знает, подскажите пожалуйста. Почему номер тиккета не записывается в переменные tikket1, tikket2, ticket3 ?? А я хотел управлять ордерами по тиккету. Типы переменных объявил, вроде все правильно сделал.

Вот кусок кода:

void OnTick()

  {

   int ticket1;

   int ticket2;

   int ticket3;

   double L1;

   double L2;

   double L3;

   int OT1;

   int OT2;


   if(OrdersTotal()<1)                                                                                     //если открытых ордеров меньше чем один..

     {

      ticket1=OrderSend(Symbol(),OP_BUY,lot1,Ask,3,Bid-SL*Point,Bid+TP2*Point);                            //открыть ордер на покупку

      Sleep(500);

      ticket2=OrderSend(Symbol(),OP_SELLLIMIT,lot2,Bid+0.00200,3,Ask+(SL+200)*Point,Ask-(TP1-200)*Point);  //выставить селл-лимит на 200 пунктов выше

      Sleep(500);

      ticket3=OrderSend(Symbol(),OP_SELLSTOP,lot1,Bid-0.00100,3,Ask+(SL-100)*Point,Ask-(TP2+100)*Point);   //выставить селл стоп на 100 пунктов ниже

     }

      if(OrderSelect(ticket1,SELECT_BY_TICKET)==true)                                                      //выбрать ордер по тиккету  ticket1

      {

      L1=OrderOpenPrice()-0.00100;                                                                         //записать в переменную L1 значение выражения цена открытия минус 0.00100

      }

      if(Bid<L1)                                                                                           //если текущая цена бид станет меньше значения L1

      {

      OrderDelete(ticket2);                                                                                //удалить селл-лимит

      }

Renat Akhtyamov
9574
Renat Akhtyamov  
добавьте функцию обработки ошибок и посмотрите какую ошибку выдоет функция открытия ордера
Ihor Herasko
19412
Ihor Herasko  

Ограниченная область видимость переменных, в которые записываются данные. Все переменные объявлены в теле функции OnTick(). Это означает, что за пределами этой функции таких переменных не существует. Зашли в OnTick(), создали переменную, записали в нее значение и оно попросту пропало при выходе из OnTick(). При следующем входе в OnTick() это совершенно другие переменные с другим данными.

Чтобы значения не пропадали, есть два способа:

  1. Объявить переменные в глобальной области видимости (вне всех функций).
  2. Сделать переменные статическими (почитайте про модификатор static).

Alekseu Fedotov
1319
Alekseu Fedotov  
a_universal:

Ребята, кто знает, подскажите пожалуйста. Почему номер тиккета не записывается в переменные tikket1, tikket2, ticket3 ?? А я хотел управлять ордерами по тиккету. Типы переменных объявил, вроде все правильно сделал.

Вот кусок кода:

void OnTick()

  {

   int ticket1;

   int ticket1;

   int ticket3;

   double L1;

   double L2;

   double L3;

   int OT1;

   int OT2;


   if(OrdersTotal()<1)                                                                                     //если открытых ордеров меньше чем один..

     {

      ticket1=OrderSend(Symbol(),OP_BUY,lot1,Ask,3,Bid-SL*Point,Bid+TP2*Point);                            //открыть ордер на покупку

      Sleep(500);

      ticket2=OrderSend(Symbol(),OP_SELLLIMIT,lot2,Bid+0.00200,3,Ask+(SL+200)*Point,Ask-(TP1-200)*Point);  //выставить селл-лимит на 200 пунктов выше

      Sleep(500);

      ticket3=OrderSend(Symbol(),OP_SELLSTOP,lot1,Bid-0.00100,3,Ask+(SL-100)*Point,Ask-(TP2+100)*Point);   //выставить селл стоп на 100 пунктов ниже

     }

      if(OrderSelect(ticket1,SELECT_BY_TICKET)==true)                                                      //выбрать ордер по тиккету  ticket1

      {

      L1=OrderOpenPrice()-0.00100;                                                                         //записать в переменную L1 значение выражения цена открытия минус 0.00100

      }

      if(Bid<L1)                                                                                           //если текущая цена бид станет меньше значения L1

      {

      OrderDelete(ticket2);                                                                                //удалить селл-лимит

      }

При каждом вызове функции OnTick переменные
ticket1,2,3 сбрасываются  на 0,
объявите их на глобальном уровне 
Andrei Novichkov
5732
Andrei Novichkov  
Дело либо в области видимости, либо в том, что не проверяется возвращаемое значение OrderSend. Может вернулось -1. Это надо обязательно проверять, потом вызывать GetLastError.
a_universal
94
a_universal  

Спасибо ребята!!! 

Действительно: номера тиккетов записывались в переменные на первом тике, а на следующем тике сразу обнулялись, я проверял функцией Comment();

Вынес эти переменные за пределы OnTick() и все сразу заработало. )))

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