FC2ブログ

ナンピン・マーチンゲールEA作成記

EA作成中
12 /28 2020
久しぶりにEA作成を始めました!
今年は武漢コロナ以外でも、プライベートで色々ありすぎて、更新する気力がありませんでした。
病気になるわ、定年になるわ・・・もうおなか一杯!
( ̄へ ̄|||) 

しかーし!!!
最近のEAを見ていると、全く前と違う様相!
ナンピン・マーチンゲールでしか利益が出ないのか?!
そこを探っていきたいのですが・・・

その前に今の状態を観察しましょ。
  • アメリカ大統領選挙、不正問題
  • 武漢コロナ、いまだに猛威を振るう
  • ブレグジット後遺症
  • 実体経済の伴わない株式
  • 仮想通貨バブル
挙げればきりがない、異常状態です。

そして、
  • gogojungleの売れているEAはナンピン・マーチンゲール
  • わたくしが購入している「PIPS miner」は絶不調
余計なことでしたw

ただし!売れているのは儲かっている証拠。
探るよりも、時流に乗ってナンピン・マーチンゲールEAを作っていってみましょう。
o(⌒ー⌒)o

ナンピン・マーチンゲール

なにそれ?おいしいの?と、言われそうですが、ナンピン=難平、日本語です!
マーチンゲールはギャンブル用語です。
この時点で意味がわかりません、というか無理やり造語な気がしますが。

ナンピン(難平)

売買から逆方向に価格が動き含み損が大きくなった場合に損切りするのではなく、もう一度同方向の売買を行い売買価格を実勢価格に近付けて平均含み損を小さくするのがナンピンです。

マーチンゲール

マーチンゲール手法は、ナンピン時に倍額で売買し、平均価格を抑えることにより、損益分岐点を小さくします。
要は、倍々でナンピンすることにより、通常のナンピンより平均価格を直近実勢価格にしてしまうことですね。

無限に資産があれば、最後に1回勝つだけで利益が出るため、100%勝てる方法です。
ただし無限に資産があれば
通常はロスカットになります。┐( ̄ヘ ̄)┌ 

無限に資産はないよ

ありませんよねー、あったらFXなんてしないです
(TヘT)
では、なぜナンピン・マーチンゲールのEAが多く、そして儲かっているのか?
まだ破綻していないからw
と、言ってしまったら元も子もありませんね。

現在販売されているEAはそれぞれ工夫されています。
マーチンゲールの値幅・倍率調整、ナンピン回数上限や、ストップロスの設定、破綻しないラインを決められたりなど。

皆さん優秀です。ただまだ破綻していないからというのも、間違いではありません。
それほど、ナンピン・マーチンゲールは怖い手法だと思います。

それでは何故作るのか?

まぁ時流に乗るというか、知っておいて損はないというか、儲けたいからですね。
o( ̄ー ̄;)ゞ

さて単純にナンピン・マーチンゲールを作っても、何番煎じかわからないので、一工夫しましょう。
ナンピン・マーチンゲール手法に合うのは、逆張りのインジケータを使った手法でしょうか。

逆張りは反転期待で行いますが、反転しないときはストップロス一直線になります。
「ストップロスに行かないで反転してくれー」と心で叫んでも、現実は無常です。

そこでナンピン・マーチンゲールです!
ストップロスに近づいたらナンピンして平均価格を近づけてストップロスを延長すれば、永遠に負けません!!
永遠なのは無限に資産がある場合ですね。
ただし、もう少しで反転するのにって場合の方が多いと思います。
(暴騰、暴落の場合もありますが、そこまで多くないですよね)

逆張りに使う手法としては、ボリンジャーバンド、ストキャスティクス他のオシレータ系、ヘッドアンドショルダーなどのチャートパターン、包み足などプライスアクション、グランビルの法則などなど、挙げればきりがありません。

グランビルの法則

今回はグランビルの法則を使っていきましょう。
グランビルの法則の一つ
"価格が移動平均線から大きく離れた場合は反転、逆張りのシグナルとなります"
ただし乖離がどれくらい大きくなると逆張りのシグナルになるのかを判断するには、マーケット・チャートを分析する必要があります。 

マーケット分析はEAに組み込めませんので、ナンピン・マーチンゲールが補助輪として機能させます。
グランビルの法則では乖離を見ます。そのため、あまりなじみは無いですが、移動平均乖離率を使います。

要件定義・仕様

EAの作成過程をブログにしていこうと思います。(いつまでかかるか・・・)
1分足でも運用をしたいと思っているので、ターゲットはMT5です。
またブローカーですが、1000通貨単位の売買ができないと厳しいです。
当然、デモ口座・VPSでの運用を目標にしています。

運用条件
  • MT5(可能なブローカー)
  • 1000通貨単位での売買(可能なブローカー)
  • M1, M5での高速スキャルピング(可能なブローカー)
  • 売り/買いの単独EA(2本動かすのが基本となるので両建てOKなブローカー)
  • VPSはWindows10サーバー(なるべく安価でカンタン設定なところ)
  • スプレッドが小さい通貨ペア狙い

概要
  1. 指定した乖離(移動平均乖離率)が発生したら逆張りオーダーを行う。
  2. ストップロスは指定値を設定する。
  3. 反転して利益が出てきたらトレーリングストップを行う。
  4. 反転しない場合は次の乖離を待つ。
  5. 乖離が発生し、前回オーダー価格から指定PIPS離れていた場合はナンピンする。
  6. ナンピンのロット数は、指定したマーチンゲール倍率とする。
  7. オーダー数制限まで3から繰り返し。

出来た!!w( ̄o ̄)w
ロスカット一直線のような気がするけどw
(_ _|||)

今後

要件定義・概要が出来た?ので、仕様設計(パラメータ設計、詳細設計)をしていきましょう。

肝は、ナンピン・マーチンゲールでの複数オーダー管理ですね。
ただ複数オーダー管理の設計は面白くないので、飛ばそうかなー
Oo。。( ̄- ̄*)


単純なブレイクアウトを使ってみる

EA作成中
07 /12 2020
行き詰ったら基本に戻りましょう。
大成功を収めた昔の投資集団のタートルズを見習って、ドンチャンブレイクアウトを試してみます。
MT4のインジケータ(昔、自分で作ったやつ)を掘り起こしてきました。

今回は、MT5への移植とドンチャンブレイクアウト手法を思い出すことですね。
このインジケータはスプレッドを考慮していない、検証が出来ていないので、まだまだブラッシュアップをしないといけませんが、MT5へ移植して動かしてみました。

ドンチャンブレイクアウト

  • 終値が、過去の40期間の最高値を更新したら仕掛ける
  • 終値が、過去の20期間の最安値を更新したら手仕舞い
ただこれだけの、トレンドに乗ってけー!という単純な手法です。

タートルズ改ブレイクアウト
  • 終値が、過去の20期間の最高値を更新したら仕掛ける (1)
  • 終値が、過去の10期間の最安値を更新したら手仕舞い (1)
  • 終値が、過去の55期間の最高値を更新したら仕掛ける (2)
  • 終値が、過去の20期間の最安値を更新したら手仕舞い (2)
(1)は利益が出た場合1回休みフィルター、(2)はフィルターなしでオーダーします。
4回までの追加オーダー(ピラミッディング)を行います。
S/Lはオーダー時のATRで計算します。

他にも市場の選定や金額などのルールがありますが、上記のタートルズ法で実装しています。

トータスビュー5プロパティ
トータスビュー5チャートH1

(インジケータは10000期間表示)
シグナルはブレイクアウトで出ている感じはしますが、スプレッドは考慮していません。
今回のインジケータでは58%という高い勝率でしたが、通常の勝率は20%前後です。
(バグがあると思われます w( ̄o ̄)w)

以前MT4インジケータで試した時には、20%の勝率でもトントンな利益率になっていました。
・・・もう一度検証してみないとダメですね。どちらがバグなのか。
(他のサイトを見ると勝率は低いのが一般的です)

なぜブレイクアウト

簡単なテクニカル・シグナルで低い勝率、かつ利益率が良いならば、少し勝率が高くなれば大きな利益率になります。

以前は移動平均線でのトレンドフィルターや、ADXなどのオシレータを使ったフィルターを入れても、20%を大きく上回ることはありませんでした。

他のオシレータでフィルターを試しても良いのですが、試行錯誤が面倒ww
ということで、機械学習でフィルターしてみては?
オーバーフィッティングにならないように、大まかにデータを区切ってやれば、ある程度使えるかもしれません。

そして!ランダムフォレストでフィルターすれば使用したオシレータの重要度が見られます!

ブレイクアウト+機械学習

勝率に関してはEAにしてバックテストすればはっきりします。
まずは(タートルズ改)ブレイクアウト手法をEAにします。
ロジックの基本はインジケータで実装していますので、そこまで時間はかからないと思います。

しかし!
ブレイクアウト、ピラミッディング、手仕舞いが正常に動作しているのか検証するデータを取るのが難しいですね。
検証しやすいデータにしないと後から見て「???」になること間違いなし!

そこから機械学習フィルターの実装ですが、こちらも学習データの選定が難しいですね。
なにごとも、データ命です( ̄- ̄;)

ブレイクアウト以外にも、いろいろなテクニカルが候補になります。
パーフェクトオーダーとか、GMMAとか順番だけで学習させれば汎化できそうなテクニカルありますねー

まだまだやることいっぱい┐( ̄。 ̄)┌ 


機械学習EA出来てはみたものの・・・

EA作成中
06 /21 2020
機械学習でEAを作ったら、いけるんじゃない?という目論見で始めましたが、無理なんじゃ?というところに来ています。
一番大きな理由がオーバーフィッティング・・・カーブフィッティングですね。

既知のデータに対して学習し、「既知のデータで推測可能な」未知のデータを予測、分類するというのが機械学習ですね。

ここが重要→「既知のデータで推測可能な」未知のデータ
FXって違うんですよねー・・・知ってたけどww

既知のデータで学習するしかないのですが、既知のデータから推測できない未知のデータはどうやっても推測できないのです。
まぁ、当たり前 ┐( ̄o ̄)┌ 

2020年1月~3月で学習し、4月~5月のデータでは少し良い感じになったとしても、2019年のデータでは全く通用しないとか、よくあるEAの動きですね。

汎化したらいいのでは?

汎化したら?と思い、いろいろ試してみましたが、汎化しすぎると機械学習する意味もないですよね。
たとえば、ADXが0.35以上はトレンドが発生しそうだからシグナルを通すとか単純なフィルタリングするレベルになってしまいます。
それ以上の学習をさせてしまうとカーブフィッティングになります。

バックテストで最適化しただけでもカーブフィッティングになるのですからね。機械学習なんてしたら完全なカーブフィッティングになることは当然でしょう。

じゃぁ機械学習って使えない?

時系列データの考慮をしたとしても、カーブフィッティングになるのは防げないのでは?と思っています。
なのでRNN、LSTMを使ったとしても「学習」で覚えてしまえば、その学習データのクセを覚えてしまうと思われます。
なので、直接的な使い方は難しいのかもしれません。

カーブフィッティングにならないような学習の方法があれば良いのですけど・・・
例えば、数値をそのまま学習するのではなく、レベルを学習するとかですね。広がりが大きい、中くらい、小さいとか、10.0ずつ区切って10分割で学習するとかが有効かもしれません。

バックテスト

学習したデータと結果はこちら

データ:BB-width,MACD,VQ,ADX
BB-width, 24.396581
MACD,     27.096298
VQ,       32.675617
ADX,       15.831504

accurate =  14.378698224852071  
real accurate =  42.99242424242424

total profit = 985.500000, 
order error= 239 / 528, 54.734848%

2020年1月~3月で学習したモデルで、2020年4月~5月で評価した結果です。
54.73%の勝率で、985PIPSの利益が見込めることになっています。

macdランダムフォレスト-バックテスト

52.88%の勝率で、588.92PIPSの利益になりました。

macdランダムフォレスト-グラフ

macdランダムフォレスト2019-グラフ

上が2020年4月~5月で、下が2019年7月~12月です。
確実に最適化、カーブフィッティングになっています。

次の手はあるのか・・・

機械学習については、まずはこの状態で置いておいて、良い手を思いつけばということろです。
実数から段階表記にして学習という手はありますが、これがダメだと本当に手がないので、他のことをやりながら、進めていくほうがダメージが少ないかもw
( ̄- ̄;)

MT5にもずいぶん慣れてきましたので、単純なシグナルで世にあるインジケータの有効性を調べてみようかなと思っています。
単純なシグナルは、MACDのシグナル線とのクロスとか、ストキャスティクスの80-20ライン越えとか、ボリンジャーバンドの2.5σ越えとかですね。
このシグナルを、このインジケータでフィルタしたら良い結果が得られるのか?とか・・・インジケータ探しをしてみようかと思います。

pythonとMT5の連携もやってみたいですね。

まだまだ夢(右肩上がりEA)の実現へ向かって突き進みますよー
Oo。。( ̄¬ ̄*)




iCustomからライブラリ化

EA作成中
06 /14 2020
インジケータからライブラリへの移植がすみました。
インジケータのコードを切り出してライブラリにするだけなので、OnTickで現在値(始値とか終値とか)の取得をして、整形すればほぼ完了でした。

iCustomでバックテストをしていた時には、テストを行った後は必ずMT5を立ち上げなおさないと、次にエラーが出てテストを連続で行えませんでした。
ライブラリ化後は何回テストしても、そのような現象にはならないです。
iCustomの不具合??

ただ、以前から出ているティックデータが取れない現象は続いています。
これは何でしょう???

新たな問題

予測結果が100%になる不具合は修正できたのですが、修正すると予測結果が40%台がMAX
(_ _|||)

うむ~~~~
学習方法を工夫してみても50%台がベスト。こんな感じです。
202004-macd-いまいち

まぁ右肩上がりと言えばそう見えますけどねー
良いような、あまり意味ないような・・・

そして他の年度でも試してみました。2019年です。
macd2019-いまいち

2019年の1月から7月までのティックデータが取れない現象が出ていますので、8月以降のバックテストですね。微妙ですねー
┐( ̄- ̄)┌ 

2020年よりも2019年の方が(どちらかと言えば)いまいちです。原因は何だろうと考えてみると、終値や移動平均値を価格そのままで学習させているからでは?という基本的な考慮漏れww
だめだなぁ、最初に考えていたのに、EA作ることにかかりっきりになると忘れてしまう。

トレンド系のインジケータからオシレータ系に全面的に移行したほうが良いとは思うのですが、それで予測確度が上がるのか?やってみないとわからないですね。

オシレータ系テクニカル

トレンド系のテクニカルはほぼチャートに表示されますので分かりやすいです。
オシレータ系のテクニカルは別窓で表示され(トレンド系でも別窓はありますが)どう見たらいいのかがテクニカルごとに違うのでややこしいですね。

今回使おうと思っているのは、この3つ。
  • Momentum
  • CCI
  • ATR
ストキャスティクス、RSI、ADX(トレンド系ですが)は試してみて、ダメでした。
(あくまでも自分が作っている機械学習ではダメだっただけで、一般的には使えるテクニカル指標です)

いまいちな結果であれば、いろいろなテクニカル指標を順次試していこうと思っています。

機械学習期間macd

こんなバックテストになれば目標達成なのですが、無理でしょうねー
(学習期間のバックテストですw)

パぺ太メモ

iCustomでのEA開発には落とし穴がいろいろありますね。
初めからライブラリで作っておけば良かったと後悔しています。・・・時間の無駄><
まさか、バックテストを連続でできないのもiCustomが原因とは思いませんでした。

ティックデータが取れない現象はまだまだ続いています。
MT5特有の現象とは思いますが、自分のEAが悪いのかMT5が悪いのかブローカーサーバーが悪いのか全く切り分けができないのが辛いです。

EAの評価ができないわけではないので、まずはバグのない右肩上がりのEAを目指しましょう。
o( ̄ー ̄)o



EA作り直し?!iCustomの罠

EA作成中
06 /05 2020
iCustomの罠というか、ただ単に自分が勘違いしていただけというか・・・
(_ _|||)

インジケータで売買シグナルをチャートに表示し、そのデータをiCustomでインジケータバッファから読み取り、オーダーをかける。
まぁ読めば普通に聞こえるし、できそうに思います。というかiCustomってそういう使い方OKでしょ?って思うのは自分だけかも?

でも、できません。いや、できるかもしれませんが、自分は諦めました。
iCustomってEAがインジケータのバッファを参照できる仕組みです。
  • EAはOnTick関数でバッファを見に行きます。
  • インジケータはOnCalculateでバッファにテクニカルを描画します。
EAがインジケータに描画を依頼するわけではなく、インジケータがバッファに描画したと報告するわけでもなく、どうやってEAはインジケータの【更新データを漏れなく】受け取れるのでしょう?

グローバル変数でインジケータの状態を書き込み、EAで監視するなどの方法もありますが、これもEAが更新をスルーする可能性が高い、基本的にEAとインジケータは同期して動けませんし、同期させるとMT5の動作が不安定になる可能性があると思います。(Mutexなどで片方を止めておくなどの方法で同期させた場合)

インジケータの描画OnCalculateのタイミング、EAのOnTickのタイミングはMT5の勝手です。(仕様とかあるかもしれませんが、ググっても同期方法がヒットしない・・・)

解決方法は?

簡単です。作り直し。(TヘT)

よく考えると、iCustomってインジケータはテクニカル表示して、EAでシグナルの判断していますよね。これが正解な使い方です。

今回作成しているのは機械学習EAなので、インジケータでも機械学習のシグナル、EAでも同様なので、インジケータで行っている計算などを全部クラスライブラリにして、includeファイルにしてしまいます。
これをインジケータで表示できるようになれば、エンジン部分は共通で、インジケータとEAは側だけ作れば良いということです。
まぁ、MT4の時にやっていた方法に戻ります。

やることは増えましたが、解決する可能性の低い方法に固執していても時間の無駄ですからね。

データが取れない、その後


データが取れない

バックテストをすると、こんな状態でした。
リアルティックが取れないよーってエラー、知らんわ!ググっても有益な情報もなく・・・
OANDAのせいかなぁ・・・と、途方に暮れていたら、「まさか?!」MT4で「n/a」になった時のように、データの齟齬が起きているのでは?と思いつき、
ティックデータを読み込んでみました。

ティック読み込み

やったー( ̄。 ̄)
バックテストでエラーが出なくなりました。

OANDAさん疑ってすみませんでした><

パぺ太メモ

さて、今週末はライブラリを作ってインジケータ、EAを動かすぞー

バックテストでのエラーも解消したし、大きな問題が起きなければ来週末にはある程度、形にできそうですねー
大きな問題・・・何か忘れている気が?
そういえば、機械学習の予測100%はバグが見つかっていない><

EAが動いて正常にデータ収集ができるようになってからまた予測させてみよう!


パペ太

パペ太は自動人形(EA)を操るという意味で、puppeteer(人形遣い)から付けました。
高収益のEAを目指して日々悩んでいます。