EAの大枠と前処理の作成(第4回)

2018年10月12日

設計図の書き込み

今回はプログラムの大枠と前処理について書いていきます。

文章に目次があるように、プログラムもまずは大項目を決めていくイメージです。

大項目が決まらなければ中身も一貫性のないものになってしまいますので、重要な項目になります。

大枠を考える

以下の項目を定型で作成します。

  • 事前判定
  • Entry判定(フィルター込み)
  • Exit判定
  • 注文

それぞれの処理で具体的に何をやるのか見ていきましょう。

 

詳細を考える

事前判定

プログラムを動かすときに、一定条件を満たした場合のみ後続処理を実行するイメージです。

私の場合は、事前判定に2つのルールを使っています。

 

  • ローソク足が生成されたタイミングで1回のみ動く
  • 証拠金が一定以上の場合のみ動く

 

「ローソク足が生成されたタイミングでのみ動かしている。」というのはどういう意味か1時間足を例に説明します。

1時間足は当然1時間毎に1個のローソク足が完成します。

この時プログラムは、最短でEAを作る(第2回)で説明した通りTick毎に呼び出されるため、状況によりますが1時間で数千回~数万回と呼び出されています。

ローソク足が生成されたタイミングで1回のみ動くようにすることで、1時間に1回のみ動くプログラムになります。

正確にはプログラム自体はTick毎に呼び出されてしまうのですが、先頭に判定処理を入れるため、後続は実行されないということになります。

このような判定をする理由は2つあります。

[理由①]不要なリスクの排除

 

自動売買の選択肢を考える(第3回)で書いた通り、私は過去にプログラムの不具合で口座が壊滅しました。

 

この時はTick毎にEntry→Exitの発注が行われ、1時間で数千回のトレードが行われたのが原因の1つでした。

 

直接的な原因はプログラムの不具合なのですが、Tick毎ではなくローソク足が完成したときに1回動くようにしていれば大惨事にはならなかったはずです。

 

私の売買ルールはTick毎に判断する必要が無いものでしたから、リスクだけを取っていたような状態です。

 

また、一般的に考えられる売買ルールもTick単位で動かす必要が無いものが殆どです。

[理由②]再現性が低い

 

Tick単位で判断する売買ルールは、テストと実際の運用時の乖離が激しいです。

 

それはMT4/MT5では基本的にバックテストでは疑似Tickを使っているためです。

現段階の知識では少しマニアックな話になってしまいますが、気になる方は「最強のスキャルピングEA|聖杯・・・?」に疑似ティックの影響で失敗した時の事を書いていますので、ご参照いただければと思います。

 
証拠金が一定以上の場合のみ動くようにしているのも不要なリスク排除のためです。
※1つのMT4/MT5内で複数のEAを動かしている場合は、他のEAの損失で証拠金が低下することがありますので、事前処理ではなくエントリーのフィルターとして使うことが多いです。(今回は特に気にする必要はありません。)
 

Entry判定

Entryで記載するプログラムを以下に列挙します。

ローソク足や各指標によるEntry条件判定

  • 移動平均線
  • RSI
  • プライスアクション
  • etc…

 

フィルターによる判定

  • タイムフィルター
  • 曜日フィルター
  • スプレッドフィルター
  • 環境認識フィルター
  • etc…

 

Exit判定

Exitパターンは大きくいくつかに分けられるので列挙します。

Exitで使うパターン

 

ローソク足やテクニカルよる判定

  • 移動平均線
  • RSI
  • プライスアクション
  • etc…

 

損益による判定

  • 固定pipsによる判定
  • トレーリングストップによる判定
  • etc…

 

時間経過による判定

 

注文

注文方式を記載します。

具体的には、「成行、指値、逆指値」を指定します。

 

定義した内容をプログラムに落とす

枠の部分のみですが作る内容を言葉で定義することができました。

これは本当に重要なことです。

もしあなたがプログラムを組めなかったとしても、具体的な言葉にできれば誰かに相談してプログラムを完成させることができるからです。

 

事前判定(プログラム)

  • ローソク足が生成されたタイミングで1回のみ動く
  • 証拠金が一定以上の場合のみ動く

 

説明できていませんでしたが、MT4/MT5のプログラム言語はMQLと呼ばれます。

上記のプログラムは少し難しく感じるかもしれませんが、やっていることは日本語で定義したことをMQLがもともと持っている機能を使って実現しているだけです。

最終的には全量を表示したバージョンを記載しますので、あまり気にせずついてきてください。

 

Entry判定(プログラム)

  • ローソク足や各種指標による条件判定
  • フィルターによる判定

まだ学習段階なので、第2回と同じものを使用しました。
それと、タイムフィルターにより16時台~22時台までしかEntry判定しないようにしています。

 

Exit判定(プログラム)

Exitはパターンが豊富ですが、今回は25期間起動平均を割ったら決済するようにします。

 

注文(プログラム)

成行で注文を行います。

 

ここまでのプログラムをまとめる

今回作ったプログラムを1つにまとめます。

実際は複数ファイルに分割したほうが設計としては綺麗なのですが、説明が複雑になってしまうので1ファイルとします。
動作としては1ファイルでも全く問題ないので心配ありません。

これをコピーしてMetaEditorに貼り付けて、Compileしてみてください。

 

動作確認しよう

最短でEAを作る(第2回)で大枠のテストの仕方は説明しましたが、今回は作りこんだプログラムも多いのでもう少し細かく見ていきます。

まずは事前判定部分の確認です。

作成したEAのバックテスト用設定を行い、スタートをクリック

画像編集の技術が無く、だいぶ汚くなってしまいました。申し訳ありません。

  1. 「エキスパート設定」をクリック
  2. 「初期証拠金」を900に変更
  3. 「モデル」は「全ティック」を選択
  4. 「ビジュアルモード」はチェックしない
  5. その他、同じように設定できたら「スタート」をクリック

数秒で処理が完了しますので、まずは結果タブを選択して1度も取引が行われなかったことを確認してください。

結果タブ

次に操作履歴タブを選択して赤枠部分から以下2点を確認します。

  1. 1時間に1回動いていること
  2. 証拠金不足とエラーが表示されること

操作履歴タブの画面

これで事前判定部分が正常に動いていることが確認できました。
少し面倒とは思いますが、最初だけのことなので我慢です。

次にEntry判定とExit判定と注文をまとめて確認します。
確認前に以下設定にしてから「スタート」をクリックしてください。

  1. 「エキスパート設定」をクリック
  2. 「初期証拠金」を10000に変更
  3. 「モデル」は「始値のみ」を選択
  4. 「ビジュアルモード」をチェックする

時間が掛かると思いますので「ビジュアルモード」脇の、スキップを押していただいても大丈夫です。

結果タブを選択するとbuy(買い)、sell(売り)、close(決済)と正常に注文が出されたことが分かります。

それから「取引種別」がbuyかsellの場合は、時間帯が全て16:00~22:59の間に収まっていることが確認できると思います。

※close(決済)に関しては特にフィルターを入れていないので、16:00~22:59の間には入らないこともあります。

結果タブ

最後に実際の売買ルールが正常に機能しているか確認します。

下図の通り、50期間移動平均を下回ったところで売り、上回ったところで決済していますので大丈夫そうです。
買いの方も同じように確認してください。
チャートに表示された売買ポイント

結果としては、かなりの短期間ではありますが直近では上手く機能していたようです。

バックテスト結果のグラフ

 

まとめ

長くなってしまいましたが、ここまでで大枠の説明はできたと思います。

次回の押し目エントリーのEA作成(第5回)で、いよいよ実践投入できるレベルのEA作成に入っていきます。

今回の記事のまとめ

  • 大枠から考える
  • リスクだけ取るようなプログラムは書かない
  • プログラムを言葉で定義する

 

自動売買入門のまとめは以下をご参照ください