Mistake # 1: You create several indicator handles at each tick! The MQL5 style implies: the indicator handle must be created ONCE and must be done in OnInit!
Example:
Creating an iMA indicator handle, getting indicator values
- 2020.03.05
- www.mql5.com
Mistake # 1: You create several indicator handles at each tick! The MQL5 style implies: the indicator handle must be created ONCE and must be done in OnInit!
Example:
Creating an iMA indicator handle, getting indicator values
It is better to fix errors gradually: the error is found -> you need to fix the error -> you need to show the corrected code
//+------------------------------------------------------------------+ //| ShiftedMA_v1.mq5 | //+------------------------------------------------------------------+ #property copyright "Copyright 2021, Malinda Rasingolla" #property version "1.00" //+------------------------------------------------------------------+ //Indicator inputs input int InpFastPeriods = 12; // Fast MA periods input int InpSlowPeriods = 20; // Slow MA periods input int ADX_Level = 25; // ADX level //SL and TP in pips input input int takeProfit_pips = 400; input int stopLoss_pips = 400; //lotsize input input double InpLots = 0.01; // Trade lot size //Magic number input input int InpMagicNumber = 212122; // Magic Number //indicator handles int HandleFast ; int HandleSlow ; int HandleADX ; #include <Trade/Trade.mqh> CTrade Trade; CPositionInfo PositionInfo; int OnInit() { HandleFast = iMA(Symbol(), Period(), InpFastPeriods,0, MODE_EMA, PRICE_CLOSE); if (HandleFast ==INVALID_HANDLE) return(INIT_FAILED); HandleSlow = iMA(Symbol(), Period(), InpSlowPeriods,0, MODE_EMA, PRICE_CLOSE); if (HandleSlow ==INVALID_HANDLE) return(INIT_FAILED); HandleADX = iADX(Symbol(), Period(),14); if (HandleADX ==INVALID_HANDLE) return(INIT_FAILED); return(INIT_SUCCEEDED); } void OnTick() { // Just exit if trading is not allowed if (!(bool)AccountInfoInteger(ACCOUNT_TRADE_ALLOWED)) return; // Once per bar if (!NewBar()) return; // Also exit if there is already a trade open if (TradeCount() > 6) return; //Initializing Indicators double fastMaArray[]; double slowMaArray[]; double ADXArray[]; ArraySetAsSeries(fastMaArray, true); ArraySetAsSeries(slowMaArray, true); ArraySetAsSeries(ADXArray , true); CopyBuffer(HandleFast, 0, 0, 3, fastMaArray); CopyBuffer(HandleSlow, 0, 0, 3, slowMaArray); CopyBuffer(HandleADX, 0, 0, 1, ADXArray); double fastMa = fastMaArray[0]; double fastMaShift = fastMaArray[2]; double slowMa = slowMaArray[0]; double slowMaShift = slowMaArray[2]; double ADX = ADXArray[0]; //Signals double Ask = SymbolInfoDouble(Symbol(), SYMBOL_ASK); double Bid = SymbolInfoDouble(Symbol(), SYMBOL_BID); string signal = ""; if((fastMa-fastMaShift)>0 && (slowMa-slowMaShift)>0 && ADX>ADX_Level) { signal = "buy"; Comment("Signal : Buy\nTrade count : ",(TradeCount()+2)); } if((fastMa-fastMaShift)<0 && (slowMa-slowMaShift)<0 && ADX>ADX_Level) { signal = "sell"; Comment("Signal : Sell\nTrade count : ",(TradeCount()+2)); } //Executing Orders double tpPrice; double slPrice; double openPrice; if(signal == "buy") { openPrice = SymbolInfoDouble(Symbol(), SYMBOL_ASK); tpPrice = openPrice + takeProfit_pips*_Point; slPrice = openPrice - stopLoss_pips*_Point; Trade.Buy(InpLots,Symbol(),openPrice,slPrice,tpPrice,NULL); } if(signal == "sell") { openPrice = SymbolInfoDouble(Symbol(), SYMBOL_BID); tpPrice = openPrice - takeProfit_pips*_Point; slPrice = openPrice + stopLoss_pips*_Point; Trade.Sell(InpLots,Symbol(),openPrice,slPrice,tpPrice,NULL); } } //+------------------------------------------------------------------+ bool NewBar() { datetime now = iTime(Symbol(), Period(), 0); static datetime prevTime = now; if (prevTime==now) return(false); prevTime = now; return(true); } int TradeCount() { int tradeCount = 0; for(int i=PositionsTotal()-1; i>0; i--) { string symbol = PositionGetSymbol(i); if(Symbol()==symbol) { tradeCount += 1; } } return(tradeCount); }
In this case, input parameters are needed:
input group "Time control" input bool InpTimeControl = true; // Use time control input uchar InpStartHour = 10; // Start Hour input uchar InpStartMinute = 01; // Start Minute input uchar InpEndHour = 15; // End Hour input uchar InpEndMinute = 02; // End Minute
need a check function:
//+------------------------------------------------------------------+ //| TimeControl | //+------------------------------------------------------------------+ bool TimeControlHourMinute(void) { if(!InpTimeControl) return(true); MqlDateTime STimeCurrent; datetime time_current=TimeCurrent(); if(time_current==D'1970.01.01 00:00') return(false); TimeToStruct(time_current,STimeCurrent); if((InpStartHour*60*60+InpStartMinute*60)<(InpEndHour*60*60+InpEndMinute*60)) // intraday time interval { /* Example: input uchar InpStartHour = 5; // Start hour input uchar InpEndHour = 10; // End hour 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 _ _ _ _ _ + + + + + _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ + + + + + _ _ _ _ _ _ */ if((STimeCurrent.hour*60*60+STimeCurrent.min*60>=InpStartHour*60*60+InpStartMinute*60) && (STimeCurrent.hour*60*60+STimeCurrent.min*60<InpEndHour*60*60+InpEndMinute*60)) return(true); } else if((InpStartHour*60*60+InpStartMinute*60)>(InpEndHour*60*60+InpEndMinute*60)) // time interval with the transition in a day { /* Example: input uchar InpStartHour = 10; // Start hour input uchar InpEndHour = 5; // End hour 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 _ _ _ _ _ _ _ _ _ _ + + + + + + + + + + + + + + + + + + + _ _ _ _ _ + + + + + + */ if(STimeCurrent.hour*60*60+STimeCurrent.min*60>=InpStartHour*60*60+InpStartMinute*60 || STimeCurrent.hour*60*60+STimeCurrent.min*60<InpEndHour*60*60+InpEndMinute*60) return(true); } else return(false); //--- return(false); }
Usage example:
*** if(!TimeControlHourMinute()) return(true); ***
Hello,
I am new to coding mql5. And I have been coding a scalping EA. Now I need to code it to trade between a time range and two time periods should be as inputs to optimise it afterwards. I need a help with this issue. My code is down below.
Thank you.
There's no need of your code to post an example:
//+--- Parameters ---! input int StartHour = 9; input int StopHour = 18; //+--- HourFilter ---! MqlDateTime time;TimeCurrent(time); bool Filter=(StartHour<StopHour&&(time.hour>=StartHour&&time.hour<StopHour))||(StartHour>StopHour&&(time.hour>=StartHour||time.hour<StopHour));
From my point this is the simpler way to filter by hour, notice that StartHour could be after than StopHour. Filter condition must be true.
- Free trading apps
- Over 8,000 signals for copying
- Economic news for exploring financial markets
You agree to website policy and terms of use
Hello,
I am new to coding mql5. And I have been coding a scalping EA. Now I need to code it to trade between a time range and two time periods should be as inputs to optimise it afterwards. I need a help with this issue. My code is down below.
Thank you.