//+------------------------------------------------------------------+
//|                                            AI Ichimoku Scalper.mq5|
//|                                                           Alfr5d |
//|                                       https://www.49design.co.za |
//+------------------------------------------------------------------+

#property copyright   "Copyright 2023, Alfred Mandala."
#property description "www.billionairebulls.co.za\n"
#property version     "1.6"
#property description "Ichimoku Scalping EA, RSI Integrated, TIMEFRAME = M5\nLOW RISK SETTINGS"

#include <Trade/Trade.mqh>

// ---- INPUTS ----
input group "--- Trading Inputs ---";
input double Lots                    = 0.01;            // Lot Size
input int TpPoints                   = 50;              // Take Profit in points [m5-50p, h1-200p]
input ENUM_TIMEFRAMES IchimokuTimeFrame = PERIOD_CURRENT; // Timeframe (will use current timeframe)

// ---- Ichimoku Inputs ----
input int TenkanPeriod                = 9;               // Tenkan-sen Period
input int KijunPeriod                 = 26;              // Kijun-sen Period
input int SenkouSpanBPeriod           = 52;              // Senkou Span B Period
input int Displacement                = 26;              // Displacement

// ---- Stochastic Inputs ----
input int StochasticKPeriod           = 14;              // %K period
input int StochasticDPeriod           = 3;               // %D period
input int StochasticSlowing           = 3;               // Slowing for the Stochastic

// ---- Parabolic SAR Inputs ----
input double SARStep                  = 0.02;            // Parabolic SAR Step
input double SARMaximum               = 0.2;             // Parabolic SAR Maximum

// ---- RSI Inputs ----
input int RsiPeriods                  = 18;              // RSI Period
input ENUM_APPLIED_PRICE RsiAppPrice  = PRICE_CLOSE;     // RSI Applied Price
input double RsiSellTrigger           = 70;              // RSI Overbought Level
input double RsiBuyTrigger            = 30;              // RSI Oversold Level

// ---- GLOBAL VARIABLES ----
int handleIchimoku, handleStochastic, handleSAR, handleRsi;
double Tenkan[], Kijun[], SenkouSpanA[], SenkouSpanB[], Chikou[];
double StochasticK[], StochasticD[], SAR[], rsi[];

CTrade trade;

int barsTotal;

// ---- EXPERT INIT ----
int OnInit()
{
   handleIchimoku = iIchimoku(_Symbol, Period(), TenkanPeriod, KijunPeriod, SenkouSpanBPeriod);
   handleStochastic = iStochastic(_Symbol, Period(), StochasticKPeriod, StochasticDPeriod, StochasticSlowing, MODE_SMA, STO_LOWHIGH);
   handleSAR = iSAR(_Symbol, Period(), SARStep, SARMaximum);
   handleRsi = iRSI(_Symbol, Period(), RsiPeriods, RsiAppPrice);

   return(INIT_SUCCEEDED);
}

// ---- EXPERT DEINIT ----
void OnDeinit(const int reason)
{
   IndicatorRelease(handleIchimoku);
   IndicatorRelease(handleStochastic);
   IndicatorRelease(handleSAR);
   IndicatorRelease(handleRsi);
}

// ---- ON TICK FUNCTION ----
void OnTick()
{
   int bars = iBars(_Symbol, Period());
   if(barsTotal != bars)
   {
      barsTotal = bars;

      double bid = SymbolInfoDouble(_Symbol, SYMBOL_BID);
      double ask = SymbolInfoDouble(_Symbol, SYMBOL_ASK);

      // Copy Ichimoku Data
      CopyBuffer(handleIchimoku, 0, 0, 1, Tenkan); // Tenkan-sen
      CopyBuffer(handleIchimoku, 1, 0, 1, Kijun);  // Kijun-sen
      CopyBuffer(handleIchimoku, 2, 0, 1, SenkouSpanA); // Senkou Span A
      CopyBuffer(handleIchimoku, 3, 0, 1, SenkouSpanB); // Senkou Span B
      CopyBuffer(handleIchimoku, 4, 0, 1, Chikou); // Chikou Span

      // Copy Stochastic Data
      CopyBuffer(handleStochastic, 0, 0, 1, StochasticK); // %K
      CopyBuffer(handleStochastic, 1, 0, 1, StochasticD); // %D

      // Copy Parabolic SAR Data
      CopyBuffer(handleSAR, 0, 0, 1, SAR);

      // Copy RSI Data
      CopyBuffer(handleRsi, 0, 0, 1, rsi);

      // SELL Signal based on Ichimoku, Stochastic, Parabolic SAR, and RSI
      if(Tenkan[0] < Kijun[0] && bid < SenkouSpanA[0] &&
         StochasticK[0] > StochasticD[0] && StochasticK[0] > 80 &&
         bid > SAR[0] && rsi[0] > RsiSellTrigger)
      {
         Print(__FUNCTION__, " > SELL Signal...");
         trade.Sell(Lots);
      }

      // BUY Signal based on Ichimoku, Stochastic, Parabolic SAR, and RSI
      else if(Tenkan[0] > Kijun[0] && bid > SenkouSpanA[0] &&
              StochasticK[0] < StochasticD[0] && StochasticK[0] < 20 &&
              bid < SAR[0] && rsi[0] < RsiBuyTrigger)
      {
         Print(__FUNCTION__, " > BUY Signal...");
         trade.Buy(Lots);
      }
   }

   // Position Management: Check open positions and handle Take Profit
   int pointsBuy = 0, pointsSell = 0;
   for(int i = PositionsTotal() - 1; i >= 0; i--)
   {
      ulong posTicket = PositionGetTicket(i);
      if(PositionSelectByTicket(posTicket))
      {
         ENUM_POSITION_TYPE posType = (ENUM_POSITION_TYPE)PositionGetInteger(POSITION_TYPE);
         double posOpenPrice = PositionGetDouble(POSITION_PRICE_OPEN);

         if(posType == POSITION_TYPE_BUY)
            pointsBuy += (int)((SymbolInfoDouble(_Symbol, SYMBOL_BID) - posOpenPrice) / _Point);
         else if(posType == POSITION_TYPE_SELL)
            pointsSell += (int)((posOpenPrice - SymbolInfoDouble(_Symbol, SYMBOL_ASK)) / _Point);
      }
   }

   for(int i = PositionsTotal() - 1; i >= 0; i--)
   {
      ulong posTicket = PositionGetTicket(i);
      if(PositionSelectByTicket(posTicket))
      {
         ENUM_POSITION_TYPE posType = (ENUM_POSITION_TYPE)PositionGetInteger(POSITION_TYPE);

         if(pointsBuy > TpPoints && posType == POSITION_TYPE_BUY)
            trade.PositionClose(posTicket);
         if(pointsSell > TpPoints && posType == POSITION_TYPE_SELL)
            trade.PositionClose(posTicket);
      }
   }

   // Display Data
   Comment("\nTenkan-sen: ", DoubleToString(Tenkan[0], 5),
           "\nKijun-sen: ", DoubleToString(Kijun[0], 5),
           "\nSenkou Span A: ", DoubleToString(SenkouSpanA[0], 5),
           "\nSenkou Span B: ", DoubleToString(SenkouSpanB[0], 5),
           "\nChikou: ", DoubleToString(Chikou[0], 5),
           "\nStochastic %K: ", DoubleToString(StochasticK[0], 5),
           "\nStochastic %D: ", DoubleToString(StochasticD[0], 5),
           "\nParabolic SAR: ", DoubleToString(SAR[0], 5),
           "\nRSI: ", DoubleToString(rsi[0], 5),
           "\nPoints Buy: ", pointsBuy,
           "\nPoints Sell: ", pointsSell);
}


nao esta abrindo ordens corrija e me entregue completo