Индикатор Разные вопросы - страница 5

 
Marco vd Heijden:
Пожалуйста, опишите, что вы пытаетесь сделать.

Извините за путаницу.

Мне нужно установить 3'EventSetMillisecondTimer', как показано ниже (вы сказали, что это не работает...). Есть ли альтернативный способ, пожалуйста?

EventSetMillisecondTimer( 10   ); // 1st will read in 10   | if won't read try next
EventSetMillisecondTimer( 250  ); // 2nd will read in 250  | if won't read try next
EventSetMillisecondTimer( 1250 ); // 3rd will read in 1250 | if read then stop reading till next PERIOD_M5

Лучший.

 

Таймер устанавливается только один раз в функции OnInit().

Если вы хотите провести повторную инициализацию, вам нужно сначала убить старый таймер, что обычно происходит в функции OnDeinit().

Как я уже сказал, в качестве альтернативы можно использовать счетчик.

Если вы поместите код, например, в 10-миллисекундный таймер, то код будет выполняться каждые 10 миллисекунд.

Это, скорее всего, приведет к зависанию вашего терминала, потому что это слишком быстро.

int counter;
//+------------------------------------------------------------------+
//| Expert initialization function                                   |
//+------------------------------------------------------------------+
int OnInit()
  {
//--- create timer
   EventSetTimer(1);// 1 second

//---
   return(INIT_SUCCEEDED);
  }
//+------------------------------------------------------------------+
//| Expert deinitialization function                                 |
//+------------------------------------------------------------------+
void OnDeinit(const int reason)
  {
//--- destroy timer
   EventKillTimer();

  }
//+------------------------------------------------------------------+
//| Expert tick function                                             |
//+------------------------------------------------------------------+
void OnTick()
  {
//---

  }
//+------------------------------------------------------------------+
//| Timer function                                                   |
//+------------------------------------------------------------------+
void OnTimer()
  {
//--- increment counter
   counter++;
//--- comment status on the chart
   Comment(IntegerToString(counter));  
//--- switch timer  
   switch(counter)
     {
      case 60:
         Alert(" 1 Minute ");
         // Do Something...
         break;
      case 300:
         Alert(" 5 Minutes ");
         // Do Something...
         break;
      case 900:
         Alert(" 15 Minutes ");
         // Do Something...
         counter=0;// Reset counter on highest value.
         break;
     }
// end switch timer    
   if(counter>900)
     {
      counter=0;// Safety Mechanism
     }
  }
//+------------------------------------------------------------------+

Обратите внимание, что одна минута срабатывает только один раз, то есть не каждую минуту.

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

Если вы хотите, например, срабатывать каждую минуту, вам придется добавить код для 60 секунд, для 120 секунд, для 180 секунд и т.д.

Отметка 15 минут будет срабатывать каждые 15 минут, потому что она устанавливает счетчик на ноль.


Какой механизм вы хотите использовать, какой код вы хотите запускать на таймерных интервалах?

Чего вы пытаетесь достичь?
 

void OnTimer()
  {
   static int counter=0;
   static int next1m=60;
   static int next5m=300;
   static int next15m=900;
//--- increment counter
   counter++;
//--- comment status on the chart
   Comment(IntegerToString(counter));  
//--- timer
   if(counter==next1m)
         {
         Alert(" 1 Minute ");
         // Do Something...
         next1m+=60;
         }
   if(counter==next5m)
         {
         Alert(" 5 Minutes ");
         // Do Something...
         next5m+=300;
         }
   if(counter==next15m)
         {
         Alert(" 15 Minutes ");
         // Do Something...
         counter=0;// Reset counter on highest value.
         next1m=60;
         next5m=300;
         }
  }

Хорошая идея Марко.

Вы можете сделать что-то вроде этого для срабатывания через каждый временной интервал

 

Marco vd Heijden:

Какой механизм вы хотите использовать, какой код вы хотите запускать на временных интервалах?

Чего вы пытаетесь достичь?
Спасибо за отличный комментарий, который гораздо более четко объясняет оператор 'switch' и временные интервалы.

Еще раз отличный комментарий, большое спасибо.

//---

Теперь мне нужно дать вам информацию о моем индикаторе.
Потому что, возможно, я не описал, что меня беспокоит, (но ваш последний комментарий все больше и больше помогает мне)...

...мой индикатор работает так, как я хотел (/ хочет ).

Индикатор работает следующим образом:

автоматически перемещает / показывает вперед 'VLINE' (какой я хочу)
показывает прошлую неделю 'VLINE'(какую я хочу)
не пересекаются линии периодов (какие я хочу)
постоянное обновление (с интервалами) только один раз в каждый следующий ПЕРИОД_**'s (какой я хочу)
и многое другое...
еще раз СПЕЦИАЛЬНОЕ СПАСИБО Marco и whroeder1 (не только помогли мне, но и многому научили).

Я должен описать свою проблему на примере:

Я открываю график EURUSD и прикрепляю свой индикатор к графику, и он работает идеально, как я и хотел, перемещает / показывает вперед (даже мимо) VLINE, я могу изменить ПЕРИОД ВРЕМЕНИ и автоматически интервалы адаптируются к этому ПЕРИОДУ (что я и хотел).

Где же проблема моего индикатора? // Может быть, это не проблема, но для обновления требуется немного больше "неактуального" времени.

Если я выбираю 'EventSetMillisecondTimer( 10 );' и затем меняю TIMEFRAME PERIODs на любой TIMEFRAME PERIODs и почти не вижу (когда это происходит) загрузки новых VLINE'ов на график (какой я хочу).

В это время, если я меняю EURUSD на "другие символы (например, GBPUSD и т.д.)", мой индикатор не загружает полные VLINE'ы. Это просто проблема (/ для меня).

Иначе: Если я выбираю 'EventSetMillisecondTimer( 1250 );', я не вижу никаких проблем с загрузкой. Все работает отлично.
Но вотпроблема (/ для меня) это занимает немного больше "нерелевантных" времен - когда я меняю TIMEFRAME PERIODs.

Так что если вы понимаете меня так ясно, пожалуйста, найдите время, чтобы прокомментировать (и помочь мне, как я могу решить эту проблему) или вы не понимаете меня так ясно, не тратьте свое время, пожалуйста.

Много и много ценю ваши комментарии - Marco & whroeder1


(ПРИМЕЧАНИЕ: Я не использую 'switch operator' - потому что ваш #18 комментарий лучше, чем все, что я обновляю его и работаю над ним - и он очень полезен для меня)

(Английский не является моим родным языком)

 

Keith Watford:

Отличная работа Марко.

Вы можете сделать что-то вроде этого, чтобы срабатывать на каждом временном интервале

Кит тоже молодец :)

Это действительно очень помогло мне, я буду использовать это в моем следующем индикаторе.

Всего наилучшего.

 

Не знаю, как другие, но меня отвлекает и раздражает ваше сочетание шрифта, цветов, жирного и курсивного начертания. На самом деле, я не мог потрудиться прочитать этот пост.

Max Enrik:
Спасибо за отличный комментарий, который гораздо более четко объясняет оператор 'switch' и временные интервалы.

Еще раз отличный комментарий, большое спасибо.

//---

Теперь мне нужно дать вам информацию о моем индикаторе.
Потому что, возможно, я не описал, что меня беспокоит, (но ваш последний комментарий все больше и больше помогает мне)...

...мой индикатор работает так, как я хотел (/ хочет ).

Индикатор работает следующим образом:

автоматически перемещает / показывает вперед 'VLINE' (какой я хочу)
показывает прошлую неделю 'VLINE'(какую я хочу)
не пересекаются линии периодов (какие я хочу)
постоянное обновление (с интервалами) только один раз в каждый следующий ПЕРИОД_**'s (какой я хочу)
и многое другое...
еще раз СПЕЦИАЛЬНОЕ СПАСИБО Marco и whroeder1 (не только помогли мне, но и многому научили).

Я должен описать свою проблему на примере:

Я открываю график EURUSD и прикрепляю свой индикатор к графику, и он работает идеально, как я и хотел, перемещает / показывает вперед (даже мимо) VLINE, я могу изменить ПЕРИОД ВРЕМЕНИ и автоматически интервалы адаптируются к этому ПЕРИОДУ (что я и хотел).

Где же проблема моего индикатора? // Может быть, это не проблема, но для обновления требуется немного больше "неактуального" времени.

Если я выбираю 'EventSetMillisecondTimer( 10 );' и затем меняю TIMEFRAME PERIODs на любой TIMEFRAME PERIODs и почти не вижу (когда это происходит) загрузки новых VLINE'ов на график (какой я хочу).

В это время, если я меняю EURUSD на "другие символы (например, GBPUSD и т.д.)", мой индикатор не загружает полные VLINE'ы. Это просто проблема (/ для меня).

Иначе: Если я выбираю 'EventSetMillisecondTimer( 1250 );', я не вижу никаких проблем с загрузкой. Все работает отлично.
Но вотпроблема (/ для меня) это занимает немного больше "нерелевантных" времен - когда я меняю TIMEFRAME PERIODs.

Так что если вы понимаете меня так ясно, пожалуйста, найдите время, чтобы прокомментировать (и помочь мне, как я могу решить эту проблему) или вы не понимаете меня так ясно, не тратьте свое время, пожалуйста.

Много и много ценю ваши комментарии - Marco & whroeder1


(ПРИМЕЧАНИЕ: я не использую 'switch operator' - потому что ваш #18 комментарий лучше, чем все, что я обновляю его и работаю над ним - и он очень полезен для меня)

(Английский не является моим родным языком)

 

Если речь идет о переключении таймфреймов, то таймер - не лучший вариант, потому что таймер уничтожается при переключении фрейма.

Вы можете создавать свои линии в функции OnInit(), а обновлять их в функциях OnTick() или OnTimer().

Вот пример:

//+------------------------------------------------------------------+
//| Expert initialization function                                   |
//+------------------------------------------------------------------+
int OnInit()
  {
//--- create timer
   EventSetTimer(60);
//--- playsound
   PlaySound("alert2.wav");  
//--- create moving timeline
   ObjectCreate(0,"Time",OBJ_VLINE,0,TimeCurrent(),0);  
//--- detect period
   switch(Period())
     {
      case PERIOD_M1:
        MessageBox("Switched to 1 Minute Frame");
        //Do Something...
        ObjectCreate(0,"1-Minute",OBJ_VLINE,0,Time[0],0);
         break;
      case PERIOD_M5:
        MessageBox("Switched to 5 Minutes Frame");
        //Do Something...
        ObjectCreate(0,"5-Minutes",OBJ_VLINE,0,Time[0],0);
         break;
      case PERIOD_M15:
        MessageBox("Switched to 15 Minutes Frame");
        //Do Something...
        ObjectCreate(0,"15-Minutes",OBJ_VLINE,0,Time[0],0);
         break;
      case PERIOD_M30:
        MessageBox("Switched to 30 Minutes Frame");
        //Do Something...
        ObjectCreate(0,"30-Minutes",OBJ_VLINE,0,Time[0],0);
         break;
      case PERIOD_H1:
        MessageBox("Switched to 1 Hour Frame");
        //Do Something...
        ObjectCreate(0,"1-Hour",OBJ_VLINE,0,Time[0],0);
         break;
      case PERIOD_H4:
        MessageBox("Switched to 4 Hour Frame");
        //Do Something...
        ObjectCreate(0,"4-Hour",OBJ_VLINE,0,Time[0],0);
         break;
      case PERIOD_D1:
        MessageBox("Switched to Daily Frame");
        //Do Something...
        ObjectCreate(0,"Daily",OBJ_VLINE,0,Time[0],0);
         break;
      case PERIOD_W1:
        MessageBox("Switched to Weekly Frame");
        //Do Something...
        ObjectCreate(0,"Weekly",OBJ_VLINE,0,Time[0],0);
         break;
      case PERIOD_MN1:
        MessageBox("Switched to Monthly Frame");
        //Do Something...
        ObjectCreate(0,"Monthly",OBJ_VLINE,0,Time[0],0);
         break;
     }
//---
   return(INIT_SUCCEEDED);
  }
//+------------------------------------------------------------------+
//| Expert deinitialization function                                 |
//+------------------------------------------------------------------+
void OnDeinit(const int reason)
  {
//--- destroy timer
   EventKillTimer();
//--- delete objects
   ObjectsDeleteAll(0,0,-1);
  }
//+------------------------------------------------------------------+
//| Expert tick function                                             |
//+------------------------------------------------------------------+
void OnTick()
  {
//---
   ObjectMove(0,"Time",0,TimeCurrent(),0);// Update timeline
  }
//+------------------------------------------------------------------+
//| Timer function                                                   |
//+------------------------------------------------------------------+
void OnTimer()
  {
//---
   ObjectMove(0,"Time",0,TimeCurrent(),0);// Update timeline
  }
//+------------------------------------------------------------------+
Также обратите внимание на ObjectsDeleteAll() в функции OnDeint(). Это позволит убедиться, что все удалено до того, как будет создано снова на новом кадре.
 

Кроме того, если вы хотите обновлять линии каждый раз, когда возникает новая свеча, вы можете объединить пример на предыдущей странице с последним, чтобы получить это:

datetime M1,M5,M15,M30,H1,H4,D1,W1,MN1;
//+------------------------------------------------------------------+
//| Expert initialization function                                   |
//+------------------------------------------------------------------+
int OnInit()
  {
//--- create timer
   EventSetTimer(60);
//--- playsound
   PlaySound("alert2.wav");
//--- load open times
   M1=iTime(Symbol(),PERIOD_M1,0);
   M5=iTime(Symbol(),PERIOD_M5,0);
   M15=iTime(Symbol(),PERIOD_M15,0);
   M30=iTime(Symbol(),PERIOD_M30,0);
   H1=iTime(Symbol(),PERIOD_H1,0);
   H4=iTime(Symbol(),PERIOD_H4,0);
   D1=iTime(Symbol(),PERIOD_D1,0);
   W1=iTime(Symbol(),PERIOD_W1,0);
   MN1=iTime(Symbol(),PERIOD_MN1,0);  
//--- create moving timeline
   ObjectCreate(0,"Time",OBJ_VLINE,0,TimeCurrent(),0);  
//--- detect period
   switch(Period())
     {
      case PERIOD_M1:
        MessageBox("Switched to 1 Minute Frame");
        //Do Something...
        ObjectCreate(0,"1-Minute",OBJ_VLINE,0,Time[0],0);
        M1=Time[0];// store current time
         break;
      case PERIOD_M5:
        MessageBox("Switched to 5 Minutes Frame");
        //Do Something...
        ObjectCreate(0,"5-Minutes",OBJ_VLINE,0,Time[0],0);
        M5=Time[0];// store current time
         break;
      case PERIOD_M15:
        MessageBox("Switched to 15 Minutes Frame");
        //Do Something...
        ObjectCreate(0,"15-Minutes",OBJ_VLINE,0,Time[0],0);
        M15=Time[0];// store current time
         break;
      case PERIOD_M30:
        MessageBox("Switched to 30 Minutes Frame");
        //Do Something...
        ObjectCreate(0,"30-Minutes",OBJ_VLINE,0,Time[0],0);
        M30=Time[0];// store current time
         break;
      case PERIOD_H1:
        MessageBox("Switched to 1 Hour Frame");
        //Do Something...
        ObjectCreate(0,"1-Hour",OBJ_VLINE,0,Time[0],0);
        H1=Time[0];// store current time
         break;
      case PERIOD_H4:
        MessageBox("Switched to 4 Hour Frame");
        //Do Something...
        ObjectCreate(0,"4-Hour",OBJ_VLINE,0,Time[0],0);
        H4=Time[0];// store current time
         break;
      case PERIOD_D1:
        MessageBox("Switched to Daily Frame");
        //Do Something...
        ObjectCreate(0,"Daily",OBJ_VLINE,0,Time[0],0);
        D1=Time[0];// store current time
         break;
      case PERIOD_W1:
        MessageBox("Switched to Weekly Frame");
        //Do Something...
        ObjectCreate(0,"Weekly",OBJ_VLINE,0,Time[0],0);
        W1=Time[0];// store current time
         break;
      case PERIOD_MN1:
        MessageBox("Switched to Monthly Frame");
        //Do Something...
        ObjectCreate(0,"Monthly",OBJ_VLINE,0,Time[0],0);
        MN1=Time[0];// store current time
         break;
     }
//---
   return(INIT_SUCCEEDED);
  }
//+------------------------------------------------------------------+
//| Expert deinitialization function                                 |
//+------------------------------------------------------------------+
void OnDeinit(const int reason)
  {
//--- destroy timer
   EventKillTimer();
//--- delete objects
   ObjectsDeleteAll(0,0,-1);
  }
//+------------------------------------------------------------------+
//| Expert tick function                                             |
//+------------------------------------------------------------------+
void OnTick()
  {
//--- update timeline
   ObjectMove(0,"Time",0,TimeCurrent(),0);
//--- check for new candles
   if(M1!=iTime(Symbol(),PERIOD_M1,0))
    {
     Alert("New candle on M1");
     ObjectMove(0,"1-Minute",0,iTime(Symbol(),PERIOD_M1,0),0); // Move line
     M1=iTime(Symbol(),PERIOD_M1,0);// Overwrite old with new value
    }  
   if(M5!=iTime(Symbol(),PERIOD_M5,0))
    {
     Alert("New candle on M5");
     M1=iTime(Symbol(),PERIOD_M5,0);// Overwrite old with new value
    }      
   if(M15!=iTime(Symbol(),PERIOD_M15,0))
    {
     Alert("New candle on M15");
     M15=iTime(Symbol(),PERIOD_M15,0);// Overwrite old with new value
    }
   if(M30!=iTime(Symbol(),PERIOD_M30,0))
    {
     Alert("New candle on M30");
     M30=iTime(Symbol(),PERIOD_M30,0);// Overwrite old with new value
    }
    // and so on to MN1...        
  }
//+------------------------------------------------------------------+
//| Timer function                                                   |
//+------------------------------------------------------------------+
void OnTimer()
  {
//---
   ObjectMove(0,"Time",0,TimeCurrent(),0);// Update timeline
  }
//+------------------------------------------------------------------+
Если есть еще какие-либо проблемы, пожалуйста, покажите код.
 
Keith Watford:

Не знаю, как другие, но меня отвлекает и раздражает ваше сочетание шрифта, цветов, жирного и курсивного начертания. На самом деле я не мог потрудиться прочитать этот пост.

Мне было сказано, не тратьте свое время.
 

Max Enrik:

Кит Уотфорд:

Не знаю, как другие, но меня отвлекает и раздражает ваше сочетание шрифта, цветов, жирного и курсивного начертания. На самом деле, я не мог потрудиться прочитать этот пост.


Мне было сказано, не тратьте свое время.
Почему вы просто процитировали мой пост без каких-либо комментариев?