首页 / 债券 / 程序化交易系列之七_程序化交易的经验之谈四

程序化交易系列之七_程序化交易的经验之谈四

日期:2022-03-11 18:27:01

当年,要不是因为外汇交易领域平台的各种灰暗,我估计会一直奋斗在外汇和黄金品种上,外汇程序化交易也不会停下脚步。

假如外汇领域和股票及期货能够真正处于一个公平的线上,我一定会选择做外汇交易。不论是成交机制,还是交易制度,交易时间,外汇交易都大大优于股票交易及期货交易。

且不论几乎24小时运转的外汇走势能提供更多的交易机会,单单是单子成交方面,外汇都是远胜于股票及期货。例如,我曾经的期货程序化单子或者人工挂单,价格都到过目标价格几次了,但就是无法成交。这些是成交机制的问题,期货是撮合成交机制,你要成交一个买单,必须有一个对应的卖单撮合到了才能成交。同一个点位如果你的申请前面还有较多的申请(比如前面已经有一万手),你要等前面的一万手都成交了才能轮到你这笔申请成交。

这就造成了根据信号有时候该进的单没进到,该出的单没出掉,或者没有能够按照既定计划及点位来成交,这对交易产生一定的影响。

对于期货程序化而言,这个撮合成交的机制,也会导致期货程序化的测试和实盘效果无法完全一致。例如测试的时候系统只会按照信号去指示出开仓点位和平仓点位,并计算出点位盈亏结果。但测试的结果不会考虑实盘交易的时候信号能否成交和如何成交,所以实盘的结果和测试的结果是有可能不一样的。

按照撮合成交机制,如果实盘中出现交易信号,系统自然会把开仓或平仓申请发出去,但是假如波动较激烈,有可能还没轮到自己的申请单撮合成交,价格就已经变动了,最终导致实盘没有单子成交,或者哪怕设置了短时间若不成交就撤回原申请并重新发新的申请,最终的成交也脱离了原本信号的意愿和点位。

我的程序化就经历过试过交易信号虽然出来了,交易程序也把开仓或平仓的申请发出去了,但最终没有真实单子能够成交的情况。当然这只是期货程序化的问题之一,而期货程序化的问题并不止于这一个。

程序化交易系列之七:如何在MT4上编写并测试双均线交易EA?

但是做过外汇的朋友都知道,外汇基本上只要点位到达了单子必然成交。当年我挂外汇EA,没有遇到过有交易信号出来但无法按信号成交的事情。

做股票和期货,最大优胜的地方,就是资金安全绝对有保证。外汇交易的各方面都挺好,可惜所有平台(在我们大陆)都没有资金安全的保障。对比之下,还是资金安全最重要,不是吗?

假如未来我们做外汇能够放心,我自然还会重新做起外汇来。今天讲一下外汇MT4编写交易EA并且测试的大致步骤。

第一步,打开MT4,找到MQ语言编辑器创建一个新EA,若有不会的朋友可参考下面两个操作即可。

  1. 在软件上方找到编辑器按钮(新订单按钮旁边那个像书本一样的按钮),点击打开后创建一个EA。
  2. 也可以在导航器中找到EA交易一栏,鼠标右键选择“MetaEtidor”创建一个EA。

第二步,按照MQL导向,一直“下一步”直到完成。这过程只需要自己给EA起个名字就可以了,比如下面我建立一个叫“双均线”的EA。

程序化交易系列之七:如何在MT4上编写并测试双均线交易EA?

第三步,在EA编辑器里编辑交易公式。

MT4的EA编写大概(默认)有以下几个部分,都是英文和代码,具体意思不一一深究,感兴趣的朋友请资料搜索相关资料去学习即可。

程序化交易系列之七:如何在MT4上编写并测试双均线交易EA?

写代码并不是好玩的事,除非有兴趣或者很热爱。我写代码水平不行,只是为了要搞自己需要的EA才自学了点皮毛。

对于自己已经有代码的朋友,可以把编辑区域清空,并复制自己的代码进去就可以了。代码编写完成后,点击上方“编写”打钩按钮,让软件检测是否有代码错误。如果有错误,会在底下有说明,如果无误,会显示没错误(0 errors)

我自己有个双均线交叉的EA代码,这里分享出来,仅供参考。

//+------------------------------------------------------------------+

//| 双均线.mq4 |

//| |

//+------------------------------------------------------------------+

#property copyright "Copyright 2013, MetaQuotes Software Corp."

#property link "http://www.metaquotes.net"

//--- input parameters

extern int shortp=10;

extern int longp=20;

extern double Lots=0.1;

int Crossed (double line1 , double line2)

{

static int last_direction = 0;

static int current_dirction = 0;

if(line1>line2)current_dirction = 1; //up

if(line1<line2)current_dirction = 2; //down

if(current_dirction != last_direction) //changed

{

last_direction = current_dirction;

return (last_direction);

}

else

{

return (current_dirction);

}

}

int start()

{

int cnt, ticket, total;

double shortma, longma;

if(Bars<100)

{

Print("bars less than 100");

return(0);

}

shortma = iMA(NULL,0,shortp,0,MODE_SMA,PRICE_CLOSE,1);

longma = iMA(NULL,0,longp,0,MODE_SMA,PRICE_CLOSE,1);

//开仓----------------------------------------------------------------

int isCrossed = Crossed (shortma,longma);

total = OrdersTotal();

if(total < 1)

{

if(isCrossed == 1)

{

ticket=OrderSend(Symbol(),OP_BUY,Lots,Ask,3,0,0,"My MA",12345,0,Green);

if(ticket>0)

{

if(OrderSelect(ticket,SELECT_BY_TICKET,MODE_TRADES))

Print("BUY order opened : ",OrderOpenPrice());

}

else Print("Error opening BUY order : ",GetLastError());

return(0);

}

if(isCrossed == 2)

{

ticket=OrderSend(Symbol(),OP_SELL,Lots,Bid,3,0,0,"My MA",12345,0,Red);

if(ticket>0)

{

if(OrderSelect(ticket,SELECT_BY_TICKET,MODE_TRADES))

Print("SELL order opened : ",OrderOpenPrice());

}

else Print("Error opening SELL order : ",GetLastError());

return(0);

}

return(0);

}

//平仓-------------------------------------------------------------------------------------------------------

for(cnt=0;cnt<total;cnt++)

{

OrderSelect(cnt, SELECT_BY_POS, MODE_TRADES);

if(OrderType()<=OP_SELL && OrderSymbol()==Symbol())

{

if(OrderType()==OP_BUY) // long position is opened

{

if(isCrossed == 2)

{

OrderClose(OrderTicket(),OrderLots(),Bid,3,Violet);// close position

return(0); // exit

}

}

if(OrderType()==OP_SELL) // go to short position

{

if(isCrossed == 1)

{

OrderClose(OrderTicket(),OrderLots(),Ask,3,Violet);// close position

return(0); // exit

}

}

}

}

return(0);

}

代码里均线参数是10和20并非表示这两数字是最好的参数,实际上也没有哪个是最好的参数,任何指标,任何参数,都只能够适应某个品种或者某个时期或者某种类型的走势,不可能应对得了市场上一切行情。

任何指标,一旦你固定为某个参数,可能又有人认为你是参数拟合。所以声明一下,参数是可以自由改动的,请在上面自己修改为自己需要的参数即可。

第四步,把编写好的EA加载到走势图里。

导航器的EA交易栏里本身已经有默认的两个EA,一个是MACD指标,一个是均线Moving指标。当你编写好自己的EA,它会出现在导航器的EA交易栏目下。

程序化交易系列之七:如何在MT4上编写并测试双均线交易EA?

鼠标对着EA点右键选择“附加到图标”,或者鼠标直接拖到走势图上。在拖进去的过程中,记得在EA属性框“常用”项下的“允许实时自动交易”打钩。确定后,EA圆脸就出现在走势图的右上角位置了。

程序化交易系列之七:如何在MT4上编写并测试双均线交易EA?

第五步,对EA进行测试。操作如下:

软件上方点“显示”,再点“EA交易测试”调出测试设置终端。选择好需要测试的EA、测试的交易品种、周期盘面等等,就可以点“开始”按钮进行测试了。

程序化交易系列之七:如何在MT4上编写并测试双均线交易EA?

最好是把“复盘显示”的勾给打上,这样可以看到复盘测试的过程。

复盘测试的过程可以看出信号是否按照预定的设计进行,复盘显示后面的速度条可以快可慢,根据个人需要。可以一边看复盘测试过程,一边看净值图,以便观察什么样的行情会让发生盈利,什么样的行情会导致资金亏损回撤。

程序化交易系列之七:如何在MT4上编写并测试双均线交易EA?

如果需要测试跨度很长的周期,需要先下载该品种更早期的历史数据。在“工具”中的“历史数据中心”里面下载即可。

外汇软件中,MT4目前依然是比较流行的,但流行的主角迟早会转移到MT5上,建议做外汇的朋友多多学习MT5,毕竟两者的EA代码编写规则不一样。

本次的内容就到这里吧,需要学习的朋友可以把文章收藏起来慢慢看。关注我,别跟丢了。


相关视频:程序化交易系列之七_程序化交易的经验之谈四

其它相关信息

长线策略

程序化交易系统是指将设计人员交易策略的逻辑与参数在电脑程序运算后,并将交易策略系统化。说白了也就是把一些固定的交易策略通过写程序固定下来,进行重复智能化操作就好,所以重要的还是交易策略,程序本身如虎添翼而已。

A股头条

国内唯一一个小散也能无门槛使用的免费股票交易软件——“投资赢家”(恒生电子开发),不用编程轻松上手,支持自动止盈止损、挂单买入、回落卖出等基础功能,更适合对程序化交易感兴趣但不会编程的新手使用。微信搜“投资赢家”可以在菜单栏直接体验模拟埋单。

溧阳路妖选牛股

只要学好C/C++就好了,其他的都好解决

能力强的,都可以自己解决平台问题

我们提供股票和期货的统一标准程序化接口

关注微信公众号
微信二维码