作为一名交易员,你每天都在和“价格”打交道。但在EA编程的世界里,我们必须以前所未有的精度,去理解价格的本质:买价(Bid)、卖价(Ask)以及它们之间的点差(Spread)。
你可能觉得这很简单,但90%的新手程序员遇到的第一个离奇BUG,都源于搞混了这几个概念。
交易中的“两种价格”与“一个成本”
请记住,任何时候市场上都同时存在两个价格。我们可以用一个生活中的例子来理解:机场的货币兑换处。
- 卖价(Ask):兑换处“卖”给你外币的价格。这个价格总是比较高。
- 买价(Bid):兑换处从你手里“买”回外币的价格。这个价格总是比较低。
- 点差(Spread):这两个价格之间的差额。这是兑换处(也就是你的经纪商)提供服务所赚取的“手续费”。
在图表上,我们通常看到的那条不断跳动的价格线,是买价(Bid)。而卖价(Ask)线通常默认不显示,但它始终真实存在,并且略高于买价线。
EA编程的黄金法则
现在,请把下面这条规则刻在你的脑子里,因为它是所有下单和风控计算的基石:
- 开【买单】(Buy) 或 平【卖单】(Sell)时,成交价格是较高的【卖价(Ask)】。
- 开【卖单】(Sell) 或 平【买单】(Buy)时,成交价格是较低的【买价(Bid)】。
学长避坑指南:价格不匹配导致的错误(Error 130) 一个最经典的错误:你想开一个买单(Buy),于是你基于图表上看到的买价(Bid)去计算你的止损位。比如 止损价 = Bid - 300 * _Point
。你的代码逻辑看起来天衣无缝,但执行OrderSend()
时,却返回了错误代码130 。 为什么?因为【买单】的开仓价是卖价(Ask),而卖价本身就比买价高。你用一个较低的买价去计算止损,导致你的止损位距离真实的开仓价(卖价)过近,甚至在它之上,所以服务器会拒绝这个无效的订单。 正确做法:所有关于【买单】的计算,其基准必须是Ask
;所有关于【卖单】的计算,其基准必须是Bid
。
EA的“四种武器”:订单类型
在MQL4中,我们主要通过四种挂单和一种市价单来执行交易意图。理解它们的区别,就是理解不同交易策略的本质。
① 市价单:
立刻,马上,现在就进场! 这是最直接的订单,以当前市场能提供的最好价格立即成交。 在编程时,OrderSend()
函数里有一个slippage
(滑点)参数。它代表了你愿意为“立即成交”这个确定性,付出多大的“价格不确定性”成本。设置滑点为3,意味着你允许最终的成交价比你下单时看到的价格,差3个点。如果市场波动过大,超出了你的滑点范围,订单就会被拒绝。
挂单:预设埋伏,等待时机
挂单不会立即执行,而是像一个“哨兵”,在未来当价格触及你设定的水平时,再自动以市价单的形式进场。
② 止损挂单:追涨杀跌,顺势而为 这类订单的核心思想是“突破”,你认为价格一旦突破某个关键点,就会沿着那个方向继续前进。
- 买入止损 (Buy Stop):在当前价格之上挂一个买单。用于“向上突破”的场景。你认为价格冲破某个阻力位后会继续大涨,于是你在那个阻力位上方设置埋伏。
- 卖出止损 (Sell Stop):在当前价格之下挂一个卖单。用于“向下破位”的场景。你认为价格跌破某个支撑位后会继续大跌,于是你在那个支撑位下方设置埋伏。
③ 限价挂单:高抛低吸,逆势抄底 这类订单的核心思想是“回调”或“反转”,你期望价格在触及某个水平后会掉头。
- 买入限价 (Buy Limit):在当前价格之下挂一个买单。用于“逢低做多”的场景。你认为当前价格太高,期望它能回调到一个支撑位(你理想的、更便宜的买点),然后再反弹上涨。
- 卖出限价 (Sell Limit):在当前价格之上挂一个卖单。用于“逢高做空”的场景。你认为当前价格太低,期望它能反弹到一个阻力位(你理想的、更贵的卖点),然后再掉头下跌。
④ 订单到期:你可以为所有挂单设置一个“保质期”。如果在到期时间之前,价格都没能触及你的挂单价,那么这个挂单就会被系统自动取消。这是一个很好的风险管理工具,可以避免你的“旧”挂单在几天后完全不同的市场环境中被意外触发。