プログラマ向け自動売買開発アイディア
目次/もくじ
「MQL4/MQL5は扱えるようになったけど、プログラミングのアイディアがない」というプログラマは比較的いると思います。最初のうちは、あれやってみよう、これやってみようという手法があると思いますが、1か月もすれば大抵の手法は検証しつくしてしまうと思います。
ここでは、そういった方向けにEA開発のアイディアについて紹介します。
計算元のデータの出発点が異なるテクニカル指標を組み合わせてみる
EA開発と言えば、ほとんどの場合テクニカル指標を組み合わせて作りますが、その組み合わせするテクニカル指標の性質が被っている場合が多々あります。
具体的には、ゴールデンクロス/デッドクロスとアリゲーターなどは移動平均を出発点にしているので、この二つを組み合わせても同じようなフィルターにしかなりません。
逆に、ボリンジャーバンドなどは標準偏差を使っているので、移動平均と組み合わせても根本となるロジックがバッティングしません。
よくよく調べてみるとわかりますが、実はテクニカル指標の多くは移動平均の差をゴニョゴニョしているだけなので、その結果をさらにEA内でゴニョゴニョしても大した優位性が得られない、という現象が発生します。
一目均衡表、平均足、MFI、ボリューム、ダイバージェンスなどはそういう意味ではバッティングしずらいテクニカル指標です。
ADX(+DI,-DI)をトレンドの判定フィルターに使う
実際には全然使われているのを見たことがないのですが、トレンドの判定にはADXを使うのが定石です。(そのために開発されたものです。)
トレンドの判定にゴールデンクロスなどを使っているプログラムも見かけますが、その場合、トレンドの強度が判定できないのでやめた方が良いと思います。(移動平均クロスによるトレンド判定の場合、じわじわ上がってトレンドが発生したのか、直近のロウソク足で急激に価格が変化したのかを判定できない)
ボラティリティの変化対応にバンド系のテクニカル指標を使う
バンド系のテクニカル指標と言えば、ボリンジャーバンドかエンベロープですが、バンド系の指標を使うという意味合いで言えばどちらを使ってもいいと思います。
二つの違いは、急激な価格ジャンプが発生した際にそれに追従するかどうかですが、それは他のトレードアルゴリズムとの相性もあるので、一概にどちらが良いとは言えません。
(ただ、私はエンベロープを使います。)
バンド系のテクニカル指標の使い方としては、価格がバンドを超えた際に順張りor逆張りエントリーをするか、あるいは、SL/TPに上バンド/下バンドを使うというものだと思います。
これは、根本的にどちらも”相場の拡大縮小”に対応させるためのテクニックです。
チャートはその時のボラティリティによって上下幅の変動が変わりますが、固定幅でプログラミングしてしまうと、そう言った変動に対応できなくなります。
ボラティリティの変化対応にATRを使う
宗教的な理由でバンド系テクニカル指標が使えないという人は、ATRを使うのが良いと思います。かつて名をはせた投資ファンド、タートルズが使った手法でもいいでしょう。
利確幅、損切幅を固定pipsで設定しているEAは多いですが、相場のボラティリティが刻々と変化するのであればそれに対応させるのが本来の正攻法です。
ATRは相場の変動幅をそのまま反映したものなので、例えば、TPにATRx3の値を、SLにATRx2の値を設定すれば、相場の変化に対応できます。
ただし、固定ロットでトレードしている場合、ボラティリティが大きくなればなるほど、SL/TP幅も広くなり、損失/利益の金額も大きくなります。
これは、トレードのリスクが相場のボラティリティに自動的に依存してしまうということでもあり、仮にレンジ相場で連勝していたとしても、一回のトレンド相場での負けが、大きなドローダウンの発生につながる可能性があるということです。
MTF(マルチタイムフレーム分析)を入れる
マルチタイムフレーム分析というのは、大きな時間枠からチャートを見ていって、大きな流れを掴んだうえでエントリーポイントを見つけよう、という趣旨の手法です。
例えば、
日足チャートを見てトレンドかレンジかを判定し、
4時間足チャートみて、さらにトレンドが発生していないか見て、
1時間足チャートで、エントリーポイントを見つける
という具合です。
「大枠でトレンドが発生している場合は、その方向に逆らわない方にエントリーすれば、仮にエントリー後に価格が逆行したとしても助かる可能性が高い」という仮説にそった方法です。
株では有効ですが、ぶっちゃけFXの場合は相場全体が元の価格に戻ろうとするので、そこまで優位性があるとは言えないと思いますが、一つのアイディアとして採用してみるのもありです。
相場の状態の推移分析によるトレードアルゴリズムで開発する
FXの場合、現時点でxxとOOのクロスが発生したらエントリーする、などのロジックが多いですが、そもそもこの手の考え方には相場の流れというものが一つしか組み込まれていません。
例えば、
トレンドが発生して、その後、xxとOOがクロスして、△△のラインを超えて、□□した場合にエントリー、といった複数の条件がフローとして発生するというプロセスを無視している傾向があります。
株の場合は裁量トレーダーが多いので、このようなフローでの相場分析が盛んですが、FXの場合はより固定的、一時的な分析にとどまっています。
というのも、このフローによるトレードアルゴリズムは従来の自動売買プログラミングとは書き方が大きく異なります。相場の状態それぞれに名前を付けて分析しなければならないため、プログラミングの難易度はやや上がります。
その分、挑戦している人が少ない方法なので、これまで試したことがない場合はやってみると面白いでしょう。
価格ジャンプフィルター/指標発表フィルターを導入する
雇用統計や指標発表時にはテクニカル指標よりもファンダメンタルズの要素が強く働きます。そのタイミングでテクニカル優位のEAを稼働させると、優位性のない結果にならざるを得ません。
雇用統計などは、毎月第一金曜日の21時半(22時半)と決まっていますが、他にもいくつか指標はあるので、あらかじめそれらの時間の周囲のタイミングではトレードさせない仕様を入れておくという手もあります。
実際、これらのあらかじめ決められたタイミングでは各FX会社もスプレッドを桁違いに広げる傾向があるので、ライブで検証する際には機能しない可能性が高いです。(逆に言えば、スプレッドフィルターでも同様に回避できます。)
曜日分析/曜日フィルターを導入する
曜日によって勝ちやすい曜日と負けやすい曜日があることがあります。だいたい金曜日の後半と月曜日の前半は、それ以外の時間帯と比較して為替チャートの性質が変異しやすい傾向があります。
MT5ではテストした際に、曜日ごとの勝率やトレードデータも出力されるので、曜日ごとにトレード結果に有意な差がある場合は、導入してみるのもいいでしょう。
ただし、これが機能するのは中期間のデイトレードで、高速スキャルピングなどのトレードロジックの場合はあまり関係ありません。
時間帯分析/時間帯フィルターを導入する
為替にアジア時間、ニューヨーク時間、ヨーロッパ時間があるのはFX裁量トレーダーには既知ですが、自動売買開発になると無視されがちな項目です。
アジア時間ではレンジになりやすく、アジア時間の終了とともに相場が活発になるとするならば、アジア時間ではエントリーを避けるべき、というのは一理あります。(実際に導入するかは別ですが…)
逆に、トラリピやグリッドトレードのような戦略では、レンジ相場こそが正義なので、アジア時間にだけポジションを保有させるような機能を付ければ改良が可能です。
分析データ量を増やす
複数通貨のデータを取り入れる
FXはいくつもの通貨がネットワークを組みながら変化しているので、他の通貨ペアチャートのデータが先行指標になるという現象が発生することがあります。
特に日本円は比較的 主体性を持たない通貨なので、他の通貨の影響を強く受けるという性質があります。
”通貨相関”というと大げさですが、データが多ければ多いほど、判断材料が増えるので、プログラムがごちゃごちゃにならない範囲で実装してみるのも実験的です。
ただし、MT4の場合はバックテストでは他通貨のデータを取得したりオーダーを出したりできないので、この検証をする場合はMT5/MQL5が必要になります。
(MT4もライブであれば他通貨可能です。)
ボリューム/ティックデータを取り入れる
多くのFX系テクニカル指標ではティックデータを無視したものがほとんどです。そもそも、価格データと違い、ティックデータの信頼性がそれほど高くないのでスルーされています。
しかし、ヒストリーデータの6分の1を占めているのはボリュームデータです。
例えば、
「ボリュームが増加しながら価格が急激に変化した場合」 と 「ボリュームは大して変わっていないので価格が急激に変化した場合」 では、根本的に相場に起こった現象が違います。
また、FX会社A社ではボリュームが増加したのに、FX会社B社ではボリュームが増加していなかった場合、B社の流動性が低いと判定することもできます。(アービトラージのチャンス)
ちなみに、MFIなどがボリュームを使うテクニカル指標です。
外部データ/オンラインデータを取り入れる
MT4/MT5ではWebRequestを使って外部データのリアルタイムな取得が可能です。指標データの取り込みは筆頭にあがりますが、ロイターなどのニュース情報をテキストマイニングして判定する、ということも可能です。
WebRequestの使い方については過去記事をご覧ください。(MQL4)WEBサイトの情報を引っ張ってくるやり方[EA自作]
ただ、データのリクエスト中はEAが止まるので、エントリータイミング瀬戸際では控えた方が良いと思います。
引数が少ないテクニカル指標に変える
トレードロジックのパラメータが多いということは、それだけ過剰最適化しやすくなるということでもあります。テクニカル指標にはもともと引数が多いテクニカル指標と引数が少ないテクニカル指標があります。
もし代替可能で同じようなテクニカル指標があるのであれば、引数が少ないテクニカル指標の方がそういった意味で汎用性が高いと言えます。(パラメータが少ないのに相場に対応できる)
全体としてEAのトレードロジック部分のパラメータが減れば、カーブフィッティングを避けることができます。
トレードロジックのパラメータを増やす
上と完全に逆のことを言っているようですが、完全に逆のことを言っています。
パラメータが多いか少ないかはどちらが良いということではなく、状況や目的によって変わります。上で述べたように、最終的なEAの形でパラメータが少なければ、過剰最適化の可能性が低いので良いEAと言えますが、そもそもパラメータが少ない状態で右肩上がりの資産グラフを形成できなければ元も子もありません。
まず、資産グラフが右肩上がりにできる状態であることが、パラメータの数うんぬんの前の前提条件です。
もし、現在開発しているEAの資産推移グラフが右肩上がりにできていないのであれば、トレードロジックのパラメータを増やしてみてください。そして優位性のありそうなパラメータ群が見つかれば、その方向に改良を加えればいいのです。
最近の海外のEA開発の流行り:ロングとショートのパラメータ群を分ける
最近海外製のEAではロングとショートのパラメータを分けるのが流行っているようです。
これはどういう背景から来ているかというと、
「株にしろFXにしろ先物にしろ、チャートは完全に上下対称じゃないんだから、買いと売りのパラメータの最適値は別ものになるはず」
というところから来ています。
確かに、どの相場でもじわじわ上昇して、下落するときには一気に下落するという性質がよく見られます。特にビットコイン、豪ドル、インデックスには顕著です。この主張は至極もっともです。
そのため、まず買いのオーダーだけを最適化してパラメータを調整し、次に売りのオーダーを最適化して、最終的に合体させるという使い方が推奨されています。
ちょっとしたマルチシグナルな訳ですが、もし入手したEAのパラメータに「L_****」、「S_****」なんてプレフィックスがついていたら、そういうもんなんだなぁと思いましょう。
日本の場合、「最適化? 何それ? よくわかんないから全部やって」みたいなスタンスの人が多いので、利用者にリテラシーを求める方向性はあまり流行らない気がしますが、開発者と利用者の間に立つ人には重要なお仕事になるので、少しは話のネタになると思います。
後継版のテクニカル指標に入れ替える
MT4/MT5にはデフォルトでさまざまなテクニカル指標が搭載されていますが、そのほとんどは数十年前に開発されたものです。
その後、さまざまな研究が進み、改良が加えられたテクニカル指標が登場しています。
単純移動平均 → 指数移動平均 などは有名ですが、
ストキャスティクス → シャフトレンドサイクル なども上位互換と言えるようなテクニカル指標です。(スムージングの遅れが少ない)
計算量は多くなりますが、より新しいテクニカル指標の方が上位互換になっていることが多いので、入れ替えてみるだけでも違いがあるでしょう。
株は順張り、為替は逆張り、仮想通貨は買いオンリー
絶対とは言えませんが、株は順張り、為替は逆張りの傾向が強いと思います。よく成功したトレーダーのインタビュー本などを読むと、順張りが大正義みたいなことが書いてありますが、それは株トレーダーの話です。
株の場合は、株 本来の性質として「どんどん上がっていたら良いよね」という関係者(株主)の総意があります。対して、為替の場合は、「一定の値の方が都合が良いよね」という関係者(各国政府・貿易関係者)の総意があります。
それが相場にも当てはまっていると考えることは、他人の成功体験を鵜呑みにするよりも合理的だと思います。
仮想通貨は長期的には順張りの方ががっつり利益を取れますが、短期的にはウネウネすることも多いので、長期+低レバレッジ+トレーリングが理論的には良いと考えられます。
トレーリングは順張り用
たまにトレーリングストップを逆張りで使っている人がいますが、トレーリングストップは順張り用のテクニックです。逆張りのテクニカル指標で使ったり、レンジ相場で使うのはNGです。
レンジ相場は損大利小、トレンド相場は損小利大
トレードの本ばかり読んでいると、”損小利大が正義”みたいな書き方をしている本が多いので騙されやすいですが、それは株の話です。FXは相場の本質そのものが違うので、損小利大モデルは特殊な使い方をしないと上手くいきません。
為替の場合は、元の価格に戻ろうとする力の方が強いので、レンジ相場になりやすいです。そのため、必然的に利益獲得モデルも損大利小モデルに落ち着きます。(ここら辺はEAを作って過去検証を何度もしている方なら何となく実感していると思います。)
もしこれまで損小利大モデルで教科書的にプログラミングをしていた場合は、SL:大き目 TP:小さ目 にしてみてください。
情報工学系の技術を使う
情報工学系の出身者であればすでに試しているはずなのでわざわざ書くこともないのですが、情報処理系の専門分野の知識を使えばシステムトレード界隈では試されたことがないようなものがまだあるかもしれません。
かの有名なボリンジャーバンドですら、相場に正規分布と標準偏差をただ適応しただけなので、ここ数年の最新の情報工学の理論を使えば何かしらの優位性を持ったシステムを組み上げることができるやもしれません。スペクトル分解やファジー理論などの古いものはすでに調べつくされているので、流行りどころと言えばディープラーニングですが、もし組み込むならMatLabやSPSSではなくRで開発することをオススメします。(早いので)
ただ、注意しなければならないのは、ノイズ処理系の工学テクニックはあまりうまくいかないです。ノイズ処理では真の値がどこかにあり、その周辺にノイズが乗っかているという前提がありますが、価格チャートではその前提そのものが成立するか怪しいです。
為替にしろ株にしろ、確かに異常値のような値動きはありますが、それ自体も実際の値ではあるのでそれを無視すると意図しないストップロスに引っ掛かったりします。
また、チャートが連続的に表示されていたとしても実際は離散型なので、関数に落とし込もうとする場合はそこら辺も注意が必要です。
すべての通貨ペア、時間枠で右肩上がりにすることは諦める
EAを開発していると、一つの通貨ペア・時間枠でばかりテストしてしまいがちですが、通貨ペアや時間枠を変えるだけで化けるEAになることもあります。
すべてのFX相場で勝てるような理論上のトレードロジックは、アービトラージや指標発表トレードなど限られています。
もともとそのつもりで開発するのであれば問題ありませんが、そうでない場合は、さまざまな通貨ペア・時間枠を試してみてください。
EAの稼働が終了しても、データを記録しておく
MT4のEA、インジケーターは、基本的にバックテストが終わるとテスト中に起こったことを記録しておくことはできません。
例えば、テスト中に、EAに勝率やパターン分析や、高値安値などの情報を記録していたとしても、そのテストが終了するとリセットされてしまいます。
しかし、もしこれらのデータをテストが終わってもリセットされずに、
どこかに記録しておくことができたとしたら便利です。
これには、2通りの方法があります。
グローバル変数
1つはグローバル変数を使う方法です。MT4にはグローバル変数を保存する機能があります。このグローバル変数は、MT4自体に保存するので、
バックテストのEAのデータをライブのEAに引き継がせることなどができます。使い方も簡単で、一行で書き込み、読み込みができます。
デメリットとしては、
浮動小数点型のデータした保存できないことと
保存期間に期限があることです。
文字列や日付などは保存できません。
(数字に変換して、暗号化すれば可能ですが、ちょっと管理が面倒です。)
グローバル変数の使い方については、
https://www.mql5.com/en/articles/1210
ファイル関数
もう一つの方法は、「ファイル関数」を使ってファイルに保存する方法です。
記述は少し面倒ですが、テキストファイルに保存すれば、文字列、日付、少数などを超長期間保存することが可能です。
例えば、
データフォルダのファイルに、
EAをテストした相場の、トレンドパターンやボラティリティ、
そのときの戦略と、その解答を記録しておけば、
簡易的な学習型EAを作ることができます。
これを使って、実験的にロウソク足パターン学習EAを作ってみました。
ロウソク足を数種類にカテゴライズし、その推移パターンをデータフォルダのファイル記録します。
その推移パターンの中で、最も発生しやすいパターンを抽出し、
そのパターンが出現したら、エントリーするというロジックです。
仮想ストップロス、仮想テイクプロフィット
最近の自動売買系の論文やコードを読んでいると「仮想ストップロス」、「仮想テイクプロフィット」という概念が出てきます。これは何のことを表しているのかというと、決済におけるストップロスやテイクプロフィットを予め予約注文としてFX業者に送信しておくのではなく、現在レートが決済予定レートになったら自動売買ソフトが成行で決済をするという機能です。
これはそもそも何のための機能かというと、FX業者のレート不正操作が疑われる場合にポジションの決済を操作されないようにするためという意味合いがあります。
ストップロスやテイクプロフィットを予めFX業者に送信すると、FX業者から見るとその決済予定価格は丸見えになります。ノミ業者の場合、トレーダーの利益=FX業者の損失になるので、FX業者としてはトレーダーに常勝して欲しくないという前提があります。
そのため、一時的にレートを操作してプラスで終わるはずのポジションをさっさと決済させてしまうという悪行をする訳です。この業界に入ったばかりの方は「業者がそんなことをするわけがないだろう」と思うかもしれませんが、FX業界ではよく行われてきたことです。
それに対抗する手段として出てきたのが、「仮想ストップロス」、「仮想テイクプロフィット」という訳です。
最近の海外EA(特にMQL5派生のEA)の場合には、この機能がついているかもしれません。ただ、この機能もメリットばかりではなく、
・成行決済なのでスリップが発生する
・何かの障害でEAが停止していた場合決済されずにポジションが残り続ける可能性がある
というデメリットもあります。
「Virtual StopLoss」というパラメータが出てきたら、「そういう背景があるんだなぁ~」くらいに思っといてください。
ティック更新よりも早い頻度で演算させる
MT4のEAは基本的にティックレートを受信する度に一回演算する仕組みになっています。
USDJPYやEURUSDの場合は、いつでもそこそこティックがあるので、あまり気になりませんが、マイナー通貨の場合は1分に一回程度しかティックが来ないものもあります。(レンジの時間帯とか)
1分足以内のスキャルピングやアービトラージをしようとすると、ここら辺が比較的ネックになるので、ティック更新を待たずに次の計算をさせる必要があります。
ただし、これは比較的荒業で、メモリに負荷がかかることは想像に難くありません。
OnTick内でループさせる
実にかんたんな話で、OnTick,(OnStart,Start,OnCalculate)内全体をループ処理させるだけです。
ポイントはループ処理する場合、レートや口座情報が更新されないので、
RefreshRate()を頭に持ってきて、半強制的にレート更新をする必要があることです。
1 2 3 4 5 6 7 8 9 10 11 |
OnTick() { for(int i_=0;i_<100;i_++) { RefreshRate(); Sleep(1); } } |
あとはEAを停止させようとしたときにフリーズする可能性が高いので、OnChartEvent内に停止ボタンを設置し、そこからEAを停止処理する記述を書くことを強くおすすめします。
for文でループさせれば上の心配はないと思います。以前はwhile文で紹介していましたが、for文の方が安全だと思います。
また、上のコードの場合100回演算が終わるとループを一回抜けてしまいますが、それくらいがちょうどいいと思います。
というのも、while文のように本当に延々とループさせてしまうと、メモリのキャッシュがクリアされないらしく、パソコンがフリーズする原因になるようです。
なので、for文で定期的にOnTickを一度終了させる必要があります。
もちろん、ループを抜け出した直後~次のティック到達の間に何か重要なトレードタイミングが発生する可能性がありますが、そのデメリットを飲んでもfor文にした方が良いと思います。
もし、上記のリスクを減らしたい場合は100回ではなく、1000回~432,000回にすればいいと思います。(60*60*24*5=432,000)
もう一つの欠点として、ティック更新が激しい場合、かつ、演算が軽量な場合、
1秒間隔で演算させるよりも通常のティック更新の方が速い可能性は十分に考えられます。
これらを考慮すると、使用場面はかなり限定的ですね。おそらくメタクオーツ側もあまりやって欲しくはないやり方だと思います。
【追記】OnTimerなる関数が実装されたので、OnTimerを使えばすべて解決すると思います。
スマホから稼働中のEAを操作、チェックする
自動売買システムはVPSなどに設置することで24時間稼働させられますが、スマホから外出先でチェック、操作したいことがあります。しかし、スマホのMetaTraderアプリはEAを扱えないし、諸事情あってリモートアクセスできないことがあります。
例えば、Beeksやお名前ドットコムのようなWindowsタイプのVPSであればRDPで接続できますが、MetaQuotesのミラーリングタイプのVPSやLINUX上でWindowsをバーチャル起動させている場合、リモートデスクトップは使えません。
また、フリーwifiなんかを使っている場合も、セキュリティ上RDPを使わない方が良いこともあります。
■■背景■■
・スマホのMetaTraderではEAが使えない
・MetaTraderには外部からアクセスするコマンドがない
・スマホのMetaTraderではオーダーコメントを付けられないが、すでにあるコメントは見られる
・スマホのMetaTraderで注文はできる
■■アイディア■■
スマホからVPSへの通信:
絶対に約定しない値に予約注文を出す(擬似コマンド)
→EA側で上の予約注文を検知、処理
VPSからスマホへの通信:
プッシュ通知、メール通知
例えば、短時間の間に大量にポジションを持つEAを稼働させている場合、予期せぬ事態が発生するかもしれません。
しかし、スマホでは注文・決済しかできないので、EAを停止させられません。
その場合、「EAがセットされている通貨ペアに、0に近い値のレートに、買い予約注文が入ったら、自動売買を停止」というコードをあらかじめ仕込んでおきます。
こうすれば、緊急停止コマンドとして非常時でも遠隔操作ができるという仕組みです。
実はこれは自分で考えたアイディアではなく、
https://www.mql5.com/en/articles/5166
の引用です。
ここではライブラリもあり、その他細かい操作の方法なども記されています。
詳しく見てみたい方はチェックしてみてください。
- PREV
- bitFlyerのAPIの使い方と注意事項
- NEXT
- FXトレーダーがたどる道[FXあるある]
関連記事
-
[MQL4]MT4でマルチタスク/マルチスレッド処理
MT4/MT5は基本的にC言語ベースなのでマルチスレッドはできません。 しかし、複数のチャート上で
-
OANDAのAPIの始め方と使い方とレート比較
オアンダのAPIやります。 金融業界、とりわけFX業界ではFIX APIが機関投資
-
株価指数両建て裁定取引のやり方と検証
日経225やダウ、SP500のチャートには強い相関関係があります。かつては「日経はニューヨークの後追
-
MT4 チャート上にボタンを作る、シダの葉を作る、動画を作る
(MQL4)MT4のチャート上にボタンを作るやり方 現在のMT4は比較的いろいろな機能が追加されて
-
[MT4]EAに口座縛り/期間限定縛りをかける種類と方法(MT5)
良いEAができた場合、身内で配布したい場合があります。しかし、知らない間に自分のEAが出回っていた場
コメント
突然の連絡すみません。
ex4のデコンパイル方法を模索していたところ下記を発見しました。
https://fxantenna.com/decompile-ex4-and-what-we-can-do/
不躾なお願いで大変恐縮ですが,有料でも構いませんので,デコンパイル方法の伝授,もしくはヒントなどいただけないでしょうか?