20,024 views
この記事は最終更新から 2574日 が経過しています。
(1) やりたいこと
前回の 「(5) 【MQL】 チャートに線を描く」 ではチャート上に独自に線を引く方法を学んだ。
今回はここから少し発展し、「(4) 【MQL】 サンプルプログラム(EA)を解析」 で中身を熟読したプログラムに書かれていた 「Moving Averageによる売買シグナル」 を抜き出して Indicatorとして作ってみたい。
(2) 仕様
(直近足の始値 > MA) 且つ (直近の終値 < MA) であれば SELLシグナルを出し、上向き矢印を表示する。
(直近足の始値 < MA) 且つ (直近の終値 > MA) であれば BUYシグナルを出し、下向き矢印を表示する。
「(4) 【MQL】 サンプルプログラム(EA)を解析」そのままの仕様だ。
(3) プログラムのひな形を作成
まずは Wizardを使って Indicatorプログラムのひな形を作成する。
基本的な手順は 「(5) 【MQL】 チャートに線を描く」 と同じなので省略する。
1) Parameterには MA Periodのみ追加する。
2) Plotsには MA線描画用、SELLシグナル描画用、BUYシグナル描画用の 3個を追加する。
すると、こんな感じで全72行のプログラムソースコードが自動生成された。
これからこのひな形に仕様を満たすための独自コードを追記していく。
(4) プログラムを書く
新しい関数は追加しない。
既存の2関数に処理を埋め込んでいく方針とする。
1. OnInit
ここでは MAを生成する。
「(4) 【MQL】 サンプルプログラム(EA)を解析」とまったく同じコードを追記する。
ExtHandleMA = iMA(_Symbol,_Period,MAPeriod,0,MODE_SMA,PRICE_CLOSE); if(ExtHandleMA == INVALID_HANDLE){ printf("Error creating MA indicator"); return(INIT_FAILED); }
もう1点、矢印の形がデフォルトだと●なので、SELLは下向き、BUYは上向き矢印の文字コードに変えておく。
PlotIndexSetInteger(1,PLOT_ARROW,242); PlotIndexSetInteger(2,PLOT_ARROW,241);
するとこうなる(↓)。
関数外部でグローバル変数 ExtHandleMA を宣言するのを忘れてはいけない。
2. OnCalculate
こちらが今回の肝な訳だが…
前述の仕様に従って処理を記述する。
私の好きな goto や try がMQL5では使えないので不慣れで汚くなってしまう。
関数リファレンス: BarsCalculated / CopyBuffer
(5) 作った Indicatorをチャートに乗せてみる
矢印が小さくて見づらい。
改善#1: 矢印を太くする。
矢印が小さくて見づらいので、これを太くする。
以下の propertyの値を変更する。
indicator_width2
indicator_width3
だいぶ見やすくなった。
改善#2: 矢印を上下にずらす。
矢印が太くなったのはよいのだが、線が隠れて見づらくなってしまった。
そこで、SELL矢印は下側へ、BUY矢印は上側へずらして表示する。
これも「(5) 【MQL】 チャートに線を描く」でやったことだ。
OnInitに以下のコードを追加する。
PlotIndexSetInteger(1, PLOT_ARROW_SHIFT, 30); // SELL Arrow PlotIndexSetInteger(2, PLOT_ARROW_SHIFT, -30); // BUY Arrow
だいぶ見やすくなった。
上記画像の左端では SELLシグナルが大物を釣り上げている!
でもその次のSELLシグナルでは結構な負けを喫している…
面白いですね Indicator