EAロジック
凄くシンプルですが、2本の移動平均線のゴールデンクロスで買い、デッドクロスで売りというロジックです( ・Д・)
パラメーター
【マジックナンバー】
任意の番号を入力して下さい。
【スリッページ】
スリッページの許容限界値を入力して下さい。
【ロット数】
1発注当たりのロット数です。
【利確幅】
利益確定幅(pips)を入力して下さい。
【損切幅】
損失確定幅(pips)を入力して下さい。
【トレーリング】
トレーリングストップを発動させるか否かの選択です。
true=ON,false=OFFです。
【トレーリングストップ幅】
トレーリングで追いかける幅(pips)を入力して下さい。
【コメント】
エントリーしたポジションに表示するコメントを入力して下さい。
---移動平均線(短期)---
【期間】
期間を入力して下さい。
【方法】
以下4つから選んで下さい。
Simple:単純移動平均(SMA)
Exponential:指数移動平均(EMA)
Smoothed:平滑移動平均(SMMA)
Linear weighted:線形加重移動平均(LWMA)
【価格】
以下7つから選んで下さい。
Close price:終値
Open price:始値
High price:高値
Low price:安値
Median price:(高値+安値)/2
Typical price:(高値+安値+終値)/3
Weighted price:(高値+安値+終値+終値)/4
---移動平均線(長期)---
【期間】
期間を入力して下さい。
【方法】
以下4つから選んで下さい。
Simple:単純移動平均(SMA)
Exponential:指数移動平均(EMA)
Smoothed:平滑移動平均(SMMA)
Linear weighted:線形加重移動平均(LWMA)
【価格】
以下7つから選んで下さい。
Close price:終値
Open price:始値
High price:高値
Low price:安値
Median price:(高値+安値)/2
Typical price:(高値+安値+終値)/3
Weighted price:(高値+安値+終値+終値)/4
バックテスト結果
USDJPY 5分足
期間 2012.01.17~2019.12.2019.12.27
ソースコード説明
今回のソースコードはこちら「MA_Cross_Zn」←クリックするとPDFファイルが開きます。
こちらの記事では細かい説明などは一部省きますので、よく分からない方は一度「潤奈流EA講座」から目を通してみて下さい( ・Д・)
パラメーター設定
1 2 3 4 5 6 7 8 9 |
//---パラメーター設定 sinput int MagicNumber=2021; //マジックナンバー input int Slippage=10; //スリッページ input double Lots=0.01; //ロット数 input int TakeProfit=100; //利確幅(pips) input int StopLoss=50; //損切幅(pips) input bool TrailingSwitching=true; //トレーリング(On=true;OFF=false) input int TrailingPips=20; //トレーリングストップ幅(pips) input string comment="MA_Cross_Zn"; //コメント |
1文づつの構成は、「修飾子 型 固有名=値; //コメント」となります。
それぞれの固有名に代入する値の種類によって、型が違っています。
インジケーター設定
1 2 3 4 5 6 7 8 9 |
//---インジケーター設定 input string MA1=""; //移動平均線(短期) input int Period1=20; //期間 input ENUM_MA_METHOD Method1=MODE_SMA; //方法 input ENUM_APPLIED_PRICE Price1=PRICE_CLOSE; //価格 input string MA2=""; //移動平均線(長期) input int Period2=50; //期間 input ENUM_MA_METHOD Method2=MODE_SMA; //方法 input ENUM_APPLIED_PRICE Price2=PRICE_CLOSE; //価格 |
2行目と6行目はMA1とMA2という空の箱を用意し、右のコメントをパラメーター設定画面に表示する事で見やすくする為に追加している物ですので、内部プログラム自体には関係ない物になります。
↓パラメーター設定画面
Period(期間)は先ほどのパラメーター設定での構成と同じ様になっていますが、「Method(方法)」と「Price(価格)」については少し見慣れない物が型の部分にありますね。
これはあらかじめMT4にいくつかの標準的なテクニカル指標は入力パラメーターとしてリスト化されており、使用する事で大変便利になります。
まずMethod1,2(方法)について、計算で使用される平滑化の計算方法を指定するために ENUM_MA_METHOD列挙にリストされている識別子が選択出来るようになります。
[table id=1 /]
次にPrice1,2(価格)について、計算に使用する価格ベースを指定するための ENUM_APPLIED_PRICE列挙に7つの事前定義された識別子が選択出来るようになります。
[table id=2 /]
ロジック構成
1 2 3 4 5 6 7 8 9 10 11 12 13 14 |
void OnTick(){ //ティック受信する度に動くプログラム //トレーリングストップ if(TrailingSwitching)TrailingStop(); //ポジション数を確認 int BuyPosition=Position(1); int SellPosition=Position(-1); //エントリー判定 int Entry=MACrossOrder(); if(BuyPosition==0 && Entry==1)OpenOrder(1); if(SellPosition==0 && Entry==-1)OpenOrder(-1); //クローズ判定 if(BuyPosition!=0 && MACrossClose(1)==1)CloseOrder(1); if(SellPosition!=0 && MACrossClose(-1)==-1)CloseOrder(-1); }//OnTick |
OnTick関数では価格を受信する度に動く関数になりますのでこの中にロジックを記入して行きます。
【トレーリングストップ】
if関数でTrailingSwitchingがture(真)かfalse(偽)を確認し、ture(真)であればTrailingStop()関数に移動します。
【ポジション数を確認】
BuyPosition変数にPosition関数で取得した買いポジション数を代入します。
SellPosition変数には売りポジション数を代入します。
【エントリー判定】
Entry変数にMACrossOrder関数でエントリー条件を確認し、買いのタイミングであれば1を、売りであれば-1を代入し、満たしていない場合は0を代入します。
次にif関数で(買いポジションが現在0 & 買い条件を満たしている)のどちらの条件も満たしていればOpenOrder関数で買いのエントリーを行う。
売り条件も同様です。
【クローズ判定】
if関数で(買いポジションが0ではない & 買いポジションの手仕舞い条件を満たしている)のどちらの条件も満たしていればCloseOrder関数で買いの手仕舞いを行う。
売り条件も同様です。
以上がこのEAのロジック動きの流れになります。
オリジナル関数
AdjustPoint関数
AdjustSlippage関数
以上2つについては潤奈流EA講座④で説明していますのでご覧下さい。
Position関数
OpenOrder関数
CloseOrder関数
以上3つについては潤奈流EA講座⑤で説明していますのでご覧下さい。
TrailingStop関数
こちらは潤奈流EA講座⑥で説明していますのでご覧下さい。
移動平均線クロスエントリー関数
1 2 3 4 5 6 7 8 9 10 11 |
//移動平均線クロスエントリー int MACrossOrder(){ int entry=0; double MAS1=iMA(_Symbol,0,Period1,0,Method1,Price1,1); double MAS2=iMA(_Symbol,0,Period1,0,Method1,Price1,2); double MAL1=iMA(_Symbol,0,Period2,0,Method2,Price2,1); double MAL2=iMA(_Symbol,0,Period2,0,Method2,Price2,2); if(MAS2<=MAL2 && MAL1<MAS1)entry=1; if(MAS2>=MAL2 && MAL1>MAS1)entry=-1; return(entry); } |
まずentry変数に0を代入してリセットします。
次に移動平均線の価格を入れる箱をdouble型でMAS1,2とMAL1,2で宣言します。
その箱の中に移動平均線を求めるiMA関数で計算された値を代入するようになります。
iMA関数の引数は、iMA(通貨ペア、時間軸、期間、シフト、平均化メソッド、適用期間、シフト);です。
iMA関数の引数について簡単に説明すると、
通貨ペア:_Symbolは現在の通貨ペアを指定します。(_Symbol)
時間軸:0は現在の時間軸を指定します。(0)
期間:移動平均を求める期間で、パラメーターで設定した値を使用します。(Period1,2)
シフト:求めた移動平均線を前後に指定本数分ずらして表示します。(0)
平均化メソッド:計算方式を指定します。(Method1,2)
適用価格:始値~終値のどの価格で計算するか指定します。(Price1,2)
シフト:何本目の足の移動平均線値を取得するか指定します。(1,2)
今回は移動平均線がクロスするタイミングが知りたいので長期と短期の移動平均線の1本前と2本前の値の合計4つ必要になります。
次に条件ですが、買いの場合は長期移動平均線を短期移動平均線が上抜けたらエントリーですのでそのクロスしたタイミングの条件は、「短期<長期 → 長期<短期」の式が成り立ちます。
これをプログラムに置き換えると、「MAS2<=MAL2 && MAL1
この条件に合致した場合、entry変数に1を代入します。売りの場合の条件に合致した場合はentry変数に-1を代入します。
ちなみにこの条件式には <= と < がありますが、< だけじゃダメなの?と私も思いました。 例えば数値に置き換えると「1 < 2 && 2 < 3」となれば良いですが、もしかしたら「2 < 2 && 2 < 3」になる事があるかもしれません。「<」はより大きいという意味ですので「2 < 2」は条件に合致しません。 すると、チャート上ではクロスしている様に見えるのに、エントリーしてない?という現象が起きる可能性がありますので、「<=」の以上を使っています。 最後のreturn(entry);とはMACrossOrder関数の計算結果としてentry変数に入っている値を返す事になります。 その後の動きは3項のロジック構成に戻って確認してみて下さい。entry変数の1が返ればOpenOrder関数(買い)に進み、-1が返ればOpenOrder関数(売り)に進みます。(ポジションが0の場合)
移動平均線クロスクローズ関数
1 2 3 4 5 6 7 8 9 10 11 12 13 |
//移動平均線クロスクローズ int MACrossClose(int Position){ int close=0; double MAS1=iMA(_Symbol,0,Period1,0,Method1,Price1,1); double MAL1=iMA(_Symbol,0,Period2,0,Method2,Price2,1); if(Position==1){ if(MAL1>MAS1)close=1; }else if(Position==-1){ if(MAL1<MAS1)close=-1; } return(close); } |
まずclose変数に0を代入してリセットします。
次に移動平均線の価格を入れる箱をdouble型でMAS1とMAL1で宣言します。
iMA関数の引数は前項のMACrossOrder関数と同様ですので省略します。
次にif関数を使用し、引数で渡されたPositionが1の場合はもう一度if関数でMAL1>MAS1(長期>短期)になっているか確認し、条件に合っていればclose変数に1を代入します。 今回はとてもシンプルな移動平均線のゴールデンクロス、デッドクロスでエントリーするEAのプログラムでした。 シンプルに、カスタマイズしやすいように書いたつもりですので是非参考にして下さい( ・Д・) 分からない事などがありましたらコメント下さいね!ググりますので( ・Д・)w 【免責事項】 ※当EAにおける如何なる損失もご自身の自己責任となります。投資資産における運用の結果生じた損害の全部若しくは一部について一切の責任及び負担を負わないものとします。
Positionが-1の場合はMAL1
分かりやすく書いたつもりですが、理解出来ましたでしょうか?
最初は分からない事が多すぎると思いますが、一つづつ動作を見て解読して行けば理解出来るようになって来ます!私も最初はそうでした・・・
※当EAにつきましても、バグや不具合がないことを保証するものではありません。
※このブログで掲載されている情報は、投資等の勧誘又は推奨を目的としたものではありません。
※掲載されている内容は予告なしに変更することがあります。
※このブログで公表してあるEAを無断転用・配布・販売することを禁じます。
コメント
私もEAプログラムを作ろうと頑張ってみたのですが、どうしても眼の関係で断念しました。行が飛んでしまう。主様に図々しいお願いなのですが、私の代わりにEAを作って頂けないでしょうか?ロジッグはいたってシンプルです。
シンプルなんですが、それなりに凄いロジックだと信じております。その凄いロジックを主様と私だけのEAにして頂けるならご連絡下さいm(__)m
お待ちしております。
コメントありがとうございます。
お声を掛けて頂いた事はありがたいですが、EA作成の依頼は受け付けていませんので申し訳ありません( ゚Д゚)
拝見させて頂きました。
MAのCrossでトレード、とても分かりやすい題材だと思いまして勉強のためバックテストをしてみました。
ですが、バックテスト結果はエラーが発生している箇所がるあるようです。
OrderModify エラー130 が連続的に起こっています。
それから ontick で呼び出している 各関数は ローソク足の値が変化するたびに動作するのでローソク足の値が確定しないうちに何回もゴールデンクロス、デッドクロス の条件に合致しつた場合。 複数回エントリーした直後に 同じ回数分Close処理が動いてしまいます。
見させていただいたこのWEBのバックテスト結果とは大きく違っています。
今一度、PDFのソースコードを見直してください。
私は現在、MT4のEAの勉強中です。 仕事はプログラマーですので基本的なことは理解していますが MQL言語はまだまだといったところです。 どのような仕掛けにしたら目的を果たせるプログラムが作れるのか 目下研究中であります。
@SJC様
コメントありがとうございます。
まずPDFのソースコードでのバックテストの再確認を行いました。
ご指摘の通りトレーリングストップでの損切値変更時にOrderModifyエラー130が発生するコードになっていますので修正を行いたいと思います。
別記事ですがトレーリングストップ関数「https://zyunafx.com/mql4_original-2/」にてこの現象が発生しないコードを掲載していますので、そちらをご参照下さい。
次にOnTickでの動作につきまして、ローソク足の値が変化するたびにゴールデン・デッドクロスの条件に合致したという処理はなされますが、ポジションを持っていない時にしかエントリーは行わないようになっていますので、複数ポジションを持つ事はありません。
クローズも同様にポジションを持っていないと処理は行われません。
ただし、あくまで1ポジションだけの取引を想定していますので、複数ポジションを持つような条件などを加えようとすると工夫が必要になります。
バックテストの結果についてですが、こちらはサンプルコードとは違うパラメーターで実施しております。
サンプルコードではトレーリングストップも実装はしていますが、バックテスト時にはOFF(false)にしておりますので、Web掲載画像と同じ期間、時間足、パラメーター、スプレッドで行うと近い値が出ると思います。
ただし、使用するヒストリカルデータの会社が違と結果も異なりますのであくまで参考となり、調整すればこれぐらいの成績になるという紹介となります。
ご職業がプログラマーという事なので、細かい所によく気付かれたのかと思います。
こちらで紹介しているコードはEAの入門レベルとして掲載しており、細かい制御については省いている所があることご理解いただけたらと思います( ゚Д゚)