跨平台跟单系统的实现方式和技术原理(EA篇)

发布于 2019-12-24 19:45:46

    书接上章EA想必接触过MT4软件的应该都不会陌生,其实就是PC终端交易软件可以用EA来进行数据通讯。

    使用此跟单系统需要有两个条件:一是要配置好EA,二是要一直打开MT4。基于EA的数据通讯用一个服务系统将多个终端链接起来,可以相互配置跟单账号、被跟单账号以及跟随策略。

    当然缺点是如果账户较多的话,硬件成本较高,每台高配置服务器最多容纳32个终端,实测20个账户对服务器负载就已经很大了。且账户的管理维护难度较大,稳定性随账户的增加而递减,数据延迟也相对较大。

原理

解释原理前,先解释几个名词:

信号源:其实就是下单的账号,通常是观察帐号。
跟单账号,顾名思义,就是跟单的账号。

跟随关系:通常是组合策略,一般信号源和跟单账号是一跟多,或者多跟多的关系。

其实原理很简单,无非就是通过一个中间键来实现一个相同标准。比如2个终端读写同一个文件,发射端触发下单命令写入一个文件,接收端在扫描文件发现有下单命令就进行下单。异或通过websocket发送和接收信号,当然这个就点难度,需要了解一些接口知识了。

实例

OK,通过修改一个文件来实现最简单的下单功能。

话不多说,直接上代码。

信号发射端代码:

void OnTick()
{
//---
  if (OrdersTotal()==1 && OrderSelect(0, SELECT_BY_POS, MODE_TRADES))//有一单选中
  {
      int myHandle = FileOpen("TradeInfo.csv", FILE_CSV | FILE_WRITE, ",");
        FileWrite(myHandle,OrderOpenTime(),OrderTicket(),OrderSymbol(),OrderType(),
        OrderLots(), OrderOpenPrice(), OrderComment(), OrderMagicNumber());
        FileClose(myHandle);//将订单信息写入文件
  }
  if (OrdersTotal()==0) FileDelete("TradeInfo.csv");
  }
}


接收端代码:

string myType, myLots, mySymobl;
int myHandle;
void OnTick()
{
  if(iReadFile() == 1 && OrdersTotal()==0)
  {
        int mycmd1 = StrToInteger(myType);
        string mySymobl1 = mySymobl;
        double mylots1 = NormalizeDouble(StrToDouble(myLots),2);
        double myOpenPrice;
        if (mycmd1 == 0) myOpenPrice = MarketInfo(mySymobl1, MODE_ASK);
        if (mycmd1 == 1) myOpenPrice = MarketInfo(mySymobl1, MODE_BID);
        OrderSend(mySymobl1, mycmd1, mylots1, myOpenPrice, 0, 0, 0);
    }
    if (iReadFile() == 0 && OrderSelect(0, SELECT_BY_POS, MODE_TRADES))
    {
        double myClosePrice;
        if (OrderType()==OP_BUY) myClosePrice=Bid;
        if (OrderType()==OP_SELL) myClosePrice=Ask;
        OrderClose(OrderTicket(), OrderLots(), myClosePrice, 0);
    }
}
int iReadFile()
{
  myHandle = FileOpen("\xxx\experts\files\TradeInfo.csv", FILE_BIN | FILE_READ);//xxx是发射端安装目录
  if (myHandle == -1) return(0);
  string myValue;
  myValue = FileReadString(myHandle, 60);
  int myDatecnt = StringFind(myValue, ",", 0);
  string myDate = StringSubstr(myValue, 0 ,myDatecnt);
  int myTicketcnt = StringFind(myValue, ",", myDatecnt+1);
  string myTicket = StringSubstr(myValue, myDatecnt+1, myTicketcnt-myDatecnt-1);
  int mySymbolcnt = StringFind(myValue, ",", myTicketcnt+1);
  mySymobl = StringSubstr(myValue, myTicketcnt+1, mySymbolcnt-myTicketcnt-1);
  int myTypecnt = StringFind(myValue, ",", mySymbolcnt+1);
  myType = StringSubstr(myValue, mySymbolcnt+1, myTypecnt-mySymbolcnt-1);
  int myLotscnt = StringFind(myValue, ",", myTypecnt+1);
  myLots = StringSubstr(myValue, myTypecnt+1, myLotscnt-myTypecnt-1);
  int myPricecnt = StringFind(myValue, ",", myLotscnt+1);
  string myPrice = StringSubstr(myValue, myLotscnt+1, myPricecnt-myLotscnt-1);
  FileClose(myHandle);
  return(1);
}

当然这是最简单的下单跟单脚本,还有很多bug,需要按照自己的意思去改写!!!

0 条评论

发布
问题