今回は、MT4のEAサンプルソース(FX用)を公開します。
トレードに使うテクニカル分析はアリゲーター(Alligator)で、順張りエントリーをしています。
はじめに
アリゲーターは移動平均線の組み合わせと似たようなもので、とてもシンプルです。トレンドを認識するうえでも結構使えますので、初心者用にもオススメのインジケータとなっています。
今回、以下の記事ではゴールデンクロス・デッドクロスでエントリーしていくサンプルを載せています。
EAの仕様
それでは、今回のソースコードのエントリー/決済/パラメータ設定についての仕様を説明します。
エントリータイミング
ロングエントリー
リップスラインのゴールデンクロスでロングエントリーします。
- ①リップスラインの値が、ティースラインより高くなっている
- ②リップスラインの値が、ジョーズラインより高くなっている
- ③ジョーズラインが、直近で上向きである
- ④ローソク足の終値が、リップスラインより高くなっている
この4つの条件がそろった場合、ロングエントリーします。
ショートエントリー
リップスラインのデッドクロスでショートエントリーします。
- ①リップスラインの値が、ティースラインより低くなっている
- ②リップスラインの値が、ジョーズラインより低くなっている
- ③ジョーズラインが、直近で下向きである
- ④ローソク足の終値が、リップスラインより低くなっている
この4つの条件がそろった場合、ショートエントリーします。
エントリー例
大きなトレンドがあると、うまくエントリーできるような感じです。
決済タイミング
エントリー時、ジョーズライン-30pipsに逆指値を設定します。指値は設定しません。
ロング中
決済タイミングは、ショートエントリーのサインが出るかつローソク足の終値が、リップスラインより低くなっている場合です。
ショート中
決済タイミングは、ロングエントリーのサインが出るかつローソク足の終値が、リップスラインより高くなっている場合です。
その他の仕様
設定値は以下の通りです。
- J_KIKAN = 13 ⇒ ジョーズラインの期間です
- J_Shift = 8 ⇒ ジョーズラインの表示移動です
- T_KIKAN = 8 ⇒ ティースラインの期間です
- T_Shift = 5 ⇒ ティースラインの表示移動です
- L_KIKAN = 5 ⇒ リップスラインの期間です
- L_Shift = 3 ⇒ リップスラインの表示移動です
- A_SPREAD = 20 ⇒ エントリー時に許容するスプレッドの値です(20 = 2pips)
- Lots = 0.01 ⇒ ロット数です(0.01=1000通貨)
- SL = 300 ⇒ ストップロスまでのポイントです
既にポジションがある場合は追加でエントリーしません。
新しい足(バー)が出来た際に1度だけ処理を行います。※1時間足の場合だと1時間に1回処理する
EAレポート結果
2005年~2020年の期間の1時間足でバックテスト確認してみました。ばりばりの最適化で良い値を選んだのですが、パラメータが何であっても割と高いプロフィットファクタになります。
ちなみに、デフォルト値の場合はこちら。
デフォルト値でも、プロフィットファクターが1.17あります。
1時間足なのに総取引数が2600近くも・・・、多いですね。実際にサンプルソースをコンパイルしてトレード内容を見てもらうとわかりますが、ほぼずっとポジションを保持している感じです。なので改良の余地は多大にありかなりポテンシャルは高いのではないかと思います。トレンドフォロー系のEA強いなーと思いました。
ダウンロード
上記のEAファイルになります。
“アリゲーターEA” をダウンロード 5_Alligator.ex4 – 1421 回のダウンロード – 11.40 KBソースコード
以下サンプルソースコードになります。
※丸々コピペでコンパイルできます
//+------------------------------------------------------------------+
//| Alligator_TEST.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 J_KIKAN = 13;
input int J_Shift = 8;
input int T_KIKAN = 8;
input int T_Shift = 5;
input int L_KIKAN = 5;
input int L_Shift = 3;
input int A_SPREAD = 20;
input double Lots = 0.01;
input int SL = 300;
datetime prevtime;
//+------------------------------------------------------------------+
//| Expert initialization function |
//+------------------------------------------------------------------+
int init()
{
//---
//---
return(INIT_SUCCEEDED);
}
//+------------------------------------------------------------------+
//| Expert tick function |
//+------------------------------------------------------------------+
int start()
{
int orderPtn=0; //0:何もしない 1:買い 2:売り
int total=0;
double ea_order_stop_price=0,ea_order_good_price=0; //ストップロスレート,利確レート,エントリーレート
bool OrderKekka;
//---
//新しい足ができた時だけやる
if(Time[0] != prevtime){
prevtime = Time[0];
}else{
return(0);
}
//***売買判断箇所***//
//ジョーズライン
double JAW_ATAI_1 = iAlligator(NULL, 0, J_KIKAN, J_Shift, T_KIKAN, T_Shift, L_KIKAN ,L_Shift, MODE_SMMA, PRICE_MEDIAN, MODE_GATORJAW, 1);
double JAW_ATAI_2 = iAlligator(NULL, 0, J_KIKAN, J_Shift, T_KIKAN, T_Shift, L_KIKAN ,L_Shift, MODE_SMMA, PRICE_MEDIAN, MODE_GATORJAW, 2);
//ティースライン
double TEETH_ATAI_1 = iAlligator(NULL, 0, J_KIKAN, J_Shift, T_KIKAN, T_Shift, L_KIKAN ,L_Shift, MODE_SMMA, PRICE_MEDIAN, MODE_GATORTEETH, 1);
double TEETH_ATAI_2 = iAlligator(NULL, 0, J_KIKAN, J_Shift, T_KIKAN, T_Shift, L_KIKAN ,L_Shift, MODE_SMMA, PRICE_MEDIAN, MODE_GATORTEETH, 2);
//リップスライン
double LIPS_ATAI_1 = iAlligator(NULL, 0, J_KIKAN, J_Shift, T_KIKAN, T_Shift, L_KIKAN ,L_Shift, MODE_SMMA, PRICE_MEDIAN, MODE_GATORLIPS, 1);
double LIPS_ATAI_2 = iAlligator(NULL, 0, J_KIKAN, J_Shift, T_KIKAN, T_Shift, L_KIKAN ,L_Shift, MODE_SMMA, PRICE_MEDIAN, MODE_GATORLIPS, 2);
//ローソク足の1つ前のクローズ値情報を取得しておく
double rosokuValueCloseP = iClose(NULL, 0, 1);
//リップスラインのゴールデンクロスでロング(ジョーズラインが上を向いている事)
if(LIPS_ATAI_1 > TEETH_ATAI_1 && LIPS_ATAI_1 > JAW_ATAI_1 && JAW_ATAI_2 < JAW_ATAI_1 && rosokuValueCloseP > LIPS_ATAI_1)
{
//ロングエントリー
orderPtn=1;
}
//リップスラインのデッドクロスでショート(ジョーズラインが下を向いている事)
else if(LIPS_ATAI_1 < TEETH_ATAI_1 && LIPS_ATAI_1 < JAW_ATAI_1 && JAW_ATAI_2 > JAW_ATAI_1 && rosokuValueCloseP < LIPS_ATAI_1)
{
//ショートエントリー
orderPtn=2;
}
else
{
//エントリーしない
orderPtn=0;
}
//***売買判断箇所***//
total=OrdersTotal();
if(total == 1){
OrderKekka = OrderSelect(0,SELECT_BY_POS,MODE_TRADES);
//買いエントリー中に、ショートエントリーのサインが出たら決済する
if(OrderKekka == true && OrderType() == OP_BUY && LIPS_ATAI_1 > rosokuValueCloseP){
if(orderPtn==2 || LIPS_ATAI_1 < JAW_ATAI_1){
OrderKekka = OrderClose(OrderTicket(),OrderLots(),Bid,10,Violet);
}
}
//売りエントリー中に、ロングエントリーのサインが出たら決済する
else if(OrderKekka == true && OrderType() == OP_SELL && LIPS_ATAI_1 < rosokuValueCloseP){
if(orderPtn==1 || LIPS_ATAI_1 > JAW_ATAI_1){
OrderKekka = OrderClose(OrderTicket(),OrderLots(),Ask,10,Violet);
}
}
}
//***決済判断箇所***//
total=OrdersTotal();
if(total ==0 && orderPtn > 0)
{
if(orderPtn == 1)
{
ea_order_stop_price = JAW_ATAI_1 - SL * Point;
ea_order_good_price = 0;
}
else if(orderPtn == 2)
{
ea_order_stop_price = JAW_ATAI_1 + SL * Point;
ea_order_good_price = 0;
}
//新規注文
OrderKekka = funcOrder_Send(orderPtn - 1,ea_order_stop_price,ea_order_good_price,0,0);
}
return(0);
}
//+------------------------------------------------------------------+
//|【関数】新規注文関数 |
//| |
//|【引数】 ea_order_entry_Type:売買(0:買 1:売) |
//|【引数】 ea_order_stop_price:損切値 ea_order_good_price:利確値 |
//|【引数】 orderComment:オーダーコメント ea_order_MagicNo:マジックNo |
//| |
//|【戻値】True:成功 |
//| |
//|
bool funcOrder_Send(int ea_order_entry_Type, double ea_order_stop_price, double ea_order_good_price,int orderComment,int ea_order_MagicNo)
{
int order_resend_num; // エントリー試行回数
int ea_ticket_res; // チケットNo
int errorcode; // エラーコード
double ea_order_entry_price; // エントリーレート
color order_Color;
bool kekka;
for( order_resend_num = 0; order_resend_num < 10; order_resend_num++ ) { // エントリー試行回数上限:10回
if(MarketInfo(NULL,MODE_SPREAD) < A_SPREAD){
if(ea_order_entry_Type == OP_BUY){
ea_order_entry_price = Ask; // 現在の買値でエントリー
order_Color = clrBlue;
}else if(ea_order_entry_Type == OP_SELL){
ea_order_entry_price = Bid; // 現在の売値でエントリー
order_Color = clrRed;
}
// FXCMでは新規エントリー時にストップ/リミットを設定出来ない。
ea_ticket_res = OrderSend( // 新規エントリー注文
NULL, // 通貨ペア
ea_order_entry_Type, // オーダータイプ[OP_BUY / OP_SELL]
Lots, // ロット[0.01単位](FXTFは1=10Lot)
ea_order_entry_price, // オーダープライスレート
20, // スリップ上限 (int)[分解能 0.1pips]
ea_order_stop_price, // ストップレート
ea_order_good_price, // リミットレート
orderComment, // オーダーコメント
ea_order_MagicNo, // マジックナンバー(識別用)
0, // オーダーリミット時間
order_Color // オーダーアイコンカラー
);
}
if ( ea_ticket_res == -1) { // オーダーエラー
errorcode = GetLastError(); // エラーコード取得
if( errorcode != ERR_NO_ERROR) { // エラー発生
printf("エラー");
}
Sleep(2000); // 1000msec待ち
RefreshRates(); // レート更新
printf("再エントリー要求回数:%d, 更新エントリーレート:%g",order_resend_num+1 ,ea_order_entry_price);
} else { // 注文約定
Print("新規注文約定。 チケットNo=",ea_ticket_res," レート:",ea_order_entry_price);
Sleep(300); // 300msec待ち(オーダー要求頻度が多過ぎるとエラーになる為)
break;
}
}
return kekka;
}
主な構文
iAlligator()
【使用例】 double JAW_ATAI_1 = iAlligator(NULL, 0, 13, 8, 8, 5, 5,3, MODE_SMMA, PRICE_MEDIAN, MODE_GATORJAW, 1);
今回は、アリゲーターの値を取得できるiAlligator()関数を使っています。
引数は以下の通りです。
- 引数1・・・通貨ペアです(NULLでチャートの通貨になります)
- 引数2・・・時間軸です(0でチャートの時間軸になります)
- 引数3・・・ジョーズラインの期間です(20で20移動平均線、25で25移動平均線になります)
- 引数4・・・ジョーズラインの表示移動です
- 引数5・・・ティースラインの期間です(20で20移動平均線、25で25移動平均線になります)
- 引数6・・・ティースラインの表示移動です
- 引数7・・・リップスラインの期間です(20で20移動平均線、25で25移動平均線になります)
- 引数8・・・リップスラインの表示移動です
- 引数9・・・移動平均の種別です(MODE_SMMA[平滑移動平均]がAlligator初期値)
- 引数10・・・適用価格です(PRICE_MEDIAN[中間値]がAlligator初期値)
- 引数11・・・MODE_GATORJAWでジョーズラインの値を取得します(MODE_GATORTEETH、でティースライン、MODE_GATORLIPSでリップスライン)
- 引数12・・・バーシフトです(0で現在の値、1で1つ前ーのバーの時の値です)
基本的に、3~8を触るような設定ですね。少し多いですが、Alligator設定画面自体多いので慣れていきましょう!3~10の設定はMT4のAlligator設定画面上で見るとイメージしやすいですね。
9:種別(移動平均線)は、以下4種類です。
- 単純移動平均線:MODE_SMA
- 指数移動平均線:MODE_EMA
- 平滑移動平均線:MODE_SMMA (デフォルト)
- 線形加重移動平均線:MODE_LWMA
10:適用価格は、以下の7種類です。
- 終値:PRICE_CLOSE
- 始値:PRICE_OPEN
- 高値:PRICE_HIGH
- 安値:PRICE_LOW
- 中間値:PRICE_MEDIAN (デフォルト)
- 平均値1:PRICE_TYPICAL
- 平均値2:PRICE_WEIGHTED
12:バーシフトは過去のAlligator値をとりたい場合変更します(0:最新バーの位置、1:1つ前のバーの位置)
さいごに
以上、アリゲーターを使ったEAのサンプルソースでした。
特に目立った処理入れてないのですが、かなりいい結果になったので個人的にもう少し詰めていきたいと思います。
あと、上記EAのトレードポイントを可視化したアリゲーターのインジケータも作ってみました。
裁量トレードをする際に表示しておくと、トレンドを見誤る事は減ると思います。
※ EAのサンプルソースを一覧表にまとめました
※オンラインレッスンやってます
コメント
初めましてm(__)m 久保と申しますm(__)m いつも凄いプログラムの能力が無茶苦茶凄いな~と感心して読ませて頂いております。突然ですが、このアリゲーターEAを15分足設定にしたいのですがどうしたら設定できますか?
お忙しい中申し訳ありませんがご回答をお待ちしておりますm(__)m
初めまして、久保さん。ブログを見て頂いて有難うございます!15分足で動かしたい場合、15分足のチャートを表示してそこにEAを読み込ませると15分足で動くと思いますがそういった話ではないですか?サンプルEAは基本的にオススメの推奨時間(分)足はありますが、どの足でも動きます!
はじめまして、こちらのサンプルコードで動かしてみましたが、ポジション持ちません、コンパイルが間違えているのかそれともMT4の愛称なのかわかりませんが、動かす方法ありませんか、
さかさんはじめまして。
ファイルができているのであれば、コンパイルは成功しています。バックテストでポジションを持たない感じでしょうか?こちらはデフォルト10より小さい場合しか動かないので小さいスプレッドで試して頂くとどうでしょうか?