Voir comment télécharger gratuitement des robots de trading
Retrouvez-nous sur Facebook !
Rejoignez notre page de fans
Un script intéressant ?
Poster un lien vers celui-ci -
laisser les autres l'évaluer
Vous avez aimé le script ? Essayez-le dans le terminal MetaTrader 5
Vues:
84
Note:
(6)
Publié:
MTF NN.mq5 (27.81 KB) afficher
MQL5 Freelance Besoin d'un robot ou d'un indicateur basé sur ce code ? Commandez-le sur Freelance Aller sur Freelance

Oscillateur de confluence multi-cadres combinant Stochastique, RSI et MACD sur 3 cadres temporels.Utilisé pour identifier les entrées de tendance lorsque tous les indicateurs sont alignés (score >50 haussier, <-50 baissier ). Utilisé de préférence pour confirmer les configurations de continuation de tendance, les réactions de support/résistance et les conditions d'épuisement.


Au lieu de normaliser les valeurs, nous attribuons simplement un score. Je ne peux pas expliquer pourquoi, mais dans mon utilisation personnelle, c'est étonnamment efficace, en particulier pour détecter les divergences.




//+------------------------------------------------------------------+
//|MultiConfluence_Index.mq5 |
//|Indice Confluence Stoch+RSI+MACD |
//+------------------------------------------------------------------+
#property copyright "Multi-Confluence Index"
#property version   "1.00"
#property indicator_separate_window
#property indicator_buffers 6
#property indicator_plots   4

// Ligne principale de l'indice
#property indicator_label1  "Confluence Index"
#property indicator_type1   DRAW_LINE
#property indicator_color1  clrDodgerBlue
#property indicator_width1  3

// Ligne zéro
#property indicator_label2  "Zero Line"
#property indicator_type2   DRAW_LINE
#property indicator_color2  clrGray
#property indicator_width2  1
#property indicator_style2  STYLE_DOT

// Zone bullish extrême
#property indicator_label3  "Zone Bullish"
#property indicator_type3   DRAW_FILLING
#property indicator_color3  clrDarkGreen

// Zone baissière extrême
#property indicator_label4  "Zone Bearish"
#property indicator_type4   DRAW_FILLING
#property indicator_color4  clrDarkRed

//+------------------------------------------------------------------+
//| Paramètres d'entrée|
//+------------------------------------------------------------------+
input group "=== TIMEFRAMES ==="
input ENUM_TIMEFRAMES TF1 = PERIOD_CURRENT;   // Période 1 (rapide)
input ENUM_TIMEFRAMES TF2 = PERIOD_H1;        // Période 2 (moyenne)
input ENUM_TIMEFRAMES TF3 = PERIOD_H4;        // Période 3 (lente)

input group "=== PARAMETRES ==="
input int      Stoch_K        = 14;      // Stochastic K
input int      Stoch_D        = 3;       // Stochastique D
input int      Stoch_Slowing  = 3;       // Ralentissement de la stochastique
input int      RSI_Period     = 14;      // Période RSI
input int      MACD_Fast      = 12;      // MACD EMA Fast
input int      MACD_Slow      = 26;      // MACD EMA Slow
input int      MACD_Signal    = 9;       // Signal MACD

//+------------------------------------------------------------------+
//| Tampons|
//+------------------------------------------------------------------+
double IndexBuffer[];
double ZeroBuffer[];
double BullishZoneTop[];
double BullishZoneBottom[];
double BearishZoneTop[];
double BearishZoneBottom[];

// Manipulation des indicateurs
int handle_stoch_tf1, handle_stoch_tf2, handle_stoch_tf3;
int handle_rsi_tf1, handle_rsi_tf2, handle_rsi_tf3;
int handle_macd_tf1, handle_macd_tf2, handle_macd_tf3;

//+------------------------------------------------------------------+
//| Initialisation|
//+------------------------------------------------------------------+
int OnInit()
{
   // Tampons
   SetIndexBuffer(0, IndexBuffer, INDICATOR_DATA);
   SetIndexBuffer(1, ZeroBuffer, INDICATOR_DATA);
   SetIndexBuffer(2, BullishZoneTop, INDICATOR_DATA);
   SetIndexBuffer(3, BullishZoneBottom, INDICATOR_DATA);
   SetIndexBuffer(4, BearishZoneTop, INDICATOR_DATA);
   SetIndexBuffer(5, BearishZoneBottom, INDICATOR_DATA);
   
   // Configuration
   ArraySetAsSeries(IndexBuffer, true);
   ArraySetAsSeries(ZeroBuffer, true);
   ArraySetAsSeries(BullishZoneTop, true);
   ArraySetAsSeries(BullishZoneBottom, true);
   ArraySetAsSeries(BearishZoneTop, true);
   ArraySetAsSeries(BearishZoneBottom, true);
   
   // Ligne zéro
   ArrayInitialize(ZeroBuffer, 0.0);
   
   // Configuration des zones de remplissage
   PlotIndexSetInteger(2, PLOT_DRAW_BEGIN, 0);
   PlotIndexSetInteger(3, PLOT_DRAW_BEGIN, 0);
   
   // Création de poignées - STOCHASTIC
   handle_stoch_tf1 = iStochastic(_Symbol, TF1, Stoch_K, Stoch_D, Stoch_Slowing, MODE_SMA, STO_LOWHIGH);
   handle_stoch_tf2 = iStochastic(_Symbol, TF2, Stoch_K, Stoch_D, Stoch_Slowing, MODE_SMA, STO_LOWHIGH);
   handle_stoch_tf3 = iStochastic(_Symbol, TF3, Stoch_K, Stoch_D, Stoch_Slowing, MODE_SMA, STO_LOWHIGH);
   
   // Création de poignées - RSI
   handle_rsi_tf1 = iRSI(_Symbol, TF1, RSI_Period, PRICE_CLOSE);
   handle_rsi_tf2 = iRSI(_Symbol, TF2, RSI_Period, PRICE_CLOSE);
   handle_rsi_tf3 = iRSI(_Symbol, TF3, RSI_Period, PRICE_CLOSE);
   
   // Création de poignées - MACD
   handle_macd_tf1 = iMACD(_Symbol, TF1, MACD_Fast, MACD_Slow, MACD_Signal, PRICE_CLOSE);
   handle_macd_tf2 = iMACD(_Symbol, TF2, MACD_Fast, MACD_Slow, MACD_Signal, PRICE_CLOSE);
   handle_macd_tf3 = iMACD(_Symbol, TF3, MACD_Fast, MACD_Slow, MACD_Signal, PRICE_CLOSE);
   
   // Vérification des poignées
   if(handle_stoch_tf1 == INVALID_HANDLE || handle_stoch_tf2 == INVALID_HANDLE || handle_stoch_tf3 == INVALID_HANDLE ||
      handle_rsi_tf1 == INVALID_HANDLE || handle_rsi_tf2 == INVALID_HANDLE || handle_rsi_tf3 == INVALID_HANDLE ||
      handle_macd_tf1 == INVALID_HANDLE || handle_macd_tf2 == INVALID_HANDLE || handle_macd_tf3 == INVALID_HANDLE)
   {
      Print("ERROR: Impossible to create handles");
      return(INIT_FAILED);
   }
   
   // Nom et échelle
   IndicatorSetString(INDICATOR_SHORTNAME, "Multi-Confluence Index");
   IndicatorSetInteger(INDICATOR_DIGITS, 1);
   IndicatorSetDouble(INDICATOR_MINIMUM, -100);
   IndicatorSetDouble(INDICATOR_MAXIMUM, 100);
   
   // Niveaux
   IndicatorSetInteger(INDICATOR_LEVELS, 3);
   IndicatorSetDouble(INDICATOR_LEVELVALUE, 0, 0);
   IndicatorSetDouble(INDICATOR_LEVELVALUE, 1, 50);
   IndicatorSetDouble(INDICATOR_LEVELVALUE, 2, -50);
   
   IndicatorSetInteger(INDICATOR_LEVELCOLOR, 0, clrGray);
   IndicatorSetInteger(INDICATOR_LEVELCOLOR, 1, clrGreen);
   IndicatorSetInteger(INDICATOR_LEVELCOLOR, 2, clrRed);
   
   IndicatorSetInteger(INDICATOR_LEVELSTYLE, 0, STYLE_SOLID);
   IndicatorSetInteger(INDICATOR_LEVELSTYLE, 1, STYLE_DOT);
   IndicatorSetInteger(INDICATOR_LEVELSTYLE, 2, STYLE_DOT);
   
   Print("Multi-Confluence Index initialized - TF:", EnumToString(TF1), "/", EnumToString(TF2), "/", EnumToString(TF3));
   return(INIT_SUCCEEDED);
}

//+------------------------------------------------------------------+
//| Désinitialisation|
//+------------------------------------------------------------------+
void OnDeinit(const int reason)
{
   if(handle_stoch_tf1 != INVALID_HANDLE) IndicatorRelease(handle_stoch_tf1);
   if(handle_stoch_tf2 != INVALID_HANDLE) IndicatorRelease(handle_stoch_tf2);
   if(handle_stoch_tf3 != INVALID_HANDLE) IndicatorRelease(handle_stoch_tf3);
   if(handle_rsi_tf1 != INVALID_HANDLE) IndicatorRelease(handle_rsi_tf1);
   if(handle_rsi_tf2 != INVALID_HANDLE) IndicatorRelease(handle_rsi_tf2);
   if(handle_rsi_tf3 != INVALID_HANDLE) IndicatorRelease(handle_rsi_tf3);
   if(handle_macd_tf1 != INVALID_HANDLE) IndicatorRelease(handle_macd_tf1);
   if(handle_macd_tf2 != INVALID_HANDLE) IndicatorRelease(handle_macd_tf2);
   if(handle_macd_tf3 != INVALID_HANDLE) IndicatorRelease(handle_macd_tf3);
   
   Comment("");
}

//+------------------------------------------------------------------+
//| Calcul principal|
//+------------------------------------------------------------------+
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[])
{
   if(rates_total < 100)
      return(0);
   
   int limit = rates_total - prev_calculated;
   if(limit == 0) limit = 1;
   if(prev_calculated == 0) limit = rates_total - 100;
   
   // Tableaux pour les données (en tant que séries pour correspondre à l'indexation de la mémoire tampon)
   double stoch_k1[], stoch_d1[], stoch_k2[], stoch_d2[], stoch_k3[], stoch_d3[];
   double rsi1[], rsi2[], rsi3[];
   double macd_main1[], macd_sig1[], macd_main2[], macd_sig2[], macd_main3[], macd_sig3[];
   
   ArraySetAsSeries(stoch_k1, true);
   ArraySetAsSeries(stoch_d1, true);
   ArraySetAsSeries(stoch_k2, true);
   ArraySetAsSeries(stoch_d2, true);
   ArraySetAsSeries(stoch_k3, true);
   ArraySetAsSeries(stoch_d3, true);
   ArraySetAsSeries(rsi1, true);
   ArraySetAsSeries(rsi2, true);
   ArraySetAsSeries(rsi3, true);
   ArraySetAsSeries(macd_main1, true);
   ArraySetAsSeries(macd_sig1, true);
   ArraySetAsSeries(macd_main2, true);
   ArraySetAsSeries(macd_sig2, true);
   ArraySetAsSeries(macd_main3, true);
   ArraySetAsSeries(macd_sig3, true);
   
   // Copie des données - copie de suffisamment de barres
   int bars_to_copy = limit + 50;
   
   int copied = 0;
   copied = CopyBuffer(handle_stoch_tf1, 0, 0, bars_to_copy, stoch_k1);
   if(copied <= 0) { Print("ERROR: Failed to copy stoch_k1, code:", GetLastError()); return(prev_calculated); }
   
   if(CopyBuffer(handle_stoch_tf1, 1, 0, bars_to_copy, stoch_d1) <= 0) { Print("ERROR: Failed to copy stoch_d1"); return(prev_calculated); }
   if(CopyBuffer(handle_stoch_tf2, 0, 0, bars_to_copy, stoch_k2) <= 0) { Print("ERROR: Failed to copy stoch_k2"); return(prev_calculated); }
   if(CopyBuffer(handle_stoch_tf2, 1, 0, bars_to_copy, stoch_d2) <= 0) { Print("ERROR: Failed to copy stoch_d2"); return(prev_calculated); }
   if(CopyBuffer(handle_stoch_tf3, 0, 0, bars_to_copy, stoch_k3) <= 0) { Print("ERROR: Failed to copy stoch_k3"); return(prev_calculated); }
   if(CopyBuffer(handle_stoch_tf3, 1, 0, bars_to_copy, stoch_d3) <= 0) { Print("ERROR: Failed to copy stoch_d3"); return(prev_calculated); }
   
   if(CopyBuffer(handle_rsi_tf1, 0, 0, bars_to_copy, rsi1) <= 0) { Print("ERROR: Failed to copy rsi1"); return(prev_calculated); }
   if(CopyBuffer(handle_rsi_tf2, 0, 0, bars_to_copy, rsi2) <= 0) { Print("ERROR: Failed to copy rsi2"); return(prev_calculated); }
   if(CopyBuffer(handle_rsi_tf3, 0, 0, bars_to_copy, rsi3) <= 0) { Print("ERROR: Failed to copy rsi3"); return(prev_calculated); }
   
   if(CopyBuffer(handle_macd_tf1, 0, 0, bars_to_copy, macd_main1) <= 0) { Print("ERROR: Failed to copy macd_main1"); return(prev_calculated); }
   if(CopyBuffer(handle_macd_tf1, 1, 0, bars_to_copy, macd_sig1) <= 0) { Print("ERROR: Failed to copy macd_sig1"); return(prev_calculated); }
   if(CopyBuffer(handle_macd_tf2, 0, 0, bars_to_copy, macd_main2) <= 0) { Print("ERROR: Failed to copy macd_main2"); return(prev_calculated); }
   if(CopyBuffer(handle_macd_tf2, 1, 0, bars_to_copy, macd_sig2) <= 0) { Print("ERROR: Failed to copy macd_sig2"); return(prev_calculated); }
   if(CopyBuffer(handle_macd_tf3, 0, 0, bars_to_copy, macd_main3) <= 0) { Print("ERROR: Failed to copy macd_main3"); return(prev_calculated); }
   if(CopyBuffer(handle_macd_tf3, 1, 0, bars_to_copy, macd_sig3) <= 0) { Print("ERROR: Failed to copy macd_sig3"); return(prev_calculated); }
   
   Print("DEBUG: Copied ", copied, " bars, limit=", limit, " rates_total=", rates_total);
   
   // Calcul de l'index - i=0 est la barre la plus récente
   int calculated = 0;
   for(int i = 0; i < limit; i++)
   {
      // Contrôle de sécurité pour l'accès aux tableaux
      if(i >= ArraySize(stoch_k1) || i >= ArraySize(stoch_k2) || i >= ArraySize(stoch_k3))
      {
         Print("DEBUG: Skipping i=", i, " - stoch arrays too small");
         continue;
      }
      if(i >= ArraySize(rsi1) || i >= ArraySize(rsi2) || i >= ArraySize(rsi3))
      {
         Print("DEBUG: Skipping i=", i, " - rsi arrays too small");
         continue;
      }
      if(i >= ArraySize(macd_main1) || i >= ArraySize(macd_main2) || i >= ArraySize(macd_main3))
      {
         Print("DEBUG: Skipping i=", i, " - macd arrays too small");
         continue;
      }
      
      double score = 0.0;
      
      //=== STOCHASTIQUE =====
      // TF1
      if(stoch_k1[i] > stoch_d1[i])
         score += 11.0;
      else
         score -= 11.0;
      
      // TF2
      if(stoch_k2[i] > stoch_d2[i])
         score += 17.0;
      else
         score -= 17.0;
      
      // TF3
      if(stoch_k3[i] > stoch_d3[i])
         score += 17.0;
      else
         score -= 17.0;
      
      //=== RSI =====
      // TF1
      if(rsi1[i] > 50)
         score += 7.0;
      else
         score -= 7.0;
      
      // TF2
      if(rsi2[i] > 50)
         score += 11.0;
      else
         score -= 11.0;
      
      // TF3
      if(rsi3[i] > 50)
         score += 11.0;
      else
         score -= 11.0;
      
      //=== MACD =====
      // TF1
      if(macd_main1[i] > macd_sig1[i])
         score += 6.0;
      else
         score -= 6.0;
      
      // TF2
      if(macd_main2[i] > macd_sig2[i])
         score += 10.0;
      else
         score -= 10.0;
      
      // TF3
      if(macd_main3[i] > macd_sig3[i])
         score += 10.0;
      else
         score -= 10.0;
      
      // Stockage - i=0 est la barre actuelle
      IndexBuffer[i] = score;
      calculated++;
      
      if(i < 3)  // Debug pour les 3 premières barres
      {
         Print("DEBUG: Bar[", i, "] score=", score, " stoch1=", stoch_k1[i], " rsi1=", rsi1[i], " macd1=", macd_main1[i]);
      }
      
      // Zones colorées
      if(score > 50)
      {
         BullishZoneTop[i] = 100;
         BullishZoneBottom[i] = 50;
      }
      else
      {
         BullishZoneTop[i] = EMPTY_VALUE;
         BullishZoneBottom[i] = EMPTY_VALUE;
      }
      
      if(score < -50)
      {
         BearishZoneTop[i] = -50;
         BearishZoneBottom[i] = -100;
      }
      else
      {
         BearishZoneTop[i] = EMPTY_VALUE;
         BearishZoneBottom[i] = EMPTY_VALUE;
      }
   }
   
   Print("DEBUG: Calculated ", calculated, " bars out of ", limit);
   
   // Informations de débogage lors du premier calcul
   if(prev_calculated == 0)
   {
      string info = StringFormat("Calculation completed | Current index: %.1f", IndexBuffer[0]);
      Print(info);
      Comment(info);
   }
   
   return(rates_total);
}
//+------------------------------------------------------------------+



Traduit de l’anglais par MetaQuotes Ltd.
Code original : https://www.mql5.com/en/code/66295

i-N'importe quelle gamme i-N'importe quelle gamme

Indicateur de plage d'intervalles de temps arbitraires.

Alerte MA-Crossover Alerte MA-Crossover

Un simple indicateur sémaphore avec des alertes et la possibilité d'envoyer des signaux à une boîte aux lettres.

Simple_Price_EA Simple_Price_EA

L'Expert Advisor le plus simple qui analyse le mouvement du prix sur un nombre donné de barres et ouvre une position correspondante.

BrakeExp BrakeExp

Indicateur de tendance simple sous forme de NRTR