Как в советнике для опционов определить объём, в простом это было OrderLots().

 

Здравствуйте.

 

В советнике для опционов некоторые функции в ордерсенд поменялись местами, на месте комментария ставится время ( в видеоролике узнал).В справке mql4 этого описания нет. 

Терерь не могу узнать объём предыдущей сделки. 

 

По другим советникам смотрю, так и есть, но почемуто не работает как в обычном советнике

 

 //----  расчёт лота
       
       double Free =AccountFreeMargin();     
      // double Lots = Free*0.1/100;
     
        for(int trade = OrdersTotal()-1; trade >=0; trade--)
    {
   if(OrderSelect(OrderTicket(),SELECT_BY_POS,MODE_HISTORY)==true)    
     {   
       if(OrderProfit()<0){Lots=OrderLots()*2; }
     }
      if(OrderSelect(OrderTicket(),SELECT_BY_POS,MODE_HISTORY)==true)    
     {   
       if(OrderProfit()<0){Lots=OrderLots()*2; }
     }
     return(Lots);
    }  
 

опционы или не опционы - разницы для кода нет.

а вот время в комментариях это не причуда языка - а свойство брокера. в комментарий вы ставите время в виде строки - сервер опционов принимает ее как время истечения сделки. Поэтому все стандартно

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

       for(int trade = OrdersTotal()-1; trade >=0; trade--)
    {
   if(OrderSelect(OrderTicket(),SELECT_BY_POS,MODE_HISTORY)==true)    
     {   
       if(OrderProfit()<0){Lots=OrderLots()*2; }
     }
      if(OrderSelect(OrderTicket(),SELECT_BY_POS,MODE_HISTORY)==true)    
     {   
       if(OrderProfit()<0){Lots=OrderLots()*2; }

 Зачем здесь два раза одно и то же ? 

Вы здесь узнаете не последний ордер, а просто перебираете в конца массива сделок в истории до первого элемента. Поэтому у Вас лот всегда первый. Или 0 , потому что сделки нет еще. А Lots не известно какой.

 Функция определения закрылось ли с минусом последняя сделка в истории, 1 - да, 2 - закрылась в 0, 0 - не закрылось в убыток. 

sy - символ  op - тип сделки mn - магик сделки   

int isCloseLastPosByStop(string sy="",int op=-1,int mn=-1)
  {
   datetime t;
   int      i,j=-1,k=OrdersHistoryTotal();

   if(sy=="0") sy=Symbol();
   for(i=0; i<k; i++)

     {
      if(OrderSelect(i,SELECT_BY_POS,MODE_HISTORY))
        {
         if(OrderSymbol()==sy || sy=="")
           {
            if(OrderType()==OP_BUY || OrderType()==OP_SELL)
              {
               if(op<0 || OrderType()==op)
                 {
                  if(mn<0 || OrderMagicNumber()==mn)
                    {
                     if(t<OrderCloseTime())
                       {
                        t=OrderCloseTime();
                        j=i;
                       }
                    }
                 }
              }
           }
        }
     }

   if(OrderSelect(j,SELECT_BY_POS,MODE_HISTORY))
     {
      if(OrderProfit()<0) return(1);
      if(OrderProfit()==0) return(2);
     }
   return(0);
  }
 
спасибо, буду пробывать.
 
Vladislav Andruschenko:

опционы или не опционы - разницы для кода нет.

а вот время в комментариях это не причуда языка - а свойство брокера. в комментарий вы ставите время в виде строки - сервер опционов принимает ее как время истечения сделки. Поэтому все стандартно

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

 Зачем здесь два раза одно и то же ? 

Вы здесь узнаете не последний ордер, а просто перебираете в конца массива сделок в истории до первого элемента. Поэтому у Вас лот всегда первый. Или 0 , потому что сделки нет еще. А Lots не известно какой.

 Функция определения закрылось ли с минусом последняя сделка в истории, 1 - да, 2 - закрылась в 0, 0 - не закрылось в убыток. 

sy - символ  op - тип сделки mn - магик сделки   

В интернете на других сайтах такой же код нашёл. Кто-то разработал.Но не хочется в советник ставить строки, которые до конца понять не могу. j присваивается сначала -1, потом 0.Мне нужно весь код понимать.
 

 Почему простой цикл последний ордер не определяет???


//+--------------------------Ордера с удвоенным лотом---------------+ 
double profitbuy()//профит закрытой покупки
{    
    for(int trade = OrdersHistoryTotal()-1; trade >=0; trade--)
    {
    OrderSelect(trade, SELECT_BY_POS, MODE_HISTORY);
    if(OrderSymbol() == Symbol() && OrderMagicNumber() == Magic  && OrderType()== OP_BUY)
      {      
       double profitb= OrderProfit();
       } 
    } 
    return(profitb);
}  
//+------------------------------------------------------------------+ 
double profitsell()// профит закрытой продажи
{    
    for(int trade = OrdersHistoryTotal()-1; trade >=0; trade--)
    {
    OrderSelect(trade, SELECT_BY_POS, MODE_HISTORY);
    if(OrderSymbol() == Symbol() && OrderMagicNumber() == Magic  && OrderType()== OP_SELL)
      {      
       double profits= OrderProfit();
       } 
    } 
    return(profits);
}  
//+------------------------------------------------------------------+ 
double lots()//объём закрытого  ордера
{    
    for(int trade = OrdersHistoryTotal()-1; trade >=0; trade--)
    {
    OrderSelect(trade, SELECT_BY_POS, MODE_HISTORY);
    if(OrderSymbol() == Symbol() && OrderMagicNumber() == Magic)
      {      
       double lots= OrderLots();
       } 
    } 
    return(lots);
}  
//+------------------------------------------------------------------+ 
       // Расчёт лота
       double Free =AccountFreeMargin();     
       double Lots = Free*0.1/100;
        
        // если ордер закрылся в минус, удваиваем объём
       if(profitbuy()<0) Lots=lots()*2;// при такой записи всегда выбирает <0(селл или бай)
       if(profitbuy()>0) Lots=lots()*1;
       if(profitsell()<0) Lots=lots()*2;
       if(profitsell()>0) Lots=lots()*1; 
 
D4135:

 Почему простой цикл последний ордер не определяет???


Потому, что все три цикла перебирают ордера от самого свежего до самого старого и возвращают значения для самого старого.
 
Vitalie Postolache:
Потому, что все три цикла перебирают ордера от самого свежего до самого старого и возвращают значения для самого старого.

     Как в значение return()  вернуть значение самого последнего закрытого ордера ?

 
   {
      if(OrderProfit()<0) return(1);
      if(OrderProfit()==0) return(2);
     }
   return(0);//если так, всё равно не получается.На форуме нашёл, что фильтр по времени закрытия надо обязательно ставить.
Более простым способом как записать.
//+-------------------Функция определения профита последнего закрытого ордера-----------------------+ 

double pr()
{
datetime time=0; 

 for(int f=OrdersHistoryTotal()-1; f>=0; f--)
 {
   if(OrderSelect(f,SELECT_BY_POS,MODE_HISTORY))
   {
      if(OrderSymbol()==Symbol())
      {
         if(OrderMagicNumber()==Magic || Magic==-1)
         {
            if(OrderCloseTime()>time) // находим последний в истории ордер
              {
               time=OrderCloseTime(); // запомним время
               double profit=OrderProfit();  // запомним профит
               double lots=OrderLots();    // запомним лот
              }


           }
       }
    }
   }
    return(profit); 
 }
//-----------------------------------------------------------

if(pr()<0) //если профит меньше нуля
   Lots=2; // Увеличим в два раза
   if(pr()>0) //если профит больше нуля
   Lots=1; //
Вродебы и по времени , и по всем параметрам сортирует, а не работает.
 Думаю может OrderProfit() в опционах нет такой функции, потому что в журнале профит пишется как Balans. хоть в минус, хоть в плюс.
 

Два дня парился, наконец то нашёл простую запись определения ордера.Всем спасибо, за помощь.

 
D4135:

Два дня парился, наконец то нашёл простую запись определения ордера.Всем спасибо, за помощь.

ВЫставите другим, может кто еще будет искать