Интересный вопрос!!!

 

Приветствую!!!


Ребят, вот есть такой индикатор, делающий хорошее усреднение цены, хорошо всем известный как Heiken Ashi. Стал я значит разбираться что у него внутрях, появились кое какие свои идеи его применения, но смутило и заинтересовала следующая особенность:

 _limit = Bars - _countedBars; 
 _i = _limit;
 
 while (_i >= 0)
      {
 
           _haOpen  = (ExtMapBuffer3[_i + 1] + ExtMapBuffer4[_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; // буфер вывода 1
                 ExtMapBuffer2[_i] = 1; // буфер вывода 2
             } 
           else
             {
                 ExtMapBuffer1[_i] = 1;
                 ExtMapBuffer2[_i] = 0;
             } 
 
           
           ExtMapBuffer3[_i] = _haOpen;   // запоминаем значения
           ExtMapBuffer4[_i] = _haClose;
 
        _i--;
     }

То есть как видно из кода сам индикатор расчитывается справа налево, то есть от максимально доступного количества баров в истории до текущего нулевого, причем в момент когда цикл находится на текущем баре например 100-ом, то индикатор использует для расчета данные бара 101, так как запоминает их значения в промежуточных буферах, не используемых для вывода на экран. Смысл в том, что у меня есть необходимость сделать наоборот расчет справа налево, вроде как должно получиться нечто подобное:

_limit = Bars - _countedBars - 1;
 
double _haOpenOld, _haCloseOld;
 
for (_i = 0; _i < _limit; _i++)
   {
        _haOpen  = (_haOpenOld + _haCloseOld) / 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;
          } 
     
        _haOpenOld  = _haOpen;
        _haCloseOld = _haClose;
 
   }

В итоге получил очень странный результат! Думал по началу что разницы нет, но результаты получились совсем другие, то есть гистограммы рисуются, причем судя по графику правильно, но совсем по другому не как в первом варианте в классическом :-) Вот тут то я и завис собственно говоря. Я если честно запутался, может кто объяснит мне в чем собака порылась? :)))

 
волшебный индикатор на продажу готовите?
 
Нет. Чисто для себя интересуюсь, ещё не имею достаточного опыта в MQL чтобы писать что то на продажу.
 
темка вверх...
 
jerrimix писал (а): темка вверх...
Не балуйтесь с лифтом, попросите повежливее Integer'а, он точно знает.
 
Он молчит как в танке :)
 
jerrimix писал (а): Он молчит как в танке :)
Это, как я понял. и есть "вежливо"?
 
Уважаемый Гранит77, у вас есть что то по существу? повидимому нет.
 
double _haOpenOld, _haCloseOld;

for (_i = 0; _i < _limit; _i++)
{
_haOpen = (_haOpenOld + _haCloseOld) / 2;
_haClose = (Open[i] + High[i] + Low[i] + Close[i]) / 4;

....
_haOpenOld = _haOpen;
_haCloseOld = _haClose;

}
А чему равны _haOpen? = (_haOpenOld? + _haCloseOld?) при первом своем использовании в цикле, и куда это потом тянется? Явно ерунда выходит... Дальше не смотрел
 
jerrimix:

Приветствую!!!


Ребят, вот есть такой индикатор, делающий хорошее усреднение цены, хорошо всем известный как Heiken Ashi. Стал я значит разбираться что у него внутрях, появились кое какие свои идеи его применения, но смутило и заинтересовала следующая особенность:

 _limit = Bars - _countedBars;   

То есть как видно из кода сам индикатор расчитывается справа налево, то есть от максимально доступного количества баров в истории до текущего нулевого, причем в момент когда цикл находится на текущем баре например 100-ом, то индикатор использует для расчета данные бара 101, так как запоминает их значения в промежуточных буферах, не используемых для вывода на экран. Смысл в том, что у меня есть необходимость сделать наоборот расчет справа налево, вроде как должно получиться нечто подобное:

_limit = Bars - _countedBars - 1;   double _haOpenOld, _haCloseOld;   for (_i = 0; _i < _limit; _i++)    {         _haOpen  = (_haOpenOld + _haCloseOld) / 2; 

В итоге получил очень странный результат! Думал по началу что разницы нет, но результаты получились совсем другие, то есть гистограммы рисуются, причем судя по графику правильно, но совсем по другому не как в первом варианте в классическом :-) Вот тут то я и завис собственно говоря. Я если честно запутался, может кто объяснит мне в чем собака порылась? :)))

Во втором примере очевидная ошибка - использование переменных без инициализации.

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

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

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


Успехов.


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

 
Figar0:
double _haOpenOld, _haCloseOld;

for (_i = 0; _i < _limit; _i++)
{
_haOpen = (_haOpenOld + _haCloseOld) / 2;
_haClose = (Open[i] + High[i] + Low[i] + Close[i]) / 4;

....
_haOpenOld = _haOpen;
_haCloseOld = _haClose;

}
А чему равны _haOpen? = (_haOpenOld? + _haCloseOld?) при первом своем использовании в цикле, и куда это потом тянется? Явно ерунда выходит... Дальше не смотрел

точно. логично! А чему тогда интересно равны значения:


ExtMapBuffer3[_i + 1] = ?

ExtMapBuffer4[_i + 1] = ?


Конечно согласен, что если я обрежу расчет индикатора до 300 баров, то он возьмет данные с 301 бара так? А если я на всю историю рассчитаю к примеру, то выходит что первые бары и далее по порядку опять будут неверны?