Skip to content

Instantly share code, notes, and snippets.

@botany02
Created July 30, 2020 07:05
Show Gist options
  • Save botany02/918079794cca1251d4cb81bc4a26a6c5 to your computer and use it in GitHub Desktop.
Save botany02/918079794cca1251d4cb81bc4a26a6c5 to your computer and use it in GitHub Desktop.
Custom Backtester to trade only on first x Symbols
/*
Custom Backtester to Trade only on First x Symbols
Coded by ChokS
https://howutrade.in
The 'MaxOpenPositions' setting is used to limit the number of open positions at any point of time.
Example:
Say you are backtesting 100 symbols and set 'MaxOpenPositions' to 5,
This will limit the number of open positions to 5 at any point of time, but once a position is closed, new signal will be taken,
means trades may be taken for more than 5 symbols
This code will not limit trades, it limits just symbols.
But what if you want to just trade only on the first 5 symbols where the signal is generated.
Below Code will do that,
Reference: https://forum.amibroker.com/
*/
_SECTION_BEGIN("BACKTEST");
MaxSymbols = Param("Max Symbols", 5, 1, 200, 1);
BarDate = DateNum(); //To Check First Bar of the Day
PositionCount = 0; //Used to hold positions count for the current day
PositionList = ""; //Used to hold positions list for the current day
SetCustomBacktestProc("");
if (Status("action") == actionPortfolio) {
bo = GetBacktesterObject();
bo.PreProcess();
for (i = 1; i < BarCount; i++) //Loop through all bars
{
//reset positions count and list on first bar
if (i == 1 OR(BarDate[i] != BarDate[i - 1])) {
PositionCount = 0;
PositionList = "";
}
for (sig = bo.GetFirstSignal(i); sig; sig = bo.GetNextSignal(i)) {
//Apply the logic on EntrySignals
if (sig.IsEntry) {
Sym = "[" + sig.Symbol + "]"; //Get Symbol of the Signal
//We will take the signal on any of the below conditions
//Position Count lesser than Max Symbols we set OR
//The Signal symbol is already present in our Position List
CanTrade = (PositionCount < MaxSymbols OR StrFind(PositionList, Sym) > 0);
if (CanTrade) {
//update running positions
//only once
if (StrFind(PositionList, Sym) < 1) {
PositionCount = PositionCount + 1;
LastList = PositionList;
PositionList = LastList + Sym;
}
} else {
sig.Price = -1; //No Trade
}
}
}
bo.ProcessTradeSignals(i);
}
bo.PostProcess();
}
_SECTION_END();
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment