208 行
12 KiB
Text
208 行
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);
| |||
}
| |||
//+------------------------------------------------------------------+
| |||
| |||
}
| |||
}
| |||
}
| |||
}
| |||
}
| |||
}
| |||
}
| |||
}
| |||
}
| |||
}
| |||
}
| |||
}
| |||
}
| |||
}
| |||
}
|