Как найти бар, открывающий новый час?

 
Как заставить работать индикатор только при появлении нового бара, а не при помощи функции IndicatorCounted().?
Помогите грамотно найти новый день и найти бары окрывающие каждыйновый час?
 
KING:
Помогите грамотно найти новый день и найти бары окрывающие каждыйновый час?

Это струдом но сделано.

Кто подскажет как избежть пересчета индикатора на каждом овом цикле? А заставить считаться только на каждом новом баре?

 
попробуй через iVolume, но тогда с анализом исторических данных можешь попрощаться...
 

Такая конструкция:

static int prevtime=0; 

void start() {


   if(Time[0] != prevtime) 
      {
         // Считаем показания индикатора
       }
    prevtime=Time[0];


return;
}
поможет?
 
sergeev:
попробуй через iVolume, но тогда с анализом исторических данных можешь попрощаться...

Не понял.

goldtrader:

Такая конструкция:

static int prevtime=0; 

void start() {


   if(Time[0] != prevtime) 
      {
         // Считаем показания индикатора
       }
    prevtime=Time[0];


return;
}
поможет?

Да наверно такая конструкция будет самая оптимальная. Спасибо.

 
goldtrader:

Такая конструкция:

static int prevtime=0; 

void start() {


   if(Time[0] != prevtime) 
      {
         // Считаем показания индикатора
       }
    prevtime=Time[0];


return;
}
поможет?

Минутку. А если запустить индикатор в 00:00, он заработает? Вроде же нет.

 
KING:
Как заставить работать индикатор только при появлении нового бара, а не при помощи функции IndicatorCounted().?
Помогите грамотно найти новый день и найти бары окрывающие каждыйновый час?


Если грамотно то так можно


 
static datetime  New_Day_DateTime  = 0 ;  // новый день
static datetime  New_Hour_DateTime = 0 ; // новый час
 
void init()
{
 
 
 
/*
// 1-й одна проблема если будете перезапускать программу 
// она начинает отсчет с этого момента
// при каждом запуске программы переменная сбрасывается , а это криво!
 
         New_Day_DateTime = iTime(Symbol(),PERIOD_D1,0);   // НОВЫЙ ДЕНЬ наступил
         New_Hour_DateTime = iTime(Symbol(),PERIOD_H1,0);   // НОВЫЙ ЧАС наступил
*/
 
 
//--------------
// 2-й это лечиться если сохранять как глобальную переменную
// или писать на диск в файл
 
  // лечим проблему , теперь только при первом старте переменна создается
  if ( GlobalVariableCheck("gNew_Day_DateTime") == false )
  {
      GlobalVariableSet("gNew_Day_DateTime",iTime(Symbol(),PERIOD_D1,0));
  }  
  else
  {
      New_Day_DateTime = GlobalVariableGet("gNew_Day_DateTime");
  }
 
  if ( GlobalVariableCheck("gNew_Hour_DateTime") == false )
  {
      GlobalVariableSet("gNew_Hour_DateTime",iTime(Symbol(),PERIOD_H1,0));
  }  
  else
  {
      New_Hour_DateTime = GlobalVariableGet("gNew_Hour_DateTime");
  }
}
 
 
 
void start() 
{
   if( iTime(Symbol(),PERIOD_D1,0) != New_Day_DateTime       )
   {
         New_Day_DateTime = iTime(Symbol(),PERIOD_D1,0);   // НОВЫЙ ДЕНЬ наступил
         GlobalVariableSet("gNew_Day_DateTime",New_Day_DateTime); // в таком режиме намного надежней код - если перезапускать не влияет
   }
 
   if( iTime(Symbol(),PERIOD_D1,0) != New_Hour_DateTime     )
   {
         New_Hour_DateTime = iTime(Symbol(),PERIOD_H1,0);   // НОВЫЙ ЧАС наступил
         GlobalVariableSet("gNew_Hour_DateTime",New_Hour_DateTime );// в таком режиме намного надежней код - если перезапускать не влияет
   }
   return;
}
 
KING:
sergeev:
попробуй через iVolume, но тогда с анализом исторических данных можешь попрощаться...

Не понял.

goldtrader:

Такая конструкция:

static int prevtime=0; 

void start() {


   if(Time[0] != prevtime) 
      {
         // Считаем показания индикатора
       }
    prevtime=Time[0];


return;
}
поможет?

Да наверно такая конструкция будет самая оптимальная. Спасибо.





такая конструкция работает только на том ТФ на котором стоит советник!

и увы новый день она найдет только на D1

а новый час только на H1

 

В своё время встретилась та же проблема отслеживания момента начала нового бара именно в индикаторе. Сразу же обнаружился некий "подводный камень". Вышеуказанная конструкция на самом деле самая надежная для демо/реала, однако не работает в визуальном режиме, если индикатор просто прицеплен к графику, а не вызывается из эксперта через iCustom( ). Индикатор "не понимает" функцию IsVisualMode( ) (по крайней мере, в 209-й сборке; в более новых не проверял). Поэтому приходится использовать комбинированный метод с использованием внешней логической переменной, явно указывающей на визуальный режим. Если она "истина", т.е. происходит тестирование индикатора в визуальном режиме, переключение на новый бар происходит по условию "Volume <= 1" ИЛИ "общее число баров (Bars) на графике изменилось на 1". Если она "ложь", то используется вышеописанный трюк со временем. Код из индикатора, весящего более 100 кб, выдрать довольно затруднительно, поэтому надеюсь, что словесного описания вкупе со встроенной справкой по языку (топики Bars, iBars( ), Volume, iVolume( ), Time[], iTime( )) будет вполне достаточно.

Пользуясь случаем, хотел бы высказать пожелание разработчикам решить проблему с функцией IsVisualMode( ) в индикаторе в будущих релизах МТ, если она почему-либо не решена в сборках новее 209-й.

 
YuraZ писал (а):

такая конструкция работает только на том ТФ на котором стоит советник!



Речь не о советнике а о индикаторе.

 
if(Volume[0]<=1)
{
// строим индюк
}
То есть в анализе ты можешь использовать только приход первого тика
Причина обращения: