198 lines
7.3 KiB
Text
198 lines
7.3 KiB
Text
|
|
//+------------------------------------------------------------------+
|
||
|
|
//| ICT + SMC ALL IN ONE FINAL EA (MT5) |
|
||
|
|
//+------------------------------------------------------------------+
|
||
|
|
#property strict
|
||
|
|
#include <Trade/Trade.mqh>
|
||
|
|
CTrade trade;
|
||
|
|
|
||
|
|
//================ INPUTS ===================
|
||
|
|
input double LotSize = 0.1;
|
||
|
|
input double RR = 2.0;
|
||
|
|
input int MaxSpreadPoints = 300;
|
||
|
|
input int BufferPoints = 20;
|
||
|
|
input bool UseKillZones = true;
|
||
|
|
input int MaxTradesPerDay = 1;
|
||
|
|
|
||
|
|
//================ GLOBAL ===================
|
||
|
|
bool PartialDone=false;
|
||
|
|
int TradesToday=0;
|
||
|
|
datetime TradeDay=0;
|
||
|
|
|
||
|
|
//================ UTILS ====================
|
||
|
|
bool IsTradeOpen(){ return PositionSelect(_Symbol); }
|
||
|
|
|
||
|
|
bool SpreadOK(){
|
||
|
|
return SymbolInfoInteger(_Symbol,SYMBOL_SPREAD)<=MaxSpreadPoints;
|
||
|
|
}
|
||
|
|
|
||
|
|
bool KillZoneOK(){
|
||
|
|
if(!UseKillZones) return true;
|
||
|
|
int h=TimeHour(TimeCurrent());
|
||
|
|
return (h>=7 && h<=10)||(h>=13 && h<=16);
|
||
|
|
}
|
||
|
|
|
||
|
|
bool DailyLimitOK(){
|
||
|
|
datetime d=Date();
|
||
|
|
if(d!=TradeDay){ TradesToday=0; TradeDay=d; }
|
||
|
|
return TradesToday<MaxTradesPerDay;
|
||
|
|
}
|
||
|
|
|
||
|
|
//================ HTF ======================
|
||
|
|
bool HTFBullish(){
|
||
|
|
return iClose(_Symbol,PERIOD_H1,1)>
|
||
|
|
iOpen(_Symbol,PERIOD_H1,1);
|
||
|
|
}
|
||
|
|
bool HTFBearish(){
|
||
|
|
return iClose(_Symbol,PERIOD_H1,1)<
|
||
|
|
iOpen(_Symbol,PERIOD_H1,1);
|
||
|
|
}
|
||
|
|
|
||
|
|
//================ PD =======================
|
||
|
|
bool InDiscount(){
|
||
|
|
double h=iHigh(_Symbol,PERIOD_H1,1);
|
||
|
|
double l=iLow(_Symbol,PERIOD_H1,1);
|
||
|
|
return SymbolInfoDouble(_Symbol,SYMBOL_BID)<(h+l)/2;
|
||
|
|
}
|
||
|
|
bool InPremium(){
|
||
|
|
double h=iHigh(_Symbol,PERIOD_H1,1);
|
||
|
|
double l=iLow(_Symbol,PERIOD_H1,1);
|
||
|
|
return SymbolInfoDouble(_Symbol,SYMBOL_ASK)>(h+l)/2;
|
||
|
|
}
|
||
|
|
|
||
|
|
//================ LIQUIDITY ================
|
||
|
|
bool EqualHighs(){
|
||
|
|
return MathAbs(iHigh(_Symbol,PERIOD_M5,1)-
|
||
|
|
iHigh(_Symbol,PERIOD_M5,2))<=10*_Point;
|
||
|
|
}
|
||
|
|
bool EqualLows(){
|
||
|
|
return MathAbs(iLow(_Symbol,PERIOD_M5,1)-
|
||
|
|
iLow(_Symbol,PERIOD_M5,2))<=10*_Point;
|
||
|
|
}
|
||
|
|
bool SweepHigh(){
|
||
|
|
return iHigh(_Symbol,PERIOD_M5,0)>
|
||
|
|
iHigh(_Symbol,PERIOD_M5,1);
|
||
|
|
}
|
||
|
|
bool SweepLow(){
|
||
|
|
return iLow(_Symbol,PERIOD_M5,0)<
|
||
|
|
iLow(_Symbol,PERIOD_M5,1);
|
||
|
|
}
|
||
|
|
|
||
|
|
//================ CHOCH ====================
|
||
|
|
bool BullishCHoCH(){
|
||
|
|
return iClose(_Symbol,PERIOD_M5,1)>
|
||
|
|
iHigh(_Symbol,PERIOD_M5,2);
|
||
|
|
}
|
||
|
|
bool BearishCHoCH(){
|
||
|
|
return iClose(_Symbol,PERIOD_M5,1)<
|
||
|
|
iLow(_Symbol,PERIOD_M5,2);
|
||
|
|
}
|
||
|
|
|
||
|
|
//================ FVG ======================
|
||
|
|
bool BullishFVG(double &lvl){
|
||
|
|
if(iHigh(_Symbol,PERIOD_M5,3)<
|
||
|
|
iLow(_Symbol,PERIOD_M5,1)){
|
||
|
|
lvl=iHigh(_Symbol,PERIOD_M5,3);
|
||
|
|
return true;
|
||
|
|
}
|
||
|
|
return false;
|
||
|
|
}
|
||
|
|
bool BearishFVG(double &lvl){
|
||
|
|
if(iLow(_Symbol,PERIOD_M5,3)>
|
||
|
|
iHigh(_Symbol,PERIOD_M5,1)){
|
||
|
|
lvl=iLow(_Symbol,PERIOD_M5,3);
|
||
|
|
return true;
|
||
|
|
}
|
||
|
|
return false;
|
||
|
|
}
|
||
|
|
|
||
|
|
//================ MANAGEMENT ===============
|
||
|
|
void ManageTrade(){
|
||
|
|
if(!PositionSelect(_Symbol)) return;
|
||
|
|
double entry=PositionGetDouble(POSITION_PRICE_OPEN);
|
||
|
|
double sl=PositionGetDouble(POSITION_SL);
|
||
|
|
double tp=PositionGetDouble(POSITION_TP);
|
||
|
|
double price=SymbolInfoDouble(_Symbol,SYMBOL_BID);
|
||
|
|
double vol=PositionGetDouble(POSITION_VOLUME);
|
||
|
|
long type=PositionGetInteger(POSITION_TYPE);
|
||
|
|
|
||
|
|
if(type==POSITION_TYPE_BUY){
|
||
|
|
double rr1=entry+(entry-sl);
|
||
|
|
if(price>=rr1 && !PartialDone){
|
||
|
|
trade.PositionClosePartial(_Symbol,vol/2);
|
||
|
|
trade.PositionModify(_Symbol,entry,tp);
|
||
|
|
PartialDone=true;
|
||
|
|
}
|
||
|
|
}else{
|
||
|
|
double rr1=entry-(sl-entry);
|
||
|
|
if(price<=rr1 && !PartialDone){
|
||
|
|
trade.PositionClosePartial(_Symbol,vol/2);
|
||
|
|
trade.PositionModify(_Symbol,entry,tp);
|
||
|
|
PartialDone=true;
|
||
|
|
}
|
||
|
|
}
|
||
|
|
}
|
||
|
|
|
||
|
|
//================ MAIN =====================
|
||
|
|
void OnTick(){
|
||
|
|
ManageTrade();
|
||
|
|
if(IsTradeOpen()) return;
|
||
|
|
if(!SpreadOK()||!KillZoneOK()||!DailyLimitOK()) return;
|
||
|
|
|
||
|
|
double bid=SymbolInfoDouble(_Symbol,SYMBOL_BID);
|
||
|
|
double ask=SymbolInfoDouble(_Symbol,SYMBOL_ASK);
|
||
|
|
|
||
|
|
// BUY
|
||
|
|
if(HTFBullish()&&InDiscount()&&
|
||
|
|
EqualLows()&&SweepLow()&&BullishCHoCH()){
|
||
|
|
double fvg;
|
||
|
|
if(BullishFVG(fvg)&&bid<=fvg+BufferPoints*_Point){
|
||
|
|
double sl=fvg-BufferPoints*_Point;
|
||
|
|
double tp=bid+(bid-sl)*RR;
|
||
|
|
if(trade.Buy(LotSize,_Symbol,ask,sl,tp)){
|
||
|
|
TradesToday++; PartialDone=false;
|
||
|
|
}
|
||
|
|
}
|
||
|
|
}
|
||
|
|
|
||
|
|
// SELL
|
||
|
|
if(HTFBearish()&&InPremium()&&
|
||
|
|
EqualHighs()&&SweepHigh()&&BearishCHoCH()){
|
||
|
|
double fvg;
|
||
|
|
if(BearishFVG(fvg)&&ask>=fvg-BufferPoints*_Point){
|
||
|
|
double sl=fvg+BufferPoints*_Point;
|
||
|
|
double tp=ask-(sl-ask)*RR;
|
||
|
|
if(trade.Sell(LotSize,_Symbol,bid,sl,tp)){
|
||
|
|
TradesToday++; PartialDone=false;
|
||
|
|
}
|
||
|
|
}
|
||
|
|
}
|
||
|
|
}
|
||
|
|
}
|
||
|
|
}
|
||
|
|
}
|
||
|
|
}
|
||
|
|
}
|
||
|
|
}
|
||
|
|
}
|
||
|
|
}
|
||
|
|
}
|
||
|
|
}
|
||
|
|
}
|
||
|
|
}
|
||
|
|
}
|
||
|
|
}
|
||
|
|
}
|
||
|
|
}
|
||
|
|
}
|
||
|
|
}
|
||
|
|
}
|
||
|
|
}
|
||
|
|
}
|
||
|
|
}
|
||
|
|
}
|
||
|
|
}
|
||
|
|
}
|
||
|
|
}
|
||
|
|
}
|
||
|
|
}
|
||
|
|
}
|