Использование MACD в скриптах - странное обнуление

 

Привет Всем!

Пол-дня убил и не нашел решения - я пользуюсь MACD в качестве одного из критериев купли-продажи.

В init-e:

// ------------------------------------

SetIndexBuffer(2,MacdBuffer);
SetIndexBuffer(3,SignalBuffer);
. . .

// ------------------------------------

В start-e:

// --------------------------------------------------------------------------------------------------------------------------------------------

int limit = 200;

ArraySetAsSeries(MacdBuffer,true);

for(i=0; i<limit; i++)
MacdBuffer[i]=iMA(NULL,0,FastEMA,0,MODE_EMA,PRICE_CLOSE,i)-iMA(NULL,0,SlowEMA,0,MODE_EMA,PRICE_CLOSE,i);

for(i=0; i<limit; i++)
SignalBuffer[i]=iMAOnArray(MacdBuffer,limit,SignalSMA,0,MODE_EMA,i);
// --------------------------------------------------------------------------------------------------------------------------------------------

Параллельно у меня запущен график с MACD линиями. Заметил расхождения (иногда! - по большеи части работает нормально)

между сигналами покупки/продажи и MACD графиком.

В результате добавил comment в свои script:

// --------------------------------------------------------------------------------------------------------------------------------------------

Comment("PERIOD = ", Period(), " minutes",
"\n", "Bars = ", Bars,
"\n", "limit = ", limit,
"\n", "MacdBuffer[", i, "] = ", MacdBuffer[i]*10, " / 10", " SignalBuffer[", i, "] = ", SignalBuffer[i]*10, " / 10",
"\n" );
// --------------------------------------------------------------------------------------------------------------------------------------------

Обнаружилась странная вещь - в отдельных случаях (обычно) SignalBuffer = 0. Нет никакои связи между валютнои парои

или периодом и етим явлением. Т.е. запускаешь script, все ок, а через какое-то время обнаруживешь что коммент выдает 0.

Переключаусь на другую пару валют - все в норме. Возвращаусь назад к проблемнои - может остаться в нуле (при том что

на графике MACD ненулевое значение), а может вернуться к нормальнои работе с верными результатами (так как на MACD

графике). Если оставить то так в нуле и остаеся.

Подскажите если кто знает в чем тут дело. Если есть другие варианты решения (через iCustom или еще что) - готов рассмотреть.

Спасибо!

Олег

 
А сколько всего буферов в индикаторе?
 
Vinin писал (а) >>
А сколько всего буферов в индикаторе?

Забыл упомянуть об етом - в самом начале задано:

// --------------------------------

double MacdBuffer[200];
double SignalBuffer[200];
. . .

// --------------------------------

Oleg

 
chief2000 писал (а) >>

Забыл упомянуть об етом - в самом начале задано:

// --------------------------------

double MacdBuffer[200];
double SignalBuffer[200];
. . .

// --------------------------------

Oleg

Зачем указывать размер массива. Зачем делать ArraySetAsSeries(MacdBuffer,true); в старте.

И почему не делать в инит нормально

В init-e:

// ------------------------------------

SetIndexBuffer(0,MacdBuffer);
SetIndexBuffer(1,SignalBuffer);
. . .

// ------------------------------------

А обрабатывать ты можешь столько элементов, сколько нужно.

За размером массивов будет сделить МТ.

Только не забудь указать количество используемых буферов.

Что типа

#property indicator_buffers 2

double MacdBuffer[];
double SignalBuffer[];

int init() {
   SetIndexStyle(0,DRAW_HISTOGRAM);
   SetIndexBuffer(0,MacdBuffer);
   SetIndexStyle(1,DRAW_LINE);
   SetIndexBuffer(0,SignalBuffer);
   return(0); 
}

int start() {
  ..........

  for (......) MacdBuffer[i]=.....................;
  for (......) SignalBuffer[i]=.....................;
  return(0);
}
Только получается полный аналог MACD. Особого смысла нет.
 
Vinin писал (а) >>

Зачем указывать размер массива. Зачем делать ArraySetAsSeries(MacdBuffer,true); в старте.

И почему не делать в инит нормально

В init-e:

// ------------------------------------

SetIndexBuffer(0,MacdBuffer);
SetIndexBuffer(1,SignalBuffer);
. . .

// ------------------------------------

А обрабатывать ты можешь столько элементов, сколько нужно.

За размером массивов будет сделить МТ.

Только не забудь указать количество используемых буферов.

Что типа

Только получается полный аналог MACD. Особого смысла нет.

----------------------------------------------------------------------------------------------------------------------------------

Я пробовал и не задавать 200, т.е.

double MacdBuffer[];
double SignalBuffer[];

Результат был тот же.

Кроме того у меня задеиствованы все 8 бафферов, poetomu v SetIndexBuffer не 0 и 1 (0 и 1 заняты другими).

MACD график я запускау извне, не из скрипта (что и позволило мне обнаружить где проблема, иначе бы неверные вычисления

были бы идентичны MACD графику).

- Может есть еще что-нибудь что следует проверить/изменить?

- В результате чего значения могут обнуляться?

- Насколько сложно запустить MACD при помощи iCustom и можно ли таким образом считывать результаты в скрипт?

Спасибо!

 
chief2000 писал (а) >>

----------------------------------------------------------------------------------------------------------------------------------

Я пробовал и не задавать 200, т.е.

double MacdBuffer[];
double SignalBuffer[];

Результат был тот же.

Кроме того у меня задеиствованы все 8 бафферов, poetomu v SetIndexBuffer не 0 и 1 (0 и 1 заняты другими).

MACD график я запускау извне, не из скрипта (что и позволило мне обнаружить где проблема, иначе бы неверные вычисления

были бы идентичны MACD графику).

- Может есть еще что-нибудь что следует проверить/изменить?

- В результате чего значения могут обнуляться?

- Насколько сложно запустить MACD при помощи iCustom и можно ли таким образом считывать результаты в скрипт?

Спасибо!

Тогда надо весь код смотреть. Если что, то контакты в профиле.

 

Сеичас попытаусь переписать проблемную часть удалив все лисхнее. Но сомневаусь что ето поможет, т.к.

MacdBuffer вычисляется верно, а следом за ним SignalBuffer делает ошибку.

- Можно ли

SignalBuffer[i]=iMAOnArray(MacdBuffer,limit,SignalSMA,0,MODE_EMA,i);

переписать при помощи другои функцзии??

Спасибо!

Олег

 
chief2000 писал (а) >>

Сеичас попытаусь переписать проблемную часть удалив все лисхнее. Но сомневаусь что ето поможет, т.к.

MacdBuffer вычисляется верно, а следом за ним SignalBuffer делает ошибку.

- Можно ли

SignalBuffer[i]=iMAOnArray(MacdBuffer,limit,SignalSMA,0,MODE_EMA,i);

переписать при помощи другои функцзии??

Спасибо!

Олег

Давай завтра в аську или скапи постучишься. А сегодня я уже не хочу думать ни о чем.

 
Vinin писал (а) >>

Давай завтра в аську или скапи постучишься. А сегодня я уже не хочу думать ни о чем.

Похоже - [int limit = 200;] - создавал проблему (надо будет хорошенько все протестировать).

С другои стороны, [int limit=ArraySize(MacdBuffer);] - не приемлем, т.к. ето перегружает систему (PC с 4GB памятью

и приличным процессором начинает страшно тормозить в моменты смены валют и т.д.). При зтом limit может равняться

500 000, тогда как меня интересуют лишь последние 200 - 300 значении массива. Попытка ограничить MacdBuffer

способом ниже не помогла (зто тот случаи когда limit = 500 000 ... в зависимости от количества баров на графике(?)):
=======================

double MacdBuffer[200];
int limit=ArraySize(MacdBuffer);
=======================

- Есть ли способ ограничить MacdBuffer и SignalBuffer заданным мною значением? (использовать только последние х-значении)

Спасибо!

Олег

 
chief2000 писал (а) >>

Похоже - [int limit = 200;] - создавал проблему (надо будет хорошенько все протестировать).

С другои стороны, [int limit=ArraySize(MacdBuffer);] - не приемлем, т.к. ето перегружает систему (PC с 4GB памятью

и приличным процессором начинает страшно тормозить в моменты смены валют и т.д.). При зтом limit может равняться

500 000, тогда как меня интересуют лишь последние 200 - 300 значении массива. Попытка ограничить MacdBuffer

способом ниже не помогла (зто тот случаи когда limit = 500 000 ... в зависимости от количества баров на графике(?)):
=======================

double MacdBuffer[200];
int limit=ArraySize(MacdBuffer);
=======================

- Есть ли способ ограничить MacdBuffer и SignalBuffer заданным мною значением? (использовать только последние х-значении)

Спасибо!

Олег

Если нет необходимости отрисовывать МАКД на графике, а используется только для расчетов, то есть смысл перейти на встроенные функции iMACD()

или же на вызов индикатора через iCustom(). Предпочтительный вариант сможешь выбрать сам.

В таком случае можно использовать готовые значения.

 
chief2000 писал (а) >>

...

- Есть ли способ ограничить MacdBuffer и SignalBuffer заданным мною значением? (использовать только последние х-значении)

Спасибо!

Олег

extern int NBars = 200;  // количество обсчитыаемых баров

int start() {
int limit;
   int counted_bars=IndicatorCounted();
   if(counted_bars>0) {
      counted_bars--;
      limit=Bars-counted_bars;
   }  else limit=NBars-1;

   for(int i=0; i<limit; i++) {
      ...
   }
...
}
Можно как выше, а можно просто задать
SetIndexDrawBegin(

int index, int begin) но я не уверен

что не будут обсчитываться все бары.
Причина обращения: