今回は、MT4のEAサンプルソース(FX用)を公開します。
トレードに使うテクニカル分析はボリンジャーバンドで、順張りエントリーをしています。
はじめに
ボリンジャーバンドの王道?である3σタッチで逆張りエントリーをするEAを最初作ったのですが全然利益がでず、思い切って順張りエントリーしていくとすんなり利益を出す事ができました。
なので、ここではボリンジャーバンドのσタッチで少し下げてから順張りをするといった感じのロジックになっています。
EAの仕様
それでは、今回のソースコードのエントリー/決済/パラメータ設定についての仕様を説明します。
エントリータイミング
基本的なボリンジャーバンドの値(上線、下線の値)を使って判断するようにしています。
ロングエントリー
ボリンジャーバンドの上3σタッチで買いエントリー待機です。その後、上2σ水準に来るまでは待ち(グローバル変数のwaitBB=1で管理)ます。waitBB=1でかつ上2σの水準まで来たら買いエントリーします。
こんな感じです。
ショートエントリー
ボリンジャーバンドの下3σタッチで売りエントリー待機です。その後、下2σ水準に来るまでは待ち(グローバル変数のwaitBB=-1で管理)ます。waitBB=-1でかつ下2σの水準まで来たら売りエントリーします。
決済タイミング
OCOの形で、損利共に22pipsです。
その他の仕様
設定値は以下の通りです。
- BB_KIKAN = 20 ⇒ ボリンジャーバンドの期間です
- Lots = 0.01 ⇒ ロット数です(0.01=1000通貨)
- SL = 220 ⇒ 損切り幅(220=22pips)
- TP = 220 ⇒ 利確幅(220=22pips)
既に建玉がある場合は追加でエントリーはしません。
値段が変わる度に処理を行いエントリー判断します。
EAレポート結果
2005年~2020年の期間の1時間足でバックテスト確認してみました。
今回は値段が変わる度に処理を行うタイプで作ったので、全ティックでのテストとなっています。全ティックでの開発とテストは、時間がかなり増えてしまうので個人的にあまり好きではないですね・・・。
※他のサンプルを見てもらったらわかりますが、足が確定した後にエントリーするタイプで基本作っています
結果を見た感じ、2σタッチでエントリーだと早すぎるのかも?1σタッチでエントリーとする等エントリーどころをもっと考えていけばもっと良くなるかもという印象でした。
ダウンロード
上記のEAファイルになります。
“ボリンジャーバンドEA” をダウンロード 2_BB.ex4 – 3609 回のダウンロード – 8.15 KBソースコード
以下サンプルソースコードになります。
※丸々コピペでコンパイルできます
//+------------------------------------------------------------------+
//| Bollinger bands_Sample.mq4 |
//| Copyright 2020, mef Software. |
//| https://fx-prog.com/ |
//+------------------------------------------------------------------+
#property copyright "Copyright 2020, mef Software."
#property link "https://fx-prog.com/"
#property version "1.00"
input int BB_KIKAN = 20;
input double Lots = 0.01;
input int SL = 220;
input int TP = 220;
double waitBB;
datetime prevtime;
//+------------------------------------------------------------------+
//| Expert initialization function |
//+------------------------------------------------------------------+
int init()
{
//---
//---
return(INIT_SUCCEEDED);
}
//+------------------------------------------------------------------+
//| Expert tick function |
//+------------------------------------------------------------------+
int start()
{
int orderPtn=0; //0:何もしない 1:買い 2:売り
int total=0;
int errorcode; // エラーコード
int ea_ticket_No,ea_order_entry_Type=0,ea_order_MagicNo; // チケットNo,エントリタイプ,マジックNo.
double ea_order_stop_price=0,ea_order_good_price=0,ea_order_entry_price=0; //ストップロスレート,利確レート,エントリーレート
//---
//ボリンジャーバンドの値を取得
double BB3UP = iBands(NULL,0,BB_KIKAN,3,0,PRICE_CLOSE,MODE_UPPER,0); //3σの上側
double BB3LO = iBands(NULL,0,BB_KIKAN,3,0,PRICE_CLOSE,MODE_LOWER,0); //3σの下側
double BB2UP = iBands(NULL,0,BB_KIKAN,2,0,PRICE_CLOSE,MODE_UPPER,0); //2σの上側
double BB2LO = iBands(NULL,0,BB_KIKAN,2,0,PRICE_CLOSE,MODE_LOWER,0); //2σの下側
//***売買判断箇所***//
//Askがボリンジャーバンドの上3σタッチで買いサイン
if(BB3UP < Ask)
{
orderPtn=1;
}
//Bidがボリンジャーバンドの下3σタッチで売りサイン
else if(BB3LO > Bid)
{
orderPtn=2;
}
//それ以外は何もしない
else
{
orderPtn=0;
}
//買いの場合 または 買い待ちの場合
if((orderPtn==1) || waitBB>0 )
{
//2σ内で買いエントリー
if((BB2UP > Ask && BB2LO < Bid ))
{
orderPtn=1;
waitBB=0;
}else{
orderPtn=0;
waitBB=1;
}
}
//売りの場合 または 売り待ちの場合
if((orderPtn==2) || waitBB<0 )
{
//2σ内で売りエントリー
if((BB2LO < Bid && BB2UP > Ask ))
{
orderPtn=2;
waitBB=0;
}else{
orderPtn=0;
waitBB=-1;
}
}
//***売買判断箇所***//
total=OrdersTotal();
if(total == 1){
//既に建玉を保有していたら何もしない
waitBB=0;
}
//***エントリー箇所***//
else if(total == 0 && orderPtn > 0)
{
if(orderPtn == 1)
{
ea_order_entry_price = Ask; // 現在の買値でエントリー
ea_order_entry_Type = OP_BUY; //OP_BUY
ea_order_stop_price = Ask - SL * Point; //損切りポイント
ea_order_good_price = Ask + TP * Point; //利喰いポイント
}
else if(orderPtn == 2)
{
ea_order_entry_price = Bid; // 現在の売値でエントリー
ea_order_entry_Type = OP_SELL; //OP_SELL
ea_order_stop_price = Bid + SL * Point; //損切りポイント
ea_order_good_price = Bid - TP * Point; //利喰いポイント
}
ea_order_MagicNo=0000; //マジックナンバーは0000固定とする
ea_ticket_No = OrderSend( // 新規エントリー注文
NULL, // 通貨ペア
ea_order_entry_Type, // オーダータイプ[OP_BUY / OP_SELL]
Lots, // ロット(0.01単位,FXTFは1=10Lot)
ea_order_entry_price, // オーダープライスレート
20, // スリップ上限
ea_order_stop_price, // ストップレート
ea_order_good_price, // リミットレート
"テストオーダー", // オーダーコメント
ea_order_MagicNo, // マジックナンバー(識別用)
0, // オーダーリミット時間
clrRed // オーダーアイコンカラー
);
if ( ea_ticket_No == -1) // オーダーエラー
{
errorcode = GetLastError(); // エラーコード取得
if( errorcode != ERR_NO_ERROR) // エラー発生
{
printf("エラー");
}
}
else { // 注文約定
Print("新規注文約定。 チケットNo=",ea_ticket_No);
}
}
return(0);
}
3σで売り買いしたい場合
上記サンプルソースは2σでエントリーするタイプで作りましたが、もし3σでエントリーしたいといった場合、以下の部分を全て削除してもらったら3σで売り買いするようになります。
//買いの場合 または 買い待ちの場合
if((orderPtn==1) || waitBB>0 )
{
//2σ内で買いエントリー
if((BB2UP > Ask && BB2LO < Bid ))
{
orderPtn=1;
waitBB=0;
}else{
orderPtn=0;
waitBB=1;
}
}
//売りの場合 または 売り待ちの場合
if((orderPtn==2) || waitBB<0 )
{
//2σ内で売りエントリー
if((BB2LO < Bid && BB2UP > Ask ))
{
orderPtn=2;
waitBB=0;
}else{
orderPtn=0;
waitBB=-1;
}
}
主な構文
iBands()
【使用例】 iBands(NULL,0,20,3,0,PRICE_CLOSE,MODE_UPPER,0);
今回は、ボリンジャーバンドの値を取得できるiBands()関数を使っています。
※何で今回はいつも使っているiCustom()関数じゃないのかというと・・・、カスタムインジケータにボリンジャーバンドが存在しないからです(※MACDは存在しますが・・・)
引数は以下の通りです。
- 通貨ペア(NULLで当該通貨)
- 時間軸(0で当該時間軸)
- 期間(メインのラインとなる期間です)
- 偏差(3:3σ、2:2σ、1:1σ)
- 表示移動
- 適用価格
- モード(MODE_MAIN:中心線 MODE_UPPER:上線 MODE_LOWER:下線)
- バーシフト
基本的に、3,4,7,8ぐらいしか触らなさそうな設定ですね。
3:期間、4:偏差、5:表示移動、6:適用価格はMT4のボリンジャーバンド設定画面上で見るとイメージしやすいですね。
7:モードは、上線の値が欲しい場合はMODE_UPPERとし、中央線の値が欲しい場合はMODE_MAIN、下線の値が欲しい場合はMODE_LOWERとします。
8:バーシフトは過去のボリンジャーバンド値をとりたい場合変更します(0:最新バーの位置、1:1つ前のバーの位置)
さいごに
以上、ボリンジャーバンドを使ったEAのサンプルソースでした。
今回は、ボリンジャーバンドの王道である3σで逆張りが全然機能しなかったので、順張り方向でのエントリーで考える事で何とか利益を出すことができました。利確ポイントや損切りポイントをもっと作り込むと3σで逆張りパターンの方が利益を出しやすいのかも・・・?
ただ、ボリンジャーバンドでも単純に順張りエントリーの方で利益が出せるというのは収穫でした。
※ MT4・EAが使えるFX会社のおすすめ
※ EAのサンプルソースを一覧表にまとめました
コメント