Расчет оптимального объема лотов

 

Для начала хочу еще раз поблагодарить СТРАYС-а за помощь в реализации очень важной для меня возможности торговать одновременно несколькими экспертами по нескольким валютным парам. Спасибо СТРАYС.

Теперь появилась новая сложность. Есть в моих экспертах такая важная вещь, как расчет оптимального объема лотов:

//+------------------------------------------------------------------+//
| Расчет оптимального объема лотов                                 
double LotsOptimized()
  {//----
   double Lots=NormalizeDouble(AccountFreeMargin()*RiskMax/100000.0,1);
   if(Lots>LotsMax)
     {
      Lots=LotsMax;
     }
   
   int orders=HistoryTotal();
   int losses=0;
   
   if(DecreaseFactor>0)
     {
      for(int i=orders-1;i>=0;i--)
        {
         if(OrderSelect(i,SELECT_BY_POS,MODE_HISTORY)==false)
           {
            Print("Ошибка в истории!");
            break;
           }
         if(OrderSymbol()!=Symbol() || OrderType()>OP_SELL) continue;
         if(OrderProfit()>0) break;
         if(OrderProfit()<0) losses++;
        }
         if(losses>1)
           {
            Lots=NormalizeDouble(Lots/(DecreaseFactor*(losses+1)),1);
           }
       }
     if(Lots<0.1)
       {
        Lots=0.1;
       }       
//----
   return(Lots);
  }

Однако, смысл её существования в эксперте теряеться, когда торгует одновременно больше одного эксперта, т.к. экспертом учитаваеться лоси и профиты других экспертов. Можно-ли решить эту проблему вот так?:

//+------------------------------------------------------------------+//
| Расчет оптимального объема лотов                                 
double LotsOptimized()
  {//----
   double Lots=NormalizeDouble(AccountFreeMargin()*RiskMax/100000.0,1);
   if(Lots>LotsMax)
     {
      Lots=LotsMax;
     }
   
   int orders=HistoryTotal();
   int losses=0;
   
   if(DecreaseFactor>0)
     {
      for(int i=orders-1;i>=0;i--)
        {
         if(OrderSelect(i,SELECT_BY_POS,MODE_HISTORY)==false)
           {
            Print("Ошибка в истории!");
            break;
           }
         if((OrderSymbol()!=Symbol() && OrderMagicNumber()==MAGIC) || (OrderType()>OP_SELL && OrderMagicNumber()==MAGIC)) continue;
         if(OrderProfit()>0) break;
         if(OrderProfit()<0) losses++;
        }
         if(losses>1)
           {
            Lots=NormalizeDouble(Lots/(DecreaseFactor*(losses+1)),1);
           }
       }
     if(Lots<0.1)
       {
        Lots=0.1;
       }       
//----
   return(Lots);
  }

Если нет, то как решить эту проблему?

 
if((OrderSymbol()!=Symbol() && OrderMagicNumber()==MAGIC) || (OrderType()>OP_SELL && OrderMagicNumber()==MAGIC)) continue;
Громоздко как-то =)))
Я бы сделал так:
if( OrderSymbol() != Symbol() || OrderMagicNumber() != MAGIC || OrderType() > OP_SELL ) { continue; }
 
komposter писал (а):
if((OrderSymbol()!=Symbol() && OrderMagicNumber()==MAGIC) || (OrderType()>OP_SELL && OrderMagicNumber()==MAGIC)) continue;
Громоздко как-то =)))
Я бы сделал так:
if( OrderSymbol() != Symbol() || OrderMagicNumber() != MAGIC || OrderType() > OP_SELL ) { continue; }

Обратите внимание на этот кусок:

(OrderSymbol()!=Symbol() && OrderMagicNumber()==MAGIC)

Тут стоит не "или", а "и".

Уже проверил, не работает.

Может кто знает как отличить ордера одних экспертов от других в истории.

 
ExpertTrader:

Обратите внимание на этот кусок:

(OrderSymbol()!=Symbol() && OrderMagicNumber()==MAGIC)

Тут стоит не "или", а "и".

Уже проверил, не работает.

Может кто знает как отличить ордера одних экспертов от других в истории.

Я заметил. И это не правильное условие.
Вам же нужны ордера по текущему символу, и с заданным мейджиком?
Вот я и написал, что если "симол не тот ИЛИ мейджик не тот", то continue;
 
Вы правы. Сейчас попробую.
 
komposter, огромное Вам спасибо! Все работает как часы.
Причина обращения: