无指标网格EA的实战哲学与风控
从ATC 2010访谈看逆势加仓与多货币分散
开发者背景与自动化交易启蒙
Dimitar Manov 是保加利亚程序员,1985年就开始用BASIC写程序,后来过渡到Pascal和C。1994年取得经济信息计算机处理专业学位。六年前(约2004年)接触MQL4后,他迅速被自动交易的威力吸引。他认为MQL语言逻辑清晰,EA不同于人类,不会恐惧或贪婪。初期他制作指标和简单EA并不成功,直到停止使用指标才出现稳定盈利。这段经历说明,程序化交易的优势在于执行纪律,而非复杂分析。
许多中文交易者在入门MQL时也容易陷入‘指标堆砌’误区,试图用各种震荡指标、鳄鱼与分形组合预测行情,但长期看账户仍被烧毁。Manov指出,指标只反映历史,与当前价格运动无必然联系,这是他彻底放弃指标的核心原因。
从ATC 2008到2010的EA演进
Manov在2008年自动化交易锦标赛(ATC 2008)使用的机器人限制了3笔订单,无法纯正使用均价摊平,也不能同时交易多货币对。2010年规则放开后,他的EA改为多货币分散风险,并去除强制止损,改为逆势加仓与跟踪止损结合。他认为纯马丁格尔在单一货币对上毫无希望,而多货币对冲能提升生存概率。
2008年失败的主因是雷曼兄弟破产引发的单边千点行情,当时EA未优化波动率且缺乏步长递增功能,迅速止损出局。2010版虽能虚拟挂网格,但若出现无回调的极端趋势,仍会快速爆仓。这提醒我们:任何网格系统都有‘黑天鹅’死穴。
无指标交易的核心信号逻辑
Manov的EA不调用任何技术指标,信号源是当前价格与持仓总均价的点差。逻辑极简:价格跌就买,涨就卖,本质是‘贱买贵卖’。系统监控当前价与仓位均价差值,差值大就减仓差(逆势开单),盈利后启动跟踪止损。不同货币对设置不同步长、跟踪止损和目标,但他曾误设两个货币对的跟踪等于最小目标,导致零利润平仓。
他认为成交量有趣的特性是改变持仓总价格,因此EA利用量价关系调整头寸。图表作为指引无用,因为未来会被修正。这种‘反技术分析’立场在量化圈少见,但契合均值回归的哲学。
逆势加仓与类马丁格尔辨析
EA不属于纯马丁格尔,因为外汇不是赌场。相似点在于:入场方向不重要,出场才是关键,亏损仓位通过反向开单降低均价差。每笔加仓用递减步长,使总均价快速追上现价。亏损金额不减少,但以点差衡量的相对亏损降低。方向选择也简单:前仓平仓后反手,买后卖再卖开。
他强调‘循环即生命’,相信修正必然来临。这与网格策略的底层假设一致:价格终将回归。但需明白,这一假设在趋势市会失效。对比纯马丁,他的系统靠多货币分散和免止损缓冲,而非倍数翻倍,杠杆更克制。
杠杆、仓位与资金管理原则
Manov视杠杆为双刃剑,任何低估都会导致崩溃。他的手数小,通过缩小加仓步长和提高总手数实现激进,但测试器中计算耗时限制了优化。每仓加量随价格运动递减,总均价速追现价。参数按保证金引导:0.1手占资多则最小利润设大;波动小货币对交易少利润薄,波动大则回撤深。
ATC中他移除了通用资金与风险管理函数,因速度慢且不适应赛制。实盘若照搬竞赛EA,必须补回风控模块。中文交易者常忽视杠杆匹配,直接套用竞赛参数易引发断崖。
多货币分散与稳定性验证
2010版交易12个货币对,分散回撤并增潜利。测试器中权益曲线平滑,斜率随参数变,仅止损会破坏。他先写多货币EA再按回撤设各对参数,用最小回撤优化确保长期盈亏平衡。评审Boris Odintsov将其列为最稳定可靠EA之一,Manov归因于追求稳定,并玩笑称若夺冠将公开代码。
多货币EA降低相关性风险,但需注意跨品种保证金共享。中文用户用MT5组合测试时,应开启‘全部品种同步 tick’以防偏差。
对中文交易者的启示与常见坑
第一,指标并非必需,价格与仓位成本差可构信号。第二,网格必死穴是单边无回调,须用多货币或波动率过滤器。第三,竞赛EA去风控,实盘不可直接迁。第四,参数误配(如跟踪=目标)会吞噬利润,须单元测试每对。第五,杠杆克制胜于倍投。第六,回测平滑不等于实盘,需压力测试极端价差。
- 放弃指标后专注价格与均价差,减少曲线拟合
- 虚拟网格降低订单数,适合MT5执行
- 多货币分散但警惕共同风险事件
- 递减步长加仓快追价,但需算力支持
- 去除硬止损改用利润回撤平仓,考验参数
// 虚拟网格示例片段(基于访谈逻辑模拟)
input double GridStep = 50; // 虚拟网格步长(点)
input double LotStep = 0.01; // 基础手数
double avgPrice; // 持仓总均价
void OnTick()
{
double posDiff = (Ask - avgPrice) / _Point;
if(posDiff > GridStep) // 价格远离均价 -> 逆势BUY
OpenVirtualOrder(ORDER_TYPE_BUY_LIMIT, LotStep);
else if(posDiff < -GridStep) // 价格低于均价 -> 逆势SELL
OpenVirtualOrder(ORDER_TYPE_SELL_LIMIT, LotStep);
// 盈利后设置跟踪止损(略)
}
void OpenVirtualOrder(ENUM_ORDER_TYPE type, double lot)
{
// 此处仅记录虚拟挂单,触价后通过OrderSend实现
}