複利でトレードするEA
複利とは、トレードによって証拠金が増えるほど、それに応じてEAの稼働ロットも増やしていくスタイルです。
- 単利:証拠金に応じたロット数
- 複利:証拠金+利益に応じたロット数
複利トレードは、口座の資金が取引により増えるたびに、ロット数を増やしていきます。
逆に資金が減って行くとロット数も減って行きます。
今回は移動平均線のゴールデンクロスとデッドクロスのロジックを活用した
複利でトレードするEAを作成してきたいと思います。
メタエディタ(MetaEditor)を立ち上げる
メタエディタ(MetaEditor)を立ち上げましょう。今回は名前を「Fukuri-EA」で作成します。
パラメーターを記述する
パラメーターを記述しましょう。
ロットをユーザーが設定するための変数Lotsを用意します。
input double Lots = 0.01; //ロット数
次に複利機能をON/OFFするための変数をbool型の変数を用意します。
input bool MM = false; //複利モードON/OFF
証拠金の%に応じて複利をするためのRisk変数を用意します。
input double Risk = 1.0; //1%の証拠金を対象に
あとはいつものようにトレードに必要な機能を用意しておきましょう。
input int StopLoss = 100;//ストップロス input int TakeProfit = 5;//利確 input int MagicNumber = 12345; //マジックナンバー input int MA_Short_period = 50;//MA期間 input int MA_Long_period = 100;//MA期間
パラメーター全体のソースコードは以下の記載しています。
input double Lots = 0.01; //ロット数 input bool MM = false; //複利モードON/OFF input double Risk = 1.0; //1%の証拠金を対象に input int StopLoss = 100;//ストップロス input int TakeProfit = 5;//利確 input int MagicNumber = 12345; //マジックナンバー input int MA_Short_period = 50;//MA期間 input int MA_Long_period = 100;//MA期間
OnTick()関数を記述する
OnTick()関数を記述しましょう。
まずは、移動平均線の過去と現在の変数を短期と長期両方用意します。
double kakoMAS,kakoMAL;//過去の短期MAと長期MA double genMAS,genMAL;//現在の短期MAと長期MA
過去のMAはシフトを1にしましょう。
//過去の短期MA kakoMAS = iMA(NULL,0,MA_Short_period,0,MODE_SMA,PRICE_CLOSE,1); //過去の長期MA kakoMAL = iMA(NULL,0,MA_Long_period,0,MODE_SMA,PRICE_CLOSE,1);
現在の足は0にしましょう。
//現在の短期MA genMAS = iMA(NULL,0,MA_Short_period,0,MODE_SMA,PRICE_CLOSE,0); //現在の長期MA genMAL= iMA(NULL,0,MA_Long_period,0,MODE_SMA,PRICE_CLOSE,0);
MMがtrueの時に複利機能をONにします。
そしてゴールデンクロス時とデッドクロス時にOrderSend関数でポジションを建てます。
その際にLotにLotSize()というユーザー定義関数を用意しました。
これが複利を計算する関数となります。
if(MM==true)//複利がONの場合
{
   //ゴールデンクロス時
   if(kakoMAS <+ kakoMAL && genMAS > genMAL)
   {
      OrderSend(Symbol(),OP_BUY,LotSize(),Ask,3,0,Ask+TakeProfit*Point*10,"Order Long",MagicNumber,0,Red);
   }
   //デッドクロス時
   if( kakoMAS >= kakoMAL && genMAS < genMAL)
   {
      OrderSend(Symbol(),OP_SELL,LotSize(),Bid,3,0,Bid-TakeProfit*Point*10,"Order Short",MagicNumber,0,Blue);
    }
}複利機能がOFの場合は通常通りにゴールデンクロスとデッドクロスはLotsでimputのLotsのサイズでトレードするようになっています。
{
   //ゴールデンクロス時
   if(kakoMAS <+ kakoMAL && genMAS > genMAL)
   {
      OrderSend(Symbol(),OP_BUY,Lots,Ask,3,0,Ask+TakeProfit*Point*10,"Order Long",MagicNumber,0,Red);
   }
   //デッドクロス時
   if( kakoMAS >= kakoMAL && genMAS < genMAL)
   {
      OrderSend(Symbol(),OP_SELL,Lots,Bid,3,0,Bid-TakeProfit*Point*10,"Order Short",MagicNumber,0,Blue);
    }
}OnTick()関数の全体のソースコードは以下に記載しています。
    double kakoMAS,kakoMAL;//過去の短期MAと長期MA
    double genMAS,genMAL;//現在の短期MAと長期MA
     
     //過去の短期MA
     kakoMAS = iMA(NULL,0,MA_Short_period,0,MODE_SMA,PRICE_CLOSE,1);
     //過去の長期MA
     kakoMAL = iMA(NULL,0,MA_Long_period,0,MODE_SMA,PRICE_CLOSE,1);
     //現在の短期MA
     genMAS = iMA(NULL,0,MA_Short_period,0,MODE_SMA,PRICE_CLOSE,0);
     //現在の長期MA
     genMAL= iMA(NULL,0,MA_Long_period,0,MODE_SMA,PRICE_CLOSE,0);
    
    if(MM==true)//複利がONの場合
    {
      //ゴールデンクロス時
      if(kakoMAS <+ kakoMAL && genMAS > genMAL)
      {
        OrderSend(Symbol(),OP_BUY,LotSize(),Ask,3,0,Ask+TakeProfit*Point*10,"Order Long",MagicNumber,0,Red);
      }
       //デッドクロス時
      if( kakoMAS >= kakoMAL && genMAS < genMAL)
      {
        OrderSend(Symbol(),OP_SELL,LotSize(),Bid,3,0,Bid-TakeProfit*Point*10,"Order Short",MagicNumber,0,Blue);
      }
    }
    else//複利がOFFの場合
    {
      //ゴールデンクロス時
      if(kakoMAS <+ kakoMAL && genMAS > genMAL)
      {
        OrderSend(Symbol(),OP_BUY,Lots,Ask,3,0,Ask+TakeProfit*Point*10,"Order Long",MagicNumber,0,Red);
      }
      //デッドクロス時
      if( kakoMAS >= kakoMAL && genMAS < genMAL)
      {
        OrderSend(Symbol(),OP_SELL,Lots,Bid,3,0,Bid-TakeProfit*Point*10,"Order Short",MagicNumber,0,Blue);
      }
    }
  }LotSize()を記述する
magnificationは倍率です。円口座とドル口座を分けるためです。
AccountCurrency()関数は、取引口座の基準となっている通貨の名前が返されます。
ですので円口座であればJPYやドル口座であればUSDなどです。
int magnification;//倍率 string currency = AccountCurrency(); //口座の通貨タイプ
AccountCurrency()関数で返って来た値がJPYであれば円口座で、
そうでなればドル口座として認識させます。
この際magnificationは10000の値に統一させるために
円口座のmagnificationは10000でドル口座は100に設定します。
if(currency == "JPY")//円口座の場合
{
  magnification = 10000;//1万円を対象
}
else//ドル口座の場合
{
  magnification = 100;//$100を対象
}複利計算をしていきます。
MathCeil()関数は小数点以下の数値を切り上げて整数値に丸めます。
AccountFreeMargin()関数は現在アカウントの余剰証拠金を返します。
ですので、わかりやすくすると
現在の余剰証拠金*リスク値/倍率→整数の値に変換
その変数の値に変換したものを100で割り、lotMMに格納します。
double lotMM = MathCeil(AccountFreeMargin()*Risk/magnification)/100;
lotMMから0.01を引きましょう。
lotMM = lotMM - 0.01;
そしてLotMMが最小ロットを下回っていないかと最大ロットを超えていないかをチェックします。
if(lotMM < 0.01) lotMM = 0.01;//最小ロット
 if(lotMM > 1.0) lotMM = MathCeil(lotMM);
 if(lotMM > 100) lotMM = 100;//最大ロット
最後にreturnでlotMMを戻り値として入れたら完了です。
return (lotMM);
LotSize()の全体のソースコードは以下に記載しています。
     int magnification;//倍率
     string currency = AccountCurrency(); //口座の通貨タイプ
     if(currency == "JPY")//円口座の場合
     {
         magnification = 10000;//1万円を対象
     }
     else//ドル口座の場合
     {
         magnification = 100;//$100を対象
     }
     //複利計算
     double lotMM = MathCeil(AccountFreeMargin()*Risk/magnification)/100;
     lotMM = lotMM - 0.01;
     if(lotMM < 0.01) lotMM = 0.01;//最小ロット
     if(lotMM > 1.0) lotMM = MathCeil(lotMM);
     if(lotMM > 100) lotMM = 100;//最大ロット
     return (lotMM);コンパイル
コンパイルして稼働して複利でロットが増えていたら完了です。
ソースコード全体
Fukuri-EAのソースコード全体は以下に記載しています。
//+------------------------------------------------------------------+
//|                                                    Fukuri-EA.mq4 |
//|                     Copyright 2020, FX-EA System Project Creator |
//|                        https://creator.fx-ea-system-project.com/ |
//+------------------------------------------------------------------+
#property copyright "Copyright 2020, FX-EA System Project Creator"
#property link      "https://creator.fx-ea-system-project.com/"
#property version   "1.00"
#property strict
input double Lots = 0.01; //ロット数
input bool MM = false; //複利モードON/OFF
input double Risk = 1.0; //1%の証拠金を対象に
input int StopLoss = 100;//ストップロス
input int TakeProfit = 5;//利確
input int MagicNumber = 12345; //マジックナンバー
input int MA_Short_period = 50;//MA期間
input int MA_Long_period = 100;//MA期間
//+------------------------------------------------------------------+
//| Expert initialization function                                   |
//+------------------------------------------------------------------+
int OnInit()
  {
//---
//---
   return(INIT_SUCCEEDED);
  }
//+------------------------------------------------------------------+
//| Expert deinitialization function                                 |
//+------------------------------------------------------------------+
void OnDeinit(const int reason)
  {
//---
   
  }
//+------------------------------------------------------------------+
//| Expert tick function                                             |
//+------------------------------------------------------------------+
void OnTick()
  {
//---
    double kakoMAS,kakoMAL;//過去の短期MAと長期MA
    double genMAS,genMAL;//現在の短期MAと長期MA
     
     //過去の短期MA
     kakoMAS = iMA(NULL,0,MA_Short_period,0,MODE_SMA,PRICE_CLOSE,1);
     //過去の長期MA
     kakoMAL = iMA(NULL,0,MA_Long_period,0,MODE_SMA,PRICE_CLOSE,1);
     //現在の短期MA
     genMAS = iMA(NULL,0,MA_Short_period,0,MODE_SMA,PRICE_CLOSE,0);
     //現在の長期MA
     genMAL= iMA(NULL,0,MA_Long_period,0,MODE_SMA,PRICE_CLOSE,0);
    
    if(MM==true)//複利がONの場合
    {
      //ゴールデンクロス時
      if(kakoMAS <+ kakoMAL && genMAS > genMAL)
      {
        OrderSend(Symbol(),OP_BUY,LotSize(),Ask,3,0,Ask+TakeProfit*Point*10,"Order Long",MagicNumber,0,Red);
      }
       //デッドクロス時
      if( kakoMAS >= kakoMAL && genMAS < genMAL)
      {
        OrderSend(Symbol(),OP_SELL,LotSize(),Bid,3,0,Bid-TakeProfit*Point*10,"Order Short",MagicNumber,0,Blue);
      }
    }
    else//複利がOFFの場合
    {
     //ゴールデンクロス時
     if(kakoMAS <+ kakoMAL && genMAS > genMAL)
     {
       OrderSend(Symbol(),OP_BUY,Lots,Ask,3,0,Ask+TakeProfit*Point*10,"Order Long",MagicNumber,0,Red);
     }
       //デッドクロス時
     if( kakoMAS >= kakoMAL && genMAS < genMAL)
     {
       OrderSend(Symbol(),OP_SELL,Lots,Bid,3,0,Bid-TakeProfit*Point*10,"Order Short",MagicNumber,0,Blue);
     }
    }
  }
//+------------------------------------------------------------------+
double LotSize()
{
     int magnification;//倍率
     string currency = AccountCurrency(); //口座の通貨タイプ
     if(currency == "JPY")//円口座の場合
     {
         magnification = 10000;//1万円を対象
     }
     else//ドル口座の場合
     {
         magnification = 100;//$100を対象
     }
     //複利計算
     double lotMM = MathCeil(AccountFreeMargin()*Risk/magnification)/100;
     lotMM = lotMM - 0.01;
     if(lotMM < 0.01) lotMM = 0.01;//最小ロット
     if(lotMM > 1.0) lotMM = MathCeil(lotMM);
     if(lotMM > 100) lotMM = 100;//最大ロット
     return (lotMM);
}
まとめ
今回は複利でトレードするEAについてでした。






コメント