外汇网格交易EA开发的过往【MQL语言】

鄙人:在么,我这边有一个外汇基于网格交易的开发需求,已经整理好,有空看看么?……文件已发送……

A:不做了,谢谢。

B:我不做了,转给朋友看看,加他qq1234567

C:良久……我感觉比较复杂,那么谈价吧

C还在某个学校在读,他那个三本某高考前重病三年当日夜御十女,应该也还是不至于去上。

但是最后谈出了第一期的价格:1600元。

鄙人虽然也是比较贫苦,湾流都买不起,但是雇人已经好久没有这么便宜了。

那份开发需求,大概是当年瞟了眼正版产品经理某某和某某的笔记,大概记了一个似是而非的格式,总结出来的,长这样:

输入参数

目标价:精度4(小数点后四位)【前两位默认填写,如现价1.1350,默认给数字1.1自填后面部分加快输入速度】

参数:本值等于每个bp开仓手数,要求可以设定默认,精度一位小数,对应市场每0.0001价格开仓手数。

间隔:网格间隔,单位bp,即1bp=0.0001,精度5,即可以设为带一位小数。

手数:网格每次挂单手数。带一位小数

货币对:自动读取/可以更改。默认eurusd

计算参数

档位价:精度4=目标价(持仓/参数)

持仓:当前方向上所有该货币持仓手数净额。

方向:自动判断,目标价低于市价即为看空,目标价高于市价即为看多。

下单方式

初步设置首单

If 档位价=目标价,首单下单状态

首单下单价格:市价偏目标价方向一个间隔。【目标价1.1400,市价1.1300,间隔5,下单价格1.1305

首单下单手数:精度0.01(目标价首单下单价格)*参数【取绝对值】

首单下单完全成交之后,进入双腿下单模式。

如果开始策略时候有底仓或者首单5分钟没有完全成交,也发起撤单,并进入双腿下单。

(当前档位价=首单下单价格)

双腿下单

多头价格:档位价间隔

空头价格:档位价+间隔

挂弹量:手数

双边挂单实现方式自动判断为:多开,多平,空开,空平。最好能够实现首单手数的部分平仓挂单。

双腿中一腿完全成交,发指令撤单另一腿。

而后loop双腿下单

停止条件

1、杠杆上限,如识别资金无法开双腿单,提示一下“开仓金额不足”并终止。

2、市价超过目标价+间隔/跌破目标价间隔。当即以目标价挂出剩余全部方向头寸平仓。EA停止运行。

3、停止按键,或其他停止手段,手工停止按钮指令发出,撤销全部挂单。

要求,EA离线运行即可。

举例

我设一个举例讨论,四个要素 目标价 1.14000;参数1 间隔5 手数1

市价1.13000,识别目标价大于市价,策略方向为做多。

首单挂单价格1.13050 手数95 假设马上完全成交

这时候有多单95手,档位价计算可得为1.13050

挂单 开空:1.13100 1手,开多:1.13000 1手

市价不变,开多1.13000 1手成交,开空:1.13100 1手撤单。对冲平仓(无相反仓位,保留两单多单)档位价计算变动:1.13040

挂单:开空 1.13090 1手,开多:1.12990 1

市价上涨到 1.13090,开空 1.13090 1手成交,开多:1.12990 1手撤单,仓位95,对冲平仓(有相反仓位,按时间顺序对冲平仓一手,只留95手多单一单)档位价重新计算变动:1.13050

挂单 开空:1.13100 1手,开多:1.13000 1手

市价上涨到1.13010,开空:1.13100 1手成交,开多:1.13000 1手撤单,对冲平仓(有相反仓位,按时间顺序对冲平仓一手,只留94手多单一单)档位价重新计算变动:1.13060

挂单 开空:1.13110 1手,开多:1.13010 1手

……

市价上涨到1.14050,满足目标价+间隔,全部撤单,挂单:策略货币对全部平仓,限价目标价。策略停止

鄙人抛出的的时候,觉得言简意赅,有解释,有逻辑,有实例,应该一案到底了吧。

扯了几个对方不明白的地方,1.0版本很快完工,当时我还在上海看Cfets发布境外投资者指数,隔了一天才测试:

结果挂单有根本的问题,mt平台,stop单子的逻辑跟期货里面的限价完全就不是一回事。。limit又不能挂已经达到的价格。

于是只好修正了一个思路,市价高于卖价或者低于卖价的时候,挂市价单。

这点小事,英明神武如鄙人,当然自己也能解决。

结果遇到了另外一个问题:

某F1赞助平台,限制单数为20。

那么我只能总结一番,新增需求了:

修正1:

  • 首单下单手数:精度0.01(目标价-首单下单价格)*参数【取绝对值】【修改为市价下单已成】
  • 双腿模式:如果无法开limit单,同时市价高于sell挂单价,或者低于buy挂单价,改为市价下单。否则循环刷新。
  • 手数合并:反向开仓与交易方向的订单按开仓时间选择最近的合并,同时优先合并。
  • 强制手数合并按钮:如点击此按钮,双腿暂停,除了手数最大的订单之外所有仓位平仓,并且按照市价开仓,开仓手数=(目标价-市价)*参数-最大订单手数。成交之后双腿重启。
  • 修改按钮,按此按钮之后,撤单并暂停,在目前参数的基础上修改EA内的“间隔”“手数”,修改确定之后立即生效重新开始报单。
  • 与手动不冲突:严格识别是否EA开单,如运行中我手动开立的头寸,不参与计算档位价。
  • EA共存:即使同一个周期的货币对,如果两组EA策略的标签不同,可以一起运行不互相干扰。

如前三项生效,此按钮仅仅作用于残留订单为首单余额和首单同方向双腿已成交单的时候。

报价400,概不还价。

不久,因为想到也可以用止盈来平仓小单子,似乎想修改修正1,但是想来想去还是对冲平仓比较可靠。

第二次报过来的时候,问题还在,并没有对冲平仓,买单卖单共存一堆,极其难看。还有20单限制最后由客服确认无法突破。我提出了准确的修正2,

修正2

  • 对冲平仓:反向开仓与交易方向的订单按开仓时间选择最近的对冲平仓,同时优先平手数相同的双腿单,其次平手数合并单,首单不参与对冲平仓。或可以简单理解为:对冲平仓不平首单,并首先从手数多少排序,然后按时间先后。(目的在于最少次数被逼合并仓位)
  • 手数合并:每次自动发起的手数合并,仅合并双腿单(即单的头寸=“手数”)的单子。保留首单残余和此前的手数合并单。

此处举例:如首单为100手多单,另有19笔手数1的空单,达到限制,需要自动合并。结果应为:保留首单,另生成一笔19手的空单。

这里还特么多了一个概念,首单,首单给了个sd的标记。

又是一个400。

终于收到了这个版本,于是我可以作死开始新增需求。其实交易商也被忍无可忍的鄙人,换成了名字还不错的Tradesway,无限持仓单数。

修正3

  • 达到目标价的时候,理论上档位价=目标价,由于首单不平,理论上所有ea订单与首单对冲平仓仓位为零,为防止平仓冲击,到达目标价(原目标价多空+-档位价)的时候,策略终止动作应为:(1)撤掉双腿单,停止双腿运行,策略暂停。(2)所有订单与首单对冲平仓。(3)策略终止,并平掉残余策略订单。
    • 自定义时段和价差功能:目前cmt+8时区(中国)100-800间交投非常清淡。所以该可编辑时间段内的间隔,设为:间隔2,并可设置自定义时段,满足不同cmt时区的mt4端口使用。除自定义时段之外,使用“间隔”,挂单手数相同即可,以免更改麻烦。
  • 转化为MT5 EA,并正常使用所有功能。

这次涨价了,1050

本低实例至少给了鄙人两点教训。

  1. 如无必要,平和用人。
  2. 撮合和妥协,方能达成目的。

最终版本下载:[download id=”5217″]

One thought on “外汇网格交易EA开发的过往【MQL语言】

Comments are closed.

Proudly powered by WordPress | Theme: Journey Blog by Crimson Themes.