提示:如有任何疑問可在下方留言或者私信
文章目錄
- 前言
- 一、分析
- 二、代碼實(shí)現(xiàn)
- 總結(jié)
前言
之前有個客戶要求說自己服務(wù)器是通過DDE(UniversalDDEConnector)獲取別人的MT4行情提供給自己平臺的,現(xiàn)在想自己去實(shí)現(xiàn)一個DDE 達(dá)到不從MT4客戶端獲取行情,而是其他某平臺獲取行情。
提示:如有任何疑問可在下方留言或者私信
一、分析
之前沒有分析過DDE,所以首先抓包看下他與MT4之間是怎么通訊的有沒有加密等
可以看到數(shù)據(jù)沒有加密都是明文傳輸,這樣就簡單了,他的流程是:當(dāng)MT4選擇連接DDE的行情插件后,MT4會連接插件中設(shè)置的ip和端口也就是dde,MT4連接DDE之后,DDE會首先發(fā)送
> Universal DDE Connector
9.00
> Copyright
1999-2008 MetaQuotes Software Corp.
> Login:
MT4返回用戶名
> Password:
MT4返回密碼。
DDE驗(yàn)證通過后則成功連接
然后DDE返回全部品種的數(shù)據(jù)給MT4,有個注意的地方是DDE每隔幾秒會發(fā)送一個心跳包給MT4
> Ping
這樣兩邊的通訊就建立完成了,比想象的要簡單
二、代碼實(shí)現(xiàn)
這種要求高的程序還是在linux上實(shí)現(xiàn)比較好,網(wǎng)絡(luò)框架我使用的是swool,比較成熟的框架比自己實(shí)現(xiàn)要穩(wěn)定。具體使用方法可自行百度
代碼
$redis = new Redis();
$redis->connect("127.0.0.1",6379);$table = new swoole_table(1024);
$table->column('msg', swoole_table::TYPE_STRING, 255);
$table->create();
$serv = new swoole_server("0.0.0.0", 2222);
$serv->set(array('worker_num' => 4,
));
$serv->on('connect', function ($serv, $fd) use ($redis){echo "connect:" . $fd;if($fd == 1){ $timer_id = swoole_timer_tick(30000,function($timer_id) use ($redis,$serv) {echo "2s , timerId :{$timer_id} \n";$fdlist = $redis->smembers("fdlist");foreach($fdlist as $k=>$v){print_r($v); $serv->send( $v,"> Ping\r\n");} }); }$fdinfo = $serv->getClientInfo($fd);$address = $fdinfo['remote_ip'];if($address != "127.0.0.1"){$serv->send( $fd, "> Universal DDE Connector 9.00\r\n> Copyright 1999-2008 MetaQuotes Software Corp.\r\n> Login: " );}
});
$serv->on('receive', function ($serv, $fd, $from_id, $data) use ($redis){$fdinfo = $serv->getClientInfo($fd);$address = $fdinfo['remote_ip'];file_put_contents("/www/wwwroot/default/log.txt","==".$data."==\r\n",FILE_APPEND);if($data == "qqq\r\n"){echo "qqq\r\n";$serv->send( $fd, "> Password: " );}if($data == "zzz\r\n"){echo "zzz\r\n";$serv->send( $fd, "> Access granted\r\n" );$redis->sadd("fdlist",$fd);} $fdlist = $redis->smembers("fdlist");if($address == "127.0.0.1"){unset($fdlist[$fd]);} foreach($fdlist as $k=>$v){$serv->send( $v,$data);}
});
$serv->on('close', function ($serv, $fd) use ($redis) {echo "close........";$redis->srem("fdlist",$fd);
});
$serv->start();
這里我還一個程序就是給上面自己的DDE提供數(shù)據(jù)的程序,這個程序是獲取某平臺的數(shù)據(jù)發(fā)送給DDE,DDE在返回給MT4,這里主要研究DDE的通訊流程,就不展示其他的程序了,有需要可以留言或私信。
總結(jié)
提示:這個程序?qū)崿F(xiàn)起來難度不大,只是記錄一個分析的過程,希望對你正在做的事情有所幫助。
如有任何疑問可在下方留言或者私信
總結(jié)
以上是生活随笔為你收集整理的MT4开发 之开发自己的数据源系统(dde UniversalDDEConnector )的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。