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 ,而当下一个订单为赢局时,则两个证语法都为假,而控制将会传送到break 操作数以终止循环。
这个方法的优点是: 很稳健,且当EA 意外拓机时不会因此而失败, EA 将会在其离开的地方重新回复。当然,这意味着,当你首次启动EA 时,它将使用前一次励输的连续值来决定手数。虽然如此,但瑕不掩瑜。
WinCount 或LossCount 变量将保有连续赢局或输局的次数。若我们想用加倍赌注策略,使用LossCount 变量以决定增加于数的大小,若我们用反加倍赌注策略,则使用WinCount 变量。
我们将使用一个外部整数变量MartingaleType 来决定使用什么变量。若MartingaleType 设定为"0" ,我们将使用加倍赌注策略;若其设定为" 1 " ,我们将使用反加倍赌注策略。我们也将执行开仓倍数( LotMultiplier) 、增加开仓手数的最大次数( MaxMartingale )和起始手数( BeseLotSize )等外部变量。

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