SLと口座リスクに基づいたマネーマネジメントのLOTサイズ計算式が必要! - ページ 4

 
darelco:

...コードのこの部分は、新しいコンパイルの問題です(エラー ---> 'MarketInfo' - 不法なスイッチ式タイプ)おそらくそれは、MT4ビルド600 +への更新まではすべてOKでした...しかし、それ以来、それはもう動作しません。

ということで、何か新しいバージョンを投稿していただけないでしょうか・・・もちろん、まだご存じであればの話ですが。


私は、もしあなたが

                switch ( MarketInfo( strSymbol, MODE_DIGITS ) )

にしてください。

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

それは大丈夫にコンパイルされます

 
darelco:

...コードのこの部分は、新しいコンパイルの問題です(エラー ---> 'MarketInfo' - 不法なスイッチ式タイプ)おそらくそれは、MT4ビルド600 +への更新まではすべてOKでした...しかし、それ以来、それはもう動作しません。

そこで、何か新しいバージョンを投稿していただけないでしょうか・・・もちろん、まだご存じであればの話ですが。


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

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

「ExpressionとParametersの値は、int 型の値のみです。Expressionは定数、変数、関数呼び出し、または式にすることができます。 各バリエーションの'場合'は、整数定数、文字定数、または定数式でマークすることができます。定数式には、変数や関数呼び出しを含めることはできません。"

 
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 = リスク = OrderLots * (|OrderOpenPrice - OrderStopLoss| *DeltaPerLot+ CommissionPerLot) (OOP-OSL には SPREAD が含まれ、DeltaPerLot は通常約 $10/pip ですが、ペアと口座通貨の為替レートを考慮します).
    • TickValueを単独で使用しないでください -DeltaPerLot
    • ロットを適切に正規化 し、最小値と最大値を チェックする必要があります。
    • ストップ・アウトを 避けるために、FreeMarginもチェックしなければなりません。