Индикатор который строит уровни Fibo по полуволнам индикатора MACD.

 

Здравствуйте, следующая задача, решение не соображается, простое решение совсем не соображается


Задача:

Индикатор который строит уровни Fibo по полуволнам индикатора MACD.

Что есть:
блок кода который строит уровни Fibo состоит из методов:
int init()
int deinit()
int start()
void ClearObjects()

блок кода, который находит min max значения и их номера тиков, по соответствущим полуволнам индикатора MACD, делался для советника, оттуда и взят
bool nonSymm(), вызывается из метода int start()
результаты проставляет в глобальные переменные

Подход 1: (Решено, пост№5)
bool nonSymm() который находит min max значения и их номера тиков, по соответствущим полуволнам индикатора MACD

данный метод в индикаторе не получает потока данных


Подход  2: (необходимость отпала)
попытка использования буферных массивов что бы к ним обращаться из метода bool nonSymm(), 

SetIndexBuffer(0,buffer_MACD);
SetIndexBuffer(1,buffer_High);
SetIndexBuffer(2,buffer_Low);
SetIndexBuffer(3,buffer_Time);

double buffer_MACD[i_bar]= iMACD(NULL,periodGlobal,12,26,9,PRICE_OPEN,MODE_MAIN, i_bar);   
double buffer_High[i_bar] = High[
double buffer_Low[i_bar] = Low[
datetime buffer_Time[i_bar] = Time[i_bar];

буфер не может принять тип dateTime

Подход  3: (необходимость отпала)
в метод nonSymm() получить данные для обработки через Copy, но здесь, как обсчитать MACD что бы тики MACD были идентичны тем что на графике, то есть в торговом потоке (мы ведь не можем здесь запросить значения MACD для тика, так как для этого потока оно не просчитано)

  double open_Array[];
   ArraySetAsSeries(open_Array,true);
   int open = CopyOpen(NULL,0,0,400,open_Array);
   double high_Array[];
   ArraySetAsSeries(high_Array,true);
   int high = CopyHigh(NULL,0,0,400,high_Array);
   double low_Array[];
   ArraySetAsSeries(low_Array,true);
   int low = CopyLow(NULL,0,0,400,low_Array);
   datetime time_Array[];
   ArraySetAsSeries(time_Array,true);
   int time = CopyTime(NULL,0,0,400,time_Array);
   double macd_Array[399];

 
Так закажите на фрилансе.
 

Так что заказывать, все есть, вопрос в том что в Советнике работает а в Индикаторе нет.

Скорее вопрос так поставить:

Если пользоваться буферами, как создать буфер данных MACD например ?

 

Кое что нащупал 

// При while (true) - в индикаторе выполниться while один раз
// При while (false) - в индикаторе выполниться ни разу, если переписать в for?
// for (true) - в индикаторе будет выполнятся бесконечно
 
Vasyl Kulyk:


буфер не может принять тип dateTime


в буферные значения (а там double, мантисса побольше 32-х бит) datetime влетает со свистом..

 

Не первый раз, такое впечатление что компилятор очень капризный

Следующий код всегда возвращает false

  bool isEqualToZero = isMACD1EqualZero && isMACD2EqualZero;
  bool isMACDReady = isSmaller || isBigger || isEqualToZero;

После компиляции с комментами
   bool isEqualToZero = isMACD1EqualZero && isMACD2EqualZero;
 //  Print("isSmaller = ", isSmaller,"isBigger = ", isBigger,"isEqualToZero = ", isEqualToZero);


   bool isMACDReady = isSmaller || isBigger || isEqualToZero;
//   Print("isMACDReady");

Сразу начал возвращать true, когда ожидается true 

И затем как хочешь компилируй, первоначальный вариант двух строк, работают согласно ожидаемым тестовым условиям
  bool isEqualToZero = isMACD1EqualZero && isMACD2EqualZero;
  bool isMACDReady = isSmaller || isBigger || isEqualToZero;
 

Топикстартеру: 

1 Цитата: 

" ... блок кода, который находит min max значения и их номера тиков, по соответствущим полуволнам индикатора MACD, делался для советника, оттуда и взят

bool nonSymm()

результаты проставляет в глобальные переменные ..." 

Иначе говоря, при попытке использования передачи данных из индикаторного буфера в советник, Вы передаете их всего один раз. А замысел требует многократной передачи данных. 


Еще: "... Подход 1:

bool nonSymm() который находит min max значения и их номера тиков, по соответствущим полуволнам индикатора MACD

данный метод в индикаторе не получает потока данных ..." 

Получает он поток, или не получает, нам без кода неизвестно. Но, даже если получает, то весь этот поток приводит к передаче в советник одного единственного набора результатов обработки - последнего по счету. 


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

В ветку для новичков сходите, там помогут. 

 
Maxim Kuznetsov:

в буферные значения (а там double, мантисса побольше 32-х бит) datetime влетает со свистом..

Спасибо,

datetime buffer_Time[]; 

SetIndexBuffer(3,buffer_Time);

 buffer_Time[i_bar] = Time[i_bar];

'SetIndexBuffer' - no one of the overloads can be applied to the function call <-- ( буфер не может принять тип dateTime)


то есть  метод SetIndexBuffer(), не может принять массив типа datetime,

Может вы имеете ввиду привести сначала к double,

но если основываться на справочнике максимум к string можно привести

https://docs.mql4.com/ru/basis/types/casting

https://docs.mql4.com/ru/basis/types/integer/datetime

Тип datetime - Целые типы - Типы данных - Основы языка - Справочник MQL4
Тип datetime - Целые типы - Типы данных - Основы языка - Справочник MQL4
  • docs.mql4.com
Константы даты и времени могут быть представлены в виде литеральной строки, которая состоит из 6 частей, представляющих числовое значение года, месяца, числа (либо числа, месяца, года), часа, минуты и секунды. Константа обрамляется...
 
Алексей Тарабанов:

Топикстартеру: 

1 Цитата: 

" ... блок кода, который находит min max значения и их номера тиков, по соответствущим полуволнам индикатора MACD, делался для советника, оттуда и взят

bool nonSymm()

результаты проставляет в глобальные переменные ..." 

Иначе говоря, при попытке использования передачи данных из индикаторного буфера в советник, Вы передаете их всего один раз. А замысел требует многократной передачи данных. 


Еще: "... Подход 1:

bool nonSymm() который находит min max значения и их номера тиков, по соответствущим полуволнам индикатора MACD

данный метод в индикаторе не получает потока данных ..." 

Получает он поток, или не получает, нам без кода неизвестно. Но, даже если получает, то весь этот поток приводит к передаче в советник одного единственного набора результатов обработки - последнего по счету. 


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

В ветку для новичков сходите, там помогут. 


Спасибо,

метод bool nonSymm() вызываю с метода int start() ( в методе nonSymm() стоит Sleep(3333), потому рассчитываю на периодическое обновление глобальных переменных, в принципе так и происходит)

вопрос с потоком, был сформулирован..., насколько хватило понимания, но спасибо, решен в посте №5


 

Я на С и МТ5 не программирую ) 

Старайтесь чаще думать. 

 
Vasyl Kulyk:

Спасибо,

datetime buffer_Time[]; 

SetIndexBuffer(3,buffer_Time);

 buffer_Time[i_bar] = Time[i_bar];

'SetIndexBuffer' - no one of the overloads can be applied to the function call <-- ( буфер не может принять тип dateTime)


то есть  метод SetIndexBuffer(), не может принять массив типа datetime,

Может вы имеете ввиду привести сначала к double,

но если основываться на справочнике максимум к string можно привести

https://docs.mql4.com/ru/basis/types/casting

https://docs.mql4.com/ru/basis/types/integer/datetime

datetime - это UNIX epoh (надеюсь правильно написал :-)

число секунд истекших с 00.00 1 января 1970г. 8 байт под него дали сильно-сильно-сильно с запасом

в double влезает без округлений.