помогите передавать значения (rates[0].high и rates[0].low) текущего бара не каждый тик ,а через определённое время или через определённое кол-во тиков.

 

Помогите передавать значения (rates[0].high и rates[0].low) текущего бара  не каждый тик ,а через определённое время или через определённое кол-во тиков.

Уже вторые сутки сижу,  при открытии свечи, в функцию надо передать значения high текущей формирующей свечи, но не каждый тик, а например каждые  60 с  или через каждые 20 пунктов.Если не набралось заданное время то оставлять значения high = предыдущему по времени или значению.

 
Evgeny Raspaev:

Помогите передавать значения (rates[0].high и rates[0].low) текущего бара  не каждый тик ,а через определённое время или через определённое кол-во тиков.

Уже вторые сутки сижу,  при открытии свечи, в функцию надо передать значения high текущей формирующей свечи, но не каждый тик, а например каждые  60 с  или через каждые 20 пунктов.Если не набралось заданное время то оставлять значения high = предыдущему по времени или значению.

Сформулируйте задачу полностью.

Просто "фильтровать" работу 60-секундным таймером или 20-пунктовым фильтром можно, но не понятно — зачем это делать.

 
Andrey Khatimlianskii:

Сформулируйте задачу полностью.

Просто "фильтровать" работу 60-секундным таймером или 20-пунктовым фильтром можно, но не понятно — зачем это делать.


Как определить начало очередного бара? (Это бывает необходимо, чтобы узнать, что предыдущий бар только что сформировался.) Существует несколько способов.


Первый способ основан на проверке количества баров:

static int prevbars = 0;
...
if(prevbars == Bars) return(0);
prevbars = Bars;
...

Этот способ может не сработать при подкачке истории. То есть, количество баров изменилось, а "предыдущий" еще не сформировался. В этом случае можно усложнить проверку на разницу между значениями, равную единице.

Следующий способ основан на том, что значение "Volume" формируется на основе количества тиков, пришедших для каждого бара, и первый тик означает, что у вновь формирующегося бара значение "Volume" равно 1:

if( Volume[0] > 1) return(0);
...

Этот способ может не сработать при слишком интенсивном поступлении ценовых тиков. Дело в том, что обработка приходящих ценовых тиков производится в отдельном потоке. И если этот поток занят во время поступления очередного тика, то во избежание излишней загрузки вычислительных ресурсов этот пришедший тик не обрабатывается! В этом случае можно также усложнить проверку, используя сохранение предыдущего значения "Volume".

Третий способ основан на времени открытия бара:

static datetime prevtime=0;
...
if(prevtime == Time[0]) return(0);
prevtime = Time[0];
...

Это - самый надежный способ. Он сработает при любых обстоятельствах.

 
Andrey Khatimlianskii:

Сформулируйте задачу полностью.

Просто "фильтровать" работу 60-секундным таймером или 20-пунктовым фильтром можно, но не понятно — зачем это делать.


задача такая есть алгоритм в него подаю текущее значение high(свечи) алгоритм по ней определяет предположительную цену закрытия этой свечи. Все хорошо до той поры пока хай не изменяться. Но если цена выросла еще больше предыдущего значения хая (этой же свечи) начинаеться не разбериха, особенно в тот самый момент пока он растет с каждым тиком изменяя значения хая. Задача отфильтровать это, то есть подавать  в алгоритм не изменения хая на каждом тике а например через 20п пример текущая цена хая 114.456 со временем хай вырос пока рос он проходил через точки 114.457,114.459,114.460,114.463 - это все отправляется в алгоритм и он в этот момент алгоритм говорит не определенный прогноз и открывает сделки то шорт то лонг. Хотелось бы хай подавался "порциями" 114.456 затем к примеру +20п 114.476 (без промежуточных значений)

Как то так...

 
Evgeny Raspaev:

задача такая есть алгоритм в него подаю текущее значение high(свечи) алгоритм по ней определяет предположительную цену закрытия этой свечи. Все хорошо до той поры пока хай не изменяться. Но если цена выросла еще больше предыдущего значения хая (этой же свечи) начинаеться не разбериха, особенно в тот самый момент пока он растет с каждым тиком изменяя значения хая. Задача отфильтровать это, то есть подавать  в алгоритм не изменения хая на каждом тике а например через 20п пример текущая цена хая 114.456 со временем хай вырос пока рос он проходил через точки 114.457,114.459,114.460,114.463 - это все отправляется в алгоритм и он в этот момент алгоритм говорит не определенный прогноз и открывает сделки то шорт то лонг. Хотелось бы хай подавался "порциями" 114.456 затем к примеру +20п 114.476 (без промежуточных значений)

Как то так...

Если через определенное время то можно использовать OnTimer(), там задаете интервал и вперед...

 
Evgeny Raspaev:

задача такая есть алгоритм в него подаю текущее значение high(свечи) алгоритм по ней определяет предположительную цену закрытия этой свечи. Все хорошо до той поры пока хай не изменяться. Но если цена выросла еще больше предыдущего значения хая (этой же свечи) начинаеться не разбериха, особенно в тот самый момент пока он растет с каждым тиком изменяя значения хая. Задача отфильтровать это, то есть подавать  в алгоритм не изменения хая на каждом тике а например через 20п пример текущая цена хая 114.456 со временем хай вырос пока рос он проходил через точки 114.457,114.459,114.460,114.463 - это все отправляется в алгоритм и он в этот момент алгоритм говорит не определенный прогноз и открывает сделки то шорт то лонг. Хотелось бы хай подавался "порциями" 114.456 затем к примеру +20п 114.476 (без промежуточных значений)

Как то так...

Сомнительный подход.

Решение будет примерно таким:

static double last_h = 0.0;
static datetime last_t = 0;

if ( Time[0] > last_t )
{
   last_t = Time[0];
   last_h = High[0];
   CallMainTradeAlgo();  // ваш торговый алгоритм
}

if ( High[0] - last_h >= 20*_Point )
{
   last_h = High[0];
   CallMainTradeAlgo();  // ваш торговый алгоритм
}
 
Evgeny Raspaev:

задача такая есть алгоритм в него подаю текущее значение high(свечи) алгоритм по ней определяет предположительную цену закрытия этой свечи. Все хорошо до той поры пока хай не изменяться. Но если цена выросла еще больше предыдущего значения хая (этой же свечи) начинаеться не разбериха, особенно в тот самый момент пока он растет с каждым тиком изменяя значения хая. Задача отфильтровать это, то есть подавать  в алгоритм не изменения хая на каждом тике а например через 20п пример текущая цена хая 114.456 со временем хай вырос пока рос он проходил через точки 114.457,114.459,114.460,114.463 - это все отправляется в алгоритм и он в этот момент алгоритм говорит не определенный прогноз и открывает сделки то шорт то лонг. Хотелось бы хай подавался "порциями" 114.456 затем к примеру +20п 114.476 (без промежуточных значений)

Как то так...

Достаточно поставить условие

if(high[0] > prevHigh)
 {
  prevHigh = high[0];
  return;
 }
 
Evgeny Raspaev:   Уже вторые сутки сижу

Тут уже много лет сижу, язык хорошо знаю - а результат только ожидаю

 


Первый способ основан на проверке количества баров:



Плохой способ. Количество баров может быть ограничено в настройках, Из-за этого количество баров всегда одно и тоже, если достигло максимума. 

Советник будет ждать нового бара но никогда его не дождется. 

 
Evgeny Raspaev:

Хотелось бы хай подавался "порциями" 114.456 затем к примеру +20п 114.476 (без промежуточных значений)


if( MathAbs(High[0]-prevHigh) < 0.020 ) return; 
prevHigh = High[0];  
 
Причина обращения: