初心者でもできる自作EAの作成方法2

プロフィール

EAの大魔術師
この世に生まれ何とか勉強していくことで誤魔化しで大学院まで進学したが、就職がうまくいかずIT系の中小企業に就職する。社会人になり将来の不安と日々のストレスと絶望感を味わいながら何とか脱サラを目指しブログと投資を実施中。

 

 

EAの基本的なコードがわかったら今度はもう一歩踏み出して実際にEAを作成してみましょう。

EAの外部パラメータを記述してみ よう

extern int    MagicNo   = 1;   // 買いマジックナンバー
extern int    Slippage  = 30;  // 許容スリッページ
extern double LotSize   = 0.1; // 売買ロット数

変数の前にexternと記載することで変数を外部パラメータとして定義することができます。外部パラメータで定義した変数にはEA稼働時にパラメータとして指定できるようになります。

インジケータの値を取得してみよう

インジケータを取得する場合は専用の関数が用意されていますので関数をそのまま記述するだけで簡単にインジケータの値が取得できます。

今回はボリンジャーバンドの値を取得してみます。 ボリンジャーバンドはiBandsという関数を使えばボリンジャーバンドの値を取得できます。 iBandsという関数を詳しく見ていきましょう。

double iBands(string symbol,int timeframe,int period,double deviation,int bands_shift,int applied_price,int mode,int shift);

string symbol
通貨ペアを指定するための引数です。現在のチャートの通貨ペアの値を取得したい場合はNULLを指定します。

int timeframe
時間軸を指定するための引数です。現在のチャートの時間軸を指定したい場合は0を指定します。

int period
ボリンジャーバンドの期間を指定するための引数です。

double deviation
σ(シグマ)を指定するための引数です。

int bands_shift
ボリンジャーバンドの値を右にいくつシフトするかを指定するための引数です。

int applied_price
ボリンジャーバンドの計算に適用する価格を指定するための引数です。

int mode
ボリンジャーバンドの上下バンドを指定するための引数です。

int shift
ボリンジャーバンドの計算結果の取得位置を指定するための引数です。

実際にボリンジャーバンドの値を取得してみましょう。

// 1つ前の足のボリンジャーバンドの+2σで上バンドの値を取得
double BollingerBand = iBands(NULL,0,60,2,0,PRICE_CLOSE,MODE_UPPER,1);

エントリーの条件を決めよう

今回はボリンジャーバンドの+2σで逆張りとしてみます。

if(High[1] >=  BollingerBand){
    OrderSend(Symbol(),OP_SELL,Lots,Bid,Slippage,Close[0] + 0.5,Close[0] - 0.5,"sell",MagicNo,0,Red);
}

High[1]
一つ前の足の高値を取得します。

ifを使用して括弧の中の条件を満たした場合に指定する処理を実行することができます。

OrderSendという関数を用いることで注文を出すことができます。 OrderSend を詳しく見ていきましょう。

int OrderSend(string symbol,int cmd,double volume,double price,int slippage,double stoploss,double takeprofit,string comment=NULL,int magic=0,datetime expiration=0,color arrow_color=clrNONE);

string symbol
通貨ペアを指定するための引数です。現在のチャートの通貨ペアの値を取得したい場合はNULLを指定します。

int cmd
注文方法を指定します。

double volume
ロットを指定します。

double price
注文価格を指定します。

int slippage
最大スリッページを指定します。

double stoploss
ストップロスを指定します。

double takeprofit
テイクプロフィットを指定します。

string comment
注文時のコメントを指定します。

int magic
マジックナンバーを指定します。

datetime expiration
注文の有効期限を指定します。

color color arrow_color
注文が通った時にチャート上に表示する矢印の色をしています。

クローズ条件を決めよう

今回はボリンジャーバンドの逆側のバンドに達したら決済してみます。

// クローズ処理  for(int i = OrdersTotal() - 1; i >= 0; i--){
     if(OrderSelect(i, SELECT_BY_POS, MODE_TRADES)){        // 本EAのポジションの場合
        if(OrderMagicNumber() == MagicNo){
           if(OrderType() == OP_BUY){
              if(High[1] >= iBands(NULL,0,20,2,0,PRICE_CLOSE,MODE_UPPER,1)){
                 OrderClose(OrderTicket(),OrderLots(),Bid,pSlippage,White);
              }
           }
           if(OrderType() == OP_SELL){
              if(Low[1] <= iBands(NULL,0,20,2,0,PRICE_CLOSE,MODE_LOWER,1)){
                 OrderClose(OrderTicket(),OrderLots(),Ask,pSlippage,White);
              }
           }
        }
     }
  }

for分を使うことで処理を繰り返すことができます。
for(int i = OrdersTotal() - 1; i >= 0; i--)は注文の最大数から0まで処理を繰り返すという意味なのでつまり、今の注文すべてに対して処理することになります。

最後に全体のコードを見てみましょう。
後はコンパイルすれば完成です。

extern int        MagicNo         = 018907;              // 買いマジックナンバー
extern int        Slippage          = 30;                     // 許容スリッページ
extern double LotSize            = 0.1;                    // 売買ロット数
//+------------------------------------------------------------------+ 
//| スタート関数                                                        |
 //+------------------------------------------------------------------+ 
int start(){
     static datetime time = Time[0];     //バーの始値でトレード可能かチェック
     if(time != Time[0]){
        time = Time[0];
        if(!IsTradeAllowed() || OrdersTotal()!=0){
           return(0);
        }
     // クローズ処理
      for(int i = OrdersTotal() - 1; i >= 0; i--){
       if(OrderSelect(i, SELECT_BY_POS, MODE_TRADES)){
          // 本EAのポジションの場合
          if(OrderMagicNumber() == MagicNo){
             if(OrderType() == OP_BUY){
                if(High[1] >= iBands(NULL,0,20,2,0,PRICE_CLOSE,MODE_UPPER,1)){
                   OrderClose(OrderTicket(),OrderLots(),Bid,Slippage,White);
                }
             }
             if(OrderType() == OP_SELL){
                if(Low[1] <= iBands(NULL,0,20,2,0,PRICE_CLOSE,MODE_LOWER,1)){
                   OrderClose(OrderTicket(),OrderLots(),Ask,Slippage,White);
                }
             }
          }
       }
    }
    // ボリンジャーバンドの+2σで上バンドの値を取得
    double BollingerBand = iBands(NULL,0,60,2,0,PRICE_CLOSE,MODE_UPPER,1);
    if(High[1] >= BollingerBand){
       OrderSend(Symbol(),OP_SELL,LotSize,Bid,Slippage,Close[0] + 0.5,0,"sell",MagicNo,0,Red);
    }
  }
  return(0);
 }

もしプログラミングの理解がどうしても難しい場合はEAつくーるというソースコードを自動生成してくれるソフトをオススメします↓

『EAつくーる』
MQL言語の学習ができ、裁量トレーダーもEA開発が可能になる!
MQL言語の学習ができ、裁量トレーダーもEA開発が可能になる!?|?fx-on.com

EAつくーるを用いれば、自分の作りたい条件でEAをプログラミングなしで作成できるのでソースコードの参考にもなるし、プログラミングができない人でもEAを作成することができます。

まずは1ヶ月版を試して使えそうなら製品版の購入をオススメします↓

EAつくーる【1ヶ月版】
MQL言語の学習ができ、裁量トレーダーもEA開発が可能になる!
MQL言語の学習ができ、裁量トレーダーもEA開発が可能になる!?|?fx-on.com

初心者でもできるプログラミング基礎から学ぶ自作EAの作成方法
初心者でもできるプログラミング基礎から学ぶ自作EAの作成方法
自作EAの作成方法を1から説明したいと思います。 今回はプログラミングの知識がほとんどない方を対象して説明しようと思います。 プログラミング...