- MultiSignal Confluence EA v1.11 (stop loss bug fixed) - Harmonic Pattern Finder v2 (optimized) - Candlestick Pattern EA (fixed) - Pivot Fade EA v4 (fixed) - Bot series (10001, 10002, EnhancedEA) Performance: ~19% return in 2 months on 00k account
481 lines
16 KiB
Plaintext
481 lines
16 KiB
Plaintext
//+------------------------------------------------------------------+
|
|
//| MultiSignal_Confluence.mq5 |
|
|
//| Combined Pivot + Harmonic + Candlestick |
|
|
//| High Probability Trader |
|
|
//| FIXED VERSION - Actually generates signals |
|
|
//+------------------------------------------------------------------+
|
|
#property copyright "Copyright 2025, Abbey Road Tech"
|
|
#property link "https://www.abbeyroadtech.com"
|
|
#property version "1.10"
|
|
#property indicator_chart_window
|
|
#property indicator_buffers 6
|
|
#property indicator_plots 6
|
|
|
|
//--- Plot settings
|
|
#property indicator_label1 "Pivot_Signal"
|
|
#property indicator_type1 DRAW_ARROW
|
|
#property indicator_color1 clrBlue
|
|
#property indicator_style1 STYLE_SOLID
|
|
#property indicator_width1 2
|
|
|
|
#property indicator_label2 "Harmonic_Signal"
|
|
#property indicator_type2 DRAW_ARROW
|
|
#property indicator_color2 clrGreen
|
|
#property indicator_style2 STYLE_SOLID
|
|
#property indicator_width2 2
|
|
|
|
#property indicator_label3 "Candlestick_Signal"
|
|
#property indicator_type3 DRAW_ARROW
|
|
#property indicator_color3 clrOrange
|
|
#property indicator_style3 STYLE_SOLID
|
|
#property indicator_width3 2
|
|
|
|
#property indicator_label4 "Confluence_Buy"
|
|
#property indicator_type4 DRAW_ARROW
|
|
#property indicator_color4 clrLime
|
|
#property indicator_style4 STYLE_SOLID
|
|
#property indicator_width4 3
|
|
|
|
#property indicator_label5 "Confluence_Sell"
|
|
#property indicator_type5 DRAW_ARROW
|
|
#property indicator_color5 clrRed
|
|
#property indicator_style5 STYLE_SOLID
|
|
#property indicator_width5 3
|
|
|
|
#property indicator_label6 "Confluence_Strength"
|
|
#property indicator_type6 DRAW_NONE
|
|
|
|
//--- Input Parameters
|
|
input group "=== Confluence Settings ==="
|
|
input int InpMinConfluence = 2; // Min signals for alert (1-3)
|
|
input bool InpRequireTrendAlignment = true; // All signals must agree
|
|
input int InpMaxSignalAge = 3; // Max bars for signal validity
|
|
input bool InpDebugMode = false; // Show debug prints
|
|
|
|
input group "=== Pivot Settings ==="
|
|
input bool InpUsePivots = true; // Enable pivot signals
|
|
input double InpPivotThreshold = 0.0010; // Min distance from pivot
|
|
|
|
input group "=== Harmonic Settings ==="
|
|
input bool InpUseHarmonics = true; // Enable harmonic signals
|
|
input double InpHarmonicSlack = 0.02; // Pattern tolerance
|
|
|
|
input group "=== Candlestick Settings ==="
|
|
input bool InpUseCandlesticks = true; // Enable candlestick signals
|
|
input double InpMinBodyRatio = 0.3; // Min body/wick ratio
|
|
|
|
//--- Buffers for display
|
|
double PivotSignalBuffer[];
|
|
double HarmonicSignalBuffer[];
|
|
double CandleSignalBuffer[];
|
|
double ConfluenceBuyBuffer[];
|
|
double ConfluenceSellBuffer[];
|
|
double ConfluenceStrengthBuffer[];
|
|
|
|
//--- Pivot levels
|
|
double pivotP, pivotR1, pivotR2, pivotS1, pivotS2;
|
|
datetime lastPivotCalc = 0;
|
|
|
|
//--- Global signal flags for current bar
|
|
int currentBuySignals = 0;
|
|
int currentSellSignals = 0;
|
|
string signalSources = "";
|
|
|
|
//+------------------------------------------------------------------+
|
|
//| Custom indicator initialization function |
|
|
//+------------------------------------------------------------------+
|
|
int OnInit()
|
|
{
|
|
//--- Set indicator buffers
|
|
SetIndexBuffer(0, PivotSignalBuffer, INDICATOR_DATA);
|
|
SetIndexBuffer(1, HarmonicSignalBuffer, INDICATOR_DATA);
|
|
SetIndexBuffer(2, CandleSignalBuffer, INDICATOR_DATA);
|
|
SetIndexBuffer(3, ConfluenceBuyBuffer, INDICATOR_DATA);
|
|
SetIndexBuffer(4, ConfluenceSellBuffer, INDICATOR_DATA);
|
|
SetIndexBuffer(5, ConfluenceStrengthBuffer, INDICATOR_DATA);
|
|
|
|
//--- Set arrow codes
|
|
PlotIndexSetInteger(0, PLOT_ARROW, 159);
|
|
PlotIndexSetInteger(1, PLOT_ARROW, 233);
|
|
PlotIndexSetInteger(2, PLOT_ARROW, 234);
|
|
PlotIndexSetInteger(3, PLOT_ARROW, 233);
|
|
PlotIndexSetInteger(4, PLOT_ARROW, 234);
|
|
|
|
//--- Initialize buffers
|
|
ArrayInitialize(PivotSignalBuffer, EMPTY_VALUE);
|
|
ArrayInitialize(HarmonicSignalBuffer, EMPTY_VALUE);
|
|
ArrayInitialize(CandleSignalBuffer, EMPTY_VALUE);
|
|
ArrayInitialize(ConfluenceBuyBuffer, EMPTY_VALUE);
|
|
ArrayInitialize(ConfluenceSellBuffer, EMPTY_VALUE);
|
|
ArrayInitialize(ConfluenceStrengthBuffer, 0);
|
|
|
|
Print("MultiSignal Confluence v1.10 Initialized");
|
|
Print("Settings: MinConfluence=", InpMinConfluence,
|
|
", Pivots=", InpUsePivots,
|
|
", Harmonics=", InpUseHarmonics,
|
|
", Candlesticks=", InpUseCandlesticks);
|
|
|
|
return(INIT_SUCCEEDED);
|
|
}
|
|
|
|
//+------------------------------------------------------------------+
|
|
//| Custom indicator deinitialization function |
|
|
//+------------------------------------------------------------------+
|
|
void OnDeinit(const int reason)
|
|
{
|
|
ObjectsDeleteAll(0, "Confluence_");
|
|
Print("MultiSignal Confluence Indicator Deinitialized");
|
|
}
|
|
|
|
//+------------------------------------------------------------------+
|
|
//| Calculate Pivot Levels |
|
|
//+------------------------------------------------------------------+
|
|
void CalculatePivots()
|
|
{
|
|
double prevHigh = iHigh(_Symbol, PERIOD_D1, 1);
|
|
double prevLow = iLow(_Symbol, PERIOD_D1, 1);
|
|
double prevClose = iClose(_Symbol, PERIOD_D1, 1);
|
|
|
|
pivotP = (prevHigh + prevLow + prevClose) / 3.0;
|
|
pivotR1 = (pivotP * 2) - prevLow;
|
|
pivotR2 = pivotP + (prevHigh - prevLow);
|
|
pivotS1 = (pivotP * 2) - prevHigh;
|
|
pivotS2 = pivotP - (prevHigh - prevLow);
|
|
|
|
lastPivotCalc = iTime(_Symbol, PERIOD_D1, 0);
|
|
}
|
|
|
|
//+------------------------------------------------------------------+
|
|
//| Check for Pivot Signals |
|
|
//+------------------------------------------------------------------+
|
|
void CheckPivotSignals(int bar)
|
|
{
|
|
if(!InpUsePivots) return;
|
|
|
|
// Recalculate pivots daily
|
|
datetime currentDay = iTime(_Symbol, PERIOD_D1, 0);
|
|
if(currentDay != lastPivotCalc)
|
|
CalculatePivots();
|
|
|
|
double close = iClose(_Symbol, _Period, bar);
|
|
double low = iLow(_Symbol, _Period, bar);
|
|
double high = iHigh(_Symbol, _Period, bar);
|
|
|
|
double threshold = InpPivotThreshold;
|
|
bool isBuy = false;
|
|
bool isSell = false;
|
|
|
|
// Buy at support
|
|
if((MathAbs(close - pivotS1) < threshold) ||
|
|
(MathAbs(close - pivotS2) < threshold) ||
|
|
(low <= pivotS1 && close > pivotS1) ||
|
|
(low <= pivotS2 && close > pivotS2))
|
|
{
|
|
isBuy = true;
|
|
PivotSignalBuffer[bar] = low - 10 * _Point;
|
|
currentBuySignals++;
|
|
signalSources += "P ";
|
|
if(InpDebugMode) Print("Pivot BUY signal at bar ", bar, " price ", close);
|
|
}
|
|
// Sell at resistance
|
|
else if((MathAbs(close - pivotR1) < threshold) ||
|
|
(MathAbs(close - pivotR2) < threshold) ||
|
|
(high >= pivotR1 && close < pivotR1) ||
|
|
(high >= pivotR2 && close < pivotR2))
|
|
{
|
|
isSell = true;
|
|
PivotSignalBuffer[bar] = high + 10 * _Point;
|
|
currentSellSignals++;
|
|
signalSources += "P ";
|
|
if(InpDebugMode) Print("Pivot SELL signal at bar ", bar, " price ", close);
|
|
}
|
|
else
|
|
{
|
|
PivotSignalBuffer[bar] = EMPTY_VALUE;
|
|
}
|
|
}
|
|
|
|
//+------------------------------------------------------------------+
|
|
//| Check for Candlestick Patterns |
|
|
//+------------------------------------------------------------------+
|
|
void CheckCandlestickSignals(int bar)
|
|
{
|
|
if(!InpUseCandlesticks) return;
|
|
|
|
double open = iOpen(_Symbol, _Period, bar);
|
|
double high = iHigh(_Symbol, _Period, bar);
|
|
double low = iLow(_Symbol, _Period, bar);
|
|
double close = iClose(_Symbol, _Period, bar);
|
|
|
|
double body = MathAbs(close - open);
|
|
double range = high - low;
|
|
double upperWick = high - MathMax(open, close);
|
|
double lowerWick = MathMin(open, close) - low;
|
|
|
|
if(range == 0) return;
|
|
|
|
bool isBuy = false;
|
|
bool isSell = false;
|
|
|
|
// Bullish Hammer
|
|
if(close > open && lowerWick > body * 2 && upperWick < body * 0.5)
|
|
{
|
|
if(lowerWick / range > InpMinBodyRatio)
|
|
{
|
|
isBuy = true;
|
|
CandleSignalBuffer[bar] = low - 15 * _Point;
|
|
currentBuySignals++;
|
|
signalSources += "C ";
|
|
if(InpDebugMode) Print("Hammer BUY at bar ", bar);
|
|
}
|
|
}
|
|
// Bearish Shooting Star
|
|
else if(close < open && upperWick > body * 2 && lowerWick < body * 0.5)
|
|
{
|
|
if(upperWick / range > InpMinBodyRatio)
|
|
{
|
|
isSell = true;
|
|
CandleSignalBuffer[bar] = high + 15 * _Point;
|
|
currentSellSignals++;
|
|
signalSources += "C ";
|
|
if(InpDebugMode) Print("Shooting Star SELL at bar ", bar);
|
|
}
|
|
}
|
|
// Bullish Engulfing
|
|
else if(bar + 1 < iBars(_Symbol, _Period))
|
|
{
|
|
double prevOpen = iOpen(_Symbol, _Period, bar + 1);
|
|
double prevClose = iClose(_Symbol, _Period, bar + 1);
|
|
|
|
if(prevClose < prevOpen && close > open &&
|
|
open <= prevClose && close >= prevOpen)
|
|
{
|
|
isBuy = true;
|
|
CandleSignalBuffer[bar] = low - 15 * _Point;
|
|
currentBuySignals++;
|
|
signalSources += "C ";
|
|
if(InpDebugMode) Print("Engulfing BUY at bar ", bar);
|
|
}
|
|
// Bearish Engulfing
|
|
else if(prevClose > prevOpen && close < open &&
|
|
open >= prevClose && close <= prevOpen)
|
|
{
|
|
isSell = true;
|
|
CandleSignalBuffer[bar] = high + 15 * _Point;
|
|
currentSellSignals++;
|
|
signalSources += "C ";
|
|
if(InpDebugMode) Print("Engulfing SELL at bar ", bar);
|
|
}
|
|
}
|
|
|
|
if(!isBuy && !isSell)
|
|
CandleSignalBuffer[bar] = EMPTY_VALUE;
|
|
}
|
|
|
|
//+------------------------------------------------------------------+
|
|
//| Check for Harmonic Patterns |
|
|
//+------------------------------------------------------------------+
|
|
void CheckHarmonicSignals(int bar, int rates_total)
|
|
{
|
|
if(!InpUseHarmonics) return;
|
|
if(bar + 4 >= rates_total) return;
|
|
|
|
// Get swing points
|
|
double X = iHigh(_Symbol, _Period, bar + 4);
|
|
double A = iLow(_Symbol, _Period, bar + 3);
|
|
double B = iHigh(_Symbol, _Period, bar + 2);
|
|
double C = iLow(_Symbol, _Period, bar + 1);
|
|
double D = iClose(_Symbol, _Period, bar);
|
|
|
|
double XA = MathAbs(A - X);
|
|
double AB = MathAbs(B - A);
|
|
double BC = MathAbs(C - B);
|
|
double CD = MathAbs(D - C);
|
|
|
|
if(XA == 0 || AB == 0 || BC == 0) return;
|
|
|
|
double ab_xa = AB / XA;
|
|
double bc_ab = BC / AB;
|
|
double cd_bc = CD / BC;
|
|
|
|
bool isBuy = false;
|
|
bool isSell = false;
|
|
|
|
// Bullish AB=CD (simplified)
|
|
if(X > A && A < B && B > C && C < D)
|
|
{
|
|
if(ab_xa >= 0.5 && ab_xa <= 0.8 &&
|
|
bc_ab >= 0.5 && bc_ab <= 0.8 &&
|
|
cd_bc >= 0.9 && cd_bc <= 1.1)
|
|
{
|
|
isBuy = true;
|
|
HarmonicSignalBuffer[bar] = D - 20 * _Point;
|
|
currentBuySignals++;
|
|
signalSources += "H ";
|
|
if(InpDebugMode) Print("Harmonic BUY at bar ", bar);
|
|
}
|
|
}
|
|
// Bearish AB=CD (simplified)
|
|
else if(X < A && A > B && B < C && C > D)
|
|
{
|
|
if(ab_xa >= 0.5 && ab_xa <= 0.8 &&
|
|
bc_ab >= 0.5 && bc_ab <= 0.8 &&
|
|
cd_bc >= 0.9 && cd_bc <= 1.1)
|
|
{
|
|
isSell = true;
|
|
HarmonicSignalBuffer[bar] = D + 20 * _Point;
|
|
currentSellSignals++;
|
|
signalSources += "H ";
|
|
if(InpDebugMode) Print("Harmonic SELL at bar ", bar);
|
|
}
|
|
}
|
|
|
|
if(!isBuy && !isSell)
|
|
HarmonicSignalBuffer[bar] = EMPTY_VALUE;
|
|
}
|
|
|
|
//+------------------------------------------------------------------+
|
|
//| Calculate Confluence |
|
|
//+------------------------------------------------------------------+
|
|
void CalculateConfluence(int bar)
|
|
{
|
|
// Reset counters
|
|
currentBuySignals = 0;
|
|
currentSellSignals = 0;
|
|
signalSources = "";
|
|
|
|
// Check all signal types
|
|
CheckPivotSignals(bar);
|
|
CheckHarmonicSignals(bar, iBars(_Symbol, _Period));
|
|
CheckCandlestickSignals(bar);
|
|
|
|
double confluenceStrength = 0;
|
|
|
|
// Strong Buy Confluence
|
|
if(currentBuySignals >= InpMinConfluence &&
|
|
(!InpRequireTrendAlignment || currentSellSignals == 0))
|
|
{
|
|
confluenceStrength = 0.7 + (currentBuySignals * 0.1);
|
|
if(confluenceStrength > 1.0) confluenceStrength = 1.0;
|
|
|
|
ConfluenceBuyBuffer[bar] = iLow(_Symbol, _Period, bar) - 30 * _Point;
|
|
ConfluenceSellBuffer[bar] = EMPTY_VALUE;
|
|
ConfluenceStrengthBuffer[bar] = confluenceStrength;
|
|
|
|
// Create visual label
|
|
string objName = "Confluence_Buy_" + IntegerToString(bar);
|
|
if(ObjectFind(0, objName) < 0)
|
|
{
|
|
datetime time = iTime(_Symbol, _Period, bar);
|
|
double price = iLow(_Symbol, _Period, bar);
|
|
|
|
ObjectCreate(0, objName, OBJ_TEXT, 0, time, price - 50 * _Point);
|
|
ObjectSetString(0, objName, OBJPROP_TEXT,
|
|
"BUY: " + signalSources + "(" + IntegerToString(currentBuySignals) + ")");
|
|
ObjectSetInteger(0, objName, OBJPROP_COLOR, clrLime);
|
|
ObjectSetInteger(0, objName, OBJPROP_FONTSIZE, 8);
|
|
}
|
|
|
|
if(InpDebugMode || bar == 0)
|
|
Print("CONFLUENCE BUY at bar ", bar, " Strength=", confluenceStrength,
|
|
" Signals=", currentBuySignals, " Sources=", signalSources);
|
|
}
|
|
// Strong Sell Confluence
|
|
else if(currentSellSignals >= InpMinConfluence &&
|
|
(!InpRequireTrendAlignment || currentBuySignals == 0))
|
|
{
|
|
confluenceStrength = -(0.7 + (currentSellSignals * 0.1));
|
|
if(confluenceStrength < -1.0) confluenceStrength = -1.0;
|
|
|
|
ConfluenceSellBuffer[bar] = iHigh(_Symbol, _Period, bar) + 30 * _Point;
|
|
ConfluenceBuyBuffer[bar] = EMPTY_VALUE;
|
|
ConfluenceStrengthBuffer[bar] = confluenceStrength;
|
|
|
|
// Create visual label
|
|
string objName = "Confluence_Sell_" + IntegerToString(bar);
|
|
if(ObjectFind(0, objName) < 0)
|
|
{
|
|
datetime time = iTime(_Symbol, _Period, bar);
|
|
double price = iHigh(_Symbol, _Period, bar);
|
|
|
|
ObjectCreate(0, objName, OBJ_TEXT, 0, time, price + 50 * _Point);
|
|
ObjectSetString(0, objName, OBJPROP_TEXT,
|
|
"SELL: " + signalSources + "(" + IntegerToString(currentSellSignals) + ")");
|
|
ObjectSetInteger(0, objName, OBJPROP_COLOR, clrRed);
|
|
ObjectSetInteger(0, objName, OBJPROP_FONTSIZE, 8);
|
|
}
|
|
|
|
if(InpDebugMode || bar == 0)
|
|
Print("CONFLUENCE SELL at bar ", bar, " Strength=", confluenceStrength,
|
|
" Signals=", currentSellSignals, " Sources=", signalSources);
|
|
}
|
|
else
|
|
{
|
|
ConfluenceBuyBuffer[bar] = EMPTY_VALUE;
|
|
ConfluenceSellBuffer[bar] = EMPTY_VALUE;
|
|
ConfluenceStrengthBuffer[bar] = 0;
|
|
}
|
|
|
|
// Update info panel on most recent bar
|
|
if(bar == 0)
|
|
UpdateInfoPanel();
|
|
}
|
|
|
|
//+------------------------------------------------------------------+
|
|
//| Update Info Panel |
|
|
//+------------------------------------------------------------------+
|
|
void UpdateInfoPanel()
|
|
{
|
|
string objName = "Confluence_InfoPanel";
|
|
|
|
if(ObjectFind(0, objName) < 0)
|
|
{
|
|
ObjectCreate(0, objName, OBJ_LABEL, 0, 0, 0);
|
|
ObjectSetInteger(0, objName, OBJPROP_CORNER, CORNER_LEFT_UPPER);
|
|
ObjectSetInteger(0, objName, OBJPROP_XDISTANCE, 10);
|
|
ObjectSetInteger(0, objName, OBJPROP_YDISTANCE, 30);
|
|
}
|
|
|
|
string text = "=== CONFLUENCE v1.10 ===\n";
|
|
text += "Buy: " + IntegerToString(currentBuySignals) + " " + signalSources + "\n";
|
|
text += "Sell: " + IntegerToString(currentSellSignals) + "\n";
|
|
|
|
if(currentBuySignals >= InpMinConfluence)
|
|
text += "STATUS: STRONG BUY\n";
|
|
else if(currentSellSignals >= InpMinConfluence)
|
|
text += "STATUS: STRONG SELL\n";
|
|
else
|
|
text += "STATUS: SCANNING...\n";
|
|
|
|
text += "Min: " + IntegerToString(InpMinConfluence) + "/3";
|
|
|
|
ObjectSetString(0, objName, OBJPROP_TEXT, text);
|
|
ObjectSetInteger(0, objName, OBJPROP_COLOR, clrWhite);
|
|
ObjectSetInteger(0, objName, OBJPROP_FONTSIZE, 10);
|
|
}
|
|
|
|
//+------------------------------------------------------------------+
|
|
//| Custom indicator iteration function |
|
|
//+------------------------------------------------------------------+
|
|
int OnCalculate(const int rates_total,
|
|
const int prev_calculated,
|
|
const datetime &time[],
|
|
const double &open[],
|
|
const double &high[],
|
|
const double &low[],
|
|
const double &close[],
|
|
const long &tick_volume[],
|
|
const long &volume[],
|
|
const int &spread[])
|
|
{
|
|
int start = (prev_calculated > 0) ? prev_calculated - 1 : 0;
|
|
|
|
for(int i = start; i < rates_total && !IsStopped(); i++)
|
|
{
|
|
CalculateConfluence(i);
|
|
}
|
|
|
|
return(rates_total);
|
|
}
|
|
//+------------------------------------------------------------------+
|