各位大佬好,小弟刚接触EA编程没多久,最近在写一个简单的网格策略,遇到了一些关于点差和滑点的问题,翻了不少帖子还是有点迷糊,想请各位指点一下。
先说点差吧。我理解的是,点差就是买入价和卖出价之间的差值,比如EURUSD当前买价1.1050,卖价1.1052,那点差就是2个点。但实际写代码的时候,我遇到几个困惑的地方。
第一,在MQL4里,我用MarketInfo(Symbol(), MODE_SPREAD)获取点差,返回的是整数,比如20,但看图表上的点差显示却是2.0点。后来查了文档才知道,这个20实际上是20个pipette(也就是0.1点),因为EURUSD的Digits是5位,所以20个pipette等于2个标准点。那我写止损止盈的时候,到底该用哪个单位?比如我想设20个点的止损,是写StopLoss = Ask - 200 * Point,还是StopLoss = Ask - 20 * Point * 10?这个问题绕了我好几天,试了几次模拟盘,发现有时候止损设得特别大,有时候又特别小,搞得我都不敢实盘了。
第二,点差在EA运行过程中会动态变化,我写了个简单的打印函数,把每次开仓前的点差记录下来,发现隔夜时候点差能扩大到平时的三四倍,比如平时2点,到晚上变成8点。那我做网格策略,每隔10点加仓一层,如果点差突然变大,会不会导致实际加仓位置偏离预期?比如我设的挂单是buy limit在1.1000,但点差大了之后,成交价会不会因为点差原因被滑到1.0998?这个问题我翻了很多帖子,有的说点差只影响开仓成本,不影响挂单成交位置,有的说点差大的时候挂单容易提前触发,到底哪种说法对?
第三,我写了个函数计算开仓成本,用OrderOpenPrice() + (Ask - Bid)这种写法,但发现平仓时候的实际盈亏和理论值总是差几个点。后来才知道OrderOpenPrice()是开仓时的价格,点差是当时的,但平仓时候的点差变了,所以实际盈亏会有差异。那如果我想精确计算策略的净利润,是不是应该在每次平仓后重新计算一次点差成本?还是说直接用OrderProfit()加上佣金和掉期费就行?我现在的策略是每开一仓就记录当时的点差,然后平仓时用记录的点差和实际平仓价差做比较,但这样代码变得很复杂,不知道有没有更简洁的方法。
再说滑点。我设的滑点参数是Slippage = 10,也就是10个pipette。但实际运行中发现,有时候市价单成交的滑点远大于10,比如设置了10的滑点,结果成交滑了30个点,这正常吗?我查了日志,发现滑点发生在数据波动剧烈的时候,比如非农数据公布那几分钟。那这种情况下,我的EA该怎么处理?目前我用的是OrderSend函数直接下单,如果滑点超标,是不是应该用循环重试机制?比如设置最大滑点50,如果实际滑点超过50,就重新下单,直到滑点小于50为止?但这样会不会陷入死循环?另外,限价单挂单有没有滑点问题?我理解限价单如果成交,价格应该就是挂单价,但看一些帖子里说,如果市场流动不足,限价单也可能被拒绝或者以更差价格成交,这又是怎么回事?
最后,我还想请教一下,点差和滑点对EA的稳定性影响到底有多大?我模拟盘跑了两个月,网格策略表现不错,但把点差从模拟盘的固定值1.5改成实盘的浮动点差(比如平均2.5),回测结果就开始亏损。是不是因为点差和滑点叠加了成本,导致策略失效?我是否需要重新设计入场逻辑,比如只在点差小于某个阈值时开仓?或者用限价单代替市价单来减少滑点影响?但限价单成交速度慢,怕错过行情。
总之,感觉点差和滑点这两个概念看着简单,实际写代码时候坑特别多。希望各位大佬能分享点经验,特别是怎么在MQL4/MQL5里合理处理点差和滑点,让EA更健壮一些。小弟先谢过了!
先说点差吧。我理解的是,点差就是买入价和卖出价之间的差值,比如EURUSD当前买价1.1050,卖价1.1052,那点差就是2个点。但实际写代码的时候,我遇到几个困惑的地方。
第一,在MQL4里,我用MarketInfo(Symbol(), MODE_SPREAD)获取点差,返回的是整数,比如20,但看图表上的点差显示却是2.0点。后来查了文档才知道,这个20实际上是20个pipette(也就是0.1点),因为EURUSD的Digits是5位,所以20个pipette等于2个标准点。那我写止损止盈的时候,到底该用哪个单位?比如我想设20个点的止损,是写StopLoss = Ask - 200 * Point,还是StopLoss = Ask - 20 * Point * 10?这个问题绕了我好几天,试了几次模拟盘,发现有时候止损设得特别大,有时候又特别小,搞得我都不敢实盘了。
第二,点差在EA运行过程中会动态变化,我写了个简单的打印函数,把每次开仓前的点差记录下来,发现隔夜时候点差能扩大到平时的三四倍,比如平时2点,到晚上变成8点。那我做网格策略,每隔10点加仓一层,如果点差突然变大,会不会导致实际加仓位置偏离预期?比如我设的挂单是buy limit在1.1000,但点差大了之后,成交价会不会因为点差原因被滑到1.0998?这个问题我翻了很多帖子,有的说点差只影响开仓成本,不影响挂单成交位置,有的说点差大的时候挂单容易提前触发,到底哪种说法对?
第三,我写了个函数计算开仓成本,用OrderOpenPrice() + (Ask - Bid)这种写法,但发现平仓时候的实际盈亏和理论值总是差几个点。后来才知道OrderOpenPrice()是开仓时的价格,点差是当时的,但平仓时候的点差变了,所以实际盈亏会有差异。那如果我想精确计算策略的净利润,是不是应该在每次平仓后重新计算一次点差成本?还是说直接用OrderProfit()加上佣金和掉期费就行?我现在的策略是每开一仓就记录当时的点差,然后平仓时用记录的点差和实际平仓价差做比较,但这样代码变得很复杂,不知道有没有更简洁的方法。
再说滑点。我设的滑点参数是Slippage = 10,也就是10个pipette。但实际运行中发现,有时候市价单成交的滑点远大于10,比如设置了10的滑点,结果成交滑了30个点,这正常吗?我查了日志,发现滑点发生在数据波动剧烈的时候,比如非农数据公布那几分钟。那这种情况下,我的EA该怎么处理?目前我用的是OrderSend函数直接下单,如果滑点超标,是不是应该用循环重试机制?比如设置最大滑点50,如果实际滑点超过50,就重新下单,直到滑点小于50为止?但这样会不会陷入死循环?另外,限价单挂单有没有滑点问题?我理解限价单如果成交,价格应该就是挂单价,但看一些帖子里说,如果市场流动不足,限价单也可能被拒绝或者以更差价格成交,这又是怎么回事?
最后,我还想请教一下,点差和滑点对EA的稳定性影响到底有多大?我模拟盘跑了两个月,网格策略表现不错,但把点差从模拟盘的固定值1.5改成实盘的浮动点差(比如平均2.5),回测结果就开始亏损。是不是因为点差和滑点叠加了成本,导致策略失效?我是否需要重新设计入场逻辑,比如只在点差小于某个阈值时开仓?或者用限价单代替市价单来减少滑点影响?但限价单成交速度慢,怕错过行情。
总之,感觉点差和滑点这两个概念看着简单,实际写代码时候坑特别多。希望各位大佬能分享点经验,特别是怎么在MQL4/MQL5里合理处理点差和滑点,让EA更健壮一些。小弟先谢过了!
专注交易策略编程实现,分享MQL开发技巧与代码优化方案