初心者向けに、MQL4言語を使ったプログラミングについて解説しています。
今回は、MT4のサンプルEA「MACD Sample.mq4」のソースコードの一部を書き換えて「nバーストップ」を実装します。
仕組みさえわかれば、あなたの自作EAにも簡単に実装できます。
ぜひあなたの勝てるEA作りに役立ててください。
nバーストップとは
nバーストップは、過去nバーの期間の高値または安値超えを基準にストップロスオーダーを設定します。
例えば、過去3日間の高値または安値超えをストップポイントとするなど。
nバーストップは、直近の価格変動を重視した手仕舞い方法で、広く使われています。
nバーストップは、通常、トレーリングを組み合わせますので、この記事でも、トレーリングを組み合わせたソースコードを作ります。
MetaEditor の起動
サンプルコード「MACD Sample.mq4」に実装されているトレーリングストップの一部を書き換えて、nバーストップのソースコードを作ります。
MT4の「メタクォーツ言語エディタ」をクリックします。
MeTaEditorが立ち上がったら、画面左側の「Navigater」内のツリーから「Experts」をダブルクリックします。
「Experts」のツリーから「MACD Sample.mq4」をダブルクリックすると、ソースコードが開きます。
nバーストップの自作
それでは、いよいよソースコードを書き換えていきます。
外部パラメーターの変更
カーソルを11行目に移動します。
ここでは、ユーザーが変更可能なパラメーターを設定しています。
【変更前】
input double TakeProfit =50;
input double Lots =0.1;
input double TrailingStop =30;
input double MACDOpenLevel =3;
input double MACDCloseLevel=2;
input int MATrendPeriod =26;
【変更後】
input double TakeProfit =50;
input double Lots =0.1;
input double MACDOpenLevel =3;
input double MACDCloseLevel=2;
input int MATrendPeriod =26;
input int ExitPeriod=3;
double TrailingStop;
サンプルコードのトレーリングストップでは、パラメーター「TrailingStop」を設定し、トレール幅を自分で決めた値に固定していました。
nバーストップでは、過去nバーの期間の高値安値がトレール値になるため、トレール幅が変動していきます。
そのため、パラメーター「ExitPeriod」で「n」を設定し、内部関数でトレール幅を計算するための変数「TrailingStop」を宣言しました。
テクニカルインジケーター変数の宣言の追加
カーソルを下に移動させます。
ここでは、テクニカルインジケーター変数の宣言を記述しています。
double MacdCurrent,MacdPrevious;
double SignalCurrent,SignalPrevious;
double MaCurrent,MaPrevious;
int cnt,ticket,total;
double ExitHigh,ExitLow;
nバーストップのストップポイントとなる過去n日間の高値または安値は、自作インジケーター「HiLoBand」で求めることにします。
そのため、HiLoバンドの変数(ExitHigh,ExitLow)の宣言を追加しました。

買いポジションのトレーリングストップ発動条件
カーソルを下に移動させます。
ここでは、買いポジションのトレーリングストップの発動条件が記述されています。
【変更前】
//--- check for trailing stop if(TrailingStop>0) { if(Bid-OrderOpenPrice()>Point*TrailingStop) { if(OrderStopLoss()<Bid-Point*TrailingStop) {
【変更後】
//--- check for trailing stop
ExitLow = iCustom(NULL,0,"HiLoBand",ExitPeriod,1,0);
if(TrailingStop<ExitLow) TrailingStop=NormalizeDouble(ExitLow,Digits);
if(OrderStopLoss()<TrailingStop)
{
まずHiLoバンドインジケーターのLoバンドででトレール幅を算出しました。
NormalizeDouble関数は、指定された精度で丸められた浮動小数点数を返します。ここでは、Digits()を用いて正規化された桁数を取得しました。
トレーリングストップの発動条件は、
「逆指値(OrderStopLoss)がトレール幅より小さいこと」
としました。
ストップロスオーダーの表記の変更
カーソルを下に移動させます。
ここでは、買いポジションのオーダー変更の命令が記述されています。
//--- modify order and exit
if(!OrderModify(OrderTicket(),OrderOpenPrice(),Bid-Point*TrailingStop,OrderTakeProfit(),0,Green))
Print("OrderModify error ",GetLastError());
return;
不要になった「Bid-Point*」を削除しました。
売りポジションのトレーリングストップ発動条件
カーソルを下に移動させます。
ここでは、売りポジションのトレーリングストップの発動条件が記述されています。
【変更前】
//--- check for trailing stop if(TrailingStop>0) { if((OrderOpenPrice()-Ask)>(Point*TrailingStop)) { if((OrderStopLoss()>(Ask+Point*TrailingStop)) || (OrderStopLoss()==0)) {
【変更後】
//--- check for trailing stop
ExitHigh = iCustom(NULL,0,"HiLoBand",ExitPeriod,0,0);
if(TrailingStop>ExitHigh) TrailingStop=NormalizeDouble(ExitHigh,Digits);
if((OrderStopLoss()>TrailingStop) || (OrderStopLoss()==0))
{
まずHiLoバンドインジケーターのHiバンドでトレール幅を算出しました。
トレーリングストップの発動条件は、
「逆指値(OrderStopLoss)がトレール幅より大きいこと、または逆指値がないこと」
としました。
ストップロスオーダーの変更
カーソルを下に移動させます。
ここでは、売りポジションのオーダー変更の命令が記述されています。
//--- modify order and exit
if(!OrderModify(OrderTicket(),OrderOpenPrice(),Ask+Point*TrailingStop,OrderTakeProfit(),0,Red))
Print("OrderModify error ",GetLastError());
return;
不要になった「Ask+Point*」を削除しました。
ソースコードの書き換えは以上です。
まとめ
MQL4言語入門として、MT4のサンプルEA「MACD Sample.mq4」のソースコードの一部を書き換えて「nバーストップ」を実装しました。
仕組みさえわかれば、自作EAに簡単に実装できます。
ぜひあなたの勝てるEA作りに役立ててください。