提示:如有任何疑问可在下方留言或者私信
前言
之前有个客户要求说自己服务器是通过DDE(UniversalDDEConnector)获取别人的MT4行情提供给自己平台的,现在想自己去实现一个DDE 达到不从MT4客户端获取行情,而是其他某平台获取行情。
提示:如有任何疑问可在下方留言或者私信
一、分析
之前没有分析过DDE,所以首先抓包看下他与MT4之间是怎么通讯的有没有加密等
可以看到数据没有加密都是明文传输,这样就简单了,他的流程是:当MT4选择连接DDE的行情插件后,MT4会连接插件中设置的ip和端口也就是dde,MT4连接DDE之后,DDE会首先发送
> Universal DDE Connector 9.00
> Copyright 1999-2008 MetaQuotes Software Corp.
> Login:
MT4返回用户名
> Password:
MT4返回密码。
DDE验证通过后则成功连接
然后DDE返回全部品种的数据给MT4,有个注意的地方是DDE每隔几秒会发送一个心跳包给MT4
> Ping
这样两边的通讯就建立完成了,比想象的要简单
二、代码实现
这种要求高的程序还是在linux上实现比较好,网络框架我使用的是swool,比较成熟的框架比自己实现要稳定。具体使用方法可自行百度
代码
//存储已经插入的fd
$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, //开启两个worker进程
));
$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){
//获取发消息的客户端ip
$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提供数据的程序,这个程序是获取某平台的数据发送给DDE,DDE在返回给MT4,这里主要研究DDE的通讯流程,就不展示其他的程序了,有需要可以留言或私信。
总结
提示:这个程序实现起来难度不大,只是记录一个分析的过程,希望对你正在做的事情有所帮助。
如有任何疑问可在下方留言或者私信