Обсуждение статьи "Практическое применение кластерных индикаторов на рынке FOREX"

 

Опубликована статья Практическое применение кластерных индикаторов на рынке FOREX:

Кластерные индикаторы – это набор индикаторов, разделяющих валютные пары на отдельные валюты. Индикаторы позволяют следить за колебаниями валют относительно друг друга, определять потенциал зарождения новых валютных трендов, получать торговые сигналы и сопровождать среднесрочные и долгосрочные позиции.

Author: Simeon Semenych

 

Я думаю многие заметили, что индикаторы CC, CCFp и CFP не обновляются автоматически. Я их немного подправил - теперь всё нормально.

Что нужно сделать:

ищем в самом начале функции start() код:

   int counted_bars = IndicatorCounted();
//---- проверка на возможные ошибки
   if(counted_bars < 0) 
       return(-1);
//---- последний посчитанный бар будет пересчитан
   if(All_Bars < 1)
       All_Bars = Bars;
   if(counted_bars > 0 && Last_Bars > 0) 
       counted_bars -= Last_Bars;
   limit = All_Bars - counted_bars;

и заменяем его на следующий:

if (IndicatorCounted()<0) return(-1);
  limit=Bars-IndicatorCounted();
  if (Bars.Count>0 && limit>Bars.Count) limit=Bars.Count;

Теперь в начале файла ищем объявление параметров:

extern int All_Bars = 0;
extern int Last_Bars = 0;

Они нам теперь не нужны, вместо них вставим строчку:

extern int Bars.Count = 0;

Всё, теперь никаких проблем не будет. Это применимо для всех трёх индикаторов.

Для тех, кому неохота ковырять код - вот уже исправленные индикаторы: (это не картинка, это ZIP архив) ===>

PS: Семён Семёныч, спасибо за проделанную работу!

 

Если не трудно, помогите понять, что здесь происходит (см. Индикаторы CCFp и CFP)

Здесь вызываем
if(EUR)
{
double EURUSD_Fast = ma("EURUSD", Fast, MA_Method, Price, i);
double EURUSD_Slow = ma("EURUSD", Slow, MA_Method, Price, i);
if(!EURUSD_Fast || !EURUSD_Slow)
break;
}
========================================================
Отсюда вызываем

//+------------------------------------------------------------------+
//| Subroutines |
//+------------------------------------------------------------------+
double ma(string sym, int per, int Mode, int Price, int i)
{
double res = 0;
int k = 1;
int ma_shift = 0;
int tf = 0;
switch(Period())
{
case 1: res += iMA(sym, tf, per*k, ma_shift, Mode, Price, i);
k += 5;
case 5: res += iMA(sym, tf, per*k, ma_shift, Mode, Price, i);
k += 3;
case 15: res += iMA(sym, tf, per*k, ma_shift, Mode, Price, i);
k += 2;
case 30: res += iMA(sym, tf, per*k, ma_shift, Mode, Price, i);
k += 2;
case 60: res += iMA(sym, tf, per*k, ma_shift, Mode, Price, i);
k += 4;
case 240: res += iMA(sym, tf, per*k, ma_shift, Mode, Price, i);
k += 6;
case 1440: res += iMA(sym, tf, per*k, ma_shift, Mode, Price, i);
k += 4;
case 10080: res += iMA(sym, tf, per*k, ma_shift, Mode, Price, i);
k +=4;
case 43200: res += iMA(sym, tf, per*k, ma_shift, Mode, Price, i);
}
return(res);
}

================================================

Вроде как получается, сумма неких ма с разных ТФ?

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

Заранее признателен!

С Уважением! :)

 

А никто не пробовал вместо машки цифровые фильтры подсунуть? Хочу поробовать, но боюсь тормазня будет страшная...

 
Спасибо! Хорошая информация, есть что перенять с этого:)
 
Crazy_Fox:

Я думаю многие заметили, что индикаторы CC, CCFp и CFP не обновляются автоматически. Я их немного подправил - теперь всё нормально.

Что нужно сделать:

ищем в самом начале функции start() код:

   int counted_bars = IndicatorCounted();
//---- проверка на возможные ошибки
   if(counted_bars < 0) 
       return(-1);
//---- последний посчитанный бар будет пересчитан
   if(All_Bars < 1)
       All_Bars = Bars;
   if(counted_bars > 0 && Last_Bars > 0) 
       counted_bars -= Last_Bars;
   limit = All_Bars - counted_bars;

и заменяем его на следующий:

if (IndicatorCounted()<0) return(-1);
  limit=Bars-IndicatorCounted();
  if (Bars.Count>0 && limit>Bars.Count) limit=Bars.Count;

Теперь в начале файла ищем объявление параметров:

extern int All_Bars = 0;
extern int Last_Bars = 0;

Они нам теперь не нужны, вместо них вставим строчку:

extern int Bars.Count = 0;

Всё, теперь никаких проблем не будет. Это применимо для всех трёх индикаторов.

Для тех, кому неохота ковырять код - вот уже исправленные индикаторы: (это не картинка, это ZIP архив) ===>

PS: Семён Семёныч, спасибо за проделанную работу!

 
Crazy_Fox:

Я думаю многие заметили, что индикаторы CC, CCFp и CFP не обновляются автоматически. Я их немного подправил - теперь всё нормально.

Что нужно сделать:

ищем в самом начале функции start() код:

   int counted_bars = IndicatorCounted();
//---- проверка на возможные ошибки
   if(counted_bars < 0) 
       return(-1);
//---- последний посчитанный бар будет пересчитан
   if(All_Bars < 1)
       All_Bars = Bars;
   if(counted_bars > 0 && Last_Bars > 0) 
       counted_bars -= Last_Bars;
   limit = All_Bars - counted_bars;

и заменяем его на следующий:

if (IndicatorCounted()<0) return(-1);
  limit=Bars-IndicatorCounted();
  if (Bars.Count>0 && limit>Bars.Count) limit=Bars.Count;

Теперь в начале файла ищем объявление параметров:

extern int All_Bars = 0;
extern int Last_Bars = 0;

Они нам теперь не нужны, вместо них вставим строчку:

extern int Bars.Count = 0;

Всё, теперь никаких проблем не будет. Это применимо для всех трёх индикаторов.

Для тех, кому неохота ковырять код - вот уже исправленные индикаторы: (это не картинка, это ZIP архив) ===> 

PS: Семён Семёныч, спасибо за проделанную работу!


ссылка дохлая
 
MIM0:
Crazy_Fox:

Для тех, кому неохота ковырять код - вот уже исправленные индикаторы: (это не картинка, это ZIP архив) ===> 

PS: Семён Семёныч, спасибо за проделанную работу!


ссылка дохлая

Нет не дохлая только-что скачал.

Там скачивается фотка весом 8 кб меняем расширение на Zip и получаем 3 индюка в архиве...

Вот праямая ссылка если так проще Тык

Ну или ниже прикрепил уже сам архив.

 

Вот только что наткнулся на эти индюки.

Сразу вопрос возник. В CCFp специально ввели ошибку в оператор Switch()?

/+------------------------------------------------------------------+
//| Subroutines |
//+------------------------------------------------------------------+
double ma(string sym, int per, int Mode, int Price, int i)
{

.......................................

switch(Period())
{
   case 1: res += iMA(sym, tf, per*k, ma_shift, Mode, Price, i); 
   k += 5;

   ....................

}
Дело в том, что вообще-то строка выбора case, оператора switch() должна завершаться оператором break

Если эту ошибку устранить, индюк начинает рисовать совсем другое.

 
А в тестере эти индикаторы должны нормально отрисовываться, в том числе в визуальном режиме? Беру эксперт пустышку, в режиме паузы набрасываю туда индикатор, например, CFP - он нормально отрисовыватся вплоть до последнего бара, отключаю паузу - и индикатор как-бы замораживается: последние Last_Bars (или Bars.Count в модифицированно версии - без разницы) баров пересчитываются в те самые значения, которые имели Last_Bars во время паузы. Т.е. картинка индикатора стоит на месте, несмотря на то, что бары движутся справа налево. Добавил отладочные Print-ы, чтобы убедиться, что номера баров, времена, и значения машек изменяются. И вот бары и время идёт, но значения считаются одни и те же. Что за фигня? Заранее спасибо.
 
В архиве не работает индикатор Complex_pairs1