Voir comment télécharger gratuitement des robots de trading
Retrouvez-nous sur Facebook !
Rejoignez notre page de fans
Rejoignez notre page de fans
Vous avez aimé le script ? Essayez-le dans le terminal MetaTrader 5
- Vues:
- 84
- Note:
- Publié:
-
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.
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
Indicateur de plage d'intervalles de temps arbitraires.
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
L'Expert Advisor le plus simple qui analyse le mouvement du prix sur un nombre donné de barres et ouvre une position correspondante.
BrakeExp
Indicateur de tendance simple sous forme de NRTR

