需要基于SL和账户风险的资金管理LOT大小公式! - 页 4

 
darelco:

...在这部分代码中,有一个新的编译问题(错误--->'MarketInfo'---非法切换表达式类型),也许在更新到MT4 build 600+之前都是正常的...但从那时起它就不再工作了。

所以,你能不能发布一些更新的版本......当然,如果你还在的话。


我想如果你把

                switch ( MarketInfo( strSymbol, MODE_DIGITS ) )

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

它就可以编译了

 
darelco:

...在这部分代码中,有一个新的编译问题(错误--->'MarketInfo'---非法切换表达式类型),也许在更新到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)) )
 

在我的不同EA中,它是这样写的。

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: 在我不同的EA中,它是这样写的。

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


  1. 自由保证金与你的 风险没有关系。它是你的经纪商 的止损(你账户的50%。)
  2. 你应该阅读整个主题,而不是发帖。总结一下。
    • 你把止损放在它需要的地方--交易的理由不再有效的地方。例如,交易一个支撑位的反弹时,止损要低于支撑位。
    • 帐户余额*百分比/100=风险=订单手数*(|订单开盘价-订单止损|*DeltaPerLot+佣金PerLot)(注意OOP-OSL包括SPREAD,DeltaPerLot通常为10美元/点左右,但它考虑到了货币对与您帐户货币的汇率。
    • 不要单独使用TickValue -DeltaPerLot
    • 你必须正确地规范手数,并检查最小和最大
    • 你还必须检查FreeMargin以避免止损