2015年12月14日月曜日

[MT4プログラミング]複利運用時のロットを求める計算式(損切値ベース)

ネタがないため、小ネタで・・・・。

複利運用時のコードですが、複利運用にもいろいろ考え方があります。

一つは、損切値があるPipsの場合、余剰証拠金の?%に限定するやり方です。
今回は、余剰証拠金の?%に限定するコードを書きたいと思います。

口座の余剰残高 / (1pipsあたりに動く金額 * 損切値)
で、損切になった場合、余剰残高がすべて消えるロット数が求まりますので、そのロット数に対してリスク値の%を掛ける計算です。


基本的には、まず、口座の余剰証拠金残高と1Pipsあたりに動くお金を計算します。
MarketInfo(symbol, MODE_TICKVALUE)
にて、1Tick/Lot あたりの口座通貨での動くお金の量が取得できます。業者の小数点桁数により1Tcik=1Pipsではないため、桁数をみてPipsあたりに変換しています。

その後、計算式に当てはめロット数を算出する形です。業者の最小ロットと最大ロットを超えないように制限をかけているのと、ロット数のステップあたりに丸めて最終ロット数を計算しています。

まぁ、発注時ベースの金額となっているため、実際にはレートが動いて実際の損切が発生した場合、指定のリスク分ちょうどにはなりませんが、そのあたりは誤差ということで・・・。

   // リミットは100pipsとする。
   double limit = 100.0;
   
   // リスクは2%
   double risk = 2.0 / 100.0;

   string symbol = Symbol();
   // ロットステップ
   double lotUnit = MarketInfo(symbol,MODE_LOTSTEP);
   // 最大ロット
   double maxLot = MarketInfo(symbol, MODE_MAXLOT);
   // 最小ロット
   double minLot = MarketInfo(symbol, MODE_MINLOT);
   
   //Pips計算 小数点桁数が3or5の場合、Point()*10=1pips
   int digit = (int)MarketInfo(symbol, MODE_DIGITS);
   // 1ロット取引したときに、最小Tickあたりに動く口座通貨ベースの金額
   double tickValue = MarketInfo(symbol, MODE_TICKVALUE);
   
   // 桁数を見てPips値に変換する。
   double pipsValue = tickValue;
   if( digit == 3 || digit == 5 )
   {
      pipsValue = tickValue * 10;
   }
   
   // 余剰証拠金
   double freeMargin = AccountFreeMargin();
   
   // 0除算対策
   double lot = 0;
   if( lotUnit > 0 && limit > 0 && pipsValue > 0 )
   {
      // ロット値の計算
      lot = freeMargin / ( limit * pipsValue ) * risk;
      
      // ステップ単位に丸める。
      lot = MathFloor(lot / lotUnit) * lotUnit;
   
      if( lot < minLot ) lot = minLot;
      if( lot > maxLot ) lot = maxLot;
   }
   
   Print("lot = ", lot);