开发和分析交易系统的最佳方法(基础篇)
「为什么先用 MT5 搭系统再谈优化」
做交易系统,最实在的路径是先能在 MT5 里跑起来,再谈统计与调参。把逻辑写成 EA 或指标,用历史数据回测,比在脑子里推演更不容易自欺。 根据平台公开文档区的历史记录,一篇发布于 2021 年 2 月 1 日的系统开发方法论文章,在较长时间内累计获得约 4211 次浏览与 69 条互动,说明这类「先搭后析」的实操内容在交易者中确有稳定需求。 外汇与贵金属杠杆高、滑点随机,任何系统在上真金前都只能用历史概率去证伪,不能当成盈利保证。开 MT5 的策略测试器,把你怀疑有效的规则先写成脚本跑一遍,是成本最低的第一步。
◍ 为什么需要一套筛选标准
外汇和贵金属零售交易规模随全球互联网带宽扩张持续放大,新信号、EA 和系统几乎每天冒出来,背后是大量想快速变现的资金与开发者。 MT5 社区生态里,用户既能买信号和产品,也能靠发布自己的系统获利,这种双向市场让「可选项」远超个人验证能力。 本文系列只做一件事:给你选外部信号/产品的硬标准,以及自己写系统、上实盘前该守的边界规则。 外汇与贵金属杠杆高、滑点跳空频繁,任何系统都只是概率优势,不是保本凭证。
从堆代码到做减法的系统观
我早年主要在 MT4 上写 EA,后来转到 MT5——单看功能,MT5 把前代甩开不止一个身位,回测精度和并行测试能力是实打实的代差。 我自己的开发节奏是:先写最简单能跑的版本,看结果像不像某种模式;像,就加过滤器、提信号强度再回测。改完变好了,才去挖背后为什么好、为什么坏。同时我会并行养几个简单系统,而不是死磕一个几个月想把它磨完美——那是弯路。 代码量是最反直觉的标尺:我写过 2000~3000 行的 EA,零产出;也写过 20~50 行的工作代码,能在多个货币对的全历史数据上跑通。决定成败的是你对市场的理解质量,不是程序复杂度。 越简单的系统越好修、越好改,而且跑着跑着你可能发现它底层逻辑完全变了——这种事有时要几年才回过味。到我现在的阶段,几乎写的机器人都尽量简单,但更稳更赚。这时候你会看清:社区里 99% 的所谓烛形套路和指标说法基本是废话,连「趋势/横盘」这种相对靠谱的概念,解释权也全在嘴上,亏了总被说成你趋势线画歪了。 外汇和贵金属是高杠杆高风险品种,别信圣杯。真要逼近价格驱动的本质,得靠数学去从回测里抠规律、想清楚背后的物理意义,而且系统必须自己从零写、自己跑足够多的数量。我找圣杯找了好几年,想找到和真找到是两回事。
「信号、EA与指标的真实定位」
MT5里的信号、EA和指标都是工具,不是解决方案。订阅信号前先看平均持仓时间:我个人不建议碰平均持仓少于1分钟的信号,这类极短线对ping极敏感,10毫秒偏差就足以让跟单开在错误价位。 好信号的特征很直白——净值线紧贴余额线,说明没有久持仓位、无马丁格尔无网格,盈利交易占比高,存款负担小。坏信号常出现大的绿色向下峰值,那是马丁格尔痕迹,测试初期的峰值可能吞掉全部利润,账户清零并非不可能,市场上仍可选到稳健样本。 租EA要算账:初始100美元、租期花200美元、赚200美元,净收益为零。预期利润至少得是EA价格的几倍才值。多货币EA更可信,若能在多个货币对通用,说明抓住了市场物理规律。我有一套未上架的EA,过去10年主货币对用单一设置文件、未优化未调参,固定1手测试,成绩见下表(此处略表),证明自动系统可达此结果。 指标我偏消极:它们慢、且只反映价格微变;窗口内指标多循环计算,后值依赖前值,效率受限。别信指标交叉当信号,那只是心理锚点。最有用的指标是识别市场几何形态并带声音提醒的,但开仓决定权永远在你。我自研的指标只做一件事——用数学函数在图表找形态并通知,省时间用,不替你决策。外汇/贵金属高风险,工具失效是常态。 从数学视角看测试与开发,才能越过这些工具表象理解底层逻辑。
◍ 用行数和概率算清开发效率
写策略最忌拍脑袋定复杂度。把「首次原型落在可接受范围内的概率」记为 Ps,它其实是关于代码行数 L 的隐函数 Ps=Ps(L)。代码越长,覆盖的边界可能越多,但开发耗时 T 近似正比于 L(T=K*L),所以单纯堆行数并不划算。 真正要最大化的是单位时间产出效率 E=Ps/T。提升 E 只有两条路:要么把市场认知打磨得更准,要么找到最合适的原型代码体量。我个人的经验是偏向简单原型,用一个基准效率 E0 来衡量自己这段时间的产出够不够高。 开发完必然进测试与修改,这两步绑死在「测试-分析-修改」的循环里。用伯努利公式可算从 n 次开发周期里拿到至少 m0 个满意原型的概率:Pa=Σ C(n,m)·Ps^m·(1-Ps)^(n-m)。注意这只能放大「撞上可用系统」的机会,外汇与贵金属市场高风险,绝不保证你一定能捞出能实盘的系统。 测试侧同样套伯努利:Pf=Σ C(n,m)·Po^m·(1-Po)^(n-m),Po 是单次迭代出可接受结果的概率。更实在的指标是 Ef=Pf/m 且让它最大——m 是你自己凭直觉砍掉的测试趟数。我习惯在初期就弃掉没灵气的原型,省下的时间比跑满 n 轮更值钱。 把开发与改进合起来看,总效率 ET=(Ps*Pf)/TSumm,其中 TSumm=T+m*Tm,Tm 是单轮「测试-修改-优化」耗时。早期我用基于 tick 的回测,后来全改基于柱形:实测测试速度能快好几倍,且避开报价点噪声,原型迭代明显更省时间。
策略质量的定量参数怎么读
评估一套 EA 或人工交易系统,靠的是一组定量参数而非感觉。Expected payoff(预期收益)、Profit factor(利润因子)、各类 drawdown、Recovery factor(恢复因子)、获利交易百分比,这些数合起来能说明策略的大部分特征,但前提是样本量不能太小——严格说 n 要趋近无穷才精确,不过几百笔成交已具备很高参考可靠性。 预期收益是最核心的一项,必须 > 0 才谈得上盈利可能。它分点数与存款货币两种算法: M_Points=( Sum(1,n)(PrPoints[i]) - Sum(1,n)(LsPoints[i]) )/n M=( Sum(1,n)(Pr[i]) - Sum(1,n)(Ls[i]) )/n 其中 PrPoints[i] 为第 i 笔盈利点数,LsPoints[i] 为第 i 笔亏损点数,Pr[i] 与 Ls[i] 为存款货币计盈亏,n 为总交易数。点差、佣金、隔夜息会吃掉一部分,实际盈利要扣除这些。 点差本质是经纪商那一侧的「预期收益」。若算出来你的预期收益只比点差略高一点,那其他参数再好看也意义不大,外汇和贵金属品种点差跳变频繁,这块高风险得盯死。 利润因子排第二,反映信号质量:PrFactor = Sum(1,n)(Pr[i]) / Sum(1,n)(Ls[i]),值域 [0, +∞),基准线是 1,>1 才可能盈利。没有亏损交易时它趋近无穷,全亏则为 0。 最大回撤取净值相邻高低点的最大落差:MaximumDrawdown = MaxOf( PriceExtremum[i+1]- PriceExtremum[i] )。同终利下挑回撤小的。恢复因子把它和总利绑在一起:RecoveryFactor = TotalProfit/ MaximumDrawdown,数值越高越能扛马丁加仓。 获利交易百分比 WinPercent= (100*NProfit)/(NProfit + NLoss),只有当平均盈笔≈平均亏笔时才管用;个人经验 60% 以上对手动系统心理负担更小,但它不揭示利润因子。绝对回撤 = 起始余额 - 测试段最低余额,别拿它当防爆仓底仓依据,那是错觉。相对回撤 = 100*AbsoluteDrawdown/EndProfit,百分比越小越好,但信息量也有限。
M_Points=( Sum(class="num">1,n)(PrPoints[i]) - Sum(class="num">1,n)(LsPoints[i]) )/n M=( Sum(class="num">1,n)(Pr[i]) - Sum(class="num">1,n)(Ls[i]) )/n PrFactor = Sum(class="num">1,n)(Pr[i]) / Sum(class="num">1,n)(Ls[i]) MaximumDrawdown = MaxOf( PriceExtremum[i+class="num">1]- PriceExtremum[i] ) RecoveryFactor = TotalProfit/ MaximumDrawdown WinPercent= (class="num">100*NProfit)/(NProfit + NLoss) AbsoluteDrawdown = StartBalance - MinimumBalance class="num">100*AbsoluteDrawdown/EndProfit