ロット数検査関数 checkLotSize

MetaTrader 4
GogoJungle
2019/08/02 22:00
94

ロット数が適切な数値であるか確認します。
不適切なロット数の場合には適切なロット数に修正します。
発注処理の直前などに実行することで、不正な取引によるエラーの発生を防ぎます。

double checkLotSize(
   double lots,
   string symbol=NULL
);

パラメータ
lots
検査を行うロット数。

symbol
トレードを行う通貨ペア名を入力します。
このパラメータは省略可能です。
省略された場合にはプログラムが適用されているチャートの通貨ペアにて計算が行われます。

戻り値
適切な数値に修正されたロット数。

ソースコード

double checkLotSize(double lots, string symbol=NULL){
   // 通貨ペアの指定が無かった場合はチャートの通貨ペアで計算
   if(symbol == NULL){
      symbol = Symbol();
   }
   
   // ロット数が最大発注数量より大きければ最大発注数量へ
   if(lots > SymbolInfoDouble(symbol, SYMBOL_VOLUME_MAX)){
      lots = SymbolInfoDouble(symbol, SYMBOL_VOLUME_MAX);
   }
   
   // ロット数が最小発注数量より大きければ最小発注数量へ
   if(lots < SymbolInfoDouble(symbol, SYMBOL_VOLUME_MIN)){
      lots = SymbolInfoDouble(symbol, SYMBOL_VOLUME_MIN);
   }
   
   // ロット数の桁数を修正
   if(SymbolInfoDouble(symbol, SYMBOL_VOLUME_STEP) == 0.1){
      lots = NormalizeDouble(lots, 1);
   }
   else{
      lots = NormalizeDouble(lots, 2);
   }
   
   return(lots);
}

サンプル1

#property copyright "Copyright 2016, gogojungle"
#property link      "http://labo.fx-on.com"
#property version   "1.00"
#property strict

extern double Lots = 0.1; //取引数量

void OnTick(){
   double lots = checkLotSize(Lots);
   // 発注処理
}

double checkLotSize(double lots, string symbol=NULL){
   // 通貨ペアの指定が無かった場合はチャートの通貨ペアで計算
   if(symbol == NULL){
      symbol = Symbol();
   }
   
   // ロット数が最大発注数量より大きければ最大発注数量へ
   if(lots > SymbolInfoDouble(symbol, SYMBOL_VOLUME_MAX)){
      lots = SymbolInfoDouble(symbol, SYMBOL_VOLUME_MAX);
   }
   
   // ロット数が最小発注数量より大きければ最小発注数量へ
   if(lots < SymbolInfoDouble(symbol, SYMBOL_VOLUME_MIN)){
      lots = SymbolInfoDouble(symbol, SYMBOL_VOLUME_MIN);
   }
   
   // ロット数の桁数を修正
   if(SymbolInfoDouble(symbol, SYMBOL_VOLUME_STEP) == 0.1){
      lots = NormalizeDouble(lots, 1);
   }
   else{
      lots = NormalizeDouble(lots, 2);
   }
   
   return(lots);
}

サンプル2
複数通貨で取引する場合などには、第2引数に通貨ペア名を指定する。

#property copyright "Copyright 2016, gogojungle"
#property link      "http://labo.fx-on.com"
#property version   "1.00"
#property strict

extern double Lots = 0.1; //取引数量

void OnTick(){
   double lots = checkLotSize(Lots, "EURUSD"); // 注釈1
   // 発注処理
}

double checkLotSize(double lots, string symbol=NULL){
   // 通貨ペアの指定が無かった場合はチャートの通貨ペアで計算
   if(symbol == NULL){
      symbol = Symbol();
   }
   
   // ロット数が最大発注数量より大きければ最大発注数量へ
   if(lots > SymbolInfoDouble(symbol, SYMBOL_VOLUME_MAX)){
      lots = SymbolInfoDouble(symbol, SYMBOL_VOLUME_MAX);
   }
   
   // ロット数が最小発注数量より大きければ最小発注数量へ
   if(lots < SymbolInfoDouble(symbol, SYMBOL_VOLUME_MIN)){
      lots = SymbolInfoDouble(symbol, SYMBOL_VOLUME_MIN);
   }
   
   // ロット数の桁数を修正
   if(SymbolInfoDouble(symbol, SYMBOL_VOLUME_STEP) == 0.1){
      lots = NormalizeDouble(lots, 1);
   }
   else{
      lots = NormalizeDouble(lots, 2);
   }
   
   return(lots);
}

注釈1 この行は全ブローカー対応に相応しくない書き方で書かれています。
参考:modifySymbol

CheckLotSize.zip

コメント

関連項目

検索結果がありません。