Exploring dynamic position sizing using Amibroker and the Anti-Martingale Trading system based on reader requests. Dynamic position sizing adapts position size for each trade, enhancing system performance. For example, if a system struggles in Q4 but excels in other quarters, it can automatically decrease position size in Q4 and increase it in Q1, Q2, and Q3. Precise position sizing is critical for trading success.
Exploring the Anti-Martingale System with Dynamic Position Sizing
The Martingale and Anti-Martingale systems, widely recognized in the casino world, find application in trading systems. Martingale involves doubling bets after losses to recoup with one win, while Anti-Martingale increases bets after profits and decreases them on losses. The Anti-Martingale approach assumes that gains from winning trades outweigh losses, making it effective in trending markets. Statistical evidence supports Anti-Martingale’s long-term superiority over Martingale in trading. This system capitalizes on prudent risk management and favorable market trends, making it a valuable strategy for traders.
Amibroker offers dynamic position sizing capabilities, enabling the creation and backtesting of the Anti-Martingale strategy. In Amibroker’s terminology, increasing your position size is referred to as “Scaling in,” while decreasing it is known as “Scaling-Out.” Two special constants, sigScaleIn and sigScaleOut, provide the means to instruct the backtester when to scale in or out.
To adjust the position size, follow these steps:
- Assign sigScaleIn to the BUY/SHORT variable if you wish to scale in (increase the size of) LONG/SHORT positions.
- Assign sigScaleOut to the BUY/SHORT variable if you intend to scale out (decrease the size of) LONG/SHORT positions.
For in-depth learning about AFL coding and creating your trading systems, click here.
AFL Overview
Parameter | Value |
Preferred Timeframe | No Constraint |
Indicators Used | MACD, Signal |
Positions | Long only |
Buy Condition | MACD crosses above the Signal line |
Sell Condition | MACD crosses below the Signal line |
Stop Loss | No fixed Stoploss |
Targets | No fixed target |
Position Size | – Initial Position size (150 fixed) – Increase position size by 150 with every 100 points gain since Buy. – Decrease position size by 75 with every 50 points loss since Buy. |
Initial Equity | 100,000 |
Brokerage | 50 per order |
Margin | 10% |
AFL Code
//------------------------------------------------------
// Formula Name: Anti-Martingale Trading system
// Website: zerobrokerageclub.com
//------------------------------------------------------
_SECTION_BEGIN("Anti Martingale Trading Syatem");
SetTradeDelays( 1, 1, 1, 1 );
SetOption( "InitialEquity", 100000);
SetOption("FuturesMode" ,True);
SetOption("MinShares",1);
SetOption("CommissionMode",2);
SetOption("CommissionAmount",50);
SetOption("AccountMargin",10);
SetOption("RefreshWhenCompleted",True);
SetOption( "AllowPositionShrinking", True );
BuyPrice=Open;
SellPrice=Open;
ShortPrice=Open;
CoverPrice=Open;
//Specify ScaleIn and ScaleOut parameters
ScaleInPoints=100;
ScaleOutPoints=50;
ScaleInSize=150;
ScaleOutSize=75;
//Buy and Sell Condition
Buy = Cross( MACD(), Signal() );
Sell = Cross( Signal(), MACD() );
BuyPrice=ValueWhen(Buy,C);
for( i = 1; i < BarCount; i++ ) { Profit[i]=Close[i]-BuyPrice[i]>=ScaleInPoints;
Loss[i]=Close[i]-BuyPrice[i]<=-ScaleOutPoints;
if(Profit[i]==1)
ScaleInPoints=(Close[i]-BuyPrice[i])+100;
if(Loss[i]==1)
ScaleOutPoints=-(Close[i]-BuyPrice[i])+50;
if(Sell[i])
{
ScaleInPoints=100;
ScaleOutPoints=50;
}
}
InTrade = Flip( Buy, Sell );
DoScaleIn = InTrade AND Profit;
DoScaleOut= InTrade AND Loss;
Buy = Buy + sigScaleIn * DoScaleIn + sigScaleOut * DoScaleOut;
PositionSize = IIf( DoScaleOut,ScaleOutSize, ScaleInSize);
Plot( Close, "Price", colorWhite, styleCandle );
SetPositionSize(PositionSize,spsShares);
PlotShapes(IIf(Cross( MACD(), Signal() ), shapeSquare, shapeNone),colorGreen, 0, L, Offset=-40);
PlotShapes(IIf(Cross( MACD(), Signal() ), shapeSquare, shapeNone),colorLime, 0,L, Offset=-50);
PlotShapes(IIf(Cross( MACD(), Signal() ), shapeUpArrow, shapeNone),colorWhite, 0,L, Offset=-45);
PlotShapes(IIf(Cross( Signal(), MACD() ), shapeSquare, shapeNone),colorRed, 0, H, Offset=40);
PlotShapes(IIf(Cross( Signal(), MACD() ), shapeSquare, shapeNone),colorOrange, 0,H, Offset=50);
PlotShapes(IIf(Cross( Signal(), MACD() ), shapeDownArrow, shapeNone),colorWhite, 0,H, Offset=-45);
PlotShapes(IIf(DoScaleIn, shapeSmallUpTriangle, shapeNone),colorBlue, 0, L, Offset=-45);
PlotShapes(IIf(DoScaleOut, shapeSmallDownTriangle, shapeNone),colorBlue, 0, H, Offset=-45);
_SECTION_END();
AFL Screenshot
The AFL screenshot depicts Buy and Sell signals using up and down arrows, respectively. A blue up triangle represents Scale-In, while a blue down triangle signifies Scale-Out.
Witness how the position gradually increases for profitable trades:
Observe the gradual decrease in position size for loss-making trades:
Backtest Report
Here’s the backtest report for this strategy. Note that the back tester treats trades involving scaling in or out as a SINGLE trade, resulting in a single row in the trade list. The key difference from regular trades is that it calculates average entry and exit prices based on all partial entries and exits, displaying these averages in the respective fields. Commissions are correctly applied to each (partial) entry or exit based on the partial buy/sell size. To delve deeper into the details of scaling, run the backtest in “DETAIL LOG” mode to observe how scaling-in and scaling-out work, along with the calculation of average prices.
Parameter | Value |
NSE Nifty | |
Initial Capital | 100,000 |
Final Capital | 1,752,936.03 |
Backtest Period | 11-Apr-2000 to 23-Feb-2016 |
Timeframe | Daily |
Net Profit % | 1652.94% |
Annual Return % | 19.39% |
Number of Trades | 146 |
Winning Trade % | 43.56% |
Average Holding Period | 14.89 periods |
Max Consecutive Losses | 8 |
Max System % Drawdown | -65.87% |
Max Trade % Drawdown | -85.83% |
You can download the detailed backtest report here.
Please note that even better results can be expected if you allow compounding of your returns.
Equity Curve
Additional Amibroker Settings for Backtesting
To specify the lot size and margin requirement, go to Symbol → Information. The screenshot below shows a lot size of 75 and a margin requirement of 10% for NSE Nifty: