Интересный вопрос!!! - страница 2

 
VladislavVG:

 
double _haOpenOld, _haCloseOld;    for (_i = 0; _i < _limit; _i++)     {          _haOpen  = (_haOpenOld + _haCloseOld) / 2;// при i=0 здесь будет мусор

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

Вы хотите сделать наоборот ? То есть текущие значения на основании будущих ? Ну, на истории нарисует красиво, а смысл ? Потому выше и спрашивали про подготовку на продажу ;) - самому торговать - только депо сливать.


Успехов.


ЗЫ пока писал ошибку заметили :).



Понятно, то есть диагноз - моя неопытность :))) то есть как я понял не реально его считать с обратной стороны так как рисоваться будет не верно? но по сути ведь у нас для правой стороны все предыдущие бары уже есть так почему нельзя сделать аналогичный расчет?

 
jerrimix:

Понятно, то есть диагноз - моя неопытность :))) то есть как я понял не реально его считать с обратной стороны так как рисоваться будет не верно? но по сути ведь у нас для правой стороны все предыдущие бары уже есть так почему нельзя сделать аналогичный расчет?


Почему нельзя ? Можно. С небольшими оговорками в целесообразности. Чуть ниже. Компьютер то он все воспримет. А вот смысл ?

Давайте по-частям.

Пусть нужно расчитать значения 100 (сотни) баров индюка.

Оригинальный алгоритм для вычисления значений берет абсолютно точные значения из прошлого - они у нас есть. Для расчета 100 бара возьмем 101, 99 - 100 соответственно... и так далее для расчета нулевого возьмем первый. Подчеркиваю все эти значения есть.

Теперь Ваш алгоритм - для расчета 100 бара берем 99, 99 - 98 и так далее.. А что будем брать для расчета нулевого ? значения из будущего ? Их у нас нет. Можно ввести что-попало, что тогда получим ? 

И по ходу расчетов в вашем индикаторе ошибка, полученная при расчете нулевого бара, передастся на первый,  с первого бара будет использованиа при расчете второго и так далее по цепочке. Это, правда, приводит к получению более красивых картинок, поскольку индикатор "знает" куда двинется цена в будущем :). Но ценности для торговли не представляет.

Или для вычисления нулевого бара используем прогнозируемые значения в будущем. Но зачем тогда индикатор, если есть прогноз ?

Разве, что тока на продажу, да и то без исходников.




Успехов.

 
VladislavVG:
jerrimix:

Понятно, то есть диагноз - моя неопытность :))) то есть как я понял не реально его считать с обратной стороны так как рисоваться будет не верно? но по сути ведь у нас для правой стороны все предыдущие бары уже есть так почему нельзя сделать аналогичный расчет?


Почему нельзя ? Можно. С небольшими оговорками в целесообразности. Чуть ниже. Компьютер то он все воспримет. А вот смысл ?

Давайте по-частям.

Пусть нужно расчитать значения 100 (сотни) баров индюка.

Оригинальный алгоритм для вычисления значений берет абсолютно точные значения из прошлого - они у нас есть. Для расчета 100 бара возьмем 101, 99 - 100 соответственно... и так далее для расчета нулевого возьмем первый. Подчеркиваю все эти значения есть.

Теперь Ваш алгоритм - для расчета 100 бара берем 99, 99 - 98 и так далее.. А что будем брать для расчета нулевого ? значения из будущего ? Их у нас нет. Можно ввести что-попало, что тогда получим ?

И по ходу расчетов в вашем индикаторе ошибка, полученная при расчете нулевого бара, передастся на первый, с первого бара будет использованиа при расчете второго и так далее по цепочке. Это, правда, приводит к получению более красивых картинок, поскольку индикатор "знает" куда двинется цена в будущем :). Но ценности для торговли не представляет.


Или для вычисления нулевого бара используем прогнозируемые значения в будущем. Но зачем тогда индикатор, если есть прогноз ?

Разве, что тока на продажу, да и то без исходников.




Успехов.



Спасибо за наставление, Владислав, приятно, когда люди не отказывают в помощи новичкам :)


Я вот тут маленько как говориться "покумекал" :-) понял что брал данные не с прошлых баров +1 а с -1 от нулевого. Вот получилось вот так:


double _haOpen, _haHigh,  _haLow, _haClose;
        int _limit = 0, _i = 0, _y, _countedBars = IndicatorCounted();
 
        if (_countedBars < 0) return(-1);
        if (_countedBars > 0) _countedBars--;
               
        _limit = Bars - _countedBars - 1;
        _limit = MathMin(_limit, CountBars);
       
        for (_i = 0; _i < _limit; _i++)
           {
                  _haOpen  = (Open[_i + 1] + Close[_i + 1]) / 2;
                  _haClose = (Open[_i] + High[_i] + Low[_i] + Close[_i]) / 4;
                  _haHigh  = MathMax(High[_i], MathMax(_haOpen, _haClose));
                  _haLow   = MathMin(Low[_i],  MathMin(_haOpen, _haClose));
                 
                  if (_haOpen < _haClose) 
                    {
                          ExtMapBuffer1[_i] = 0;
                          ExtMapBuffer2[_i] = 1;
                    } 
                  else
                    {
                          ExtMapBuffer1[_i] = 1;
                          ExtMapBuffer2[_i] = 0;
                    } 
                        
                 
 
           }
Рисует почти как оригинал, единственное пока разбираюсь что почему то некоторые бары не совпадают по цвету, а где то кажется такое чувство что сдвинуто на 1 бар. Может быть проблема в том что данные в истории другие все же сохраняются не такие как при расчете прошлых значений с запоминанием в цикле?
 
на первом запуске все работает правильно, потому что все бары за раз обсчитываются, а потом, когда делается расчет для одного последнего бара переменные _haOpenOld, _haCloseOld всегда равны нулю. Вынести их на уровень модуля или сделать статическими тоже не поможет, потому что они буду хранить значение не с предыдущего бара а с предыдущего тика. Если нужны предыдущие значения надо отводить для этого дела буфер, или проверять время бара на котором тик произошел, и сохранять предыдущие значения в переменные если новый тик произошел на новом баре.
 

Да, это собственно и не наставления - так обратил Ваше внимание на не столь очевидные вещи. Всего-то.


Теперь по поводу разницы в работе алгоритмов - ничего удивительного - по разному вычисляются величины _haOpen .

_haOpen = (ExtMapBuffer3[_i + 1] + ExtMapBuffer4[_i + 1]) / 2;

в оригинале и

_haOpen = (Open[_i + 1] + Close[_i + 1]) / 2;

 у Вас.

В оригинале берется не цена открытия бара, а значение индикатора - то есть расчитанная величина.


Отличия могут быть как незначительными, так и весьма существенными.

И потом, возьмите себе за правило объявлять переменные с разу с инициализацией, например так

double _haOpen=0, _haHigh=0, _haLow=0, _haClose=0;

В дальнейшем это позволит избежать многих часов поиска неочевидных ошибок.


Успехов.

 
VladislavVG:

Да, это собственно и не наставления - так обратил Ваше внимание на не столь очевидные вещи. Всего-то.


Теперь по поводу разницы в работе алгоритмов - ничего удивительного - по разному вычисляются величины _haOpen .

_haOpen = (ExtMapBuffer3[_i + 1] + ExtMapBuffer4[_i + 1]) / 2;

в оригинале и

_haOpen = (Open[_i + 1] + Close[_i + 1]) / 2;

у Вас.

В оригинале берется не цена открытия бара, а значение индикатора - то есть расчитанная величина.


Отличия могут быть как незначительными, так и весьма существенными.

И потом, возьмите себе за правило объявлять переменные с разу с инициализацией, например так

double _haOpen=0, _haHigh=0, _haLow=0, _haClose=0;

В дальнейшем это позволит избежать многих часов поиска неочевидных ошибок.


Успехов.


да уж... согласен! даже не знаю пока как сделать грамотно. Есть идея конечно взять сделать массив прогнать его по оригинальному алгоритму запомнить в него значения а своем прогонять уже как нужно... но мне что подсказывает что во-первых это будет ресурсы кушать и тормозить сильно терминал если это ещё будет висеть в нескольких окнах...
 
jerrimix:

Собственно, вопрос: а что нужно сделать и зачем ? Оригинальный алгоритм абсолютно корректен. Считает из прошлого в будущее. Вперед не заглядывает. Значит его можно использовать для торговли - можно собрать статистику и принять решение. А что Вам хочется получить ? Для чего другой порядок расчета ? Кстати, я Вам настоятельно рекомендую избегать алгоритмов расчета из будущего в прошлое - там можно допустить неочевидную ошибку и по истории все будет в порядке, а вот с прогнозом текущей ситуации будет беда....


Успехов.

 
VladislavVG:
jerrimix:

Собственно, вопрос: а что нужно сделать и зачем ? Оригинальный алгоритм абсолютно корректен. Считает из прошлого в будущее. Вперед не заглядывает. Значит его можно использовать для торговли - можно собрать статистику и принять решение. А что Вам хочется получить ? Для чего другой порядок расчета ? Кстати, я Вам настоятельно рекомендую избегать алгоритмов расчета из будущего в прошлое - там можно допустить неочевидную ошибку и по истории все будет в порядке, а вот с прогнозом текущей ситуации будет беда....


Успехов.

Хочу сделать мультитаймфреймовый Хейкен Аши, но в одном скрипте а не с вызовом оригинального скрипта в конструкцию:

int start()
  {
       datetime TimeArray[];
       int _limit, _i = 0, _y = 0; 
       int _countedBars = IndicatorCounted();
   
       ArrayCopySeries(TimeArray, MODE_TIME, Symbol(), TimeFrame); 
   
       _limit = Bars - _countedBars;
 
       for (_i = 0, _y = 0; _i < _limit; _i++)
          {
 
              if (Time[_i] < TimeArray[_y]) _y++; 
               
              ExtMapBuffer1[_i] = iCustom(NULL, TimeFrame, "#Heiken_Ashi_Histogram", CountBars, 0, _y); 
              ExtMapBuffer2[_i] = iCustom(NULL, TimeFrame, "#Heiken_Ashi_Histogram", CountBars, 1, _y); 
          }  
  
   return(0);
  }

Данная конструкция в общем то понятна и логична. Но ее расчет идет справа налево, и это понятно так как в таком случае удобно определить расхождение по времени баров между например Н1 (текущий график) и Н4, с которого мы берем данные, потому что если попытаться сделать наоборот под алгоритм расчета Хейкен Аши, то получиться, что определить начало для Н1 и Н4 сложно, а если например использовать такой вариант что для общего цикла Н1 брать количество баров для расчет равное:


_limit = Bars - _countedBars - 1;

А для Н4 расчет:


int TimeFrame = 240;
_limit2 = (_limit / (TimeFrame / Period()));

То количество баров для Н4 не совсем стыкуется с Н1, точнее не стыкуются бары в начале. В итоге получается опять масленница :))))

 

Делал я такой индюк :).

Есть несколько вариантов.

1. Использовать функции iOpen() iHigh() iLow() iClose() вместо Open[], High[], Low[], Прямо в оригинальном коде индикатора.

2 Оформить его отдельной функцией, в которую передаете массивы котировок и в качестве таковых подать ему на вход котировки со старшего т\ф. Их можно также получить используя вышеназванные функции.

При прорисовке на младшем т\ф воспользуйтесь функцией iBarShift() - получите начало отсчета бара старшего т\ф относительно младшего.

Идея в аттаче. Там тока идет вызов С-шных функций, но они по названиям понятны  - я старался максимально близко к МКЛ называть. С-шную библиотеку само собой не прикладываю ;).


Успехов.

ЗЫ Да, сам алгоритм несколько отличался от оригинального потому назван НА2МА - там результат еще раз сглаживался - интересно получается попробуйте. Если не ошибаюсь, такой алгоритм уже есть в кодебейсе.



 

 

Файлы:
 

VladislavVG:

Делал я такой индюк :).

Есть несколько вариантов.

1. Использовать функции iOpen() iHigh() iLow() iClose() вместо Open[], High[], Low[], Прямо в оригинальном коде индикатора.

2 Оформить его отдельной функцией, в которую передаете массивы котировок и в качестве таковых подать ему на вход котировки со старшего т\ф. Их можно также получить используя вышеназванные функции.

При прорисовке на младшем т\ф воспользуйтесь функцией iBarShift() - получите начало отсчета бара старшего т\ф относительно младшего.

Идея в аттаче. Там тока идет вызов С-шных функций, но они по названиям понятны - я старался максимально близко к МКЛ называть. С-шную библиотеку само собой не прикладываю ;).


Успехов.

ЗЫ Да, сам алгоритм несколько отличался от оригинального потому назван НА2МА - там результат еще раз сглаживался - интересно получается попробуйте. Если не ошибаюсь, такой алгоритм уже есть в кодебейсе.






У нас с Вами идея прям одинаковая!!!!!! насколько я понял вы там тоже сделали усреднение через MA обычную, потом по T3, получились два разных фильтра и далее сравнивали где они оба показывают вверх то общий индикатор выдает вверх синюю гистограмму где вниз там красную это насколько я понял! так вот у меня аналогичная идея!!!!!!! Я уже знаю как ее сделать в плане усреднения Хейкена с использованием различных алгоритмов это не сложно в общем то, но как и большинство наверно малоопытных людей попался на проблеме расчет баров :)))
Причина обращения: