8.14 加倍赌注(Martingale)
加倍赌注是一种赌博方式,经常用于赌轮盘和21点,在连续不断的输局后将赌注加倍。这个理论是赢一把即可使结余回到损益平衡的状态。其缺点是需有大量的资金,以经得起损失的打击。
例如,若开始是0.1手,经过连续四次的输局后,你开仓1.6手——原始手数的16倍。经过连续7次输局后,你的开仓手数将是12.8手——原始手数的128倍。但是,这种方法会在长期连续的输局后使得你血本无归。
然而,投资者希望有这样一个系统:既可以在连续的贏局或输局中增加开仓手数,而且还不会对账户造成巨大损失。最简单的方法是:在增加开仓手数时设置一个最高限度。你可以在Strategy Tester窗口中的Report表下检验最大连续损失数以决定这个数字。当然,投资者必须明了,一个健全的交易系统不应有超过3次或4次以上的连续损失。
典型的加倍赌注策略是:在每次连续损失后加倍手数。
另一种方法是:用较小的倍数来增加开仓手数,这时可用小于2的倍数。也有所谓的反加倍赌注策略,就是当你连续贏的时候增加开仓手数。
我们来检验一个程序,先计算连续赢或输的次数,再据以增加开仓手数。在每次开仓时加倍赌注策略表现最好。现在我们假设每个部位由单一交易所组成。
使用者将在加倍赌注(输局)或反加倍赌注(贏局)策略做出选择,并设定限制最大连续开仓手数的次数,而开仓倍数可作调整。
首先,我们计算连续赢或输的次数。我们需要在订单历史数据库中进行回测,从最近平仓单开始。我们设置每次的贏或输递增计数器。只要连续的赢或输模式保持着,我们就将持续回测循环运算。一旦模拟回测失败(在一次或多次输局后出现一次贏局;反之亦然),则跳出循环。


首先了解贏和输计数器的变量。在for操作数内,我们使用OrderHistoryTotal()以建立初始的开始位置。OrderHistoryTotal()回传了在过往历史的订单数量。我们将其减1以决定最近订单的指数位置,并储存于Count变量中。
注意:我们省略了在for循环中的第二个表达式,该表达式用以决定停止循环的条件。对于任何省略的表达式都需有分号。我们在每一次循环运算中递减Count变量。
我们使用MODE_HISTORY作为OrderSelect()函数中的第三个自变量,以说明我们是在封闭的订单历史堆中执行循环。一般默认OrderSelect()使用开放订单堆,所以当我们检查封闭订单堆时必须明确定义MODE_HISTORY。
检查并确认目前选择的订单与我们指定的黄金商品的K线图和自定义数字是否相符。然后,使用OrderProfit()函数检査订单利润。若回传值意指有利润(也就是大于“0”),我们则递增WinCount变量;若是有损失,我们则递增LossCount。
因为我们所寻找的是连续的赢或输,所以我们必须在反向情况发生时立刻中止循环。要做到这一点,在检查订单利润时,我们要检查WinCount或LossCount变量。例如,假设我们有两个连续输局——意指LossCount=2,当下一个订单为贏局时,则两个if语法都为假,而控制将会传送到break操作数以终止循环。
这个方法的优点是:很稳健,且当EA意外拓机时不会因此而失败,EA将会在其离开的地方重新回复。当然,这意味着,当你首次启动EA时,它将使用前一次贏/输的连续值来决定手数。虽然如此,但瑕不掩瑜。
WinCount或LossCount变量将保有连续贏局或输局的次数。若我们想用加倍赌注策略,应使用LossCount变量来决定增加手数的大小;若我们用反加倍赌注策略,则使用WinCount变量。
我们将使用一个外部整数变量MartingaleType来决定使用什么变量。若MartingaleType设定为“0”,我们将使用加倍赌注策略;若其设定为“1”,我们将使用反加倍赌注策略。我们也将执行开仓倍数(LotMultiplier)、增加开仓手数的最大次数(MaxMartingale)和起始手数数量(BeseLotSize)等外部变量。

若连续订单数大于MaxMartingale,我们将重设其大小至MaxMartingale(若你喜欢,重设至预设手数也是可以的)。手数将保持这个值,直到赢或输局结束(订单的连续输或贏)。
手数由BaseLotSize和LotMultiplier相乘而得,LotMultiplier的值则以ConsecutiveCount指数增加,两者相乘而得。MathPow()函数提升一个值到一个特定的次方数。第一个自变量是基数,第二个自变量是幂数。例如,若我们的开始手数是0.1,手数倍数是2,而我们有4个连续订单,则方程式是0.1*24即1.6。
调整LotMultiplier,以及使用加倍赌注和反加倍赌注策略,可提供足够的选择来使用指数型手数。可通过简单修改程序代码来使用其他变量。例如,可以反向界定手数的大小,从最大到最小;或用外部计数器来取代ConsecutiveCount。