ブログトップ 記事一覧 ログイン 無料ブログ開設

とあるMetaTraderの備忘秘録 RSSフィード Twitter

忙しいです。ネタもないし・・・

2010-02-07

MT4他業者の価格を表示させる。/共有メモリの活用。

FxPro が GBPJPY を何円で取引しているのか?を FXDD の MT4 上で知ることは…当然出来ない訳ですが、それを無理やりプログラム上で知るにはどうすればよいのか?…という話です。


それが何の役に立つのか?は不明で、業者間裁定が成り立つかどうかは分かりませんし、いくつかの業者の価格を参照することで、システム的な異常を検出できるかどうかも分かりません。ただ、ツールとして実現しておけば、いつか活用できる日がくるかな??と思っただけです。


実現手段としては、

(1) FxPro の MT4 が特定の場所にファイルとして価格を書き出す。

(2) FXDD の MT4 がそのファイルを読み込む。

というのが簡単そうです。

MQL4 標準の関数では、experts\files フォルダ以下にしか書き込めないので、ジャンクションでフォルダを共有することで実現できますし、WindowsAPI を直接使えば任意の場所のファイルが読み書きできます。(参考:http://articles.mql4.com/720)



でも、どうせファイルでやり取りするなら、それをメモリ上で済ませてしまった方が楽なので、試しに共有メモリでやってみました。

f:id:fai_fx:20100206153303p:image

↑それぞれの MT4 の Tick が更新されるタイミングでしか価格は反映されませんが、一応、FxPro の価格が FXDD の MT4 上で取得できています。サンプルはこちらからダウンロードできます。


共有メモリを実現する MemMap.dll の使い方は、まず関数の宣言をしておいて、

#import "MemMap.dll"
string SetMemString(string tag,string msg);
string GetMemString(string tag);
#import

書き込み側は、

SetMemString("ファイル名","文字列データ");

読込み側は、

string data = GetMemString("ファイル名");

するだけです。メモリ上に作られたファイルのようなものは、それを作成した MemMap.dll がアンロード(DLL_PROCESS_DETACH)される時点で自動消去されるので、ファイル共有するよりも管理がずっと楽だと思います。

bugmubugmu 2010/02/07 12:31 MT4のデータ(価格だけでなくインディケータの値等も)をファイルに保存しそれを他のプログラム(VBとかUWSCとか)でリアルタイムで読むことはMT4の関数で実現できることは知っていましたが、いまいちダサイナと思っておりました。メモリ共有非常に参考になりました。
ところで、MT4業者以外のTicデータをリアルタイムで集めることはたとえばUWSC等を使えばできる場合があります。またTicデータを数か月分ならCSV形式で取得できる業者もあります。それをMT4で処理することはできないでしょうか?
一般的な質問ですが、
1.モニタ画面上に表示されるFX業者のTicデータを収集することはどの様な場合可能なのでしょう?
2.そのTicデータをMT4は処理する(チャート表示し、解析する)ことが可能になりますか?
3.過去の他業者のCSV形式のTicデータを元にMT4に解析をさせることは可能になりますか?
数ヶ月前からMT4のプログラムを勉強し始めて、一番参考になるのがこのサイトです。
MT4を汎用FXデータ処理ソフトとして使えたら便利だなと考えています。
時間があるときにでも教えていただけたら嬉しいです。

SayaSaya 2010/02/07 12:31 これはすごい!
data_segを使ってセクションを作っているのでしょうか?
もしよろしければdllの詳しい解説をお願いします。

ソースがあれば自分で勉強してもいいのですが
それはさすがに無理だと思うので><

ChiseChise 2010/02/07 20:55 とても参考になります。いつもありがとうございます。


便乗で申し訳ないのですが、これを使ってMT4上で動かしている他の通貨ペアで仕様しているインジケータの数値を取得することって可能なのでしょうか?

たとえば12通貨ペアでトレンドが出てくると80%とか数値が表示されるインジケータがあるとして、12ペア中8ペアが80%を表示できたら目的の通貨ペアでトレードする、といったことを考えていましたが、同じMT4上に表示されていてもそれらを参照するという関数はありません。

APIを使うとできそうな気がしてきましたが、何かヒントを頂ければと思います。
よろしくお願いいたします。

Dr.ヘパDr.ヘパ 2010/02/07 23:32 共有メモリ、メモリマップドファイルを使ったプロセス間通信、MT4でいずれ必要になるだろうからいつかやろうと思っていました。また感動いたしました。

プロセス境界を超えた場合の排他制御の考慮はあまり必要ないかと思いましたが、こういった場合は必要になってきそうですね。

LL 2010/02/08 06:01 Tickチャートを用いて
OverLay チャートみたく
業者間での動きを比較できた方が便利かと!

そちらのほうが実用的かと思います。><

bugmubugmu 2010/02/08 08:03 早速のコメントありがとうございます。実のところMT4(Alparidemo)は時々止まることがありますがFX業者の中にはメンテナンス時間以外は止まらず、ほぼリアルタイムでTicを複数通貨取り出せるところがあります。スプレッドもほとんど固定なので、VBでTicチャート(5秒足チャート)等を表示し簡単な解析表示に用いています(Ticの取得はMT4のDDEと切り替えにしています)。公開されたインディケーターの場合はVBに翻訳できますが、そうでない場合も多いのでMT4と併用しています。ただ、MT4のバックテスト機能を自作VBで実現させるのは大変で、MT4を勉強し始めたら便利な関数がいっぱいある(VBで数日考えたサブルーチンを関数ひとつで実現できるとか)ので、MT4を使い倒したほうがいいと思い始めたしだいです。過去のデータについてhstファイルを作成して、オフラインチャートで解析はやってみます。
このサイトはアイデアがいっぱいで大変楽しいです。今後も楽しい話題を期待しています。コメントありがとうございました。

アイソトープアイソトープ 2010/02/09 12:13 すいません。
表示されません...。
セットアップの仕方を最初から教えていただけないでしょうか?
ちなみに業者は121とJadeFXです。
恐縮ですが、よろしくお願いします。

SayaSaya 2010/02/09 22:22 ソースを弄りすぎたのか、
MT4がエラーのウィンドウを出して落ちた後、
二度と立ち上がらなくなりましたw

MT4を再インストールしたら
とりあえず立ち上がりましたが
dllをインポートすると落ちてしまいます。
OSから再インストールかなぁ??

fai &gt; アイソトープfai > アイソトープ 2010/02/10 12:29 まずは、
DLLの使用を許可しているかどうか?
ログに何かエラーは記録されていないかどうか?
通貨名は同一かどうか?
を教えてください。

fai &gt; Sayafai > Saya 2010/02/10 12:31 DLLの引数の型と、MQL4 側の引数の型が違うと落ちますけど…

そういう問題ではない・・?

TakTak 2010/02/10 14:47 複数の値を共有することは可能でしょうか?
例えば時間足のOpen,Close,High,Lowの4つの値を
一度に書き込むことは可能でしょうか?

fai &gt; Takfai > Tak 2010/02/10 17:55 SetMemString("OPEN",DoubleToStr(Open[0]);
SetMemString("CLOSE",DoubleToStr(Close[0]);
みたいにファイル名さえ変えてやればOKのはずです。。。

TakTak 2010/02/11 13:11 できました!
現在のところ100〜120個ほどのファイル名を
使ってみましたが、問題無いようです。
ただ、MT4の場合はTickの変化がトリガーになっているので
書き込みと読み出しのタイミングによって
古いデータを読んじゃうことがありますね。

yukiyuki 2010/04/03 12:55 すばらしいDLLありがとうございます。
一つ質問があります。
他のMT4のレートを0.1秒間隔でGetMemStringで読み込んで値を確認しているのですが、
時々違う通貨の値を読み込んでしまいます。

例えば、EURUSDだけであれば大丈夫なのですがEURJPY,GBPUSD等
複数の通貨同様に0.1秒間隔で値を確認すると、時々レートが急激に動いた時など
EURJPYの値を読み込んでいるのに、EURUSDの値を読み込む時があります。

どのような原因が考えれるでしょうか?それとも私の使い方がまずいでしょうか?
よろしくお願いいたします。

fai &gt; yukifai > yuki 2010/04/05 15:58 メールしましたので、確認お願いします。

kyojeekyojee 2010/04/25 13:07 いつも御世話になります。

ちょっと思い出したように、使ってみたのですが・・・
init() で、 SetMemString しても、返り値が NULL のようです。
どうしてでしょ? dll は正しく読まれています。
例: x = SetMemstring(prefix+"_", + Symbol(), "1.33778");  とかで、 x が空っぽです。

また、SetMemString の第2引数は、任意の文字列でよかったでしょうか?

fai &gt; kyojeefai > kyojee 2010/04/25 14:42 SetMemString した時の返り値は、エラーがあったらエラーメッセージでも返そうか・・・と思いつつ、
実は空文字を返すだけになってます。^^;

kyojeekyojee 2010/04/25 14:53 /(_ _)/

kyojeekyojee 2010/05/04 11:23 いつも御世話になります。
まだ、これを試しているのですが・・・S_MT4上で2つのEUとGUチャートで、それぞれ別にdllを読み込んでSet、同様にG_MT4上で2つのEUとGUチャートでそれぞれGetしているのですが、何かのタイミングで読み違えたり、EUとGUの両方の値を読み込んだりしています。いつも起きるわけではありません。
TAG文字はユニークにしてあります。
何か考えられますでしょうか?うまくdebug する方法とかありますでしょうか?

fai &gt;kyojeefai >kyojee 2010/05/04 12:05 http://ux.getuploader.com/fai_fx/download/114/MemMap2SRC.zip
こっちのDLLで試してもらえますか?

polBpolB 2010/05/10 23:16 すばらしいDLLありがとうございます。
TradeSwitch.DLLの代替として使用させて頂きました。

alohafxalohafx 2010/07/04 14:24 faiさん、ご無沙汰です。

さて、Automated Trading Championship 2010 が10月から開催されますが、faiさんは参加さ

れないのでしょうか?日本のトップMT5使いとして是非出馬していただきたいと思います。

ところでこちらのDLLを使って、MT5 to MT4 TradeCopier を作ろうと思っているのですが、
ttp://alohafx.blog36.fc2.com/blog-entry-45.html
どうもうまくメモリに書き込めません。MT5ではこのDLLは対応していないのでしょうか?
送信側の MQ5 は下記に上げておきました。お助けいただけませんでしょうか?
ttp://ux.getuploader.com/fai_fx/download/159/SotoumaTrancemitter.mq5

hzkhzk 2010/07/12 14:57 こんにちは
このdllをありがたく使わせてもらっている一人です。

↑の書き込みにあるyukiさんと同じ

>例えば、EURUSDだけであれば大丈夫なのですがEURJPY,GBPUSD等
>複数の通貨同様に0.1秒間隔で値を確認すると、時々レートが急激に動いた時など
>EURJPYの値を読み込んでいるのに、EURUSDの値を読み込む時があります。

という現象がありましたので、
私にも解決方法を教えていただけたら幸いです。

fai &gt;hzkfai >hzk 2010/07/12 15:17 5/4 にリリースした
http://ux.getuploader.com/fai_fx/download/114/MemMap2SRC.zip
でも解決していないということでしょうか?

hzkhzk 2010/07/14 13:31 申し訳ないです;;;
5/4リリース分で解決しました、
ありがとうございます。

susansusan 2010/09/02 01:15 MT4 3ヶ月の初心者です。
はじめまして、VB6にてFXのプログラムを作っていますが、このDLLをVB6で使うことは可能でしょうか?
目的はVB6とMT4のデータのやり取りをさせることです。
出来る場合にはやり方をご教授してもらえればありがたいです。
よろしくお願いします。

fai&gt;susanfai>susan 2010/09/02 11:32 VB6 を使ったことが無いので分かりません^^;
最初はベタにファイルでやり取りするのが良いのではないかと思います。

susansusan 2010/09/03 08:15 早速の返答ありがとうございます。
ファイルのやり取りでやって見ます。

こちらの情報大変勉強になりました。
今後ともよろしくお願いします。

投稿したコメントは管理者が承認するまで公開されません。

スパム対策のためのダミーです。もし見えても何も入力しないでください
ゲスト


画像認証