当ページは、アフィリエイト広告を含みます。

大量売買防止方法 MT4EA作成編第29回

自作EAでたまにでてくる、想定外の大量売買に対応するための変更プログラムをご紹介します。

困ったら部分を文章に置き換える

前回記事Breakout1TS1.mq4 1粒で三度おいしい無料EAで、バックテストをすると短時間で大量売買をする可能性があることがわかりました。このEAに限らず、自作EAではこういう結果をだすことがあります。

 

例えば、ポジション作成シグナルと決済シグナルで別々のテクニカル指標を使うときなどです。

 

  • ポジション作成:一目均衡表で判断
  • ポジション決済:移動平均線で判断

 

こういう感じで、それぞれ別の指標を使うとポジションを作ってすぐに決済シグナルが発生することもあるため、そこで無限に売買を繰り返す状況が生まれたりします。

 

この傾向があるEAをそのまま稼動させていると、一晩で大量売買を行い、朝には資金が大幅に減っているなんで笑えない事態の恐れもあります。

 

これを訂正するにはどうすればいいでしょうね。

 

こういう時は、困っている部分を言葉や図にして紙に書いてみるのがおすすめです。書き出すことで「何を理解していて」「何が理解出来ていないのか」が見えてくるからです。対処法もみつけやすくなります。今回のケースだとこんな感じになります。

 

「1時間足を使っていてその1時間の中でポジション作成と決済を繰り返してします。」

 

こう書き出してから、「それから具体的にどうすればいいんだ?」と考えてみます。多分、最初は何も思いつかないと思います。でも、これを繰り返していくうちに以下のような答えが思いつくようになります。

 

「1時間足を使っているのだから1時間で決済は一回しか発生しないようにできないか。」

 

更に一歩進んでいくとこんな感じになっていきます。

 

「1本の足で決済は1回だけにする」

 

ここまで辿り着くとプログラム変更するメドがつけやすくなります。EAの疑問解決はグーグル検索でも見つかることが多いです。でも、グーグル検索で解決法を見つける場合でも、有効な検索キーワードを考えないといけません。その有効な検索キーワードをみつけるのにもこのやり方は使えます。

 

では、「1本の足で決済は1回だけにする」ためにEAをどう加工すればいいのかをやってみます。具体的にはこんな感じでやるといいです。

変更箇所

使う文章は3つです。

 

  • int TrailBar=0;
  • TrailBar<Bars
  • TrailBar=Bars;

 

この3つの文章をEAの該当箇所にはめこんでいきます。

 

このプログラムを使う際の注意点:このプログラムをコピペで使用する際は「>」「=」は半角に修正してください。サイト表示をするにあたり半角のままだとエラーがでてしまうため、全角にてサイト記事を作成しています。そのままコピペ使用するとエラーがでるはずですのでご注意ください。

 

16行目:外部パラメーター部分

 

// 外部パラメータ
extern double Lots = 0.1;
extern int Slippage = 3;
extern int TStype = 2; //トレイリングストップの種類
int TrailBar=0;

 

文章の1番最後に「int TrailBar=0;」を追加しました。次は決済シグナルの買い決済と売り決済の該当箇所に組み込んでいきます。

 

53行近辺(買い決済部分)

 

変更前

if(OrderType() == OP_BUY)
{
double newsl = Bid-ts*Point;
if(newsl >= OrderOpenPrice() && newsl > OrderStopLoss())
    MyOrderModify(newsl, 0, magic);
break;
}

 

変更後

if(OrderType() == OP_BUY && TrailBar<Bars)
{
double newsl = Bid-ts*Point;
if(newsl >= OrderOpenPrice() && newsl > OrderStopLoss())
    MyOrderModify(newsl, 0, magic);
TrailBar=Bars;
break;
}

 

「 TrailBar<Bars」 と 「TrailBar=Bars;」をひとつづつ追加します。

 

61行目(売り決済部分)

 

変更前

if(OrderType() == OP_SELL)
{
newsl = Ask+ts*Point;
if(newsl <= OrderOpenPrice() && (newsl < OrderStopLoss()
    || OrderStopLoss() == 0)) MyOrderModify(newsl, 0, magic);
break;

 

変更後

if(OrderType() == OP_SELL && TrailBar<Bars)
{
newsl = Ask+ts*Point;
if(newsl <= OrderOpenPrice() && (newsl < OrderStopLoss()
    || OrderStopLoss() == 0)) MyOrderModify(newsl, 0, magic);
TrailBar=Bars;
break;

 

これと同じような作業を98行目近辺でも行います。

 

98行目近辺

 

変更前

if(OrderType() == OP_BUY)
{
if(LL > OrderStopLoss()) MyOrderModify(LL, 0, magic);
break;
}

 

 if(OrderType() == OP_SELL)
{
if(HH < OrderStopLoss() || OrderStopLoss() == 0)
     MyOrderModify(HH, 0, magic);
break;
}

 

変更後

if(OrderType() == OP_BUY && TrailBar<Bars)
{
if(LL > OrderStopLoss()) MyOrderModify(LL, 0, magic);
TrailBar=Bars;
break;
}

 

 if(OrderType() == OP_SELL && TrailBar<Bars)
{
if(HH < OrderStopLoss() || OrderStopLoss() == 0)
     MyOrderModify(HH, 0, magic);
TrailBar=Bars;
break;
}

 

このように変更してコンパイルしてエラーが出なければ、再び同じ条件でバックテストをしてみてましょう。おそらく、大量売買が消えているはずです。例えば、こんな感じになります。

 

Breakout1TS1.mq4修正版 バックテスト

 

大量売買防止

 

 

Breakout1TS1.mq4修正版 売買結果

大量売買防止

 

修正前のバックテスト結果と見比べてみてください。

 

前回記事:修正前EAバックテスト

 

修正後のバックテストでは、大量売買が消えていることを確認できるはずです。この変更を加えておくことで、今後のこのEA改造がやりやすくなります。

 

ここでも、RSIEAに改造といってもよいのですが、これまで2回同じような改造をしたのでここではやりません。

 

次回より、MT4を使っていくときに私が注意している点をまとめさせていただきます。

MT4EA作成編目次

EAを手軽につくるやり方をまとめました。

 

MT4 自動売買関連記事まとめページへ戻る

2014/07/07


記事がお気に召しましたら、共有・拡散お願いします。

このエントリーをはてなブックマークに追加   
TOPへ