So, we need to calculate for each symbol its dailyATR and a lotSizeMultiplier. (I do this with a struct for clarity, but you can do this you own way).
Let's say, you have an array of symbols. This array is populated with all the symbols that the EA is managing.
Code: Select all
struct SYMBOL {
string name;
double pipFactor;
double dailyATR;
double lotSizeMultiplier;
};
SYMBOL mySymbols[];In the OnTimer() event handler, you would put a call to updateSymbols(), with updateSymbols defined as:
Code: Select all
void updateSymbols (SYMBOL &symbols[]) {
int numATR = 0;
double totalATRProfit = 0.0;
for (int iSymbol=0; iSymbol < ArraySize(symbols); iSymbol++) {
symbols[iSymbol].dailyATR = iATR( symbols[iSymbol].name, PERIOD_D1, atrPeriod, 1 );
if ( symbols[iSymbol].dailyATR > 0.0 ) { // Only add to totalATRProfit if dailyATR > 0.0
totalATRProfit += symbols[iSymbol].dailyATR * symbols[iSymbol].pipFactor * MarketInfo( symbols[iSymbol].name, MODE_TICKVALUE );
numATR++;
}
}
if ( numATR > 0 ) {
double averageATR = totalATRProfit / numATR;
for (int iSymbol = 0; iSymbol < ArraySize(symbols); iSymbol++) {
if ( symbols[iSymbol].dailyATR > 0.0 )
symbols[iSymbol].lotSizeMultiplier = averageATR / ( symbols[iSymbol].dailyATR * symbols[iSymbol].pipFactor * MarketInfo( symbols[iSymbol].name, MODE_TICKVALUE ) );
else
symbols[iSymbol].lotSizeMultiplier = 1.0;
}
}
}Once we have this lotSizeMultiplier for each symbol, a trade would typically be opened with:
Code: Select all
void openTrade( SYMBOL &symbol ) {
double lotSize = LotSize * symbol.lotSizeMultiplier;
if ( lotSize < MarketInfo( symbol.name, MODE_MINLOT ) ) {
lotSize = MarketInfo( symbol.name, MODE_MINLOT );
}
else {
lotSize = MathFloor( lotSize / MarketInfo(symbol.name, MODE_LOTSTEP) ) * MarketInfo(symbol.name, MODE_LOTSTEP);
}
}Hope that this gives a general idea.