//+------------------------------------------------------------------+
//| 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