Помогите начинающему

 

Добрый день коллеги!

кто может подсказать что я не так делаю

В приведенном ниже коде есть такой фрагмент

      CopyBuffer(H_Stohastic, SIGNAL_LINE, 0, 3, aStohastik_Signal);
     
      Print(aStohastik_Signal[2],"|",aStohastik_Signal[1],"|",aStohastik_Signal[0]);

Почему этот код выдает одну и туже тройку значений

2011.02.12 15:20:57    Core 1    2011.02.10 23:59:59   23.34151915907678|37.41065496154604|57.88286899697894
2011.02.12 15:20:57    Core 1    2011.02.10 23:59:55   23.29303431059216|37.41065496154604|57.88286899697894
2011.02.12 15:20:57    Core 1    2011.02.10 23:59:53   23.26879188634958|37.41065496154604|57.88286899697894
2011.02.12 15:20:57    Core 1    2011.02.10 23:59:51   23.24454946210753|37.41065496154604|57.88286899697894
2011.02.12 15:20:57    Core 1    2011.02.10 23:59:50   23.22030703786495|37.41065496154604|57.88286899697894
2011.02.12 15:20:57    Core 1    2011.02.10 23:59:48   23.19606461362237|37.41065496154604|57.88286899697894
2011.02.12 15:20:57    Core 1    2011.02.10 23:59:47   23.17182218938032|37.41065496154604|57.88286899697894
2011.02.12 15:20:57    Core 1    2011.02.10 23:59:45   23.14757976513774|37.41065496154604|57.88286899697894
2011.02.12 15:20:57    Core 1    2011.02.10 23:59:43   23.12333734089515|37.41065496154604|57.88286899697894
2011.02.12 15:20:57    Core 1    2011.02.10 23:59:42   23.17182218938032|37.41065496154604|57.88286899697894
2011.02.12 15:20:57    Core 1    2011.02.10 23:59:40   23.19606461362237|37.41065496154604|57.88286899697894
2011.02.12 15:20:57    Core 1    2011.02.10 23:59:38   23.22030703786495|37.41065496154604|57.88286899697894
2011.02.12 15:20:57    Core 1    2011.02.10 23:59:37   23.09909491665257|37.41065496154604|57.88286899697894


Если я не ошибаюсь данные должные сдвигаться т.е. при каждом вызове события OnTick() буфер индикатора должен пополняться новым значением и это значение должно быть доступно в позиции [0].

Может нужно запускать расчет индикаторов каждый раз из программы явно? Только не пойму как это сделать.

полный листинг эксперта

int OnInit()
  {
    H_Stohastic = iStochastic(NULL,0, K_Period, D_Period, Slowing, MODE_SMA, STO_LOWHIGH);
 
    if (H_Stohastic == INVALID_HANDLE){
      Alert("Ошибка выделения буфера осцилятора!!!!!");
    }
    return(0);
  }
void OnDeinit(const int reason)
  {
      //IndicatorRelease(H_Stohastic);
  }
void OnTick()

  {
double aStohastik_Main[3];
double aStohastik_Signal[3];
int main_total;

    // Print("OnTick ....");
   
    main_total = CopyBuffer(H_Stohastic, MAIN_LINE, 0, 3, aStohastik_Main);
    if (main_total >= 3)
    {
      CopyBuffer(H_Stohastic, SIGNAL_LINE, 0, 3, aStohastik_Signal);
     
      Print(aStohastik_Signal[2],"|",aStohastik_Signal[1],"|",aStohastik_Signal[0]);

     
      if (((aStohastik_Signal[0]-aStohastik_Signal[1])*
          (aStohastik_Signal[1]-aStohastik_Signal[2]))<0) {
         
        Print("Перегиб !!!!!");
       
        if (aStohastik_Signal[1]>Level_Hight){
          Print("Покупаем");
        } else if (aStohastik_Signal[1]<Level_Low){
          Print("Продаем");
        }
      }
     
    } else {
    // Нам нужно не менее 3-х точек о чем и говорим
      Print("Не достаточно данных ",main_total," нужно не менее 3");
    }

  }

Документация по MQL5: Основы языка / Функции / Функции обработки событий
Документация по MQL5: Основы языка / Функции / Функции обработки событий
  • www.mql5.com
Основы языка / Функции / Функции обработки событий - Документация по MQL5
 

Ну если верить документации:

Неважно, какое свойство имеет приемный массив - as_series=true или as_series=false, данные будут скопированы таким образом, что самый старый по времени элемент будет в начале физической памяти, отведенной под массив. ...

.

и потом

ArraySetAsSeries

.....

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

Массив определен статически

double aStohastik_Signal[3];

 
попытаюсь разобраться по подробней что и как считается...

 
stalkersoft:

Если я не ошибаюсь данные должные сдвигаться т.е. при каждом вызове события OnTick() буфер индикатора должен пополняться новым значением и это значение должно быть доступно в позиции [0].

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

Обработчик события "новый бар"
Обработчик события "новый бар"
  • 2010.10.04
  • Konstantin Gruzdev
  • www.mql5.com
Язык программирования MQL5 позволяет решать задачи на совершенно новом уровне. Даже те задачи, которые уже вроде имеют решения, благодаря объектно-ориентированному программированию могут подняться на качественно новый уровень. В данной статье специально взят простой пример проверки появления нового бара на графике, который был преобразован в достаточно мощный и универсальный инструмент. Какой? Читайте в статье.
 
Спасибо я похоже не так интерпретировал понятие "тик"

Думал раз период задан 1 час то и тик столько-же похоже тик это тик.


OnTick

Событие NewTick генерируется только для экспертов при поступлении нового тика по символу, к графику которого прикреплен эксперт. Функцию OnTick() бесполезно определять в пользовательском индикаторе или скрипте, поскольку событие Tick для них не генерируется.

Событие Tick генерируется только для экспертов, но это не означает, что эксперты обязаны иметь функцию OnTick(), так как для экспертов генерируются не только события Tick, но и события Timer, BookEvent и ChartEvent. Должна быть объявлена с типом void, параметров не имеет:

Как говорится учите мат часть .... :)

Спасибо за помощь

 
Interesting:
попытаюсь разобраться по подробней что и как считается...

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