Rejoindre la communauté
banner_forum
Devenez membre de la plus grande
communauté francophone sur le Forex
Partagez, échangez et apprenez en gagnant des crédits sur votre compte de trading

Ajout d'une alerte sur indicateur 3 lignes brisées - 3 line strike

  • Noob58

    Bonjour à tous,

    Je ne suis pas du tout à l'aise avec la programmation et j'aurais aimé ajouter une alerte visuelle et sonore à l'indicateur ci-dessous.
    Il s'agirait d'être informé à chaque signal, apparition de flèche.

    Serait-il possible d'avoir un peu d'aide sur le sujet svp?

    Merci à vous.

    Code
    //https://www.tradingview.com/script/admGhVz7-3-Line-Strike-TTF/ #property copyright "Bugscoder Studio" #property link "https://www.bugscoder.com/" #property version "1.00" #property strict #property indicator_chart_window #property indicator_buffers 2 #property indicator_type1 DRAW_ARROW #property indicator_width1 1 #property indicator_color1 clrDarkSeaGreen #property indicator_type2 DRAW_ARROW #property indicator_width2 1 #property indicator_color2 clrTomato input bool showBear3LS = true; //Show Bearish 3 Line Strike input bool showBull3LS = true; //Show Bullish 3 Line Strike double up[], dn[]; string obj_prefix = "3LS_"; int OnInit() { IndicatorDigits(Digits); SetIndexLabel(0, "up"); SetIndexBuffer(0, up); SetIndexArrow(0, 233); SetIndexLabel(1, "dn"); SetIndexBuffer(1, dn); SetIndexArrow(1, 234); return(INIT_SUCCEEDED); } 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 startPos = rates_total-prev_calculated-4; if (startPos <= 1) { startPos = 1; } for(int pos=startPos; pos>=0; pos--) { up[pos] = is3LSBull(pos) ? Low[pos] : EMPTY_VALUE; dn[pos] = is3LSBear(pos) ? High[pos] : EMPTY_VALUE; } return(rates_total); } void OnDeinit(const int reason) { ObjectsDeleteAll(0, obj_prefix); } int price_diff(double price1, double price2, string _pair = "", bool abs = true) { if (_pair == "") { _pair = Symbol(); } double _point = MarketInfo(_pair, MODE_POINT); double p = price1-price2; if (abs == true) { p = MathAbs(p); } p = NormalizeDouble(p/_point, 0); string s = DoubleToStr(p, 0); int diff = (int) StringToInteger(s); return diff; } int getCandleColorIndex(int pos) { return (Close[pos] > Open[pos]) ? 1 : (Close[pos] < Open[pos]) ? -1 : 0; } bool isEngulfing(int pos, bool checkBearish) { bool ret = false; int sizePrevCandle = price_diff(Close[pos+1], Open[pos+1]); int sizeCurrentCandle = price_diff(Close[pos], Open[pos]); bool isCurrentLagerThanPrevious = sizeCurrentCandle > sizePrevCandle ? true : false; if (checkBearish == true) { bool isGreenToRed = getCandleColorIndex(pos) < 0 && getCandleColorIndex(pos+1) > 0 ? true : false; ret = isCurrentLagerThanPrevious == true && isGreenToRed == true ? true : false; } else { bool isRedToGreen = getCandleColorIndex(pos) > 0 && getCandleColorIndex(pos+1) < 0 ? true : false; ret = isCurrentLagerThanPrevious == true && isRedToGreen == true ? true : false; } return ret; } bool isBearishEngulfuing(int pos) { return isEngulfing(pos, true); } bool isBullishEngulfuing(int pos) { return isEngulfing(pos, false); } bool is3LSBear(int pos) { bool ret = false; bool is3LineSetup = ((getCandleColorIndex(pos+1) > 0) && (getCandleColorIndex(pos+2) > 0) && (getCandleColorIndex(pos+3) > 0)) ? true : false; ret = (is3LineSetup == true && isBearishEngulfuing(pos)) ? true : false; return ret; } bool is3LSBull(int pos) { bool ret = false; bool is3LineSetup = ((getCandleColorIndex(pos+1) < 0) && (getCandleColorIndex(pos+2) < 0) && (getCandleColorIndex(pos+3) < 0)) ? true : false; ret = (is3LineSetup == true && isBullishEngulfuing(pos)) ? true : false; return ret; }
  • ogaepinay — en réponse à Noob58 dans son message #127995

    Bonjour, essayez ceci.
    Code
    //https://www.tradingview.com/script/admGhVz7-3-Line-Strike-TTF/ #property copyright "Bugscoder Studio" #property link "https://www.bugscoder.com/" #property version "1.00" #property strict #property indicator_chart_window #property indicator_buffers 2 #property indicator_type1 DRAW_ARROW #property indicator_width1 1 #property indicator_color1 clrDarkSeaGreen #property indicator_type2 DRAW_ARROW #property indicator_width2 1 #property indicator_color2 clrTomato input bool showBear3LS = true; //Show Bearish 3 Line Strike input bool showBull3LS = true; //Show Bullish 3 Line Strike double up[], dn[]; string obj_prefix = "3LS_"; datetime PreviousBarTime1;//Ajout bool NewBar=false;//Ajout int OnInit() { IndicatorDigits(Digits); SetIndexLabel(0, "up"); SetIndexBuffer(0, up); SetIndexArrow(0, 233); SetIndexLabel(1, "dn"); SetIndexBuffer(1, dn); SetIndexArrow(1, 234); PreviousBarTime1=Time[0];//Ajout return(INIT_SUCCEEDED); } 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 startPos = rates_total-prev_calculated-4; if (startPos <= 1) { startPos = 1; } for(int pos=startPos; pos>=0; pos--) { up[pos] = is3LSBull(pos) ? Low[pos] : EMPTY_VALUE; dn[pos] = is3LSBear(pos) ? High[pos] : EMPTY_VALUE; } //Ajout if(PreviousBarTime1<Time[0]){PreviousBarTime1=Time[0];NewBar=true;} else {NewBar=false;} if(up[1]!=EMPTY_VALUE&&NewBar==true){Alert("Line-Strike (", Symbol(), ", M ", Period(), ") - BUY!!!");} if(dn[1]!=EMPTY_VALUE&&NewBar==true){Alert("Line-Strike (", Symbol(), ", M ", Period(), ") - Sell!!!");} return(rates_total); } void OnDeinit(const int reason) { ObjectsDeleteAll(0, obj_prefix); } int price_diff(double price1, double price2, string _pair = "", bool abs = true) { if (_pair == "") { _pair = Symbol(); } double _point = MarketInfo(_pair, MODE_POINT); double p = price1-price2; if (abs == true) { p = MathAbs(p); } p = NormalizeDouble(p/_point, 0); string s = DoubleToStr(p, 0); int diff = (int) StringToInteger(s); return diff; } int getCandleColorIndex(int pos) { return (Close[pos] > Open[pos]) ? 1 : (Close[pos] < Open[pos]) ? -1 : 0; } bool isEngulfing(int pos, bool checkBearish) { bool ret = false; int sizePrevCandle = price_diff(Close[pos+1], Open[pos+1]); int sizeCurrentCandle = price_diff(Close[pos], Open[pos]); bool isCurrentLagerThanPrevious = sizeCurrentCandle > sizePrevCandle ? true : false; if (checkBearish == true) { bool isGreenToRed = getCandleColorIndex(pos) < 0 && getCandleColorIndex(pos+1) > 0 ? true : false; ret = isCurrentLagerThanPrevious == true && isGreenToRed == true ? true : false; } else { bool isRedToGreen = getCandleColorIndex(pos) > 0 && getCandleColorIndex(pos+1) < 0 ? true : false; ret = isCurrentLagerThanPrevious == true && isRedToGreen == true ? true : false; } return ret; } bool isBearishEngulfuing(int pos) { return isEngulfing(pos, true); } bool isBullishEngulfuing(int pos) { return isEngulfing(pos, false); } bool is3LSBear(int pos) { bool ret = false; bool is3LineSetup = ((getCandleColorIndex(pos+1) > 0) && (getCandleColorIndex(pos+2) > 0) && (getCandleColorIndex(pos+3) > 0)) ? true : false; ret = (is3LineSetup == true && isBearishEngulfuing(pos)) ? true : false; return ret; } bool is3LSBull(int pos) { bool ret = false; bool is3LineSetup = ((getCandleColorIndex(pos+1) < 0) && (getCandleColorIndex(pos+2) < 0) && (getCandleColorIndex(pos+3) < 0)) ? true : false; ret = (is3LineSetup == true && isBullishEngulfuing(pos)) ? true : false; return ret; }
    J'ai ajouté la détection de nouveau chandelier (pour que l'alerte ne sonne qu'une fois et mis Ajout en commentaire pour ce que j'ai ajouté). Ensuite la fonction Alert ne sonne pas en testeur(dans mes souvenirs) et pour finir "if(up[1]!=EMPTY_VALUE&&NewBar==true){Alert....... Si up[Chandelier 1 ici] est diffèrent d'EMPTY VALUE et nouveau chandelier = true alors achat(à vous de mettre ce que vous voulez). Idem pour dn[Chandelier que vous voulez].
    Modifié le 2022-11-16 06:06:51 par ogaepinay
  • Noob58 — en réponse à ogaepinay dans son message #127998

    Merci pour ce retour rapide !! :)

    Je test tout ça aujourd'hui et vous fais un retour dès que possible.

    Bonne journée
  • Noob58 — en réponse à Noob58 dans son message #127999

    Test concluant.

    J'ai ajouté l'alerte sonore ainsi que la possibilité de l'activer ou non.

    Merci encore
  • kaliloup

    De rien, j'ai retrouvé mon compte maintenant. Sans indiscrétion en quel timefrime trader vous avec cet indicateur ? Pour l'instant je fais de test en M5.
  • Noob58

    Je fais aussi des tests en M5. Je passerais ensuite sur M15.
    Je le test avec les indicateurs RSI TMA, SMMA 200/50/21
  • kaliloup

    Avez vous compris comment il fonctionne et les calculs qu'il réalise?
  • kaliloup

    il y à surement moyen de l'optimiser parce que ca me parait assez faible pour l'instant. Il calcule les 3 dernières bougie, si les 3 dernières sont haussières ou baissières, il calcul les 2 dernières et si le corp de la bougie 1 entre Open et Close (ou inversement) et supérieur au corp de la bougie 2 alors il met une flèche(Fleche baissière après 3 hausse et flèche haussière après 3 baisses).
    Modifié le 2022-11-17 09:40:38 par kaliloup
  • Noob58 — en réponse à kaliloup dans son message #128008

    Bonjour Kaliloup,

    Effectivement, il peut être optimisé :)
    J'avais compris le fonctionnement basique. Mais merci pour les précisions de calculs, qui me permette de comprendre un peu mieux la "faiblesse" de cet indicateur.

    Si vous avez des idées pour l'optimiser, je suis preneur ;)

    J'en avais trouvé un autre sur le site:
    https://www.forexfactory.com/thread/881970-high-level-accuracy-method-3-bar-pattern-indicatoralert
    Mais j'essaye encore de comprendre comment le configurer...
  • kaliloup

    Je suis un peu pris en ce moment mais je vais regarder ce que je peux faire sur l'indicateur si j'ai un peu de temps. Pour le deuxième indicateur, j'ai télécharger le fichier compilé, sans la source ca va être compliqué de l'analyser correctement mais je vais regarder aussi.
  • kaliloup

    Bonjour, j'ai regardé un peu plus l'indicateur et pour ma part (du moins sur du petit timefrime m5, m15) il ne me donnera rien de bon, même avec un ou plusieurs indicateurs ajoutés. J'ai survolé le deuxième, mais je n'accroche pas non plus. Je t'envoi quand même ce que j'ai testé pour ton indicateur.

    Code
    #property copyright "Bugscoder Studio" #property link "https://www.bugscoder.com/" #property version "1.00" #property strict #property indicator_chart_window #property indicator_buffers 2 #property indicator_type1 DRAW_ARROW #property indicator_width1 1 #property indicator_color1 clrDarkSeaGreen #property indicator_type2 DRAW_ARROW #property indicator_width2 1 #property indicator_color2 clrTomato input bool showBear3LS = true; //Show Bearish 3 Line Strike input bool showBull3LS = true; //Show Bullish 3 Line Strike //input int NbrCandleForCalcul = 3;//entre 3 et 7 enum nbrCandleForCalcul { A1=3,//3 B1=4,//4 C1=5,//5 D1=6,//6 E1=7,//7 }; input nbrCandleForCalcul NbrCandleForCalcul=A1;//Number of candle for calcul enum nbrCandleForHeight { A2=2,//2 B2=3,//3 C2=4,//4 D2=5,//5 E2=6,//6 }; input nbrCandleForHeight NbrCandleForHeight=A2;//Number of candle for Height //input int NbrCandleForHeight = 2;//entre 2 et 6 double up[], dn[]; string obj_prefix = "3LS_"; datetime PreviousBarTime1;//Ajout bool NewBar=false;//Ajout int OnInit() { IndicatorDigits(Digits); SetIndexLabel(0, "up"); SetIndexBuffer(0, up); SetIndexArrow(0, 233); SetIndexLabel(1, "dn"); SetIndexBuffer(1, dn); SetIndexArrow(1, 234); PreviousBarTime1=Time[0];//Ajout return(INIT_SUCCEEDED); } 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 startPos = rates_total-prev_calculated-4; if (startPos <= 1) { startPos = 1; } for(int pos=startPos; pos>=0; pos--) { up[pos] = is3LSBull(pos) ? Low[pos] : EMPTY_VALUE; dn[pos] = is3LSBear(pos) ? High[pos] : EMPTY_VALUE; } //Ajout if(PreviousBarTime1<Time[0]){PreviousBarTime1=Time[0];NewBar=true;} else {NewBar=false;} if(up[1]!=EMPTY_VALUE&&NewBar==true){Alert("Line-Strike (", Symbol(), ", M ", Period(), ") - BUY!!!");} if(dn[1]!=EMPTY_VALUE&&NewBar==true){Alert("Line-Strike (", Symbol(), ", M ", Period(), ") - Sell!!!");} return(rates_total); } void OnDeinit(const int reason) { ObjectsDeleteAll(0, obj_prefix); } int price_diff(double price1, double price2, string _pair = "", bool abs = true) { if (_pair == "") { _pair = Symbol(); } double _point = MarketInfo(_pair, MODE_POINT); double p = price1-price2; if (abs == true) { p = MathAbs(p); } p = NormalizeDouble(p/_point, 0); string s = DoubleToStr(p, 0); int diff = (int) StringToInteger(s); return diff; } int getCandleColorIndex(int pos) { return (Close[pos] > Open[pos]) ? 1 : (Close[pos] < Open[pos]) ? -1 : 0; } bool isEngulfing(int pos, bool checkBearish) { bool ret = false; int sizePrevCandle5 = price_diff(Close[pos+5], Open[pos+5]); int sizePrevCandle4 = price_diff(Close[pos+4], Open[pos+4]); int sizePrevCandle3 = price_diff(Close[pos+3], Open[pos+3]); int sizePrevCandle2 = price_diff(Close[pos+2], Open[pos+2]); int sizePrevCandle = price_diff(Close[pos+1], Open[pos+1]); int sizeCurrentCandle = price_diff(Close[pos], Open[pos]); bool isCurrentLagerThanPrevious = false; if(NbrCandleForHeight==2){isCurrentLagerThanPrevious = sizeCurrentCandle > sizePrevCandle ? true : false;} if(NbrCandleForHeight==3){isCurrentLagerThanPrevious = sizeCurrentCandle > sizePrevCandle && sizePrevCandle > sizePrevCandle2 ? true : false;} if(NbrCandleForHeight==4){isCurrentLagerThanPrevious = sizeCurrentCandle > sizePrevCandle && sizePrevCandle > sizePrevCandle2 && sizePrevCandle2 > sizePrevCandle3 ? true : false;} if(NbrCandleForHeight==5){isCurrentLagerThanPrevious = sizeCurrentCandle > sizePrevCandle && sizePrevCandle > sizePrevCandle2 && sizePrevCandle2 > sizePrevCandle3 && sizePrevCandle3 > sizePrevCandle4 ? true : false;} if(NbrCandleForHeight==6){isCurrentLagerThanPrevious = sizeCurrentCandle > sizePrevCandle && sizePrevCandle > sizePrevCandle2 && sizePrevCandle2 > sizePrevCandle3 && sizePrevCandle3 > sizePrevCandle4 && sizePrevCandle4 > sizePrevCandle5 ? true : false;} if (checkBearish == true) { bool isGreenToRed = getCandleColorIndex(pos) < 0 && getCandleColorIndex(pos+1) > 0 ? true : false; ret = isCurrentLagerThanPrevious == true && isGreenToRed == true ? true : false; } else { bool isRedToGreen = getCandleColorIndex(pos) > 0 && getCandleColorIndex(pos+1) < 0 ? true : false; ret = isCurrentLagerThanPrevious == true && isRedToGreen == true ? true : false; } return ret; } bool isBearishEngulfuing(int pos) { return isEngulfing(pos, true); } bool isBullishEngulfuing(int pos) { return isEngulfing(pos, false); } bool is3LSBear(int pos) { bool ret = false; bool is3LineSetup=false; if(NbrCandleForCalcul==3){is3LineSetup = ((getCandleColorIndex(pos+1) > 0) && (getCandleColorIndex(pos+2) > 0) && (getCandleColorIndex(pos+3) > 0)) ? true : false;} if(NbrCandleForCalcul==4){is3LineSetup = ((getCandleColorIndex(pos+1) > 0) && (getCandleColorIndex(pos+2) > 0) && (getCandleColorIndex(pos+3) > 0)&& (getCandleColorIndex(pos+4) > 0)) ? true : false;} if(NbrCandleForCalcul==5){is3LineSetup = ((getCandleColorIndex(pos+1) > 0) && (getCandleColorIndex(pos+2) > 0) && (getCandleColorIndex(pos+3) > 0)&& (getCandleColorIndex(pos+5) > 0) && (getCandleColorIndex(pos+5) > 0)) ? true : false;} if(NbrCandleForCalcul==6){is3LineSetup = ((getCandleColorIndex(pos+1) > 0) && (getCandleColorIndex(pos+2) > 0) && (getCandleColorIndex(pos+3) > 0)&& (getCandleColorIndex(pos+5) > 0) && (getCandleColorIndex(pos+5) > 0)&& (getCandleColorIndex(pos+6) > 0)) ? true : false;} if(NbrCandleForCalcul==7){is3LineSetup = ((getCandleColorIndex(pos+1) > 0) && (getCandleColorIndex(pos+2) > 0) && (getCandleColorIndex(pos+3) > 0)&& (getCandleColorIndex(pos+5) > 0) && (getCandleColorIndex(pos+5) > 0)&& (getCandleColorIndex(pos+6) > 0)) ? true : false;} ret = (is3LineSetup == true && isBearishEngulfuing(pos)) ? true : false; return ret; } bool is3LSBull(int pos) { bool ret = false; bool is3LineSetup=false; if(NbrCandleForCalcul==3){is3LineSetup = ((getCandleColorIndex(pos+1) < 0) && (getCandleColorIndex(pos+2) < 0) && (getCandleColorIndex(pos+3) < 0)) ? true : false;} if(NbrCandleForCalcul==4){is3LineSetup = ((getCandleColorIndex(pos+1) < 0) && (getCandleColorIndex(pos+2) < 0) && (getCandleColorIndex(pos+3) < 0)&& (getCandleColorIndex(pos+4) < 0)) ? true : false;} if(NbrCandleForCalcul==5){is3LineSetup = ((getCandleColorIndex(pos+1) < 0) && (getCandleColorIndex(pos+2) < 0) && (getCandleColorIndex(pos+3) < 0)&& (getCandleColorIndex(pos+5) < 0) && (getCandleColorIndex(pos+5) < 0)) ? true : false;} if(NbrCandleForCalcul==6){is3LineSetup = ((getCandleColorIndex(pos+1) < 0) && (getCandleColorIndex(pos+2) < 0) && (getCandleColorIndex(pos+3) < 0)&& (getCandleColorIndex(pos+5) < 0) && (getCandleColorIndex(pos+5) < 0)&& (getCandleColorIndex(pos+6) < 0)) ? true : false;} if(NbrCandleForCalcul==7){is3LineSetup = ((getCandleColorIndex(pos+1) < 0) && (getCandleColorIndex(pos+2) < 0) && (getCandleColorIndex(pos+3) < 0)&& (getCandleColorIndex(pos+5) < 0) && (getCandleColorIndex(pos+5) < 0)&& (getCandleColorIndex(pos+6) < 0)) ? true : false;} ret = (is3LineSetup == true && isBullishEngulfuing(pos)) ? true : false; return ret; }

    Tu vois, j'ai ajouté quelques chandeliers pour les calculs et j'ai fais quelques test dans l'optimisation en faisant varier les paramètres mais ca na pas donné grand chose.
    J'ai aussi testé avec quelques autres indicateurs pour voir si je pouvait filtrer avec mon Expert.
    Si tu veux tester par toi même et que tu as du mal à coder télécharge mon Expert (la version démo n'a qu'un indicateur mais elle est gratuite et pour essayer d'optimiser c'est déjà ca). Bon courage.