2026-06-14 11:22:27 +00:00
|
|
|
#property strict
|
|
|
|
|
|
2026-06-17 13:52:11 +00:00
|
|
|
#include <Trade/Trade.mqh>
|
|
|
|
|
|
|
|
|
|
CTrade trade;
|
|
|
|
|
|
2026-06-17 12:40:04 +00:00
|
|
|
double LotSize = 0.01;
|
2026-06-16 12:09:10 +00:00
|
|
|
int Slippage = 3;
|
|
|
|
|
|
|
|
|
|
double StopLossPrice = 0;
|
|
|
|
|
double TakeProfitPrice = 0;
|
|
|
|
|
|
|
|
|
|
bool BuyTradeOpen = false;
|
|
|
|
|
bool SellTradeOpen = false;
|
|
|
|
|
|
|
|
|
|
int MagicNumber = 12345;
|
|
|
|
|
|
|
|
|
|
bool AutoTradingEnabled = true;
|
|
|
|
|
|
|
|
|
|
int MaxTrades = 1;
|
|
|
|
|
|
2026-06-17 12:49:01 +00:00
|
|
|
int CurrentTrades = 0;
|
|
|
|
|
|
2026-06-16 12:09:10 +00:00
|
|
|
bool UseStopLoss = true;
|
|
|
|
|
bool UseTakeProfit = true;
|
|
|
|
|
|
|
|
|
|
double RiskPercent = 1.0;
|
|
|
|
|
|
|
|
|
|
bool DemoMode = true;
|
|
|
|
|
|
|
|
|
|
bool PrintDebugMessages = true;
|
2026-06-17 12:40:04 +00:00
|
|
|
|
|
|
|
|
int OnInit()
|
|
|
|
|
{
|
|
|
|
|
Print("SMC_BOS_EA Loaded");
|
|
|
|
|
return(INIT_SUCCEEDED);
|
2026-06-14 11:22:27 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
|
|
void OnTick()
|
|
|
|
|
{
|
|
|
|
|
if(IsSwingHigh(2))
|
|
|
|
|
Print("Swing High Found");
|
|
|
|
|
|
|
|
|
|
if(IsSwingLow(2))
|
|
|
|
|
Print("Swing Low Found");
|
2026-06-14 14:17:56 +00:00
|
|
|
|
|
|
|
|
if(BuyLiquiditySweep(1))
|
|
|
|
|
Print("BUY Liquidity Sweep Found");
|
|
|
|
|
|
|
|
|
|
if(SellLiquiditySweep(1))
|
|
|
|
|
Print("SELL Liquidity Sweep Found");
|
2026-06-15 11:53:18 +00:00
|
|
|
|
|
|
|
|
if(BullishBOS(1))
|
|
|
|
|
Print("Bullish BOS Found");
|
|
|
|
|
|
|
|
|
|
if(BearishBOS(1))
|
|
|
|
|
Print("Bearish BOS Found");
|
2026-06-15 11:56:23 +00:00
|
|
|
|
|
|
|
|
if(HigherLow(1))
|
|
|
|
|
Print("Higher Low Found");
|
|
|
|
|
|
|
|
|
|
if(LowerHigh(1))
|
|
|
|
|
Print("Lower High Found");
|
2026-06-15 11:59:15 +00:00
|
|
|
|
|
|
|
|
if(BullishTrend())
|
|
|
|
|
Print("Bullish Trend Confirmed");
|
|
|
|
|
|
|
|
|
|
if(BearishTrend())
|
|
|
|
|
Print("Bearish Trend Confirmed");
|
2026-06-16 16:37:29 +00:00
|
|
|
}
|
2026-06-15 12:03:43 +00:00
|
|
|
|
2026-06-17 13:05:02 +00:00
|
|
|
if(BuySetup() && !BuyTradeOpen && CurrentTrades < MaxTrades)
|
2026-06-16 16:37:29 +00:00
|
|
|
{
|
|
|
|
|
Print("BUY SETUP READY");
|
|
|
|
|
OpenBuy();
|
|
|
|
|
}
|
2026-06-15 12:27:32 +00:00
|
|
|
|
2026-06-17 13:05:02 +00:00
|
|
|
if(SellSetup() && !SellTradeOpen && CurrentTrades < MaxTrades)
|
2026-06-16 16:37:29 +00:00
|
|
|
{
|
|
|
|
|
Print("SELL SETUP READY");
|
|
|
|
|
OpenSell();
|
2026-06-14 14:17:56 +00:00
|
|
|
}
|
|
|
|
|
|
2026-06-14 11:22:27 +00:00
|
|
|
bool IsSwingHigh(int shift)
|
|
|
|
|
{
|
|
|
|
|
return High[shift] > High[shift+1] &&
|
|
|
|
|
High[shift] > High[shift+2] &&
|
|
|
|
|
High[shift] > High[shift-1] &&
|
|
|
|
|
High[shift] > High[shift-2];
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
bool IsSwingLow(int shift)
|
|
|
|
|
{
|
|
|
|
|
return Low[shift] < Low[shift+1] &&
|
|
|
|
|
Low[shift] < Low[shift+2] &&
|
|
|
|
|
Low[shift] < Low[shift-1] &&
|
|
|
|
|
Low[shift] < Low[shift-2];
|
2026-06-14 11:23:26 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
|
|
bool BuyLiquiditySweep(int shift)
|
|
|
|
|
{
|
|
|
|
|
return Low[shift] < Low[shift+1] - 5 * _Point &&
|
|
|
|
|
Close[shift] > Low[shift+1];
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
bool SellLiquiditySweep(int shift)
|
|
|
|
|
{
|
|
|
|
|
return High[shift] > High[shift+1] + 5 * _Point &&
|
|
|
|
|
Close[shift] < High[shift+1];
|
|
|
|
|
}
|
2026-06-15 11:53:18 +00:00
|
|
|
|
|
|
|
|
bool BullishBOS(int shift)
|
|
|
|
|
{
|
|
|
|
|
return Close[shift] > High[shift+1];
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
bool BearishBOS(int shift)
|
|
|
|
|
{
|
|
|
|
|
return Close[shift] < Low[shift+1];
|
2026-06-15 11:56:23 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
|
|
bool HigherLow(int shift)
|
|
|
|
|
{
|
|
|
|
|
return Low[shift] > Low[shift+1];
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
bool LowerHigh(int shift)
|
|
|
|
|
{
|
|
|
|
|
return High[shift] < High[shift+1];
|
2026-06-15 11:59:15 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
|
|
bool BullishTrend()
|
|
|
|
|
{
|
|
|
|
|
return HigherLow(1) && BullishBOS(1);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
bool BearishTrend()
|
|
|
|
|
{
|
|
|
|
|
return LowerHigh(1) && BearishBOS(1);
|
2026-06-15 12:03:43 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
|
|
bool BuySetup()
|
|
|
|
|
{
|
2026-06-16 12:12:39 +00:00
|
|
|
return BullishTrend() &&
|
|
|
|
|
BuyLiquiditySweep(1) &&
|
|
|
|
|
BullishBOS(1);
|
2026-06-15 12:03:43 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
|
|
bool SellSetup()
|
|
|
|
|
{
|
2026-06-16 12:12:39 +00:00
|
|
|
return BearishTrend() &&
|
|
|
|
|
SellLiquiditySweep(1) &&
|
|
|
|
|
BearishBOS(1);
|
2026-06-15 12:18:03 +00:00
|
|
|
}
|
|
|
|
|
|
2026-06-15 12:28:33 +00:00
|
|
|
void OpenBuy()
|
|
|
|
|
{
|
2026-06-15 12:37:34 +00:00
|
|
|
StopLossPrice = Low[1];
|
|
|
|
|
TakeProfitPrice = High[10];
|
2026-06-15 12:40:19 +00:00
|
|
|
|
|
|
|
|
Print("BUY ORDER EXECUTED");
|
2026-06-16 11:33:16 +00:00
|
|
|
|
2026-06-17 14:05:46 +00:00
|
|
|
if(trade.Buy(LotSize, _Symbol, 0, StopLossPrice, TakeProfitPrice))
|
2026-06-17 14:00:30 +00:00
|
|
|
Print("BUY ORDER SENT SUCCESSFULLY");
|
2026-06-17 14:11:58 +00:00
|
|
|
else
|
|
|
|
|
Print("BUY ORDER FAILED");
|
2026-06-17 13:55:47 +00:00
|
|
|
|
2026-06-16 11:33:16 +00:00
|
|
|
Print("SL: ", StopLossPrice);
|
|
|
|
|
Print("TP: ", TakeProfitPrice);
|
2026-06-16 11:35:28 +00:00
|
|
|
|
|
|
|
|
double EntryPrice = Ask;
|
2026-06-17 13:30:12 +00:00
|
|
|
Print("BUY ENTRY PRICE: ", EntryPrice);
|
2026-06-16 16:41:05 +00:00
|
|
|
|
|
|
|
|
BuyTradeOpen = true;
|
2026-06-17 12:52:55 +00:00
|
|
|
|
2026-06-17 13:26:41 +00:00
|
|
|
SellTradeOpen = false;
|
|
|
|
|
|
2026-06-17 12:52:55 +00:00
|
|
|
CurrentTrades++;
|
2026-06-17 13:14:37 +00:00
|
|
|
Print("CURRENT TRADES: ", CurrentTrades);
|
2026-06-15 12:28:33 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
|
|
void OpenSell()
|
|
|
|
|
{
|
2026-06-15 12:41:37 +00:00
|
|
|
StopLossPrice = High[1];
|
|
|
|
|
TakeProfitPrice = Low[10];
|
|
|
|
|
|
2026-06-15 12:28:33 +00:00
|
|
|
Print("SELL ORDER EXECUTED");
|
2026-06-16 11:33:16 +00:00
|
|
|
|
2026-06-17 14:05:46 +00:00
|
|
|
if(trade.Sell(LotSize, _Symbol, 0, StopLossPrice, TakeProfitPrice))
|
2026-06-17 14:00:30 +00:00
|
|
|
Print("SELL ORDER SENT SUCCESSFULLY");
|
2026-06-17 14:11:58 +00:00
|
|
|
else
|
|
|
|
|
Print("SELL ORDER FAILED");
|
2026-06-17 13:55:47 +00:00
|
|
|
|
2026-06-16 11:33:16 +00:00
|
|
|
Print("SL: ", StopLossPrice);
|
|
|
|
|
Print("TP: ", TakeProfitPrice);
|
2026-06-16 11:35:28 +00:00
|
|
|
|
|
|
|
|
double EntryPrice = Bid;
|
2026-06-17 13:30:12 +00:00
|
|
|
Print("SELL ENTRY PRICE: ", EntryPrice);
|
2026-06-16 16:41:05 +00:00
|
|
|
|
|
|
|
|
SellTradeOpen = true;
|
2026-06-17 12:52:55 +00:00
|
|
|
|
2026-06-17 13:26:41 +00:00
|
|
|
BuyTradeOpen = false;
|
|
|
|
|
|
2026-06-17 12:52:55 +00:00
|
|
|
CurrentTrades++;
|
2026-06-17 13:14:37 +00:00
|
|
|
Print("CURRENT TRADES: ", CurrentTrades);
|
2026-06-17 12:45:09 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
|
|
void ResetBuyTrade()
|
|
|
|
|
{
|
|
|
|
|
BuyTradeOpen = false;
|
2026-06-17 13:08:04 +00:00
|
|
|
|
2026-06-17 13:12:04 +00:00
|
|
|
if(CurrentTrades > 0)
|
2026-06-17 13:08:04 +00:00
|
|
|
CurrentTrades--;
|
2026-06-17 13:16:32 +00:00
|
|
|
|
|
|
|
|
Print("BUY TRADE RESET");
|
|
|
|
|
Print("CURRENT TRADES: ", CurrentTrades);
|
2026-06-17 12:45:09 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
|
|
void ResetSellTrade()
|
|
|
|
|
{
|
|
|
|
|
SellTradeOpen = false;
|
2026-06-17 13:08:04 +00:00
|
|
|
|
2026-06-17 13:12:04 +00:00
|
|
|
if(CurrentTrades > 0)
|
2026-06-17 13:08:04 +00:00
|
|
|
CurrentTrades--;
|
2026-06-17 13:16:32 +00:00
|
|
|
|
|
|
|
|
Print("SELL TRADE RESET");
|
|
|
|
|
Print("CURRENT TRADES: ", CurrentTrades);
|
2026-06-15 11:53:18 +00:00
|
|
|
}
|