MT4开发 之开发自己的数据源系统(dde UniversalDDEConnector )

提示:如有任何疑问可在下方留言或者私信


前言

之前有个客户要求说自己服务器是通过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的通讯流程,就不展示其他的程序了,有需要可以留言或私信。


总结

提示:这个程序实现起来难度不大,只是记录一个分析的过程,希望对你正在做的事情有所帮助。
如有任何疑问可在下方留言或者私信

  • 1
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值