EAで指標発表等を回避するには?

・・・と、どなたかに聞かれていたような気がするので方針だけ書いておきます。

1.ネット上で経済指標発表時刻一覧を公開しているサイトを探す。
2.定期的に自動取得して、EAに読み込む。

公開サイトとしては、
ForexFactoryhttp://www.forexfactory.com/ff_calendar_thisweek.xml や、
DailyFXhttp://www.dailyfx.com/files/Calendar-10-21-2012.csv (週単位でファイル名が変わります)
が知られています。

EAからデータ取得するとしたら、WinInet.mqh のようなライブラリを使うと

↑こんな感じで、↓のCSVデータが取得できます。

DailyFXのデータはCSVなので、MQL4では簡単に読めます。(ただし、文字コードUnicodeなので一部文字化けします。)
DailyFXの指標を表示させるインジケータがここにあるので、そのあたりを参考にすればよいと思います。


一方、ForexFactory のデータは、FFCal.mq4 が対応していて、EA から直接 iCustom 経由で直前直後にどのインパクトの指標発表があるのかを1つだけ取得できます。

↑EAでの書き方はこれだけです。一つのMT4内で、複数のEAで使う場合は、iCustom よりもグローバル環境変数を用いて情報共有させた方が良いかもしれません。



問題は、、、FFCal.mq4 自体があまり改良されていない点で、例えば、「SetIndexStyle(1, DRAW_NONE);//←本来は 2 」みたいなバグも相変わらず放置されています。
一定時間前に鳴るように Alert の設定をしても、希なタイミングで鳴らないこともあります。EAから呼ばれる際に、毎回、XMLファイルを読み取って、構文解析する処理も非効率です。(一度読んだ結果をメモリ上に保持しておけば良いはずなのに...)



指標インジケータ自体は、凝ったものがいくつかあるので作り込む気はないのですが、最低限のカスタマイズをしたものをこちらに用意しました。

・縦ライン表示機能の削除
・Alertは少し遅れても確実に鳴るように
・3個以上の指標時刻を表示可能に
XMLのデータは解析結果を保持
・既知の指標名は日本語表示可能に

などの変更を行っています。指標ボットを作りたい人向けの下地になれば良いかなと思ってます。

↑二段表示

↑日本語表示(!)


日本語表示は、同梱のCSVファイルによる置換をしているだけなので、適宜、正しい訳語に修正してお使いください。

最近のMT4鯖はPingに応答しないらしい。

もと 2012/09/23 15:41
こんにちは。
無料のVPS(Cent OS)を見つけたのですが、これにWineをインストールしてMT4を稼動させるって可能でしょうか?
http://www.host1free.com/

このVPSは、フリーのアカウントを申し込んで、一週間後にアカウントアクティベートのメールが届いて利用可能になりました。
VPSとの通信速度が最大で128kbps程度しか出ないので、GUIの操作はかなり厳しいと思います。(リモートデスクトップでログインするところまで設定しましたが、640x480サイズの画面で色数を減らしても操作が厳しいです..)
また、SSHの通信も一定時間で切られるようなので、不便極まりないです..。諦めましょう..。



ふぁん 2012/10/01 23:54
こんなことを聞けるのは御大しかおられないので、もしご関心を頂ければ、教えて頂きたいと思います。
以前はMT4 BrokerのサーバーのIPアドレスを調べて、Pingを行うと例外なく試験ができたのですが、
最近、ほとんどの(全部?)MT4 BrokerでPing試験がTimeOutになってしまいます。
例のMT4のバージョンアップによるものかとも思いますが、VPS等からPingができないと折角の海外VPSの有り難味が感じられない状態です。
すいませんが、同様の事象を観測されておりますでしょうか?
また、接続時間を計るすべが御座いましたら、ぜひご教授頂きたいと存じます。

早速調べてみました。
まず、ProcessExplore等でMT4の通信先を調べます。

通信中の terminal.exe を選んで右クリックProperties から、TCP/IP タブを見ると
195.88.176.141 のhttpsポート(443)に接続していることが分かります。




普通にPingを打つと・・・応答がありません。
おそらく、サーバのセキュリティ向上のために、Pingに応答しないように設定しているのだと思います。



こんな時は、tcping.exeが使えます。
ダウンロードしたら、C:\Windows 以下にコピーしておきましょう。
使い方は、

tcping IPアドレス ポート番号

です。ポート番号には https の場合は 443 を指定します。

これで、Pingの代わりに計測できるはずですので試してみてください。

デコンパイルすると動かないコード(?!)

先日みつけた、int 最小値バグを調べていて気づいたのが、表題の「デコンパイルすると動かないコード」です。正確には、「動かない」のではなくて、挙動が変わるだけですが、デコンパイラをお持ちの人は以下のコードを試してみてください。(ちなみに、Purebeamさんは、8/10 にデコンパイラの販売を停止されています..)


↑このコードをex4にコンパイルして実行すると、OK が表示されます。


↑先の ex4 をデコンパイルした結果がこのコードです。
これをコンパイルして実行すると、NG が表示されます。変数に設定した値がビミョーに変化しているのが分かります。



上記は単純な例ですが、デコンパイルで数値が変わる特性を利用して、大量の変数で複雑に分岐すれば、ある種のデコンパイル対策になるかもしれません。^^;

   int a = -2147483648;
   int b = -2147483647;
   int c = -2147483648;
   int d = -2147483647;
   ↓デコンパイル結果 (フラグ情報が失われる)
   int li_0 = -2147483647;
   int li_4 = -2147483647;
   int li_8 = -2147483647;
   int li_12 = -2147483647;
続きを読む

ランダムデータでのバックテストの仕方


↑昨日のドル円1時間足の動き...
直近のデータに痕跡が無いために推定できない極端な値動きは、ファンダメンタルというか外部情報を集めて避けまくるしか無い・・・と個人的には思っているのだけど、いつも大きな魚を逃しているような気がしてつらいです...。(ため息



さて、表題の通り、以下の質問がありましたので回答しますね。

Love OANDA
>オフラインチャートとして 「_RAND」という銘柄が出来上がります。
>本物の値動きと区別できる特徴点を見つけ出すことができれば成功です。
>(このデータで、EAのバックテストや最適化を試したらどうなるんだろうねぇ..

すみませんオフラインチャートでEAのバックテストや最適化をしたいのですが、どうすればできるのでしょうか?

簡単にやるには、既存の通貨ペアにデータをインポートしてしまうのが楽です。



↑オフラインチャートを開いて、ファイルメニューから保存を選びます。これで、CSV形式で4本値を保存できます。


↑ツールから History Center を開いて、EURUSD にインポートします。


↑保存済のCSVのデータを選んで・・・



↑取り込み完了です。




↑例のデータは、1970年から始まるので、テスト期間を元データの期間内に設定します。

↑最適化してテストすればこのとおり!(笑




ちなみに、今日の記事の画面キャプチャには、FastStone Capture(古い版)を利用しています。このソフトを使うと、キャプチャ直後に赤丸や赤四角で書込みができるので、解説記事やマニュアル作成に役に立つかもです。

MQL4でXorShiftによる疑似乱数生成。-2147483648 > -2147483647-1 という不思議。

真面目な用途での乱数生成は、メルセンヌ・ツイスターが推奨で、MT4 であれば これExcel であれば、Excel乱数生成アドインがあります。


ただ、どうしても MQL4のみで、MathRand() より良さそうな乱数を使いたい時のために、XorShift による実装を用意しました。

int XorShiftRand(int seed = 123456789) { 
  static int x = 123456789;
  static int y = 362436069;
  static int z = 521288629;
  static int w = 88675123; 
  if(seed != 123456789) x = seed;
  
  int t;
 
  t = x ^ (x << 11);
  x = y; y = z; z = w;
  w = (w ^ (w >> 19)) ^ (t ^ (t >> 8)); 
  return(w);// w = -2147483648~2147483647
}

使い方は、

XorShiftRand(GetTickCount());

で、最初に seedを設定し、以降は、XorShiftRand() で、-2147483648〜2147483647 の整数乱数を得ることができます。


ちなみに、1億回実行した時の実行時間は以下の傾向です。

関数 実行時間(ms)
MathRand 3479
XorShiftRand 7660
gsl_rng_uniform 16724

極端に遅くなることは無いようです。



-2147483648 > -2147483647-1 という不思議。

実用性はさておき、XorShift を調べていて気づいたのが MQL4 の不思議な挙動です。

int a = -2147483648;
int b = -2147483647-1;
if(a > b) Print("a > b");// TRUE 

↑ a と b は等しいはずなのに、a が大きくなります。


この現象は、int 型の最小値 -2147483648 のときのみ起こる・・・と信じたいところですが、未確認です。

int a = -2147483648.0; // 実数表記
int a = 0x80000000; // 16進表記

↑変則的に、このように宣言すれば、a == b が成立します。
これは苦肉の策ですが、、変数の型で定義される末端の数値を扱うときは注意しましょう。。orz






ランダムチャートのその後。


出来高に凶悪なコーシー分布のノイズを加えて、高騰/急落を再現してみました。
1.5秒毎にローソク足1本を追加して自動更新する機能も追加しました。
乱数に GSL も使えるようにしました。
http://ux.getuploader.com/fai_fx/download/318/RandomChart.zip
あくまでも、ベースとなる動きはコイントス方式のランダムウォークで、横軸=時間軸を出来高の調整で歪めているだけです。
実験用途や、週末に動くチャートを見たい時に活用ください。

MQL4のMathRand()の計算式は・・・

最悪のアフターエピソードというのはね。
長いことブログを書かないでいると、書き方すら忘れてしまうことだったんだ。
URLのリンクに title 属性付けるときはどう書くんだっけ?
引用部分を囲むのは > or >> or >| ?
画像のサイズ指定はどう書くの?
はてな記法なんて、ブログでしか使わないから、毎日書いていないと直ぐに忘れてしまう。(涙)


そんな時のために「はてな記法壁紙があるじゃないか!」と言われても、そこまでするモチベーションが湧かないよ...。(泣)




・・・とまぁ、本題に入る前に一発ネタを入れたほうが良いかなって書いてみたけど、これ以上続けるともっと哀しくなってゆくので、止めておきます。
さて、昨日紹介した、ランダムウォークのチャート作成スクリプトによる人工チャートと、実際の為替チャートとの違いは、いろいろあるのでしょうけど、分かりやすいところでは、指標発表時特有の動きの有無でしょうか。
価格が突然大きく動くジャンプ拡散過程のような要素が計算式に入っていないと長期間で見たとき少し違和感があります。




ただ、それ以前に、MQL4の MathRand() で乱数シミュレーションするのはどうよ? と思ったので、MathRand()の計算式を調べました。

int start()
  {
   MathSrand(100);
   MQ4Rand(100);// 同一のseedを設定する。
   for(int i=0;i<10;i++)
      Print(i+ " MathRand="+MathRand()+" MQ4Rand="+MQ4Rand());
  }
//+------------------------------------------------------------------+
int MQ4Rand(int seed = -1){
   static int x = 1;//Seed
   if(seed != -1){x = seed; return(0);}
   x = x*214013 + 2531011; // N倍して、Mを足すだけ....
   return((x >> 16) & 32767);
}

↑このスクリプトを実行した結果が、下図です。

MathRand と MQ4Rand が同一の結果を返していますので、計算式は合っていると思います。
この解説によると、これは線形合同法による乱数で、周期は 2147483648 だそうです。最下位ビットの周期は131072 になります。


つまり、、乱数値を2で割って余りを求めた場合、131073回目以降は同じ並びになるということです。

for(int i=1;i<=131072+10;i++){
   int x = MathRand();
   if(i<=10 || i>131072)
      Print(i+" mod="+ DoubleToStr(MathMod(x,2),0));
}

↑その確認用コードの結果が下図です。

見事に繰り返していますね。
MathRand の計算式が、実質わずか2行であることに驚き(2行なのに計算結果が想像つかない..)、その周期が想像よりはるかに短いという..。これこそが、最悪のアフターエピソードです。苦笑。


まとめ

『Expert advisor』は、おもしろい! で紹介されている、GSL(The GNU Scientific Library) であれば、デフォルト設定でメルセンヌ・ツイスタ(Mersenne twister)を乱数発生器として、 MQL4から使えるので、そちらを使いましょう..。

ココロ アトランダム

残暑お見舞い申し上げます。



私の近況は・・・夏の巡礼も無事終えまして、今日はお盆休み最後の休養中です。
ただ、明日からの仕事が修羅場っていると想うと憂鬱になるので、今は、現実逃避にチャートを眺めています。

↑これは とある銘柄のチャートで、例の移動平均はまぁまぁ上手くトレンドを認識できているようです。
約1日続いた上昇トレンド(水色部分)に対して、最安値から最高値の間にフィボナッチライン(オレンジ)を引いています。


上昇からの戻りは、23.6% で一旦反発し、 38.2% 付近で何度か反発して、再び上昇を始めているように見えますよね。
やはり、フィボナッチの概念は取り入れたほうが賢いのかなぁと思ったりするのですが、、、。
(でも、そこから最悪のアフターエピソードが始まるんだよ。。

続きを読む