FXの予想プログラムはなんかかっこいい! by 六花

未来予想・・・なんか出来そうでできなそうな感じ・・・

という事で今回は、FXの未来予想をしてみようかな?という感じです。
今回のぶつは以下にあります。
http://ux.getuploader.com/FXProgram2001/download/15/HPVAR005.zip
DLPass:hpVar
今回のシステムは表示しているとなんかかっこいい!(By 六花 2期楽しみ!)

ですが結構重い、本当に使えるの?(検証は殆どしていない)があるのでどうしてもやってみたい!という方以外はやめておいた方が宜しいかと。
じゃあなぜ公開したのかって。 それは間違っているよ!とかこういう方法もるよという親切な方が現れるかもしれないかな?という期待があったりします。
(後、他の機能も色々実装してみようと・・また実装途中だったりで、いつまでたってもfixしそうになかったので、ここらへんで公開しておこうとw それと、これ別のテクニカルでも応用出来そうで・・・やってくれる方募集w)

ここでFXで未来予測を行うにあたって勝手な妄想を・・いやいや前提を・・・

  1. データはトレンドと雑音?ノイズに分解される。(またはされやすい)つまり解析可能(しやすい?)かもしれないトレンドと、解析不可能と思われるノイズになる ・・・かも
  2. トレンドは力学的なカオス的振る舞いと似ている面がある。つまり、近未来予測がある程度可能であると予測される。また、時間と共に予測しにくくなる・・・だろう。
  3. ほぼ解析不可能なノイズを含んでいる。ここはある程度統計的にばらつくかもしれない?(正規分布なんかに近くなれば驚きの白さ!。これ確かめてない事に今更気づいたwこれがそうであったなら、HPのAlfaを求められるかも? という根拠なき想像)
  4. 一通貨のデータではトレンド成分もランダムに近い(つまりパターン化しにくい)が、複数通貨を見る事により情報量が上がりパターン、相関が見えてくるかもしれない。(情報のフィルタリングと選択かな?)

以上の仮定を元に今回予測システムの概略構成です。

まず、(1)に関してこれはある周波数フィルタが簡単そうです。ツイッターでHP(Hodrick-Prescott)フィルターの話題が少し前に上がっていました。
以下の@elfcobeさんのblogを参考にしています。
http://elfcobe.hateblo.jp/entry/2013/08/04/015008
リペイントについて・・・これは端っこに行くほど仮定?(予測?と考えられる)部分が含まれるのである程度はしかたないと思っています。(今回のぶつは過去の表示やその変化を見るアニメーション機能もあります)

次に、複数通貨による相関関係です。
ここでRのVAR関数が使えそうだと・・・ただ見せかけの相関ってのが気になります!(by える 氷菓の2期ってないのかなぁ)以下のblogで詳しく説明されています。
http://tjo.hatenablog.com/entry/2013/04/23/190417

上のBlogでも紹介されているのがvecmです。この手法であればどうにか予測出来るかも?しれません。(ただこれはちゃんと理解していないので使い方が間違っている可能性が結構ありますw)

今回はvecmを使って行ったのですが、実は上記のvecmの評価結果(共和分ランク)がNanになったり複素数になったり、はたまた5%の棄却にしても見つからなかったり(これは見つからなかった場合、一番ましな値を採用しています。)。またこれを避ける為に季節成分を振ってみたりしています。(この季節要因をFFT解析でと思っただけさすがにやめていますw)

ここでようやく概略

  • 予測に使用する通貨ペアは以下の7種類(使わない指定もできます)

 EURUSD,USDJPY,AUDUSD,USDCAD,USDCHF,NZDUSD

  • 予測計算可能な通貨ペアは

 USD,EUR,JPY,AUD,GBP,CAD,CHF,NZDの組み合わせの28通貨ペア

  • MT4で動作するEA(IndicatorはSleepが使えないので見送り)

・基本的にTickが入らないと動作しません。休み中の検証をする場合は、以下で紹介されているmt4tickerが使えるので使ってみて下さい。
 (init()からstart()を読んでも出来そうですが、やっていませんw)
 https://www.fx1.net/

  • Rを使用。(使用パッケージは添付のRスクリプトを参照してください)
  • MT4よりRを使う為に以下のRforMT4を使用。

 https://sites.google.com/site/prof7bit/r-for-metatrader-4

  • 現在バックテストには対応していません。(これは今の所予定なしw 最近Rで大体の傾向&最適化??という手法で行っている為)
  • 結構処理が重く、また非同期対応していないので待たされます。(これ実は、Rでの処理というよりどうもデータの読み込み準備でかなり時間がかかっているようです。ただデータ数を少なくすると予測は見た目におかしくなります。更新データのみと処理を変えれば少し軽くなるかもしれませんが、今の構造だと修正箇所が多くめげてます)
  • PreBarで指定した過去の表示&アニメーションでリペイントの動作?傾向?がわかると思います。ただしかなり重いので、通常はアニメーション機能をfalseで使用した方がいいと思われます。
  • 過去n回の予測平均も表示しています。
  • 表示しているPreBarをチャート上で動かすと、動かした先の所で表示します。(これ、MessageBoxが出る直前の位置です。MessageBox表示中もVLineは動かせますが、MessageBoxが表示した後動かした位置を採用したい場合は、一度いいえを押した後再度MessageBoxが出たらはいを押して下さい)
  • これはRのfunction化されています。実は最初Rで全て処理させて・・・とやっていたのですが、もろもろの思い?(当時の結果?)でMT4化を先に終わらせました。Rでの統計処理をやってみたい!という危篤な方がおられましたら、データの前処理も公開してみるかもしれません。(主にデータの時間軸方向の処理です。ここはRで処理すると無茶苦茶時間がかかるのでawkで処理させています)

ーーーーちょこっと後書き

  • 今回HPフィルターを使ったのですが、この部分を別のテクニカルなんか適用すると面白いかもしれません。Ku-Chartなんかに適用すると・・・いいかも?

 **************************
 ちなみに普通の重回帰解析(lm)だとKu-Chartはその計算の性質から、多重共振性の問題と思われる結果で悩みますが・・・今回の手法だと上手くいくかも??と思った事があったりなかったりw
=>上記は多重共振性では無く、多重共線性です。
   @faifxさんに指摘して頂きました。ありがとうございます!

 **************************

  • 見せかけの回帰を防ぐ方法として一階差分をとる方法もあるので今回やってみたのですが一階差分をとっても、非定常であり単純にはいきそうもなかったです。
  • 重要指標なんかがあるとあっさり違った方向にいきますwつまりある要因による急な変動については全く意味を持たないので、これはあくまでトレンドの予測で、取引アルゴリズムをしっかり作らないといけないなぁという(エントリーだけでなく保有中のアルゴリズム等も)当たり前の感想を持ったのは秘密ですw。(TP,SL固定ではエントリーをかなり厳選しないと難しいかな?とw)・・・と書いてて忘れていた事・・・過去の指標のcsv無いかなぁ?探さなきゃw
  • 今回は要因分析等はあまり意味を持たなさそうなのでやっていません。どの通貨ペアの影響が・・というのは時間と共に変化するだろうとのあまり根拠のない考えからです。

Historyファイルのマージをバッチ処理化して@がんばらない

今回のものはここにあります。
DLPASS himerge

MT4のStrategyTesterでシミュレーションを行って検証しては・・・・とやっている時いつも困るのがHistoryデータの管理です。

Historyデータについては、いっきに大昔まで! ってデータを作って、常に新しいデータをリアルに追加!ってやっていてもいいのですが、どうしてもHistoryデータが大きくなりすぎて色々処理が重くなったりメモリが大量消費したりと効率が悪くなってしまいます。

今回は分割して保存しているHistoryデータ+最新データのマージが手作業を必要のないようにバッチ処理できるようにしてみました。(各々のデータでかぶり等があっても構いません)
#注意 Cygwinかそれと同様な環境が必要です。
#またUnixのコマンドの知識が少しあれば、カスタマイズ可能です。

簡単に、処理の説明を書くと

(1)オリジナルのhst(binary)ファイルをcsv(text)ファイルにします。(by MT4 EA)
(2)追加するhst(binary)ファイルをcsv(text)ファイルにします。(by MT4 EA)
(3)上記2つcsvファイルを結合して ソートしてだぶりを削除します。(by Cygwin sort -u)
(4)(3)で作成したcsv(text)ファイルをhst(ファイル)にします。(by MT4 EA)
(5)(4)のファイルから他の全periodを変換したものを作成します。(by MT4 EA)

以下が、バッチの中身と実行例です。
#------------------------実行バッチ bat(例)--------------------------


#!/bin/tcsh
# mt4 original directry and work directry
setenv mt4path_o "/cygdrive/Z/FXCM MetaTrader 4_DEV2/"
setenv libpath_o "history/FXCM-JPYReal01"
# mt4 add history file
setenv mt4path_a "/cygdrive/Z/FXCM MetaTrader 4_DEV/"
setenv libpath_a "history/FXCM-JPYReal01"
./merge.tcsh GBPJPY M1 yes
./merge.tcsh EURJPY M1 yes
./merge.tcsh EURUSD M1 yes

#----------------実行結果-------------------


~/tcsh[187]>./bat
Making original GBPJPY csv file ...
Done
Making add GBPJPY csv file ...
Done
Start merge & uniqfy
Done
Start making final hst file
Done
Converting period
Done
Making original EURJPY csv file ...
Done
[途中略]
Converting period
Done


**ちょこっと参考コメント ・・・になっているかなぁ?

最初に全部を行うアプリでも作ろうかと思ったのですが・・・。毎回この手のツールを作る時、順番の並べ替えとだぶりデータの削除で少し悩んでしまいます。せっかくCygwinの環境でsort,uniqfyが使えるのでそれでやってしまえ!と思ったので今回のような事をしています。

処理の中の(1),(2),(4)の処理はHistory Centerでも出来る事ですが(今回の中間ファイルのcsvHistoryセンターのcsvと互換フォーマットですw)EA化する事によりバッチ処理化出来るようにしました。(今回のdlファイルにそれぞれのEAが入っています)

後(5)の処理も通常Scriptで手作業が入るのでEA化しています(といってもちょこっとですが。ちなみに標準のperiod_convertをフォルダを変えただけではEAとして上手く終了しない場合があるので注意です。今回のdlファイルに修正してちゃんと終了するものを入れてます。)これでバッチ処理を可能にしています。

途中はcsv(text)データになっているので、分離なんかも簡単に出来るようになります。
データを一気に修正する場合なんか、テキストデータなのでawk等のスクリプトでフィルター処理なんかをする事が出来るようになりHistoryデータの取り扱いが楽になるかも。

MT4のエディタでviを使おう・・知恵の泉が言っているのだよ


MT4のエディタは、比較的小さなプログラムを作成するにはそれ程苦労しませんが、少し長いプログラムを作成しようとすると結構疲れます。(ページスクロールや行間ジャンプ後 {} 対応チェックとか切った、張った、ちょい面倒な加工とかその他もろもろ)

今回は やっぱりviが好き!というのがあって環境を作ってみたので、書いておきます。

Unix環境としてCygwinで設定してみました。今回のようにUnixコマンドを使いつつWindowのアプリも実行する場合は便利です。GUIは使わないので、標準のターミナルのminttyを使用。これは日本語も使えて便利です。後grep,sort,sed,awkなんかでlog編集なんかもすぐに出来るのでデバッグがかなり楽になります。(viコマンドのみでよければ、Windows用のviコマンドでも同じような設定が出来そうですが・・・せっかくですからw)

ここから、viの設定です。

まずは、viをカラフルに、syntax情報を設定。これを一から作成すると大変ですが、以下に設定ファイルを既に作成している方がいますのでので使わせてもらいます。({}対応なんかもチェックする事等の設定も含んでいるので楽ですね)
https://github.com/vobornik/vim-mql4

また、個人的に以下の設定をmql4.vimに追加しています。


"ターミナルにファイル名表示
:set title
" タブストップを3にします。これはMetaeditorのデフォルトですw
:set ts=3
"先頭に行数表示をします。これは無くてもいいのですが気分の問題です。
:set number
"折りたたみ機能をmarkerで設定します。markerはdefaultの ’{{{’ ’}}}’です。
:set foldmethod=marker

最後に.vimrcに以下を追加しちゃえば使えます。


:syntax on

また、viを拡張すると便利なので以下の予測変換機能をインストールします。
設定は、.vimrcに以下の一行を追加して使うようにしているだけです。


let g:neocomplcache_enable_at_startup = 1
#なんかmt4に少し対応しているみたい MarketInfoが変換候補に出てくる!
https://github.com/Shougo/neocomplcache/wiki/Presentation-file

また、alias設定で以下のように設定をしておけばvi上でコンパイル&編集も比較的楽に出来ます。(もう少し楽な方法もありそうですが・・・一発でviのバッファ書き込み&コンパイル・・・これは今後の課題です・・・誰か知っていたら教えて下さいm(_ _)m)
#これCygwin環境から直接Windowsのコマンドが実行出来るのでこのような事が可能です。


#---------------.cshrc-----------------------------
# For mt4
setenv MT4PATH "/cygdrive/Z/FXCM\ MetaTrader\ 4_DEV2/"
alias mt "$MT4PATH/terminal.exe &"
alias mc "$MT4PATH/metalang.exe"
#------------------------------------------------

viのコマンドラインの例(以下の2アクションで可能です)


:w        
:!mc %

追記(2013年5月3日)
.mq4ファイルを書き込み時にコンパイルを毎回やっても良いのであれば、以下のように.vimrcに追加すれば、バッファ書き込み時に毎回コンパイルしてくれるようです。ただこれは他との兼ね合いが出るかもしれませんが今の所この設定にしています。


#---------------.vimrcに追加-----------------------------
function! s:mt4()
!mc %
endfunction
autocmd BufWritePost *.mq4 :call s:mt4()
#------------------------------------------------

これでviのコマンドラインで以下のように書き込めば、その都度コンパイルされます。(1アクション)


:w        

Strategy Testerで複数通貨ペアを扱えるライブラリ

今回のライブラリファイルやテストに使ったインジケータセットここです。
DL PASS: MT4MultiLib

MT4のStrategyTesterでのバックテストでは指定した通貨ペア(Symbol())
以外の値を取得出来ないようです。(と思っているけど方法があるのかなぁ?)

例えば、MT4のStrategyTesterを使用してUSDJPYのバックテストをしてい
る時に

Print( "Open[1]=",Open[1]);

Print("iOpen("USDJPY",Period(),1)=",USDJPY",Period(),1));
は値が取得できますが、

Print("iOpen("EURJPY",Period(),1)=",EURJPY",Period(),1));
等と違う通貨ペアでやっても値は取得出来ません。

という事で、USDJPYテスト時にEURJPYの値も取得できちゃうぞ、という
ライブラリを作成してみました。(仕様詳細、注意事項、制限はDLファイル
の"読んでね.txt"を参照して下さい。)ちなみにピリオドは、設定ピリオド
以上であればOKです。例えばM15設定時にM15、M30、H1等はOKですが、
M1,M5はNG等。

で、実際にライブラリを実装して動作させてみました。
まずはここにあるMCPというインジケータです。
#これV2もあるみたいですね・・・まだ見てもないですが・・・・
http://codebase.mql4.com/8022
Ku-chart これは、ここを元にしましたが、少々元のプログラムを
書き換えているので参考になるかどうか?ですが
http://d.hatena.ne.jp/fai_fx/20111122/1321894623

動作動画

使えるか使えないかはあなたしだい・・・って違う!!!
ライブラリが悪いとも・・・・これが真実かぁ!
後、これ使えるけど改造出来ない?とうのを教えて貰えれば改造するかも?
これは本人の気分しだい・・・・って体調との相談なのですが・・。

<補足>
動作は簡単に書いてしまうと目的の通貨ペアのHistoryファイルを直接読んで
しまえ!という事をやっています。記述はMT4のみw。実はC++でDLLの作成
もちょっと考えてみましたが、MT4上での時間経過の取得とか複数の通貨ペア
のデータベース管理をどうしようとか・・その他色々考えてるとMT4の機能を
使っちゃった方が簡単かもと思ってしまいました。処理速度は・・・作ってか
ら考えようとwww
#ここらへんで・・・色々変な作りになってますがご勘弁を・・・・
#もっとべたに書いた方が処理速度的にいいのかもと思ってみましたが、
 まだバグがある可能性があるのである程度メンテナンスを考えてます(謎

Windows7/8 で簡単? ネットワーク有効/無効化

Windows7/8でPCのネットワーク機能をを有効/無効ってする方法です。
物理的にネットワークケーブルを抜いちゃえばいいんじゃ?とか、ネットワーク機器の設定や
デバイスドライバの設定で有効/無効ってやればという話もありますが、今回はバッチ処理
お気軽にやってしまおうというものです。

以下のような実行バッチファイルを作成して、管理者権限で実行して下さい。(右クリック
で"管理者として実行"で行う等)これでOKです。
#但しハードウエアIDが同じデバイスは同時に無効化されちゃいます。
#インスタンスIDが使えればよいのですが・・・今のところわかっていません(;_;
#ソースを見て・・・気力と実力がなさそうです。




rem set netid=[ネットワークアダプタの”ハードウエアID”]
rem set devconpath=[devconv.exeのインストールディレクトリ]
set netid="PCI\VEN_10EC&DEV_8168&SUBSYS_81681849&REV_06"
set devconpath="C:\Program Files (x86)\Windows Kits\8.0\Tools\x64\"

cd %devconpath%
devcon.exe disable %netid%

cd "C:\MetaTrader 4"
terminal.exe

cd %devconpath%
devcon.exe enable %netid%

<<DevConの入手方法>>
・・・必要なソフトは"DevCon"です。これはMSが提供しているWDKに含まれています。
以下から入手が可能です。(WDKについては適当にぐぐってね)

ここ

Windows7/8 32/64bit用として、”Windows Driver Kit 8”の”Windows Driver Kit 8
のダウンロード”に含まれています。(2013年03月14日現在)


<<ネットワークアダプタの”ハードウエアID”>の調べ方
ここでちょっと面倒ですが、無効にしたいネットワークアダプタの”ハードウエアID”を調べます。
調べる方法はいくつかありますが、以下の方法が比較的楽だと思います。

バイスマネージャーで目的のネットワークアダプターのプロパティを開いて、以下で見れます。


"詳細"タブから、プロパティで"ハードウエア ID"を選びます。値はいくつかありますが、この中
で一番長いIDが目的のIDです。これをコピーすればよいです。


追記 これよりnetshコマンドの方が楽ですね
//---------------------例-------------------
netsh interface set interface "ローカル エリア接続" disable
netsh interface set interface "ローカル エリア接続" enable
//-------------ここまで------------------

MT4 StrategyTesterのOrderSelect関数の不思議?


以前以下のような記事を書きましたが、もう少し原理がわかりました。(2012/11/21 追記)
OrderSelectコマンドのインデックス管理が、実行中にコマンド(約定、決済等)が実行
されるとインデックスが更新されるのが仕様のようです。(最初の書き方だと、最初の
インデックスが決済された時インデックスが更新されて、次のインデックスが一つ減った
状態になっているようです)
つまり、最初の誤動作をする書き方では実際にも誤動作する可能性が大きいので注意
した方がよく、2つ目の書き方の方が良さそうです。


いきなりですが、MT4のStrategyTesterのバグと思われる現象がありました。
OrderSelect関数が上手く動作しない場合がありました。尚Build432でも残って
いるのでまだ解決されていない気もします。(FXCM用だけかもしれません)
#プログラムの他の部分とも絡んでいそうで、プログラム依存があるのかもしれません。
#最後にも書きましたが、これは仕様(最近の?)かもしれませんwww



以下のような関数で、strategyTesterで指定MagicNumberの買いまたは売りの全てのポジションを決済します。




void BuySellClose(bool BuyFlag, bool SellFlag){
if(BuyFlag || SellFlag){
for (int i=0; i




でこれを実行した結果の一部が以下です。



これを見るとわかりますが?、ポジションの一部が残ってしまっています。
ただ、これが発生するケースがわかっていません。



で決済だけなら、以下のように書けばこのバグは回避出来ます。




void BuySellClose(bool BuyFlag, bool SellFlag){
if(BuyFlag || SellFlag){
int i;
int BuyCount=0,SellCount=0;
while(true){                   //<−ここがポイント
BuyCount=0;SellCount=0;
for (i=0; i


ポジションが無くなるまで無限ループってやると上手くいきます。



このバグはOrderSelect関数の動作から考えると、StrategyTeserのバグ(仕様???)で
実際のサーバーの動作では問題がないのでは?と思ったりしています。



後日談・・・というかここまで書いてちょこっと確認

mql4.comを見てみると・・・・while(残数チェック)と同じような事をやっているのがあった・・・これって仕様だったの??????
でも、最初のような記述方法のもある??? 単に実時間で、ペンディングされているオーダーの時間関係が無い為の対応????

トラリピ試行その1

今回のEAはここにあります。
 DL passwd: tratra

注意
最初に書いておきますが、今回のEAはまだ使い物になりません。(エラー処理、その他色々機能が不足しています。)
トラリピがどんな風に動くのか、またどんな欠点、長所があるのかを試すには今回のEA位がいいのかもしれません。(通貨ペア、期間
を変えてみるとわかりやすいです)

今回のトラリピは殆ど機能が無く、唯一あるのが設定分前の高値、安値に応じて投入Lot数を変える程度です。ただ既にその価格帯で買い、
または売りを実行していた場合は今の使用では追加、買い、売りは実行しません。実行するのは、買い、売りがまだ実行されていない
(Limit/stop)のオーダーのみの修正を行っています。
#実は、損きりや、リセット機能も作りこんでいますまが、現状使い道はないような。

Lotsを毎週変えるのは以下の価格レンジに対して行っています。つまり設定の過去のHigh,Low内で動く範囲でのみ上手くいきそうな
ロジックです。

買い:BuyLots 売り:SellLots
<<高値 (100%)>>
買い:BuyLots 売り:SellLots*HighLotRate
<<CheckHighLevelRate>>
買い:BuyLots 売り:SellLots
<<CheckLowLevelRate>>
買い:BuyLots*LowLotRate 売り:SellLots
<<安値(0%)>>
買い:BuyLots 売り:SellLots


ちなみにAUDNZDの200604-201204の結果

Total net profit 39066.61
Profit factor 16.23
Expected payoff 1.61
Absolute drawdown 8749.38
Maximal drawdown 16200.86

DDが大きいですね。ここはチャートを見るとわかりませが、長いトレンドが続いています。
ここは、少し改善ロジックを考えてはいるのですが、今は体調との相談です(泣
#実はこの状態で結構経っています・・・・・。