MT4→自作ツールへの連携方式を改善中

取組中・自分用のメモです。

  • SteadyWinner 6.5へのバージョンアップのお知らせと、今回もEAのソースコードが届きました。机に向かう良いきっかけを頂きました。
  • 6月頃から、実口座で少量のロット数で運用を続けてます。「EURCHFの負けないやつ」を有難く使わせていただいてますが、6月に2勝した後、7〜9月は一度も決済なし(ほんのちょっと含み益)の状況です。

  • 不安要素(後述)を解消させてからロット数を増やそうと予定してます。

現行の仕組みは、おおまかに書くと下記となってます。

  1. MT4上のデモ口座で自動売買を行う
  2. MT4の売買状況の変化を監視する
  3. 売買状況が変化したら、速やかに実口座へ自動反映する

しかし、売買状況の変化の監視が少し不安定で、改善する必要があると考えています。

  • 3年前に作ったきりの、現行の簡易方式 (※カッコ内は不安要素):
    1. MT4にて、売買状況を集約した一時テキストファイルを生成する (※生成速度が遅くないか?)
    2. 自作ツールで、一時テキストファイルの更新状況を監視する (※更新検知は遅延したり不確実ではないか?)
    3. 更新があれば、テキストファイルの内容を解析する (※解析速度が遅くないか?)
    4. 解析の結果と、実口座の注文状況に差異があれば、差異を埋めるよう発注する



  • 不安1:MT4にて売買状況を集約した一時テキストファイルを生成する速度が、遅くないか?
    1. 結論:1回ぶん=約70行を生成する速度は 約0.16ミリ秒 で、問題になるほど遅くなく、特に対策をしない
    2. 検証環境:ホストマシン=Intel Xeon E31225/3.10GHz/4CPU、ゲストマシン=VMWare Player上のWindowsXP/2CPU
    3. 一時テキストファイル生成の流れ
handle = FileOpen( OutputFileName, FILE_BIN|FILE_WRITE );
FileWriteString( handle, strText, StringLen( strText ) ); //1回あたり約70行
FileClose( handle );
    1. 速度計測方法の選定
      1. MT4に用意された関数の分解能=1秒、計測には精度不足
      2. WindowsAPI GetTickCount()の分解能=約16ミリ秒
      3. WindowsAPI GetLocalTime()の分解能=約1ミリ秒との情報→WindowsXPで確認すると、残念ながら約16ミリ秒
    2. 今回はおおざっぱに確認できれば良いので、下記方法とした
      1. WindowsAPI GetLocalTime()を用いる
      2. FileWriteString()の部分を1万回ループさせ、約16ミリ秒の間に何行を生成できたかを確認する
    3. 同一タイムスタンプが続くのは、約7000行ずつ(例えば 327957行〜334962行 → 7005行/約16ミリ秒)
    4. すなわち1回ぶん=約70行を生成する速度は 約0.16ミリ秒



  • 不安2:自作ツールでの一時テキストファイルの更新監視が、遅延したり不確実ではないか?
    1. 結論:運用中、更新監視が不安定だと実感しており、Windowsメッセージを用いる方式に変更する
      1. 現象1:MT4からの生成と、自作ツールでの読み取りとで、ファイル排他ロックによる衝突が起きる
      2. 現象2:C#.net および FileSystemWatcherクラスを用いているが、取りこぼしが時折起こる
    2. 変更案
      1. Windowsメッセージ「WM_APP」にて、ファイル更新完了のみを通知する(簡単なので今回採用)
      2. Windowsメッセージ「WM_COPY」にて、文字列データを直接送信する(変更が多く、検証が大変なので見送る)
    3. 困ったこと
      1. MetaTrader4のBuild600以降、WindowsAPIの呼び出し方法に配慮が必要のようです。

      1. 文字列の文字コードUnicodeに変わったとのこと。FindWindowAでは下記のように記述すると動作しました。


祝日はマーケットが動いているので、デバッグを進めやすかったです。
大きな不安材料2つが解消して、本格運用の再開に大きく前進しました。