Вы упускаете торговые возможности:
- Бесплатные приложения для трейдинга
- 8 000+ сигналов для копирования
- Экономические новости для анализа финансовых рынков
Регистрация
Вход
Вы принимаете политику сайта и условия использования
Если у вас нет учетной записи, зарегистрируйтесь
Пожалуйста, опишите, что вы пытаетесь сделать.
Извините за путаницу.
Мне нужно установить 3'EventSetMillisecondTimer', как показано ниже (вы сказали, что это не работает...). Есть ли альтернативный способ, пожалуйста?
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 миллисекунд.
Это, скорее всего, приведет к зависанию вашего терминала, потому что это слишком быстро.
//+------------------------------------------------------------------+
//| 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:
Какой механизм вы хотите использовать, какой код вы хотите запускать на временных интервалах?
Чего вы пытаетесь достичь?Еще раз отличный комментарий, большое спасибо.
//---
...мой индикатор работает так, как я хотел (/ хочет ).
Индикатор работает следующим образом:
Я должен описать свою проблему на примере:
Я открываю график EURUSD и прикрепляю свой индикатор к графику, и он работает идеально, как я и хотел, перемещает / показывает вперед (даже мимо) VLINE, я могу изменить ПЕРИОД ВРЕМЕНИ и автоматически интервалы адаптируются к этому ПЕРИОДУ (что я и хотел).
Где же проблема моего индикатора? // Может быть, это не проблема, но для обновления требуется немного больше "неактуального" времени.
Если я выбираю 'EventSetMillisecondTimer( 10 );' и затем меняю TIMEFRAME PERIODs на любой TIMEFRAME PERIODs и почти не вижу (когда это происходит) загрузки новых VLINE'ов на график (какой я хочу).
Много и много ценю ваши комментарии - Marco & whroeder1
(ПРИМЕЧАНИЕ: Я не использую 'switch operator' - потому что ваш #18 комментарий лучше, чем все, что я обновляю его и работаю над ним - и он очень полезен для меня)
(Английский не является моим родным языком)
Keith Watford:
Отличная работа Марко.
Вы можете сделать что-то вроде этого, чтобы срабатывать на каждом временном интервале
Кит тоже молодец :)
Это действительно очень помогло мне, я буду использовать это в моем следующем индикаторе.
Всего наилучшего.
Не знаю, как другие, но меня отвлекает и раздражает ваше сочетание шрифта, цветов, жирного и курсивного начертания. На самом деле, я не мог потрудиться прочитать этот пост.
Еще раз отличный комментарий, большое спасибо.
//---
...мой индикатор работает так, как я хотел (/ хочет ).
Индикатор работает следующим образом:
Я должен описать свою проблему на примере:
Я открываю график EURUSD и прикрепляю свой индикатор к графику, и он работает идеально, как я и хотел, перемещает / показывает вперед (даже мимо) VLINE, я могу изменить ПЕРИОД ВРЕМЕНИ и автоматически интервалы адаптируются к этому ПЕРИОДУ (что я и хотел).
Где же проблема моего индикатора? // Может быть, это не проблема, но для обновления требуется немного больше "неактуального" времени.
Если я выбираю 'EventSetMillisecondTimer( 10 );' и затем меняю TIMEFRAME PERIODs на любой TIMEFRAME PERIODs и почти не вижу (когда это происходит) загрузки новых VLINE'ов на график (какой я хочу).
Много и много ценю ваши комментарии - 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
}
//+------------------------------------------------------------------+
Кроме того, если вы хотите обновлять линии каждый раз, когда возникает новая свеча, вы можете объединить пример на предыдущей странице с последним, чтобы получить это:
//+------------------------------------------------------------------+
//| 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
}
//+------------------------------------------------------------------+
Не знаю, как другие, но меня отвлекает и раздражает ваше сочетание шрифта, цветов, жирного и курсивного начертания. На самом деле я не мог потрудиться прочитать этот пост.
Max Enrik:
Не знаю, как другие, но меня отвлекает и раздражает ваше сочетание шрифта, цветов, жирного и курсивного начертания. На самом деле, я не мог потрудиться прочитать этот пост.