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

Авторизуйтесь или зарегистрируйтесь, чтобы добавить комментарий
Vasyl Kulyk
258
Vasyl Kulyk  

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


Задача:

Индикатор который строит уровни 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];

Vladimir Simakov
6149
Vladimir Simakov  
Так закажите на фрилансе.
Vasyl Kulyk
258
Vasyl Kulyk  

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

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

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

Vasyl Kulyk
258
Vasyl Kulyk  

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

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


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


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

Vasyl Kulyk
258
Vasyl Kulyk  

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

Следующий код всегда возвращает 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;
Алексей Тарабанов
10042
Алексей Тарабанов  

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

1 Цитата: 

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

bool nonSymm()

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

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


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

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

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

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


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

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

Vasyl Kulyk
258
Vasyl Kulyk  
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 частей, представляющих числовое значение года, месяца, числа (либо числа, месяца, года), часа, минуты и секунды. Константа обрамляется...
Vasyl Kulyk
258
Vasyl Kulyk  
Алексей Тарабанов:

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

1 Цитата: 

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

bool nonSymm()

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

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


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

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

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

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


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

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


Спасибо,

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

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


Алексей Тарабанов
10042
Алексей Тарабанов  

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

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

Maxim Kuznetsov
13781
Maxim Kuznetsov  
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 влезает без округлений.

Авторизуйтесь или зарегистрируйтесь, чтобы добавить комментарий