FXボーグ | テクニカル実験室

テクニカル分析を使った自動売買プログラムの開発に挑戦!

スポンサーリンク

ソケット経由でMT4からAkumuliにティック送信

前回に引き続きAkumuliを弄っています。今回はMQLからティック情報を送信してみました。休日なのでバックテストを使用した擬似ティックを使用しましたが早送りで実行するので性能テストとしては好都合です。

Akumuliへデータを書き込むには「RESPプロトコル」を使用します。RESPはRedisの通信方式なのですが、ソケット通信さえ出来ればどこからでもデータを送ることが出来ます。

MQLにはソケット通信を行う組込み関数はないのですが「WinSock」を直接呼び出す形式の「socket-library-mt4-mt5.mqh」が見つかりました。こちらはMT5にも対応しているようです。

コンソール上でテスト 

まずはコンソール上で動作確認を行います。以下のようなテストデータをファイルに保存します。

vagrant@vagrant:~$ cat ticks 
+tick.bid|tick.ask host=tradeview instruments=USDJPY indicator=tick
+20171002T000001.000000000
*2
+111.0151
+111.0161
+tick.bid|tick.ask host=tradeview instruments=USDJPY indicator=tick
+20171002T000002.000000000
*2
+111.0154
+111.0164
+tick.bid|tick.ask host=tradeview instruments=USDJPY indicator=tick
+20171002T000003.000000000
*2
+111.0156
+111.0166
+tick.bid|tick.ask host=tradeview instruments=USDJPY indicator=tick
+20171002T000004.000000000
*2
+111.0157
+111.0167
+tick.bid|tick.ask host=tradeview instruments=USDJPY indicator=tick
+20171002T000005.000000000
*2
+111.0158
+111.0168

続いてncコマンドで8282ポートに送信します。

vagrant@vagrant:~$ time cat ticks | nc 127.0.0.1 8282
-DB late write

real    0m0.010s
user    0m0.004s
sys     0m0.000s

書き込みに成功したようです。データの取得するには以下のようなJSONリクエストを投げます。

vagrant@vagrant:~$ cat select.json 
{
  "join":["tick.bid","tick.ask"],
    "range": {
        "from": "20171002T000001.000000000",
        "to":   "20171002T000005.000000001"
    }, 
  "where": {
   "host": ["tradeview"],
   "indicator": ["tick"],
   "instruments": ["USDJPY"]
  },
   "order-by": "series",
   "output": {"format": "csv"}
}

curlコマンドを使用してJSONデータをPOST送信します。

vagrant@vagrant:~$ curl -d @select.json  --url http://127.0.0.1:8181/api/query
tick.bid|tick.ask host=tradeview indicator=tick instruments=USDJPY,20171002T000001.000000000,111.0151,111.01609999999999
tick.bid|tick.ask host=tradeview indicator=tick instruments=USDJPY,20171002T000002.000000000,111.0154,111.0164
tick.bid|tick.ask host=tradeview indicator=tick instruments=USDJPY,20171002T000003.000000000,111.01560000000001,111.0166
tick.bid|tick.ask host=tradeview indicator=tick instruments=USDJPY,20171002T000004.000000000,111.0157,111.0167
tick.bid|tick.ask host=tradeview indicator=tick instruments=USDJPY,20171002T000005.000000000,111.0158,111.0168

正常に取得できました。

MQL4のコード

実際のMQL4コードこんな感じです。OnTick()イベントでティックデータを送信しています。

void OnTick()
  {
   if(!glbClientSocket)
     {
      glbClientSocket=new ClientSocket(Hostname,ServerPort);
      if(glbClientSocket.IsSocketConnected())
        {
         Print("Client connection succeeded");
           } else {
         Print("Client connection failed");
        }
     }

   if(glbClientSocket.IsSocketConnected())
     {

      MqlTick last_tick;
      //---
      if(SymbolInfoTick(Symbol(),last_tick))
        {
         string strMsg="+tick.bid|tick.ask host=tradeview instruments=USDJPY indicator=tick\r\n";
         long offset=3600000*InpGmtOffset;
         long t=1000000*(last_tick.time_msc+offset);

         StringAdd(strMsg,":"+IntegerToString(t)+"\r\n");
         StringAdd(strMsg,"*2"+"\r\n");
         StringAdd(strMsg, StringFormat("+%f\r\n",last_tick.bid));
         StringAdd(strMsg, StringFormat("+%f\r\n",last_tick.ask));
         glbClientSocket.Send(strMsg);
        }

     }

// If the socket is closed, destroy it, and attempt a new connection
// on the next call to OnTick()
   if(!glbClientSocket.IsSocketConnected())
     {
      // Destroy the server socket. A new connection
      // will be attempted on the next tick
      Print("Client disconnected. Will retry.");
      delete glbClientSocket;
      glbClientSocket=NULL;
     }
  }

バックテスト時の負荷

「全ティック」モードでバックテストを行い。実行中のリソースをNetDataを使用してモニタリングしてみました。

f:id:fxborg:20171029222436p:plain CPUは80%まで上昇しましたがメモリー使用量は5MBに抑えられています。実際のティックが送られるペースはずっとゆっくりなので、これは期待以上の結果です。

Akumuliデータをチャートへ

Akumuliに保存されているデータをチャートに表示してみました。インジケーターからHTTPリクエストを送っています。

f:id:fxborg:20171030005447p:plain

BST時間の17:00~17:05間の下落時のティックを表示しています。

最後に 

今回はMQLからAkumuliへデータを送信してみました。メモリー使用量が少ないのでVPS上で使用しても問題なさそうです。また、カスタム足や予測値をキャッシュすることでバックテストの高速化などが図れそうです。

こちらからどうぞ
Experts/ea_socket_client.mq4
Indicators/tick_indi.mq4