#property copyright "Copyright 2022, MetaQuotes Ltd." #property link "https://www.mql5.com" #property version "1.00" datetime New_Time[1]; //+------------------------------------------------------------------+ //| Expert tick function | //+------------------------------------------------------------------+ void OnInit() { ObjectsDeleteAll(0, 0, -1); } //+------------------------------------------------------------------+ //| Expert tick function | //+------------------------------------------------------------------+ void OnTick() { // --------- check new period ------- // bool IsNewBar = false; IsNewBar = ChkNewBar(IsNewBar); //--- EA should only check for new trade if we have a new bar if(IsNewBar == false) { return; } // ---------------------------------- // // define Ask, Bid double Ask = NormalizeDouble(SymbolInfoDouble(_Symbol,SYMBOL_ASK), _Digits); double Bid = NormalizeDouble(SymbolInfoDouble(_Symbol,SYMBOL_BID), _Digits); // create an array for several prices double MiddleBandArray[]; double UpperBandArray[]; double LowerBandArray[]; // sort the price array from the current candle downwards ArraySetAsSeries(MiddleBandArray, true); ArraySetAsSeries(UpperBandArray, true); ArraySetAsSeries(LowerBandArray, true); // define Bollinger Bands int BollingerBands = iBands(_Symbol, _Period, 20, 0, 2, PRICE_CLOSE); // copy price info into the array CopyBuffer(BollingerBands, 0, 0, 3, MiddleBandArray); CopyBuffer(BollingerBands, 1, 0, 3, UpperBandArray); CopyBuffer(BollingerBands, 2, 0, 3, LowerBandArray); // calculate EA for the current candle double MiddleBandValue = MiddleBandArray[0]; double UpperBandValue = UpperBandArray[0]; double LowerBandValue = LowerBandArray[0]; // giving buy signal when price > MA if(Ask >= MiddleBandValue && Ask < UpperBandValue) { Comment("BUY...."); DrawVLine("BUY", Ask); } // check take profit signal if(Bid >= UpperBandValue) { Comment("TAKE PROFIT...."); DrawVLine("TP", Ask); } // check if we have no signal if(Ask < MiddleBandValue) { Comment("NO SIGNAL...."); } } //+------------------------------------------------------------------+ void DrawVLine(string action, double ask) { // delete last object bool ok = ObjectDelete(ChartID(), "Line"); int ok2 = ObjectFind(ChartID(), "Line"); // create object line ok = ObjectCreate(ChartID(), "Line", OBJ_VLINE, 0, TimeCurrent(), 0); ok2 = ObjectFind(ChartID(), "Line"); if(action == "BUY") { // set object color ok = ObjectSetInteger(0, "Line", OBJPROP_COLOR, clrGreen); ok2 = ObjectFind(0, "Line"); } if(action == "TP") { // set object color ok = ObjectSetInteger(0, "Line", OBJPROP_COLOR, clrRed); ok2 = ObjectFind(0, "Line"); } // set object width ok = ObjectSetInteger(0, "Line", OBJPROP_WIDTH, 1); ok = ObjectSetInteger(0, "Line", OBJPROP_STYLE, STYLE_SOLID); ok2 = ObjectFind(0, "Line"); } //+------------------------------------------------------------------+ //| ChkNewBar | //+------------------------------------------------------------------+ bool ChkNewBar(bool &IsNewBar) { static datetime Old_Time; // copying the last bar time to the element New_Time[0] int copied=CopyTime(_Symbol,_Period,0,1,New_Time); if(copied>0) // ok, the data has been copied successfully { if(Old_Time!=New_Time[0]) // if old time isn't equal to new bar time { IsNewBar = true; // if it isn't a first call, the new bar has appeared Old_Time=New_Time[0]; // saving bar time } } else { Alert("Error in copying historical times data, error =",GetLastError()); ResetLastError(); } return(IsNewBar); } //+------------------------------------------------------------------+