存成 MQL5/Scripts/Lesson15MTF.mq5。它從任何一張圖表讀出 D1 的 EMA200 與 H1 的 EMA50 並印出環境——注意它用 shift 1 來避免重繪。
//+------------------------------------------------------------------+
//| Lesson 15 - Multi-timeframe regime filter |
//+------------------------------------------------------------------+
#property copyright "Strategist Academy"
#property version "1.00"
void OnStart()
{
string sym = _Symbol;
int maD1 = iMA(sym, PERIOD_D1, 200, 0, MODE_EMA, PRICE_CLOSE);
int maH1 = iMA(sym, PERIOD_H1, 50, 0, MODE_EMA, PRICE_CLOSE);
int maH4 = iMA(sym, PERIOD_H4, 50, 0, MODE_EMA, PRICE_CLOSE);
if(maD1 == INVALID_HANDLE || maH1 == INVALID_HANDLE || maH4 == INVALID_HANDLE)
{
Print("Handle creation failed. Error: ", GetLastError());
return;
}
double d1[], h1[], h4[];
ArraySetAsSeries(d1, true);
ArraySetAsSeries(h1, true);
ArraySetAsSeries(h4, true);
// Ask for 3 bars so index 1 (last CLOSED bar) is always available.
bool okD1 = (CopyBuffer(maD1, 0, 0, 3, d1) >= 3);
bool okH1 = (CopyBuffer(maH1, 0, 0, 3, h1) >= 3);
bool okH4 = (CopyBuffer(maH4, 0, 0, 3, h4) >= 3);
if(!okD1 || !okH1 || !okH4)
{
Print("Not enough higher-timeframe data yet. Error: ", GetLastError());
IndicatorRelease(maD1); IndicatorRelease(maH1); IndicatorRelease(maH4);
return;
}
double price = SymbolInfoDouble(sym, SYMBOL_BID);
Print("=== Multi-timeframe view of ", sym, " ===");
Print("Current chart timeframe: ", EnumToString((ENUM_TIMEFRAMES)_Period));
Print("Bid: ", DoubleToString(price, _Digits));
Print("D1 EMA200: ", DoubleToString(d1[1], _Digits));
Print("H4 EMA50: ", DoubleToString(h4[1], _Digits));
Print("H1 EMA50: ", DoubleToString(h1[1], _Digits));
Print("");
Print("Daily regime: ", (price > d1[1]) ? "ABOVE the daily trend - longs only"
: "BELOW the daily trend - shorts only");
Print("H4 alignment: ", (price > h4[1]) ? "above" : "below");
Print("H1 alignment: ", (price > h1[1]) ? "above" : "below");
Print("");
Print("Note: all values use shift 1 (last CLOSED bar). Shift 0 is still");
Print("forming and would make this repaint - the backtest would look better");
Print("than the live result, every time.");
// Raw bars from another timeframe, for reference.
MqlRates dailyBars[];
ArraySetAsSeries(dailyBars, true);
if(CopyRates(sym, PERIOD_D1, 0, 5, dailyBars) == 5)
{
Print("");
Print("Last 5 completed daily bars:");
for(int i = 1; i < 5; i++)
Print(" ", TimeToString(dailyBars[i].time, TIME_DATE),
" O=", DoubleToString(dailyBars[i].open, _Digits),
" H=", DoubleToString(dailyBars[i].high, _Digits),
" L=", DoubleToString(dailyBars[i].low, _Digits),
" C=", DoubleToString(dailyBars[i].close, _Digits));
}
IndicatorRelease(maD1);
IndicatorRelease(maH1);
IndicatorRelease(maH4);
}