//+------------------------------------------------------------------+ //| MOM MACD v3.mq5 | //| Copyright 2023, MetaQuotes Ltd. | //| https://www.mql5.com | //+------------------------------------------------------------------+ #property copyright "Copyright 2023, MetaQuotes Ltd." #property link "https://www.mql5.com" #property version "1.00" #include input int FastPeriod = 14; input int SlowPeriod = 21; int fastHandle; int slowHandle; double fastBuffer[]; double slowBuffer[]; datetime openTimeBuy = 0; datetime openTimeSell = 0; CTrade trade; //+------------------------------------------------------------------+ //| Expert initialization function | //+------------------------------------------------------------------+ int OnInit() { //--- fastHandle = iMA(_Symbol, PERIOD_CURRENT, FastPeriod, 0,MODE_EMA,PRICE_CLOSE); if (fastHandle == INVALID_HANDLE){ Alert("Failed to create fast handle"); return INIT_FAILED; } slowHandle = iMA(_Symbol, PERIOD_CURRENT, SlowPeriod, 0,MODE_EMA,PRICE_CLOSE); if (slowHandle == INVALID_HANDLE){ Alert("Failed to create slow handle"); return INIT_FAILED; } ArraySetAsSeries(fastBuffer, true); ArraySetAsSeries(slowBuffer, true); //--- return(INIT_SUCCEEDED); } //+------------------------------------------------------------------+ //| Expert deinitialization function | //+------------------------------------------------------------------+ void OnDeinit(const int reason) { //--- if(fastHandle != INVALID_HANDLE) { IndicatorRelease(fastHandle);} if(slowHandle != INVALID_HANDLE) { IndicatorRelease(slowHandle);} } //+------------------------------------------------------------------+ //| Expert tick function | //+------------------------------------------------------------------+ void OnTick() { //--- int values = CopyBuffer(fastHandle,0,0,2, fastBuffer); if (values!=2){ Print("Not enough data for FMA"); return; } values = CopyBuffer(slowHandle,0,0,2, slowBuffer); if (values!=2){ Print("Not enough data for SMA"); return; } Comment("fast[0]:", fastBuffer[0],"\n", "fast[1]:", fastBuffer[1],"\n", "slow[0]:", slowBuffer[0],"\n", "slow[1]:", slowBuffer[1]); if(fastBuffer[1]<=slowBuffer[1] && fastBuffer[0]>slowBuffer[0] && openTimeBuy!=iTime(_Symbol,PERIOD_CURRENT,0)){ openTimeBuy = iTime(_Symbol,PERIOD_CURRENT,0); double ask = SymbolInfoDouble(_Symbol, SYMBOL_ASK); trade.PositionOpen(_Symbol,ORDER_TYPE_BUY, 1.0,ask,0,0,"MOM DMAC"); Print("Long Signal generated"); if (!trade.PositionOpen(_Symbol,ORDER_TYPE_BUY, 1.0,ask,0,0,"MOM DMAC Long")) { Print("Error opening position", GetLastError()); } } if(fastBuffer[1]>=slowBuffer[1] && fastBuffer[0]