2.5 计算停损价格和停利价格

2.5 计算停损价格和停利价格


有几种计算止损和停利价格的方法。最常用的方法是指定数量的点数,从成交价格来决定你的预平仓价位。例如,如果我们设50 点的止损,则意味着止损价格将高于或低于开单价格50 点左右。我们也可以使用一个指标值,如外部的参数或其他类型的价格计算。

2.5.1 计算获利点和停损点

对于计算获利点和停损点最常用的方法是用一个外部的变量,就是用户指定的价位来进行,也就是你愿意承受的损失或者是获利。关于买进市价单,开仓价即是市场卖价(ASK) ,卖出市价单开仓价则是市场买进价( BID) 。在止损和限价之前,我们有效地确认开仓价格,这个价格不包含市价。将适当的预期获利或停损点计算于开盘价内。

这里有我们预先设定的停损或停利变量:

在这个例子中设了止损50 点, 100点停利。在之前你可能已经看到这在EA中有类似的设定。要计算止损,我们需要在我们的开仓价格上加上或减去50 点。首先,我们需要转换这50 点为分数,我们将使用它来加或减去开盘价。像是日元对50 个点等于0.50 。而对于所有其他的货币对,是0.0050 。将整数转换为相应的分数值,我们需要增加我们的外部止损点的变量。

2.5.2 最小报价点

根据MQL 预定义变量,点是交易货币报价最小位数。对于小数点后有4 位的货币对,点为0.0001 。日元对是0.01 。

现在来计算买进市价单。设定市场卖出价为开仓价。在此检查看到, StopLoss设置为大于零。如此将止损乘上点,然后减去开盘价。结果将被存储在变量BuyStopLoss中。

如果止损不大于零, BuyStopLoss 初始化为值"0" ,并且没有止损设定。假设点等于0.0001 ,如果开仓价格是1.4500和50 的停损点,那么多单的止损价格将是1.4500-(0.0050) = 1.4450 。券商当中有不少公司提供小数点后第五位的报价,随着竞争变得更为激烈,小数点差报价可将各个较热门货币对的买卖差价进一步收窄一一鉴于市况近期波动不定,这对交易者来说的确是交易优势。日元对保留3 位小数,其他货币对保留5 位小数。如果经纪商使用该报价模式报价,在上面的例子中一点等于0.00001 。

如果以一点为0.00001 来计算上面的例子,止损点从开仓价计算,为上下点5 ,而不是50 点,这带来了一个问题:为了得到正确的值,我们必须增加一个零到我们所设定的数值中,即止损=500 。

我们不需要投资者在总报价中每次都增加一个额外的零到止损和停利设定中,所以我们使用一个函数,该函数将总是返回0.01 或0.0001 ,不管是否使用经纪商报价分数点。我们称这个函数为PipPoint ,因为其回传点价总是等于一个点的点值。

字符串参数的货币对符号,我们要检索基点。MarketInfo ( )函数的MODE_DIGITS 参数中回传该对数的小数字(数字)。把if-else 语句放置CalcPoint 变量至合适的基点值,并取决于小数位数。下面是使用此功能的例子。绝大多数的时间你都会使用当前图表对,所以我们将以Symbol( )函数作为参数。这将回传当前图表的点。

我们将使用此功能来找到这本书的剩余的单点子的点值。正如我们证明的,当我们进行单点计算时,并在经纪商进行小数点后5 位数报价时, Point 变量不能正常工作。我们不能永远假设EA 只适用于2 位和4 位报价,所以它必须使用PipPoint自动确认单点的点值。

2.5.3 清点和报价点

现在我们来创建一个函数,可以用它来适当调整滑点参数。如同本章前面提到的经纪商分数报价,滑点参数的Ordersend ( )函数需要增加10 的因子得到正确的滑点值。以下功能是利用外部滑点参数自动设定滑点变量的数值:

我们透过的货币代码和外部滑点变量作为参数。如果货币使用2 位数或4 位数的报价,我们使用的不变的SlippagePips 参数当我们的滑点设定。如果货币使用3 位数或5 位数的报价,我们将SlippagePips 乘以10 。如何使用OrderSend ( )的范例如下:

在上述例子中,滑点为5 点,滑点变量将根据货币报价的基础自动调整。

2.5.4 清点和报价点用于总体( 全局)变量(Global Variables)

使用函数返回滑点的缺点是: 需要额外输入函数参数。我们创建适当的报价点和滑点值作为当前货币的全局变量,并随时需要引用这些值。这些数值在程序执行过程中不会改变,并在init ( )函数中计算这些数值。我们假设外部变量滑点已存在:

现在我们将这些数值用于UsePoint 和UseSlippage 。上面的代码假设你的EA只用一种货币的订单。上述情况占多数,但如果要创建EA 并有多种货币组合(或当前图表以外的货币) ,则每次都要使用PipPoint( )和GetSlippag( ) 函数计算这些值。

2.5.5 Marketlnfo( ) 市场信息函数

使用MarketkeInfo( )函数可以检索到上述点值和货币报价。MarketkeInfo( )函数有许多用途,你会用它来获取在你的程序中必要的价格讯息。这里的MarketkeInfo( )数的语法为:

符号参数是要检索信息的货币代号。Symbol( )函数可以用于目前图表。对于其他符号,你需要指定货币代号,如ERU/JPY。 RequestType 是一个整数常数,代表这个程序所传达的你需要的讯息。这里有列表中最有用的Marketlnfo ( )常数。可以在MQL 参考完整列表, 根据标准常数一一Marketinfo 。

● MODE_POINT一一点值。例如, 0.01 或0.00001 。

● MODE_DIGITS一一数字中的小数字的价格。将是2 或3 用于日元对, 4或5 可用于其他货币对。

● MODE 价差一一目前点差。例如:3 点(对于以5 位数报价的经纪商来说为30 点) 。

● MODE_STOPLEVEL一一停止水平。例如:3 点(对于以5 位数报价的经纪商来说为30 点) 。

这些参数检查时,一般都用在其他货币价格,或是除了当前货币对图表之其他讯息:

● MODE_BID一一选定的商品符号的当时买入价。

● MODE_ASK一一选定的商品符号的当时卖出价。

● MODE LOW一一目前工具栏中选定商品的低价。

● MODE_HIGH一一目前工具栏中选定商品的高价。

2.5.6 计算停损价格

现在,我们已经确定了正确的点值,接着我们来计算止损价位。对于买进多单,止损价要低于开仓价,而空单方面则是相反。以下是多单止损的计算,并变量UsePoint。需要注意变量OpenPrice:

这里计算的是空单,我们已经设定买入价来进行开仓,并且只是增加而不是减少:

关于挂单,止损点将被计算于相对的挂单价格。在这种情况下,使用该变量的OpenPrice 来存储挂单价格,而不是目前的市场价格。这与上述的逻辑算法范例是相同的。

2.5.7 计算停利价格

计算停利的价格与计算停损点类似,但我们会使用相反的方法来计算。下多单,获利点将高于开仓价;如果是空单的情况,获利的价格将低于开仓价。我们假设已设定适当的OpenPrice:

2.5.8 停损方法的选择

还有其他方法可以用来确定止损价和停利价。例如,可以使用最近价格的高点或低点,或技术指标来确定。假设我们让停损点设低于2 点于当前价格K 棒价格。使用预定义的价格数组Low[ ]来检索。Low[0]是低于当前K 棒,Low[1] 是低于前个K 棒,依此类推。一旦我们确定了当前K 棒低点,就可以用UsePoint 乘以2来得到一个十进制值,并减去低点:

因此, K 棒低点为1.4760 ,则止损价位设在1.4758 。

或许我们想要将止损放在K 棒最后的低点(可设为X)。MetaTrader 本身对此有函数设定。iLowest ( )可显示指定时间范围中K 棒的最低值。我们可以使用最高价、最低价、开盘价或收盘价。下面是如何使用证ρwest( )从最近的10 个K 棒中找到的最低价的例子:

第一个参数iLowest( )是货币代码NULL ,意味着我们使用的是当前商品。在MQL 功能中使用的字符串常数NULL ,是指当前商品图表。

第二个参数是的图表周期, "0" 是指到目前的图表。

CountBars 是我们要在10 个K 棒中搜索的数字。最后一个参数是我们的起始位置。"0" 是当前K 棒。要找寻上一个K 棒,则从当前K 棒开始往后数, "1" 为当前K 棒之前的K 棒, "2" 为再前一个K 棒,以此类推。

iLowest ( )函数输出是一个整数,该价格为过去K 棒显示的一系列低价中的最低价。在上面的范例中,如果iLowest ( )返回6 ,这意味着最低价出现在过去第六根K 棒。我们将该值存在LowestShift 变量中。若要查找实际最低价格,我们只需检索[ LowestShift ]或换句话说,就是Low[6] 的值。

如果你想运用此方法来计算空单的止损价,与iHighest ( )函数的工作方式相同。引用到上面的范例中,你可使用MODE_HIGH 数组参数。

以下是使用技术指标来找出停损点。现在让我们使用移动平均线来找出停损点。用变量移动平均线表示当前K 棒的移动平均值,我们要做的就是用当前移动平均值来计算止损点:

如果移动平均线目前是1.6894 ,这将是我们的止损点。这些都只是确定止损价或停利价的常用方法。你可以用自己的技术分析或从市场得到的讯息来判断,改进并发展其他方法。