208 lines
No EOL
12 KiB
Text
208 lines
No EOL
12 KiB
Text
//+------------------------------------------------------------------+
|
|
//| ScalpingEA.mq5 |
|
|
//| Copyright 2024, Your Name Here |
|
|
//| https://www.yoursite.com |
|
|
//+------------------------------------------------------------------+
|
|
#property copyright "Copyright 2024, Your Name Here"
|
|
#property link "https://www.yoursite.com"
|
|
#property version "1.00"
|
|
|
|
//+------------------------------------------------------------------+
|
|
//| Input parameters |
|
|
//+------------------------------------------------------------------+
|
|
input double LotSize = 0.01; // Lot size
|
|
input int StopLoss = 50; // Stop Loss in points
|
|
input int TakeProfit = 100; // Take Profit in points
|
|
input int MagicNumber = 12345; // Magic Number
|
|
input int Slippage = 3; // Slippage
|
|
|
|
// ZLSMA parameters
|
|
input int ZLSMA_Period = 50; // ZLSMA Period
|
|
input int ZLSMA_Price = PRICE_CLOSE; // ZLSMA Price type
|
|
|
|
// Chandelier Exit parameters
|
|
input int CE_Period = 22; // Chandelier Exit Period
|
|
input double CE_Multiplier = 3.0; // Chandelier Exit Multiplier
|
|
|
|
// Additional indicators for better signals
|
|
input int RSI_Period = 14; // RSI Period
|
|
input int ATR_Period = 14; // ATR Period for volatility
|
|
|
|
//+------------------------------------------------------------------+
|
|
//| Global variables |
|
|
//+------------------------------------------------------------------+
|
|
int zlsma_handle, ce_handle, rsi_handle, atr_handle;
|
|
double zlsma[], ce_high[], ce_low[], rsi[], atr[];
|
|
|
|
//+------------------------------------------------------------------+
|
|
//| Expert initialization function |
|
|
//+------------------------------------------------------------------+
|
|
int OnInit()
|
|
{
|
|
// Create indicator handles
|
|
zlsma_handle = iCustom(Symbol(), Period(), "Zero Lag Smoothed MA", ZLSMA_Period, ZLSMA_Price);
|
|
ce_handle = iCustom(Symbol(), Period(), "Chandelier Exit", CE_Period, CE_Multiplier);
|
|
rsi_handle = iRSI(Symbol(), Period(), RSI_Period, PRICE_CLOSE);
|
|
atr_handle = iATR(Symbol(), Period(), ATR_Period);
|
|
|
|
if(zlsma_handle == INVALID_HANDLE || ce_handle == INVALID_HANDLE)
|
|
{
|
|
Print("Error creating indicator handles");
|
|
return(INIT_FAILED);
|
|
}
|
|
|
|
// Set array as series
|
|
ArraySetAsSeries(zlsma, true);
|
|
ArraySetAsSeries(ce_high, true);
|
|
ArraySetAsSeries(ce_low, true);
|
|
ArraySetAsSeries(rsi, true);
|
|
ArraySetAsSeries(atr, true);
|
|
|
|
return(INIT_SUCCEEDED);
|
|
}
|
|
|
|
//+------------------------------------------------------------------+
|
|
//| Expert tick function |
|
|
//+------------------------------------------------------------------+
|
|
void OnTick()
|
|
{
|
|
// Get current indicator values
|
|
if(CopyBuffer(zlsma_handle, 0, 0, 3, zlsma) < 3) return;
|
|
if(CopyBuffer(ce_handle, 0, 0, 3, ce_high) < 3) return; // Upper exit
|
|
if(CopyBuffer(ce_handle, 1, 0, 3, ce_low) < 3) return; // Lower exit
|
|
if(CopyBuffer(rsi_handle, 0, 0, 3, rsi) < 3) return;
|
|
if(CopyBuffer(atr_handle, 0, 0, 3, atr) < 3) return;
|
|
|
|
double current_price = SymbolInfoDouble(Symbol(), SYMBOL_BID);
|
|
double ask_price = SymbolInfoDouble(Symbol(), SYMBOL_ASK);
|
|
|
|
// Check for buy signal
|
|
if(IsBuySignal())
|
|
{
|
|
if(CountPositions() == 0)
|
|
{
|
|
double sl = current_price - StopLoss * _Point;
|
|
double tp = current_price + TakeProfit * _Point;
|
|
OpenTrade(ORDER_TYPE_BUY, LotSize, ask_price, sl, tp);
|
|
}
|
|
}
|
|
|
|
// Check for sell signal
|
|
if(IsSellSignal())
|
|
{
|
|
if(CountPositions() == 0)
|
|
{
|
|
double sl = current_price + StopLoss * _Point;
|
|
double tp = current_price - TakeProfit * _Point;
|
|
OpenTrade(ORDER_TYPE_SELL, LotSize, current_price, sl, tp);
|
|
}
|
|
}
|
|
}
|
|
|
|
//+------------------------------------------------------------------+
|
|
//| Buy signal condition |
|
|
//+------------------------------------------------------------------+
|
|
bool IsBuySignal()
|
|
{
|
|
// Price above ZLSMA and ZLSMA trending up
|
|
bool zlsma_bullish = (zlsma[0] > zlsma[1]) && (zlsma[1] > zlsma[2]);
|
|
|
|
// Price above Chandelier Exit lower band
|
|
double current_price = SymbolInfoDouble(Symbol(), SYMBOL_BID);
|
|
bool above_ce_low = current_price > ce_low[0];
|
|
|
|
// RSI not overbought
|
|
bool rsi_ok = rsi[0] < 70;
|
|
|
|
return (zlsma_bullish && above_ce_low && rsi_ok);
|
|
}
|
|
|
|
//+------------------------------------------------------------------+
|
|
//| Sell signal condition |
|
|
//+------------------------------------------------------------------+
|
|
bool IsSellSignal()
|
|
{
|
|
// Price below ZLSMA and ZLSMA trending down
|
|
bool zlsma_bearish = (zlsma[0] < zlsma[1]) && (zlsma[1] < zlsma[2]);
|
|
|
|
// Price below Chandelier Exit upper band
|
|
double current_price = SymbolInfoDouble(Symbol(), SYMBOL_BID);
|
|
bool below_ce_high = current_price < ce_high[0];
|
|
|
|
// RSI not oversold
|
|
bool rsi_ok = rsi[0] > 30;
|
|
|
|
return (zlsma_bearish && below_ce_high && rsi_ok);
|
|
}
|
|
|
|
//+------------------------------------------------------------------+
|
|
//| Open trade function |
|
|
//+------------------------------------------------------------------+
|
|
bool OpenTrade(ENUM_ORDER_TYPE type, double lot, double price, double sl, double tp)
|
|
{
|
|
MqlTradeRequest request = {0};
|
|
MqlTradeResult result = {0};
|
|
|
|
request.action = TRADE_ACTION_DEAL;
|
|
request.symbol = Symbol();
|
|
request.volume = lot;
|
|
request.type = type;
|
|
request.price = price;
|
|
request.sl = sl;
|
|
request.tp = tp;
|
|
request.deviation = Slippage;
|
|
request.magic = MagicNumber;
|
|
|
|
if(OrderSend(request, result))
|
|
{
|
|
Print("Trade opened: ", result.comment);
|
|
return true;
|
|
}
|
|
else
|
|
{
|
|
Print("Error opening trade: ", GetLastError());
|
|
return false;
|
|
}
|
|
}
|
|
|
|
//+------------------------------------------------------------------+
|
|
//| Count open positions |
|
|
//+------------------------------------------------------------------+
|
|
int CountPositions()
|
|
{
|
|
int count = 0;
|
|
for(int i = 0; i < PositionsTotal(); i++)
|
|
{
|
|
if(PositionGetSymbol(i) == Symbol() && PositionGetInteger(POSITION_MAGIC) == MagicNumber)
|
|
count++;
|
|
}
|
|
return count;
|
|
}
|
|
|
|
//+------------------------------------------------------------------+
|
|
//| Expert deinitialization function |
|
|
//+------------------------------------------------------------------+
|
|
void OnDeinit(const int reason)
|
|
{
|
|
if(zlsma_handle != INVALID_HANDLE) IndicatorRelease(zlsma_handle);
|
|
if(ce_handle != INVALID_HANDLE) IndicatorRelease(ce_handle);
|
|
if(rsi_handle != INVALID_HANDLE) IndicatorRelease(rsi_handle);
|
|
if(atr_handle != INVALID_HANDLE) IndicatorRelease(atr_handle);
|
|
}
|
|
//+------------------------------------------------------------------+
|
|
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
} |