Задержите сигнал тревоги на несколько секунд - страница 2

 
OnTimer()
 
Спасибо eevviill, но мои навыки слишком сложны. Я начинаю заниматься программированием, это самоучитель , и мне трудно понять некоторые вещи.
Спасибо за все, Массимо.
 
omissamf:
Спасибо eevviill, но мои навыки слишком сложны. Я начинаю заниматься программированием, это самоучитель , и мне трудно понять некоторые вещи.
Спасибо за все, Массимо.
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;
        }
     }
  
  }
 
Спасибо eevviill, ваш код работает, но я не от сигнала после трех секунд , что открыл свечу, но если, например, RSI находится выше уровня 70 после 30 секунд , что свеча открыта, код позволяет 3/2 еще , а затем приносит вверх стрелку.
Пока что ближе всего код , который предложил мне GumRai, но дает мне сигнал и устанавливает открытие свечи , а не через 3 секунды.

Спасибо за все, Массимо.

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.
 

но я не отсигнала через3 секунды,который открываетсвечу.

Лучше сначала написать это, а не "мне нужен сигнал каждые 3 секунды".

 
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
     }

Проверка должна выполняться при первом полученном тике, который происходит не менее чем через 3 секунды после открытия бара.

Обратите внимание, что если при инициализации индикатора бар был открыт n секунд и n > 3, то проверка будет произведена в это время. Также, очевидно, он не будет работать с историческими барами.

 
GumRai:

Проверка должна выполняться при первом полученном тике, который происходит как минимум через 3 секунды после времени открытия бара.

Обратите внимание, что если при инициализации индикатора бар был открыт n секунд и n >3, то он будет проверен в это время. Также, очевидно, он не будет работать с историческими барами.

:))))

1)Я хотел бы модифицировать этот код так, чтобы алерт, вместо того, чтобы появляться на открытии свечи, определял условия через несколько секунд.

2)но я не получаюсигнал через3 секунды после открытиясвечи.

P.S. Не используйте Time[0], используйте Bars.

 
eevviill:

:))))

1)я хотел бы изменить этот код так, чтобы алерт, вместо того, чтобы появляться на открытии свечи, определял условия через несколько секунд.

2)но я не получаюсигнал черезтри секунды после открытиясвечи.


Что вы имеете в виду?

eevviill:

:))))


P.S. Не используйте Time[0], используйте Bars

Почему нет? Нет ничего плохого в использовании Time[0] для обнаружения нового бара.

 
Привет, ребята, вы великолепны !!!
Я не знаю, как поблагодарить вас за сотрудничество.
Код, размещенный eevviill, работает очень хорошо, это то, что я имел в виду.
Код GumRai вместо этого делает перерисовку и дает сигнал всякий раз , когда RSI пересекает уровни 30/70.
Я вставляю рабочий код в соответствии с предложениями eevviill, надеясь, что он еще послужит.

Спасибо за все, Массимо.


//+------------------------------------------------------------------+
//|                                                   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;
        }
     }
     }
 //-----------------------------------------------------------------------------------------------------------------------------