помогите разобраться с закрытием ордера

 

Возникла такая проблема

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

//+------------------------------------------------------------------+
//|                                              Додаткові умови.mq4 |
//+------------------------------------------------------------------+

int    magicNumber1;                              
int    magicNumber2;   
static int ticket1;
static int ticket2;
void OnInit()
{
   int sum;
   for(int i=0; i<StringLen(Symbol()); i++)
      sum+= StringGetChar(Symbol(), i);
      
   magicNumber1 = sum + (rand()%10000 + 1000); 
   magicNumber2 = magicNumber1 + 1;
   
  ticket1 = OrderSend(Symbol(), OP_BUY, 1, Ask, 3, Bid - 500*Point, Ask + 500*Point, "Buy", magicNumber1, 0, Red);
  
}
void OnTick()
{
  static bool flag = false;

  if(close())
   flag = true;
   
   if(flag)
   {
      ticket2 = OrderSend(Symbol(), OP_BUY, 1, Ask, 3, Bid - 500*Point, Ask + 500*Point, "Buy", magicNumber2, 0, Red);
      flag = false;
   }
   

}

bool close ()
{
      for(int i=0; i<OrdersHistoryTotal(); i++)
      {
         if(OrderSelect(i,SELECT_BY_POS,MODE_HISTORY)) 
         if(OrderMagicNumber()== magicNumber1 || OrderSymbol()==Symbol()) 
         return true;
      }
      return false;
}
 
traderEvgen:

Возникла такая проблема

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

1. На самом деле у вас magicNumber1 не уникален. Он может повторяться. И уже может быть в истории закрытый ордер с таким магиком.

2.У вас логика в функции close() : если в истории есть ордер ИЛИ с нужным магиком ИЛИ с нужным символом. Может вы месяц назад совершили сделку по этому символу и тогда у вас всегда флаг будет true.

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

 
Oksana Berenko:

1. На самом деле у вас magicNumber1 не уникален. Он может повторяться. И уже может быть в истории закрытый ордер с таким магиком. 

2.У вас логика в функции close() : если в истории есть ордер ИЛИ с нужным магиком ИЛИ с нужным символом. Может вы месяц назад совершили сделку по этому символу и тогда у вас всегда флаг будет true.

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

"1. На самом деле у вас magicNumber1 не уникален. Он может повторяться. И уже может быть в истории закрытый ордер с таким магиком. " - Как сделать что бы был уникален ?

"2.У вас логика в функции close() : если в истории есть ордер ИЛИ с нужным магиком ИЛИ с нужным символом. Может вы месяц назад совершили сделку по этому символу и тогда у вас всегда флаг будет true. " - Это да, ошибка, спасибо, я не увидел 

 
traderEvgen:

Как сделать что бы был уникален ?


Ко времени привязать, оно уникально, так как записывается как "локальное компьютерное время в виде количества секунд, прошедших после 00:00 1 января 1970 года".
 
   magicNumber1 = sum + (rand()%10000 + 1000); 
   magicNumber2 = magicNumber1 + 1;
   
  ticket1 = OrderSend(Symbol(), OP_BUY, 1, Ask, 3, Bid - 500*Point, Ask + 500*Point, "Buy", magicNumber1, 0, Red);
  

Зачем нужен этот случайный магик, если следом получаем тикет? И тикет и магик потеряется при перезапуске, так что можно тикетом пользоваться вместо магика. 

 
Oksana Berenko:
Ко времени привязать, оно уникально, так как записывается как "локальное компьютерное время в виде количества секунд, прошедших после 00:00 1 января 1970 года".
TimeLocal()
 
Я тут подумал, и у меня другая проблема, надо сгенерировать магик случайным образом, но когда терминал будет закрыт и открыт снова, нужно что бы советник распознал свои ордера. 
 
Ордер помечайте как-нибудь. Через глобальную переменную или через комментарий. Первый не помечать, второй помечать. Если не помеченный ордер, значит после его исчезновения открываться. В советнике сделать простую переменную, проходим по ордерам, если есть ордер без метки, запоминаем его в переменную. Но если есть в переменной, а в рынке нет, значит открывать второй надо. Таким образом будет независимо от перезапусков.
 
Dmitry Fedoseev:

Зачем нужен этот случайный магик, если следом получаем тикет? И тикет и магик потеряется при перезапуске, так что можно тикетом пользоваться вместо магика. 

а как сделать, что бы можно было распознать ордер при перезапуске ?
 
traderEvgen:
а как сделать, что бы можно было распознать ордер при перезапуске ?
Не это надо. Надо распознать момент исчезновения ордера. Потому-что после исчезновения надо открывать новый. Открывать или не открывать решать по метке ордера, метка в комментарии или глобальная переменная с тикетом ордера в имени.
 
ок, понял, спасибо
Причина обращения: