Here's a compact pair-trading EA — notional derived from contract size × price, signals on a rolling z-score:// Statistical Arbitrage — pair: EURUSD / GBPUSD
double NotionalValue(string sym, double lots) {
double contract = SymbolInfoDouble(sym, SYMBOL_TRADE_CONTRACT_SIZE);
double price = SymbolInfoDouble(sym, SYMBOL_BID);
return lots * contract * price; // notional, quote ccy
}
double ZScore(double &spread[], int period) {
double mean = 0, sd = 0;
for (int i = 0; i < period; i++) mean += spread[i];
mean /= period;
for (int i = 0; i < period; i++) sd += MathPow(spread[i] - mean, 2);
sd = MathSqrt(sd / period);
return sd == 0 ? 0 : (spread[0] - mean) / sd;
}
void OnTick() {
double beta = HedgeRatio("EURUSD", "GBPUSD", 200); // rolling OLS
double z = ZScore(spreadSeries, 100);
if (z > 2.0) OpenPair(SELL_A_BUY_B, beta); // spread rich
if (z < -2.0) OpenPair(BUY_A_SELL_B, beta); // spread cheap