Идентификация нового открытого ордера с последующий задачей. - страница 2

 
Roger:
Может сделать обработку ордера сразу же после открытия, тогда и искать ничего не надо будет.

Что вы имеете ввиду?
Хоть скажите, это спомошью масивов делаеться?
 
semiromid:

Что вы имеете ввиду?

Имеется в виду, что один и тот же советник и открывает ордера, и выполняет над ним какую-то задачу.

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

//+------------------------------------------------------------------+
//|                                                    Order_act.mq4 |
//|                                                                  |
//|                                                                  |
//+------------------------------------------------------------------+
#property copyright ""
#property link      ""
int Order_array[200];
int Total=0;
int j,pos,count,order_tick,type;
bool found;

//+------------------------------------------------------------------+
//| script program start function                                    |
//+------------------------------------------------------------------+
int start()
  {
//----
// создаем список ордеров (туда входят и открытые, и отложенные)
  Total=OrdersTotal();

   for(pos=0;pos<Total;pos++)
  {  
   if(OrderSelect(pos,SELECT_BY_POS,MODE_TRADES)==true) 
   {  Order_array[pos]=OrderTicket();}
  }

// проверочная часть скрипта  
  int i=0;
  while ( !IsStopped() )
  { 
    count=OrdersTotal();                                           
    for(pos=0;pos<count;pos++)                              
    {
      if(OrderSelect(pos,SELECT_BY_POS,MODE_TRADES)==true)
      {
        found=false;  
        order_tick=OrderTicket();          
        
        for (j=0;j<Total;j++)
        {     
        
          if (order_tick==Order_array[j])  {found=true;}   
        }
        if (!found)
        {
          type=OrderType();
         
          if ((type==OP_BUY) || (type==OP_SELL)) 
          {
            Total++;                                            // в случае,если есть новый открытый
            Order_array[Total-1]=order_tick;                //ордер - добавляем в список

            Alert("Новый открытый ордер");                  // и делаем с ним что хотим

          }      
        }
      } 
    // если планируется, что скрипт будет работать долго или открываемся часто
    // удаляем из списка все закрытые ордера чтобы не было переполнения. 
    // А чтобы работало быстрее, количество записей можно уменьшить (лишь бы не превысило 
    // максимально возможного числа открытых и отложенных поз.
    if  (Total>190)           
    {                          
      for (j=0;j<Total;j++)       
      {
        if(OrderSelect(Order_array[j],SELECT_BY_TICKET)==true)
        {
          if (OrderCloseTime()!=0) 
          {
            Alert("нашли закрытый в списке и удалили");   
            for (i=j+1;i<Total;i++) {Order_array[j]=Order_array[i];}
            Total--;       
          }  
        }
      }     
    }   
    Sleep(100);    
    }
  }  
//----
   return(0);
  }
//+------------------------------------------------------------------+
 
RAVen_:

Имеется в виду, что один и тот же советник и открывает ордера, и выполняет над ним какую-то задачу.

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

Огромное Спасибо . Теперь главное разобраться самому в этом коде до мельчайших деталей.

Может сделать обработку ордера сразу же после открытия,

Это спомощью какой функции делаеться?
 
RAVen_:

Имеется в виду, что один и тот же советник и открывает ордера, и выполняет над ним какую-то задачу.

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


//+------------------------------------------------------------------+
//| Order_act.mq4 |
//| |
//| |
//+------------------------------------------------------------------+
#property copyright ""
#property link ""
int Order_array[200];
int Total=0;
int j,pos,count,order_tick,type;
bool found;

//+------------------------------------------------------------------+
//| script program start function |
//+------------------------------------------------------------------+
int start()
{
//----
// создаем список ордеров (туда входят и открытые, и отложенные)
Total=OrdersTotal();

for(pos=0;pos<Total;pos++)
{
if(OrderSelect(pos,SELECT_BY_POS,MODE_TRADES)==true)
{ Order_array[pos]=OrderTicket();}
}

// проверочная часть скрипта
int i=0;
while ( !IsStopped() )
{
count=OrdersTotal();
for(pos=0;pos<count;pos++)
{
if(OrderSelect(pos,SELECT_BY_POS,MODE_TRADES)==true)
{
found=false;
order_tick=OrderTicket();

for (j=0;j<Total;j++)
{

if (order_tick==Order_array[j]) {found=true;}
}
if (!found)
{
type=OrderType();

if ((type==OP_BUY) || (type==OP_SELL))
{
Total++; // в случае,если есть новый открытый
Order_array[Total-1]=order_tick; //ордер - добавляем в список

Alert("Новый открытый ордер"); // и делаем с ним что хотим

}
}
}
// если планируется, что скрипт будет работать долго или открываемся часто
// удаляем из списка все закрытые ордера чтобы не было переполнения.
// А чтобы работало быстрее, количество записей можно уменьшить (лишь бы не превысило
// максимально возможного числа открытых и отложенных поз.
if (Total>190)
{
for (j=0;j<Total;j++)
{
if(OrderSelect(Order_array[j],SELECT_BY_TICKET)==true)
{
if (OrderCloseTime()!=0)
{
Alert("нашли закрытый в списке и удалили");
for (i=j+1;i<Total;i++) {Order_array[j]=Order_array[i];}
Total--;
}
}
}
}
Sleep(100);
}
}
//----
return(0);
}
//+------------------------------------------------------------------+

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

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