大量売買防止方法 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の該当箇所にはめこんでいきます。
このプログラムを使う際の注意点:このプログラムをコピペで使用する際は「>」「=」は半角に修正してください。サイト表示をするにあたり半角のままだとエラーがでてしまうため、全角にてサイト記事を作成しています。そのままコピペ使用するとエラーがでるはずですのでご注意ください。
// 外部パラメータ
extern double Lots = 0.1;
extern int Slippage = 3;
extern int TStype = 2; //トレイリングストップの種類
int TrailBar=0;
文章の1番最後に「int TrailBar=0;」を追加しました。次は決済シグナルの買い決済と売り決済の該当箇所に組み込んでいきます。
変更前
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;」をひとつづつ追加します。
変更前
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行目近辺でも行います。
変更前
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;
}
このように変更してコンパイルしてエラーが出なければ、再び同じ条件でバックテストをしてみてましょう。おそらく、大量売買が消えているはずです。例えば、こんな感じになります。
修正前のバックテスト結果と見比べてみてください。
前回記事:修正前EAバックテスト
修正後のバックテストでは、大量売買が消えていることを確認できるはずです。この変更を加えておくことで、今後のこのEA改造がやりやすくなります。
ここでも、RSIEAに改造といってもよいのですが、これまで2回同じような改造をしたのでここではやりません。
次回より、MT4を使っていくときに私が注意している点をまとめさせていただきます。
MT4EA作成編目次
EAを手軽につくるやり方をまとめました。
- 第1回MT4EA作成編 RSIEAの簡単な作り方
- 第2回手順その2 EAの売買ロジックを考える
- 第3回手順その3:EA加工前の準備 EAコピーの仕方
- 第4回基本EAの変更箇所確認
- 第5回30分でできるRSI MT4EA作成編
- 第6回MT4組み込みテクニカル指標関数の使い方
- 第7回MT4でRSIEAを作る 売買シグナル部分
- 第8回決済注文プログラムはたった1行
- 第9回マジックナンバーとRSIEA検証行
- 第10回パラメーターと変数化の効果
- 第11回RSI設定使い方 3つのパターン
- 第12回RSIエグジット戦略とは
- 第13回RSIスキャルピングにも使えるこの応用形
- 第14回RSI20 RSI80の検証
- 第15回RSIの使い方 3つのポイント
- 第16回過剰最適化(カーブフィッティング)の話
- 第17回最適化はカミソリ 大怪我しないためのポイント
- 第18回RSIEA無料配布と留意点
- 第19回決済を値幅指定
- 第20回ブレイクアウトMT4無料EA検証
- 第21回EA作成早期習得のための2つのポイント
- 第22回プログラムを短くする関数化
- 第23回「Breakout1SL1.mq4」をRSI値幅決済EAへ書換え
- 第24回コメントアウト MT4でも大切な理由
- 第25回EA解説後半 EA作成上達のコツ
- 第26回RSI値幅決済EA 短期売買向
- 第27回改造EAの面白いところ
- 第28回Breakout1TS1.mq4 1粒で三度おいしい無料EA
- 第29回大量売買防止方法
- 第30回MT4運用失敗の必然性に気づく
- 第31回最適化して最高成績を選ぶ愚
- 第32回MT4 PF(プロフィットファクター)
- 第33回MT4バックテスト 私の使い方
- 第34回MT4ファンのMT4口座比較方法
- 第35回裁量トレードの方が優秀に見える理由
- 第36回MT4最初の壁「夢の過剰最適化」
- 第37回MT4で儲からないことで目覚めた