Правильное определение размера лота. Минимальный размер лота и шаг изменения лота.

 
Есть такая функция:
extern int RiskMax=10; //Максимальный риск (%)
 
//+------------------------------------------------------------------+
//| Расчет оптимального размера лота                                 |
//+------------------------------------------------------------------+
double LotsOptimized()
  {
//----
   double Lots=NormalizeDouble(AccountBalance()*RiskMax/100000.0,1);
   if(AccountFreeMargin()<(1000*Lots))
     {
      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)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(AccountFreeMargin()<(1000*Lots))

Не будет правильно допустим для евро.

А еще есть:

double LotsMin=MarketInfo(Symbol(),MODE_MINLOT); //Минимальный размер лота
double LotsStep=MarketInfo(Symbol(),MODE_LOTSTEP); //Шаг изменения лота

Как бы правильно зделать расчет для таких валют как евро, фунт. .. При этом учитывая минимальный размер лота и шаг изменения лота.

 

честно говоря, не понял в чём проблема...

 
CTPAYC писал (а):

честно говоря, не понял в чём проблема...

if(AccountFreeMargin()<(1000*Lots)) - т.е. на один лот 1000, а к примеру для евро надо уже больше, сейчас почти 1300... Это первая проблема, вторая, шаг лота.
 
ExpertTrader:
if(AccountFreeMargin()<(1000*Lots)) - т.е. на один лот 1000, а к примеру для евро надо уже больше, сейчас почти 1300... Это первая проблема, вторая, шаг лота.
Дык Bid*1000 =)
 
Во блин, так просто, ну я туплю, заработался наверное. Спасибо. ;)
 
А вторую проблему как решить, как учитывать шаг лота?
 
ExpertTrader:
А вторую проблему как решить, как учитывать шаг лота?
Я, если чесно, тоже не понял, в чём проблема =)
 
komposter писал (а):
ExpertTrader писал (а):
А вторую проблему как решить, как учитывать шаг лота?
Я, если чесно, тоже не понял, в чём проблема =)


Ну например, на счете одного ДЦ можно открыть от 0,1 до 10 лотов с шагом 0,1 (0,1...0,2...0,3... и т. д.) , на счете второго ДЦ можно открыть от 1 до 100 лотов с шагом 1 (1...2...3... и т. д.), на счете третьего ДЦ можно открыть от 10 до 1000 лотов с шагом 10 (10...20...30... и т. д.).

Если использовать шаг в 0,1 на счете с шагом в 1, то размер лота будет некоректным, например 1,1.

 
А это не подходит?
MarketInfo(Symbol(),MODE_LOTSTEP);
 

Подойти должно, а вот куда засунуть в функцию расчета оптимального размера лота чего-то не пойму.

 
Во-первых, вместо
     if(Lots<0.1)
       {
        Lots=0.1;
       }
надо написать
     if(Lots<MarketInfo(Symbol(),MODE_MINLOT))
       {
        Lots=MarketInfo(Symbol(),MODE_MINLOT);
       }


Во-вторых, сразу после этого надо добавить:
   double raznica = MathMod( Lots, MarketInfo(Symbol(),MODE_LOTSTEP) );
   if ( raznica > 0.0 ) Lots -= raznica;


Должно работать ;)


ps: настоятельно рекомендую все выражения и переменные нормализовывать перед сравнением. Речь идёт о размере лота - ошибка может быть достаточно обидной...
Причина обращения: