Vizion-Trading-EA/Shared Projects/VizionAI-Trading/VizionAI-Trading-Repo/VizionAI-EA/TradingSetups.mqh
2026-02-19 23:19:25 -06:00

208 lines
6.8 KiB
MQL5

#ifndef TRADING_SETUPS_MQH
#define TRADING_SETUPS_MQH
void ExecuteReEntries();
bool IsDirectionAllowedByCoordinator(const bool buy)
{
if(!Use_Signal_Coordinator)
return true;
if(!Coordinator_AllowTrade)
return false;
if(buy && Coordinator_Bias_Direction < 0)
return false;
if(!buy && Coordinator_Bias_Direction > 0)
return false;
return true;
}
void FireSetup(const bool buy, const string name, const bool continuation)
{
if(!IsDirectionAllowedByCoordinator(buy))
return;
if(continuation)
{
if(Current_State != STATE_CONTINUATION && State_Bias_Confidence < 60.0)
return;
}
double setup_mult = continuation ? 1.0 : 0.8;
if(buy) OpenBuy(name, setup_mult);
else OpenSell(name, setup_mult);
}
void ExecuteMARetestAndRejectionSetups()
{
if(!Use_MA_Retest_Entries && !Use_MA_Rejection_Entries)
return;
double current = MidPrice();
// EMA14/21/50/140/230 retests
int watched[5] = {1,2,3,4,5};
for(int i = 0; i < 5; ++i)
{
int idx = watched[i];
double ma = MA_Current[idx];
bool touched = NearLevel(current, ma, MA_Touch_Buffer);
bool bull_retest = (MA_Previous[0] > MA_Previous[idx] && iLow(_Symbol, PERIOD_CURRENT, 0) <= ma && iClose(_Symbol, PERIOD_CURRENT, 0) > ma);
bool bear_retest = (MA_Previous[0] < MA_Previous[idx] && iHigh(_Symbol, PERIOD_CURRENT, 0) >= ma && iClose(_Symbol, PERIOD_CURRENT, 0) < ma);
if(Use_MA_Retest_Entries && touched && TimeCurrent() - Last_MA_Retest_Trade >= MA_Retest_Cooldown_Seconds)
{
if(bull_retest) { FireSetup(true, "EMA-RETEST-UP", true); Last_MA_Retest_Trade = TimeCurrent(); }
if(bear_retest) { FireSetup(false, "EMA-RETEST-DN", true); Last_MA_Retest_Trade = TimeCurrent(); }
}
if(Use_MA_Rejection_Entries && touched && TimeCurrent() - Last_MA_Reject_Trade >= MA_Retest_Cooldown_Seconds)
{
double o = iOpen(_Symbol, PERIOD_CURRENT, 0);
double c = iClose(_Symbol, PERIOD_CURRENT, 0);
double h = iHigh(_Symbol, PERIOD_CURRENT, 0);
double l = iLow(_Symbol, PERIOD_CURRENT, 0);
double body = MathAbs(c - o);
double up_wick = h - MathMax(o, c);
double lo_wick = MathMin(o, c) - l;
bool bull_reject = (lo_wick > body * 2.0 && c > ma);
bool bear_reject = (up_wick > body * 2.0 && c < ma);
if(bull_reject) { FireSetup(true, "EMA-REJECT-UP", true); Last_MA_Reject_Trade = TimeCurrent(); }
if(bear_reject) { FireSetup(false, "EMA-REJECT-DN", true); Last_MA_Reject_Trade = TimeCurrent(); }
}
}
}
void ExecuteForceEntrySetups()
{
int open_count = CountOpenTradesForSymbol();
if(open_count >= Min_Active_Entries)
return;
int dir = BiasDirection();
if(open_count < 2)
{
if(dir >= 0) FireSetup(true, "FORCE-URGENT-BUY", true);
if(dir <= 0) FireSetup(false, "FORCE-URGENT-SELL", true);
return;
}
if(dir >= 0 && (Active_Praise_Signals >= Active_Warnings || Current_Mode != MODE_CHOP))
FireSetup(true, "FORCE-STANDARD-BUY", false);
if(dir <= 0 && (Active_Warnings >= Active_Praise_Signals || Current_Mode != MODE_CHOP))
FireSetup(false, "FORCE-STANDARD-SELL", false);
}
void ExecuteContinuationSetups()
{
if(Current_Mode != MODE_TRENDING || Current_State != STATE_CONTINUATION)
return;
double current = MidPrice();
double buffer = MA_Touch_Buffer;
int dir = BiasDirection();
if(MA_Previous[1] <= MA_Previous[3] && MA_Current[1] > MA_Current[3]) FireSetup(true, "MA14-CROSS-UP", true);
if(MA_Previous[1] >= MA_Previous[3] && MA_Current[1] < MA_Current[3]) FireSetup(false, "MA14-CROSS-DN", true);
if(NearLevel(current, MA_Current[3], buffer))
{
if(dir >= 0) FireSetup(true, "MA50-BOUNCE-UP", true);
if(dir <= 0) FireSetup(false, "MA50-BOUNCE-DN", true);
}
if(NearLevel(current, MA_Current[4], buffer))
{
if(dir >= 0) FireSetup(true, "MA140-BOUNCE-UP", true);
if(dir <= 0) FireSetup(false, "MA140-BOUNCE-DN", true);
}
if(NearLevel(current, MA_Current[5], buffer))
{
if(dir >= 0) FireSetup(true, "MA230-BOUNCE-UP", true);
if(dir <= 0) FireSetup(false, "MA230-BOUNCE-DN", true);
}
if(NearLevel(current, MA_Current[6], buffer))
{
if(dir >= 0) FireSetup(true, "MA500-TOUCH-UP", true);
if(dir <= 0) FireSetup(false, "MA500-TOUCH-DN", true);
}
for(int i = 1; i <= 5; ++i)
{
double c0 = iClose(_Symbol, PERIOD_CURRENT, 0);
double c1 = iClose(_Symbol, PERIOD_CURRENT, 1);
if(c1 <= PriceLevels[i] && c0 > PriceLevels[i]) FireSetup(true, "FIB-BREAK-UP", true);
if(c1 >= PriceLevels[i] && c0 < PriceLevels[i]) FireSetup(false, "FIB-BREAK-DN", true);
}
for(int i = 1; i <= 5; ++i)
{
double c0 = iClose(_Symbol, PERIOD_CURRENT, 0);
double c1 = iClose(_Symbol, PERIOD_CURRENT, 1);
if(c1 < PriceLevels[i] && c0 > PriceLevels[i]) FireSetup(true, "FIB-RECLAIM-UP", true);
if(c1 > PriceLevels[i] && c0 < PriceLevels[i]) FireSetup(false, "FIB-RECLAIM-DN", true);
}
bool hugging = (Current_ATR > 0.0 && (MathAbs(current - MA_Current[2]) / Current_ATR) < 0.7);
if(hugging && dir >= 0) FireSetup(true, "MAGNET-WALK-UP", true);
if(hugging && dir <= 0) FireSetup(false, "MAGNET-WALK-DN", true);
if(NearLevel(current, MFIB_Level_382, buffer) || NearLevel(current, MFIB_Level_618, buffer))
{
if(dir >= 0) FireSetup(true, "MFIB-LADDER-UP", true);
if(dir <= 0) FireSetup(false, "MFIB-LADDER-DN", true);
}
}
void ExecuteRangeSetups()
{
if(Current_Mode != MODE_RANGING)
return;
double current = MidPrice();
double buffer = MA_Touch_Buffer;
if(NearLevel(current, PriceLevels[1], buffer) && Stoch_K_Current < Stoch_Weak_Low)
FireSetup(true, "RANGE-EDGE-BUY", false);
if(NearLevel(current, PriceLevels[5], buffer) && Stoch_K_Current > Stoch_Weak_High)
FireSetup(false, "RANGE-EDGE-SELL", false);
if(NearLevel(current, MFIB_Level_382, buffer) && Stoch_K_Current < Stoch_Mid)
FireSetup(true, "RANGE-MFIB-BUY", false);
if(NearLevel(current, MFIB_Level_618, buffer) && Stoch_K_Current > Stoch_Mid)
FireSetup(false, "RANGE-MFIB-SELL", false);
}
void ExecuteChopSetups()
{
if(Current_Mode != MODE_CHOP)
return;
if(Stoch_K_Current <= Stoch_Oversold && Active_Warnings >= Active_Praise_Signals)
FireSetup(true, "CHOP-REV-BUY", false);
if(Stoch_K_Current >= Stoch_Overbought && Active_Warnings >= Active_Praise_Signals)
FireSetup(false, "CHOP-REV-SELL", false);
double current = MidPrice();
if(NearLevel(current, MA_Current[0], MA_Touch_Buffer) && Active_Warnings >= 2)
{
if(iClose(_Symbol, PERIOD_CURRENT, 0) < MA_Current[0]) FireSetup(true, "CHOP-SNAP-BUY", false);
if(iClose(_Symbol, PERIOD_CURRENT, 0) > MA_Current[0]) FireSetup(false, "CHOP-SNAP-SELL", false);
}
}
#endif