Нужна формула размера LOT для управления капиталом, основанная на SL и риске счета! - страница 4

 
darelco:

... в этой части кода есть проблема с новой компиляцией (ошибка ---> 'MarketInfo' - illegal switch expression type), возможно, все было в порядке до обновления до MT4 build 600+ ... но с тех пор это больше не работает.

Поэтому, не могли бы вы выложить более новую версию... если, конечно, вы еще здесь.


Я думаю, если вы измените

                switch ( MarketInfo( strSymbol, MODE_DIGITS ) )

на

                int dig=MarketInfo( strSymbol, MODE_DIGITS ) ;
                switch ( dig )

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

 
darelco:

... в этой части кода есть проблема с новой компиляцией (ошибка ---> 'MarketInfo' - illegal switch expression type), возможно, все было в порядке до обновления до MT4 build 600+ ... но с тех пор это больше не работает.

Поэтому, не могли бы вы выложить более новую версию... если, конечно, вы еще здесь.


   switch((int)MarketInfo(strSymbol,MODE_DIGITS))
 

https://book.mql4.com/operators/switch

"Значениями Выражения и Параметров могут быть только значения типа int. Выражение может быть константой, переменной, вызовом функции или выражением. Каждый вариативный "случай" может быть обозначен целочисленной константой, символьной константой или константным выражением. Константное выражение не может включать переменные или вызовы функций."

 
angevoyageur:
   switch((int)MarketInfo(strSymbol,MODE_DIGITS))

И снова вы предлагаете более простое и лучшее решение.
 
GumRai:
И снова вы предлагаете более простое и лучшее решение.
Мы все учимся друг у друга.
 
                int dig=MarketInfo( strSymbol, MODE_DIGITS ) ;
                switch ( dig )
или
   switch((int)MarketInfo(strSymbol,MODE_DIGITS))
или стиль объекта (работает за исключением приведения указателей)
   switch( int(MarketInfo(strSymbol,MODE_DIGITS)) )
 

В моем другом советнике это выглядит следующим образом:

extern double      Risk_Percent                   = 3;
extern int         StopLoss                       = 50;

//+------------------------------------------------------------------+
  {
   double lot = MathCeil(AccountFreeMargin() * Risk_Percent / 1000) / 100;
   if(lot<MarketInfo(Symbol(),MODE_MINLOT))lot=MarketInfo(Symbol(),MODE_MINLOT);
   if(lot>MarketInfo(Symbol(),MODE_MAXLOT))lot=MarketInfo(Symbol(),MODE_MAXLOT);
   return (MathMin(NormalizeDouble(lot,PipMultiplier),MaxLotSize));
  }
//+------------------------------------------------------------------+
   if(_Digits==5 || _Digits==3)PipMultiplier=10;
   else PipMultiplier=1;
   slippage=Slippage*PipMultiplier;
   if(_Digits<4)
     {
      point=0.01;
     }
   else
     {
      point=0.0001;
     }
   return(0);
//+------------------------------------------------------------------+

 
Sebastien Pelle: В моих разных советниках написано так:

   double lot = MathCeil(AccountFreeMargin() * Risk_Percent / 1000) /


  1. Свободная маржа не имеет ничего общего с вашим риском. Это стоп-лосс вашего брокера (50% вашего счета).
  2. Вам следовало прочитать всю тему, а не писать здесь. Резюмирую:
    • Вы размещаете стоп там, где он должен быть - там, где причина для торговли больше не актуальна. Например, при торговле на отскоке от поддержки стоп опускается ниже поддержки.
    • Баланс счета * процент/100 = РИСК = OrderLots * (|OrderOpenPrice - OrderStopLoss| * DeltaPerLot+ CommissionPerLot) (Примечание OOP-OSL включает SPREAD, а DeltaPerLot обычно составляет около $10/pip, но он учитывает обменные курсы пары по отношению к валюте вашего счета).
    • НЕ используйте TickValue само по себе - DeltaPerLot.
    • Вы должны правильно нормализовать лоты и проверить их на min и max.
    • Вы также должны проверить FreeMargin, чтобы избежать стоп-аута.
Причина обращения: