3.2 修改挂单价
OrderModify ( )也可用来修改挂单价。如点到挂单价并入单,就不再是挂单了,且价格无法变更。
我们会以变量NewPendingPrice 表示变更后的交易价。我们会假设价格已计算过且为有效。修改挂单价的方式如下:

一如往常,我们用OrderSelect ( )获取交易单信息。如此就能把固定的停损与获利价传送至OrderModify ( )功能。修改交易单之前,我们会进行检查,以确保新的挂单价不同于目前的挂单价。
对于OrderModify ( ) ,我们指定交易单票,新的交易单储存于NewPendingPrice ,以OrderStopLoss ( )和OrderTakeProfit ( )代表固定的停损值与获利值。此单不使用到期时间,故以"0" 作为到期参数。
3.2.1 验证停损价与挂单价
停损、获利及挂单价和买卖价之间须有最低间距。如停损或挂单价太接近目前的市价,会出现错误而不入单。此为最常见的交易错误之一,交易员如保留足够的间距,谨慎地设好停损与挂单价,就可轻易避免。
然而,在汇价迅速变动期间,扩大价差可能会让有效的停损价变成无效。虽然经纪商各有不同的停损价位,但各经纪商提供的有效停损价,对投资者来说可能太接近了。有些系统会根据指标值来设停损价与挂单价,这些指标值可能是高、低点或其他不保证最低间距的计算方法。
由于这些原因,投资者务必验证停损价、获利价或挂单价确为有效,且未太接近目前的市场价。此部分可透过检查货币的停损价位来验证。
3.2.2 停损( 利)价值
停损(利)价位是指距离目前卖价或买价的点数,下任何停损单与挂单都一定会有卖价或买价。对于多数的经纪商,停损价位约为3-4 点。ECN 经纪商通常会设很近的停损(利)价位,其他像Alpari 的经纪商则有较远的停损价位(至少8点) 。
图3-1 是一停损(利)关系图。要把汇价想成粗体线,其宽度是价差,别把汇价想成单一数值(例如卖价)。汇价粗体线的两侧是界线,以停损(利)价位表示。所有停损、获利及挂单都必须落在界外。

有MODE_STOPLEVEL 参数的MarkeInfo ( )功能,是用来获取货币符号的停损价位的。停损价位以整数表示,且需要以Point转换成小数值。
对于有3 点停损(利)价位的4 位数货币,有MODE_STOPLEVEL 的MarkeInfo( )功能会返回3 。对于有3 点停损价位的5 位数货币,由于额外的小数字, MarkeInfo( )功能会返回到。获取停损价位并将其转换成十进制的代码如下:

请注意:我们使用的是预定义的Point 变量,而非之前建立的PipPoint( )功能。这是因为需要将停损价位乘以实际点值。4 位数货币的Point 为0.0001 ,而5 位数货币的Point 为0.00001 。若停损价位如上所示为3 点,则小数值是0.0003 。
我们已经知道如何找停损(利)价位,现在我们需要计算停损价、获利价及挂单价的最大值和最小值。可用目前的交易价加减停损价来完成。
以此代码计算所允许的最低获利买价、停损(利)卖价、停损(利)买价,或限价卖价。我们会使用前面计算过的StopLevel (停损价位) 。

我们的卖价若是1.4650,则如之前所计算的StopLevel (停损价位)是0.0003点,而最低停损价就是1.4653。 如以此单作为获利买单,买价就一定高于此价,我们称此为UpperStopLevel (停损价位上限) 。
以此代码计算所允许的最高获利卖价、停损(利)买价、停损(利)卖价,或限价卖价。请注意:我们用的是Bid( 买价),而非Ask( 卖价) ;是减去,而非加上。

我们称此为LowerStopLevel (停损/利价位下限) 。下单前,请用UpperStopLevel和LowerStopLevel 值验证停损价、获利价及挂单价。请记住: 汇价瞬息万变,你会希望实际的停损价、获利价及挂单价远超过这些价位。
3.2.3 验证停损与获利价
最低获利点等于入单价加/减停损价。如停损价为3 点,而入单价是1.4500,则获利买价须为1.4503 以上。然而,市价单的最低停损价会包括目前的价差,因此最低停损价会大于最低获利价。例如,停损价位若为3 点,价差为2 点,而入单价是1.4500,则市价停损买单须低于1.4495 。这并不适用于挂单交易,验证挂单停损时无须找出价差。因此,如在1.4500挂单,停损价位为3 点,则停损价可设1.4497 以下。
以下是检查买单的停损价与获利价,以确保价格有效的例子。停损价或获利价若无效,会自动调整至距离停损价位数点之外。

变量MinStop 为停损价加/减5 点,以确保验证过的价格不会因滑价而无效。你可调整此值以执行足够的最低停损/获利价位,甚至可用外部变数调整此值。
程序的第二行比较停损与LowerStopLevel (停损价位下限)。若停损大于最低停损价位,就代表停损无效。在此情况下,我们会把停损调至比停损价位低数点。程序的第三行对获利价进行同样的处理。
要检查卖单的停损价与获利价,只要反向计算即可:

你也可以显示错误讯息并停止执行程序,而不用自动调整无效价格。如此一来,使用者就得重设停损价或获利价才可继续操作。这里有如何进行此项操作的例子:

计算出的停损若因高于停损价位而过于接近汇价, Alert( )功能将会弹出讯息给用户。return 操作员会退出目前功能,并保证不会执行此单。在本书中,我们会假设下更正过的交易单比完全不下单好,而自动调整无效的价格。有此情况时,打印讯息至日志档案可能会很有用:

3.2.4 验证挂单价
这里说明如何验证挂单交易的停损买单或限价卖单。PendingPrice 变量会储存我们的挂单价:

请注意: 这里的逻辑与上述检查获利买价和停损卖价的代码相同。检查挂单的停损卖单或限价买单的代码为:
