DDEの憂鬱

906 名前:Trader@Live![sage] 投稿日:2013/01/23(水) 09:19:28.31
MT4を起動してから
DDE-Sample.xlsを開いてもリアルタイムレートがエクセルに表示されません。
どうしたらエクセルにレートを表示できますでしょうか?


DDEサーバーを有効にするにチェックをいれてます。
エクセルは2007です。
エクセルの リンクの編集ー値の更新を押してもだめでした・・

この問題は・・・難しいですね。
MT4のDDE経由でExcelに情報を渡せません」でも解決策は無いですし、マイクロソフトの「DDE links crash Excel 2010 on Windows 7 64bits」のいくつかの回避案も万能ではないようです。
私の環境でも、Excelが固まる現象を確認できたのですが、固まるようになると、何をやっても直らず、逆に動くようになると常に動く・・・ようで、原因追求も対策もままらない状況です。


調べて集まった情報をまとめると、、

新しいExcel では、 MT4 を 'MT4' と囲む必要がある。
=MT4|BID!EURUSD

='MT4'|BID!EURUSD


銘柄に # が含まれる場合は、銘柄も囲む。
='MT4'|BID!'#CH3'

Google Chrome や soffice.exe を動かしているとダメ。
アンインストールするか、soffice.exeを管理者権限で実行すると治った。

↑私の環境では、DDEが動作するときは、Chrome動作中でも問題無く動きました。

Excel をアンインストールし、再インストールすると治る。

↑私の環境では、治らなかったこともあります。

以下のVBAマクロをExcel上で動かすと治る(?)。
Sub KillDDE()
Dim i, ChannelNumber As Integer
For i = 1 To 1000
Application.DDETerminate (i) ' Closes all DDE links whose channels might be open
Next i
End Sub

↑※私の環境では、治ったことは無いです。。

MT4の代わりにDDEの送信テスト用に使えるツール。
http://www.codematic.net/excel-development/excel-dev-general/excel-dde-links.htm ただのテストツール
https://www.prorealtime.com/en/help-manual/dde-data-export ProRealTime DDE(有料)
DDESPYは動作のモニタ用。


今のところ、私の環境では下記の手順で2回、復旧に成功していますので、お困りの人は試してみてください。

1.ウィンドウズを再起動します。

2.MT4 を1つだけ起動します。
他のアプリは起動してはいけません。絶対に・・・

3.Excel を起動します。

4. ='MT4'|BID!EURUSD と数式を入れてみます。 MT4 の前後を ' で囲んでください。

複数のチャートの通貨ペアを一括変更する。

VPS上のEAを不正コピーされる事案が起きたそうです。詳しくは、「ずさんな管理のレンタルVPSサーバー(実話)」をどうぞ。





さて、表題のツールは、例えば、下図のように USDCHF の時間足の異なる複数のチャートを開いている状態から、全てのチャートをGBPUSDに変更したい場合に役立つスクリプトです。ある人のためだけに作ったものですが、欲しい人のためにこちらに置いておきます。


使い方は、まず、気配値ウィンドウから GBPUSDをドロップして1枚のチャードだけ GBPUSD に変更します。

その後、GBPUSD のチャートにスクリプトをドロップすると・・・


↓全てのチャートが GBPUSD に変わります。

仕組みは・・・

1. チャートウィンドウを列挙して、順にアクティブ化
2. キーナビゲーションで、シンボル名をキー入力
3. 稀に失敗するので、何度か繰り返す

みたいなことをしているだけです。
スクリプト内の Sleep(1) を Sleep(5000) などに変えると動作をゆっくり確認できます。
シンボル名に特殊な文字が入っていて動かない場合は、カスタマイズが必要です。(面倒なので、、不完全)

OANDAのHeatmap を真似てみた。

OANDAのCurrency Strength Heatmap Tableに似せたインジケータ(HeatMapModoki)を作ってみました。
Exoticsや、Commoditiesは無しで8通貨のみを縦に一列に並べるだけのものです。
計算式は、USDを基準として、デフォルトで現在から60分前(BeforeMin = 60)の価格からの変化率%で並べ替えているだけです。
色分けは、白が中央となるイメージです。

↑それぞれ5,60,1440分前に設定して、横に3つ並べています。
位置調整は、ShiftX,ShiftY で行えます。




↑文字が黄色の時は、その通貨のデータが足りない可能性があります。
通常は、1分足のデータを元に計算しますが、長期の変化率を見る時は長い時間足のデータを参照しますので、ログ等確認してください。

MT4のチャート上に画像を表示する(?)


前回得た知識は、Webdings フォントの g が四角であるというコトでした。
この四角を最小化して隙間なく埋めることができれば、、、チャート上に画像を表示することが出来るかも知れません。
・・・という訳で早速試してみました。


下準備として、JPEG画像をPPM (ASCII P3)形式に変換しておきます。
画像がRGB値のテキストデータになるので、MQL4のスクリプトでも簡単に扱えます。
変換ソフトには、IrfanView32を使います。

続きを読む

ZigZag指標に相場の周期性を夢見る・・

時系列データに周期性があるのかどうか?を調べる方法としては、コレログラム、フーリエ変換、ARモデル・・・等を使うのが一般的のようです。ただ、投機市場に見られる周期性は、私の想像では、連続する2〜3つの山が近い周期になるだけ(3〜4つ目の山で周期が崩れる)なので、長期のデータから固定長の周期性を見つけ出すのは困難なのでは?と思ってたりします。
(一時的に周期性が存在しても、投機筋が他者を出し抜く過程で周期性が失われてしまう・・・



なので、相場に周期性は存在しないという前提でいろいろ考えているのですが、せっかく、ヒストグラム表示インジケータを作ったので、今日はZigZagインジケータの周期分布を調べてみます。
ZigZag.mq4 を改造し、山の頂点間の期間データ(top.csv)、谷底間の期間データ(btm.csv)、一辺の期間データ(full.csv)を保存するようにしたものが、ZigZag_output.mq4 です。
csvデータをそのまま表示させるのが、CSVView.mq4 です。(一行に一個しか数字が入っていないので、CSVとは言えないのはさておき...
Hist-NF-Meter.mq4 は、top.csv ファイルを読み込んでヒストグラム表示します。

↑山頂と山頂の期間(Top to Top) のデータを生で見るとランダムに見えますが(2段目)、ヒストグラムでは20〜25期間にピークがあることが分かります。



ZigZagインジケータを眺めていると、そこに周期性らしきものを感じるのは、錯覚ではなく、実際に特定の周期付近での頻度が多いからだったのですね。。。

続きを読む

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

続きを読む