Retarder l'alerte de plusieurs secondes - page 2

 
OnTimer()
 
Merci eevviill, mais mes compétences sont trop compliquées. Je débute dans la programmation, ils sont autodidactes et j'ai du mal à comprendre certaines choses.
Merci pour tout, Massimo.
 
omissamf:
Merci eevviill, mais mes compétences sont trop compliquées. Je débute dans la programmation, ils sont autodidactes et j'ai du mal à comprendre certaines choses.
Merci pour tout, Massimo.
int seconds=3;

int OnInit()
  {  
   EventSetTimer(seconds);
 
   IndicatorBuffers(2);
   SetIndexBuffer(0, Buffer1);
   SetIndexEmptyValue(0, 0);
   SetIndexArrow(0, 241);
   SetIndexBuffer(1, Buffer2);
   SetIndexEmptyValue(1, 0);
   SetIndexArrow(1, 242);
   //initialize myPoint
   myPoint = Point();
   if(Digits() == 5 || Digits() == 3)
     {
      myPoint *= 10;
     }
   return(INIT_SUCCEEDED);
  }
//_____________________________________________
//_____________________________________________
int start()
{
return(0);
}

void OnTimer(){
     
      //Indicator Buffer 1
      if(iRSI(NULL, PERIOD_CURRENT, 2, PRICE_CLOSE, 0) < 30
      
      )
        {
         Buffer1[0] = Low[0] - iATR(NULL, PERIOD_CURRENT, 14, 0); //Set indicator value at Candlestick Low - Average True Range
         if(0 == 0 && Time[0] != time_alert) { myAlert("indicator", "Buy"); time_alert = Time[0]; } //Instant alert, only once per bar
        }
      else
        {
         Buffer1[0] = 0;
        }
      //Indicator Buffer 2
      if(iRSI(NULL, PERIOD_CURRENT, 2, PRICE_CLOSE, 0) > 70
     
      )
        {
         Buffer2[0] = High[0] + iATR(NULL, PERIOD_CURRENT, 14, 0); //Set indicator value at Candlestick High + Average True Range
         if(0 == 0 && Time[0] != time_alert) { myAlert("indicator", "Sell"); time_alert = Time[0]; } //Instant alert, only once per bar
        }
      else
        {
         Buffer2[0] = 0;
        }
     }
  
  }
 
Merci eevviill, votre code fonctionne, mais je ne suis pas du signal après trois secondes qui a ouvert la bougie, mais si, par exemple, RSI est au-dessus du niveau 70 après 30 secondes que la bougie est ouverte, le code laisse 3/2 encore et puis apporte la flèche.
Pour l'instant le code qui se rapproche le plus est celui qui m'a suggéré GumRai, mais me donne le signal et fixe l' ouverture de la bougie et non après 3 secondes.

Merci pour tout, Massimo.

int start(){
if (BarStart !=Time[0]) 
{
  BarStart = Time[0]; 
//This is the code suggested by GumRai. This works well, but the arrow appears and fixed the opening of the candle, instead of 3 seconds after its opening.
 

mais je ne suis pas dusignal aprèstrois secondesqui a ouvertla bougie

Il vaut mieux l'écrire en premier et non "j'ai besoin d'un signal toutes les 3 secondes".

 
extern int seconds=3;
int time_dif;
bool current_candle_alert_been;
int prev_bars;

int OnInit()
  { 
prev_bars=Bars;
 
   EventSetTimer(1);
   time_dif=int(TimeLocal()-TimeCurrent());
   ...


void OnTimer()
{
if(Bars!=prev_bars) current_candle_alert_been=false;
prev_bars=Bars;

if(current_candle_alert_been) return;
if(TimeLocal()-time_dif<Time[0]+seconds) return;
current_candle_alert_been=true;



...
 
   static datetime BarStart=0;
   static bool check=false;
   if(BarStart!=Time[0])
     {
      BarStart=Time[0];
      check=true;
     }
   if(check && TimeCurrent()>=Time[0]+3)
     {
      check=false;
      //Check Condition
     }

Cette vérification doit se faire au premier tick reçu qui est au moins 3 secondes après l'heure d'ouverture de la barre.

Notez que si la barre est ouverte depuis n secondes lorsque l'indicateur est initialisé et que n est >3, il sera vérifié à ce moment-là. Aussi, évidemment, cela ne fonctionnera pas avec les barres historiques.

 
GumRai:

Cette vérification doit s'effectuer au premier tick reçu qui est au moins 3 secondes après l'heure d'ouverture de la barre.

Notez que si la barre est ouverte depuis n secondes lorsque l'indicateur est initialisé et que n est >3, elle sera vérifiée à ce moment là. Aussi, évidemment, cela ne fonctionnera pas avec les barres historiques.

:))))

1)Je voudrais modifier ce code pour que l'alerte, au lieu d'apparaître à l'ouverture de la bougie, détecte les conditions après quelques secondes.

2)mais je ne suis pas dusignal aprèstrois secondesqui a ouvert labougie

P.S. Ne pas utiliser Time[0], utiliser Bars

 
eevviill:

:))))

1)Je voudrais modifier ce code pour que l'alerte, au lieu d'apparaître à l'ouverture de la bougie, détecte les conditions après quelques secondes.

2)mais je ne suis pas dusignal aprèstrois secondesqui a ouvert labougie


Quel est votre point de vue ?

eevviill:

:))))


P.S. Ne pas utiliser Time[0], utiliser Bars

Pourquoi pas ? Il n'y a rien de mal à utiliser Time[0] pour détecter une nouvelle barre.

 
Bonjour les gars, vous êtes géniaux ! !!
Je ne sais pas comment vous remercier pour votre coopération.
Le code posté eevviill fonctionne très bien, c'est ce que je voulais dire.
Le code GumRai par contre fait repeindre et donne le signal chaque fois que le RSI traverse les niveaux 30/70.
J'insère le code qui fonctionne selon les suggestions d' eevviill, en espérant qu'il servira un peu plus.

Merci pour tout, Massimo.


//+------------------------------------------------------------------+
//|                                                   Test Delay.mq4 |
//|                                                          Massimo |
//|                                             https://www.mql5.com |
//+------------------------------------------------------------------+
#property copyright "Massimo"
#property link      "https://www.mql5.com"
#property version   "1.00"
#property description ""

#include <stdlib.mqh>
#include <stderror.mqh>

//--- indicator settings
#property indicator_chart_window
#property indicator_buffers 2

#property  indicator_type1 DRAW_ARROW
#property  indicator_width1 1
#property  indicator_color1 0xFFAA00
#property  indicator_label1 "Buy"

#property  indicator_type2 DRAW_ARROW
#property  indicator_width2 1
#property  indicator_color2 0x0000FF
#property  indicator_label2 "Sell"


extern int seconds =3;
int time_dif;
bool current_candle_alert_been;
int prev_bars;



datetime time_alert; //used when sending alert
//--- indicator buffers
double Buffer1[];
double Buffer2[];

extern int Period1 = 2;
double myPoint; //initialized in OnInit

void myAlert(string type, string message)
  {
   if(type == "print")
      Print(message);
   else if(type == "error")
     {
      Print(type+" | Test @ "+Symbol()+","+Period()+" | "+message);
     }
   else if(type == "order")
     {
     }
   else if(type == "modify")
     {
     }
  }

//+------------------------------------------------------------------+
//| Custom indicator initialization function                         |
//+------------------------------------------------------------------+
int OnInit()
  {   
   prev_bars=Bars;
    EventSetTimer(1);
   time_dif=int(TimeLocal()-TimeCurrent());
   
   IndicatorBuffers(2);
   SetIndexBuffer(0, Buffer1);
   SetIndexEmptyValue(0, 0);
   SetIndexArrow(0, 241);
   SetIndexBuffer(1, Buffer2);
   SetIndexEmptyValue(1, 0);
   SetIndexArrow(1, 242);
   //initialize myPoint
   myPoint = Point();
   if(Digits() == 5 || Digits() == 3)
     {
      myPoint *= 10;
     }
   return(INIT_SUCCEEDED);
  }
//________________________________
 
int start()
{
return(0);
}

//_________________________________

void OnTimer(){
{
if(Bars!=prev_bars) current_candle_alert_been=false;
prev_bars=Bars;

if(current_candle_alert_been) return;
if(TimeLocal()-time_dif<Time[0]+seconds) return;
current_candle_alert_been=true;
     
      //Indicator Buffer 1
      if(iRSI(NULL, PERIOD_CURRENT, Period1, PRICE_CLOSE, 0) < 30
      
      )
        {
         Buffer1[0] = Low[0] - iATR(NULL, PERIOD_CURRENT, 14, 0); //Set indicator value at Candlestick Low - Average True Range
         if(0 == 0 && Time[0] != time_alert) { myAlert("indicator", "Buy"); time_alert = Time[0]; } //Instant alert, only once per bar
        }
      else
        {
         Buffer1[0] = 0;
        }
      //Indicator Buffer 2
      if(iRSI(NULL, PERIOD_CURRENT, Period1, PRICE_CLOSE, 0) > 70
     
      )
        {
         Buffer2[0] = High[0] + iATR(NULL, PERIOD_CURRENT, 14, 0); //Set indicator value at Candlestick High + Average True Range
         if(0 == 0 && Time[0] != time_alert) { myAlert("indicator", "Sell"); time_alert = Time[0]; } //Instant alert, only once per bar
        }
      else
        {
         Buffer2[0] = 0;
        }
     }
     }
 //-----------------------------------------------------------------------------------------------------------------------------
Raison: