FC2ブログ

ダイバージェンスEAをiCustomで作る2

EA作成中
05 /04 2020
前回作ったダイバージェンスEAの山谷判断ロジックを改善しました。
あと、クローズサインでクローズするように改造しようと思ったのですが、もう出来ていました。
o( ̄ー ̄;)ゞ

そして山谷の判断ロジックを改善したら衝撃的な出来事が・・・・
試しに山谷でオーダーしてみたら、ダイバージェンスより良い結果になってしまったww

まずは改善項目の確認です。山谷が判断できない状態が頻繁にありました。(下図)
icustom-divereye-falseチャート

山谷の判断漏れがないように(できるだけ)改善しました。(下図)
icustom-divereye-trueチャート

これが山谷の判断がいまいちなEA。
icustom-divereye-falseグラフ

これが山谷の判断を改善したEA。
icustom-divereye-trueグラフ

改善前EAのグラフがフォワード付きのしか残ってないので、わかりにくいですが、あまり変わらないもしくは悪くなった
まぁ、そんなもんでしょう。オーダー数は増えましたが、優秀なEAではないのでオーダーが増えれば良い時も増え、悪い時も増え・・・とんとんでしょう。

では衝撃的なグラフを。
icustom-divereye-MACD-Peakグラフ

これがMACDの山谷だけでオーダーをしているグラフです。当然、オーダー数はだいぶ増えています。オーダー数が増えると普通は悪い方向に向かっていきます。
が!フォワードが右肩上がりになっていますし、バックテストも利益が出ています。

icustom-divereye-stochas-Peakグラフ

Stochasticsの山谷だけのオーダーも試してみましたが、MACDのほうが優秀です。
「山谷でのオーダーからトレイリングストップでのクローズ」の方がシンプルでオーダー数も多く、最適化がしやすいのでしょう。

今回試したかったEAではダイバージェンスの有効性検証だけではなく、オーダー数が多いことが望ましかったので、これは良い結果になりました。

パぺ太メモ


機械学習のデータとしてチャートの値動きを入力しようと思っていますが、全ティック入れても意味がないというか、あまり有効な結果が出ない気がしています。
特定のポイントで予測を行うほうが条件を絞りやすく、データが集めやすく、有効性もわかりやすいのではないかと思っています。

でも予測ポイントよりオーダーは少なくなるため、予測ポイントが少ないとオーダーをしないEAになってしまう可能性が高くなります。月一回とか勘弁w

これで方針は決まりましたので、機械学習での予測の準備に入ります。
o(⌒ー⌒)o

  • MACDの山谷ポイントでのデータを集める
  • データは、移動平均各種、一目均衡表、RSI、Stochastics、MACD
  • 機械学習で予測モデルを作る
  • MT5のEAにDLLを組み込む
  • インジケータを作成する
  • EAをiCustomで作成する

・・・まだまだ先は遠い (_ _|||)




ダイバージェンスEAをiCustomで作る

EA作成中
05 /02 2020
案外簡単にできたのですが、デバッグしているとインジケータのデータが細切れに途切れてしまう現象が・・・
一旦MT5を落として、立ち上げなおすと何とか動作するようになりました。
同じインジケータの違うバージョンを同名で立ち上げていると誤動作するようですね。
デバッグの時には気を付けよう。

iCustomのオーダー

オーダー部分は、MT5のExampleEA(MACD Sample.mq5)から取り出して使ったので、iCustomでインジケータのデータを取り込みオーダーする部分のみ実装すればOKでした。
下のコードで「最大ヒストリーバー」以降は、インジケータのパラメータです。

ex_ind_handle = iCustom(
Symbol(),
Period(),
"DiverEye5",  // インジケータ名称(ファイル名)
1000, // 最大ヒストリーバー
0, // チャート表示選択
true, // オーダーのみ表示
true, // ダイバージェンス両表示
macdDivSignal, // MACDダイバージェンス
shortMacdPeriod, // 短期MACD期間
longMacdPeriod, // 長期MACD期間
divMacdPeriod, // MACD ダイバージェンス判断期間(期間より大きく)
stochasDivSignal, // ストキャス ダイバージェンス
stochasMidPeriod, // ストキャス期間
stochasMidSlow, // ストキャス スローイング
stochasViewThreshold, // ストキャスしきい値(ダイバージェンス)
diverStochasPeriod // ストキャス ダイバージェンス判断期間(期間より大きく)
);

DiverEye5インジケータでは、バッファ0にロングオーダーサイン、バッファ1にショートオーダーサインを表示しています。なので、iCustomの戻りハンドルを使用して、バッファ0と1をコピーしてきます。
その最新インデックス(0)が有効な値の場合は、オーダーサインになります。

if (CopyBuffer(m_handle_ind, 0, 0, 1000, m_long) != m_period)
{
Print(" CopyBuffer error !! ");
return false;
}
if (m_long[0] != 0 && m_long[0] != EMPTY_VALUE)
{
Print("long = ", m_long[0]);
return 「ロングのオーダー」;
}
if (CopyBuffer(m_handle_ind, 1, 0, 1000, m_short) != m_period)
{
Print(" CopyBuffer error !! ");
return false;
}
if (m_short[0] != 0 && m_short[0] != EMPTY_VALUE)
{
Print("short = ", m_short[0]);
return 「ショートのオーダー」;
}

それでどうなの?

いろいろな通貨ペアで試しましたが、USDJPYの1時間足が一番いい結果でした。

icustom-divereye設定

去年1年間でバックテスト・フォワードテストを行いました。

icustom-divereyeパラメータ

パラメータ最適化をしています。Lotは0.1固定です。

icustom-divereyeバックテスト

バックテスト期間(1年の2/3)では微益が出ました。勝率は辛うじて50%を超えています。

icustom-divereyeフォワード

フォワード期間(1年の1/3)でも微益が出ました。勝率は56%ぐらいです。

icustom-divereyeグラフ

グラフで見るとこんな感じ。バックテストからフォワードテストに移るときに金額がリセットされています。(2019年8月中旬で残高が100000$にリセットされています)

他の通貨ペア(EURUSD、GBPUSD、CADJPY)は最適化してもプラスになっていません。
他の時間足(5分、15分、30分)は微益でしたが、1時間足が一番いい結果でした。

1時間足なので1年間83オーダーしかしていません。インジケータの時に説明した、山谷の判断ロジックを改善すれば、オーダー数は上がると思います。が・・・それがいい結果になるかどうかはわかりません。
(_ _|||)

あとクローズサインをインジケータでは表示しているのですが、EA側では全く違うクローズロジックになっています。
これも損益に関係してくると思います。

次にやること


やはりMT5でのバックテストは良いですねー、MT4よりも相当早い気がします。
最適化やバックテストを行うと、自動でパラメータや設定を保存しておいてくれるのもGOODです。
フォワードテストで検証できるのも良いし。
これで、移植さえ簡単なら・・・( ̄へ ̄||) 

このEAのままでは使い物にならないので、次にやることは、
  • 山谷の判断ロジックを改善する。
  • クローズサインでクローズするようにする。
特に「クローズサインでクローズ」は他のインジケータを作ったとき必須になるので、実装しておきたいですね。

連休中にはできないかなぁ・・・( ̄ー ̄;)ゞ
カルマンフィルタの改造もしたいし、機械学習の組み込みもしたいなぁ、休みがあと1ヵ月あればなぁ。
Oo。。( ̄¬ ̄*)
(そんなことしたら生活できませんてw)



カルマンフィルタEAでバックテスト

EA作成中
05 /01 2020

カルマンフィルタ

Wikiでは「誤差のある観測値を用いて、ある動的システムの状態を推定あるいは制御するための、無限インパルス応答フィルターの一種」となっています。
はい、イミフですw

話が変わりますが、カーナビってトンネルでも今の位置を表示していますよね。なんで?!
チコチャンじゃなくても気になりませんか?
※トンネルじゃなくても、民生用GPSではそこまで精度は高くないので、基地局の位置情報を使ったりするようです。
あとは走行速度とか、コンパスとか・・・まぁどれも精度は期待できるものではありません。
これらの情報から位置を推定して表示しているようです。

「誤差のある観測値(GPS、基地局、速度、方位など)を用いて、ある動的システム(車)の状態(位置)を推定」しているのですね。
※実際のカーナビ開発をしていないので推測です。
o( ̄ー ̄;)ゞ

不正確な時系列データ(測定値は時々刻々送られてきます)から状態を推定する・・・FXに使えるかもって思いますよねー!
※鋭い方は「誤差のある観測値」(FXは誤差ってもんじゃないだろ?!)ってことに引っかかると思いますがスルーで。

そう思ってたら、MQL5.comに記事があるじゃないですか?!それもEAを作られていて右肩上がりのバックテストが載っています。
ダウンロードしてバックテストしてみるしかないですよね。

※カルマンフィルタのインジケータもMQL5.comからダウンロードできます。(見方がいまいちピンとこないですが・・・)

MT5でバックテスト


カルマンーストラテジー

記事では EURUSD でバックテストをしていたので、昨年の半年間で行ってみました。
(今年の相場では今後あまり参考になりそうもないのでw)

カルマンーバックテスト

MT5ではMT4と違い、スプレッドは指定しません。実際の値=その時々のスプレッドの変化が使われます。また実際の値動きを使用するため、データの品質は100%です。

勝率35%程度で、1割近く負けていますね。
グラフで見るとこうなります。

カルマンーバックテストグラフ

見事な右肩下がり(_ _|||)

記事では・・・2017年8月の一か月だけでバックテストしてますね。
一か月って、意味ないでしょw
上のグラフでも8月は右肩上がりになっている感じです。8月には使える?!

まぁそんなに甘くはなかったです。
ところでMT5には「フォワードテスト」がシミュレート出来るんです。

カルマンーフォワード

バックテストデータを検証できるみたいですね。
実際どういうことをしているのかわかりませんが、バックテスト最適化でのカーブフィッティング(過剰最適化)を検証する機能ということです。
※フォワードテストは指定期間の1/2、1/3、1/4期間が選択できます。上図では右側の1/3期間がフォワードテスト結果です。

このカルマンフィルタEAもパラメータ最適化しましたので、フォワードテストで過剰最適化だということがバレました。
( ̄□ ̄;)

他のフィルタ

他にも「粒子フィルタ」(パーティクルフィルタ)というのがあるのですが、MQL5.comにはインジケータもEAもありませんでした。
C++言語のソースは見つけたのでMQL5に移植すればいいのですが・・・・

敷居も高いし、カルマンフィルタがこれではねぇ
┐( ̄- ̄)┌ 

このカルマンフィルタEAに移動平均や一目均衡表の算出値を「誤差のある観測値」として入れてみる方が有効な気がします。

まずはダイバージェンス・インジケータ

EA作成中
04 /30 2020
MQL5でのインジケータ作成も、1つできると少し進みが早くなります。

ただ以前MQL4で作った全機能を移植するのはきついので、一部分を切り出して移植しています。
簡易なインジケータの作成から、EAにするのが今回(連休中の)目標です。

ダイバージェンス・インジケータ


ということで、簡易なダイバージェンス・インジケータを作成しました。
前回のとおりですが、MACDとストキャスティクスのダイバージェンスを表示できるようにしました。
DiverEyeMT5プロパティ

チャートの表示上に山谷とダイバージェンスを表示します。
MACDのダイバージェンスをストキャスのチャートに表示するなどもできます。(まったく意味ないですがw)

オシレータ(MACD、ストキャス)の山、谷は前後2値が、山なら一致しているか安い場合です。
プログラムでは「v[4] <= v[3] && v[3] <= v[2] && v[1] <= v[2] && v[0] <= v[1]」こんな感じとしていますので、前後2値が条件に一致しないと山や谷とみなしません。

そしてダイバージェンス判断は、期間内(30期間とか)で直前のピークより大きなピークがあった場合に、山なら高値が安かった場合に「ダイバージェンスだ!」としています。
当然、ピークを判断できるのが2期間後なので、サインも2期間遅れて表示されます。

ここまでは前回と同じですが、「前後2値が条件に一致しないと山や谷とみなしません」この部分をちょっと解説します。

MACDでのピーク、ダイバージェンス表示

ダイバージェンスMACD

ストキャスでのピーク、ダイバージェンス表示

ダイバージェンスStochas

明らかに緑背景部分が山谷の判断できていません。
ダイバージェンスNG1
①はOKだけど、②のように1回で戻ってまた落ちてくるなどは山谷と判断できません。他にも判断できないパターンがあります。
プログラムなので、いろいろなパターンでも大丈夫なように作れば出来るんですけどね。簡易版ということで。
(_ _|||)

EAにするには


このダイバージェンス・インジケータをEAにするのは、iCustomを使おうと思っています。
まずインジケータでMACD、ストキャスのダイバージェンスサインを合成して売買シグナルを描画します。
この売買シグナルをiCustomで取り込んで、実際の売買関数でオーダーをかけるという感じです。
売買シグナルからオーダーをかける部分は、どんなインジケータでも同じに出来るので、今後他のインジケータを作成しても少しの改造でEAになります。

MT4の時はiCustomが重すぎて、ずれてオーダーされているような感じでしたが、MT5は処理が早くなっているので、そのようなことも無いと思います。
※自分の使い方がわるいのかもしれませんが、MT4ではiCustomを使うと売買がうまくいかないことがありました・・・。

ちなみに他のインジケータ


HULL移動平均

一番初めにMQL4から移植した「HULL移動平均」です。
オシレータ系よりもわかりやすいのと、テクニカル関数を使ってないので移植はしやすかったです。

HULL移動平均だけでは、売買シグナルが出せないので、簡易ダイバージェンス・インジケータを移植してます。
この図だけではいい感じに赤青の切り替わり(転換点)がありますが・・・たぶん右肩ガッツリ下がるようなEAしかできないと思われます。

次は、iCustomでEAを作る!にする予定です。
オーダーの仕方を勉強しないと・・・
( ̄- ̄;)


MQL5の壁

EA作成中
04 /28 2020
EAに機械学習を組み込みたい!から、ずいぶん経ってしまいました。

どうせならMT5で動かしたいと思ったのがいけなかった
( ̄へ ̄|||) 
MQL5の厚い壁に阻まれています……

今まで作っていたMQL4ライブラリが、ことごとく動かない!!
大分かけて作ったので捨てたくないし、しかし半端な修正量ではないし、地道に動かしていくしかないかと、少しずつ修正していました。

一番痛いのはテクニカル関数の使い方が、ガラッと変わったこと。そこらじゅうで使ってるのでほんと面倒で…バッファの順番が逆なのも地味に痛い><
┐( ̄ヘ ̄)┌ 

MT5のメリットは速度、バックテスト、Pythonからの呼び出し、など食指が動くものばかりなので、今さら諦めたくない!
少しずつでも移植していきます。

さて弱音ばかり言っててもしょうがない。
移植中のダイバージェンスロジックが少し動いてきたので制作過程から。

ダイバージェンス・インジケータ

MACDなどのオシレータ系での現象ですね。
「高値を更新したのに、オシレータは低くなった」
「安値を更新したのに、オシレータは高くなった」
っていうやつです。

ダイバージェンス1

・矢印はダイバージェンスです。
・◎はダイバージェンスになっていないピークです。赤丸は山、青丸は谷。

ピークの山、谷は前後2値が、山なら一致しているか安い場合です。
プログラムでは「v[4] <= v[3] && v[3] <= v[2] && v[1] <= v[2] && v[0] <= v[1]」こんな感じ。(vはオシレータ値)

そしてダイバージェンス判断は、期間内(30期間とか)で直前のピークより大きなピークがあった場合に、山なら高値が安かった場合に「ダイバージェンスだ!」としています。
またピーク値は0以上、0以下で区切っています。

当然、ピークを判断できるのが2期間後なので、サインも2期間遅れて表示されます。


これから

まずはインジケータを完成させてしまえば、iCustomを使ってEAが簡単に作成できます。
MACD、ストキャスティクスのダイバージェンス判断インジケータを作成して、iCustomで動かすまでを、できれば連休中に終わらせたいですねー
Oo。。( ̄¬ ̄*)
MT5のバックテストを早く使いたいー

ついでと言っては何ですが、MQL5.comで「カルマンフィルタ」のEAを見つけてしまいました!
時系列データの予測に使われるアルゴリズムですね。
これも連休中に使ってみたい。

新コロナで外出制限中なのでちょうどいいのですが、他にもやりたいこといっぱいなんですよ。
連休が一か月ぐらいあればいいのに。
( ̄ρ ̄)

そうそう、コメントいただきました。ありがとうございます!
質問に答えさせていただきます。

パぺ太は全くの独学で勉強しています。
EA開発者の友人… 残念ながらいません。
FXトレーダーの友人さえいませんw
「FXって怖いよー」って株を買っている人ならいます。いや、似たようなものだってww

独学はなかなか難しいですが、頑張りましょうー!

パペ太

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