Вопросы от начинающих MQL5 MT5 MetaTrader 5 - страница 740

 

Продублирую вопрос сюда, в индикаторах никто не отзывается..

Начал изучать MQL5. Опыта в программировании нет, потому возникают некоторые вопросы и непонятки. Часть из них решается самостоятельно, на анализе примеров и частично методом тыка, но отдельные моменты не понять вот так сразу. Начал изучение с простого - получить вывод на главное окно графика две линии инструментов. Построение по Close текущего и дополнительного (родственного, примечание будет далее) инструмента по текущему таймфрейму на 1000 баров назад. Родственный инструмент - фьючерс следующей серии, он малоликвиден и всегда имеет некоторые пробелы в данных, т.е. количество сделок не такое частое, как в основной серии фьючерса. Задача казалось бы выполнена, но есть ошибки. О том, пригодится ли мне сглаживание сказать не могу, поэтому использовал iMA с периодом 1, чтобы в случае необходимости можно было сгладить без переделок.

Вот вопросы:

1. при компиляции, когда я копирую буффер iMA в массив, вижу предупреждение "possible loss of data due to type conversion". Что это такое и почему, о какой конвертации типов речь? Линии же отрисовались нормально и вроде ничего не пропало.

2. После отработки индикатора и появления линий двух инструментов на главном окне графика я вижу, что они не синхронизированы. Т.е. первый инструмент в норме и соответствует свечному графику основного окна. Второй (менее ликвидный) с пробелами, и поэтому он постепенно "поджимается" вызывая рассинхрон. А нужно, чтобы он синхронизировался по времени как-то. Это для меня пока непосильно. Надо увидеть правку наглядно, чтобы понять чего не хватает.

Вот скрин, как это выглядит. Желтая линия - то, что нужно синхронизировать относительно зеленой. Чтобы в желтой линии, где пробелы по датам просто были "соединения" предыдущий значений со следующими, а не поджатие с пропуском дат. Код в приложении.

Файлы:
 
ottenand:

Продублирую вопрос сюда, в индикаторах никто не отзывается..

Начал изучать MQL5. Опыта в программировании нет, потому возникают некоторые вопросы и непонятки. Часть из них решается самостоятельно, на анализе примеров и частично методом тыка, но отдельные моменты не понять вот так сразу. Начал изучение с простого - получить вывод на главное окно графика две линии инструментов. Построение по Close текущего и дополнительного (родственного, примечание будет далее) инструмента по текущему таймфрейму на 1000 баров назад. Родственный инструмент - фьючерс следующей серии, он малоликвиден и всегда имеет некоторые пробелы в данных, т.е. количество сделок не такое частое, как в основной серии фьючерса. Задача казалось бы выполнена, но есть ошибки. О том, пригодится ли мне сглаживание сказать не могу, поэтому использовал iMA с периодом 1, чтобы в случае необходимости можно было сгладить без переделок.

Вот вопросы:

1. при компиляции, когда я копирую буффер iMA в массив, вижу предупреждение "possible loss of data due to type conversion". Что это такое и почему, о какой конвертации типов речь? Линии же отрисовались нормально и вроде ничего не пропало.

2. После отработки индикатора и появления линий двух инструментов на главном окне графика я вижу, что они не синхронизированы. Т.е. первый инструмент в норме и соответствует свечному графику основного окна. Второй (менее ликвидный) с пробелами, и поэтому он постепенно "поджимается" вызывая рассинхрон. А нужно, чтобы он синхронизировался по времени как-то. Это для меня пока непосильно. Надо увидеть правку наглядно, чтобы понять чего не хватает.

Вот скрин, как это выглядит. Желтая линия - то, что нужно синхронизировать относительно зеленой. Чтобы в желтой линии, где пробелы по датам просто были "соединения" предыдущий значений со следующими, а не поджатие с пропуском дат. Код в приложении.


1. Хендл индикатора должен иметь тип int. Пример смотреть тут: CopyBuffer

int  CopyBuffer( 
   int       indicator_handle,     // handle индикатора 
   int       buffer_num,           // номер буфера индикатора 
   int       start_pos,            // откуда начнем  
   int       count,                // сколько копируем 
   double    buffer[]              // массив, куда будут скопированы данные 
   );
 
Vladimir Karputov:


1. Хендл индикатора должен иметь тип int. Пример смотреть тут: CopyBuffer

Точно, этот момент я проглядел, ошибка при компиляции пропала, спасибо!

Но основная проблема на данный момент - рассинхрон, остается актуален. Без его решения нельзя будет например проводить математические операции между инструментами, которые я и планирую испытывать.

 
ottenand:

Точно, этот момент я проглядел, ошибка при компиляции пропала, спасибо!

Но основная проблема на данный момент - рассинхрон, остается актуален. Без его решения нельзя будет например проводить математические операции между инструментами, которые я и планирую испытывать.


Я бы на Вашем месте начал с правильного написания кода - дело в том, что сейчас Ваш стиль - это бесшабашный "четвёрочный" - то есть нет проверок, всё на авось.

Начните исправлять OnInit():

  1. после получения хендл нужно проверить на корректность
  2. если всё нормально возвращать НЕ "0", а "INIT_SUCCEEDED"
Всё это есть в примере iMA. Только потом можно будет двигаться дальше.

 
Vladimir Karputov:


Я бы на Вашем месте начал с правильного написания кода - дело в том, что сейчас Ваш стиль - это бесшабашный "четвёрочный" - то есть нет проверок, всё на авось.

Начните исправлять OnInit():

  1. после получения хендл нужно проверить на корректность
  2. если всё нормально возвращать НЕ "0", а "INIT_SUCCEEDED"
Всё это есть в примере iMA. Только потом можно будет двигаться дальше.

Кто ж тебе сказал, друг, что нельзя тяпляпать на пятёрке, и писать красиво на четвёрке?

Дело не в ПЛАТФОРМЕ, а в голове конкретного писаки...

Профессор Преображенский верно говорил про то, где разруха - не в клозетах, а в головах...


 
Vladimir Karputov:


Я бы на Вашем месте начал с правильного написания кода - дело в том, что сейчас Ваш стиль - это бесшабашный "четвёрочный" - то есть нет проверок, всё на авось.

Начните исправлять OnInit():

  1. после получения хендл нужно проверить на корректность
  2. если всё нормально возвращать НЕ "0", а "INIT_SUCCEEDED"
Всё это есть в примере iMA. Только потом можно будет двигаться дальше.

Ну, теперь буду знать, как мой стиль называется) Правда я начинаю сразу с пятой версии, с нуля)

Спасибо, пункты 1 и 2 исправил.  Вся загвоздка в блоке калькуляции. Буду думать как прописать расположение баров двух инструментов в соответствии с временем. Иначе рассихрон и всё то же предупреждение №4806.

Файлы:
 
ottenand:

Ну, теперь буду знать, как мой стиль называется) Правда я начинаю сразу с пятой версии, с нуля)

Спасибо, пункты 1 и 2 исправил.  Вся загвоздка в блоке калькуляции. Буду думать как прописать расположение баров двух инструментов в соответствии с временем. Иначе рассихрон и всё то же предупреждение №4806.

Воооот! Правильно! Так как, например на M1 по фьючерсу "A" есть бары в 13 минут, 14 минут и 15 минут. А по фьючерсу "Б" есть только в 13 минут и в 15 минут - то есть дыра. Где-то были статьи, искать по слову "дыра".
 
Vladimir Karputov:
Воооот! Правильно! Так как, например на M1 по фьючерсу "A" есть бары в 13 минут, 14 минут и 15 минут. А по фьючерсу "Б" есть только в 13 минут и в 15 минут - то есть дыра. Где-то были статьи, искать по слову "дыра".
Я об этом и говорю) Ошибка №4806 видимо по той причине и приходит. Ок, поищу)
 

Добрый день.

Подскажите, пожалуйста, как найти цену трэндовой линии для текущего бара? Пробовал через ObjectGetDouble, но не дает нужного результата. Пример кода:

   ObjectCreate(0,"O_Resistance",OBJ_TREND,0,UpTime_2[0],UpFractal_2,UpTime_1[0],UpFractal_1);
   ObjectMove(0,"O_Resistance",0,UpTime_2[0],UpFractal_2);
   ObjectMove(0,"O_Resistance",1,UpTime_1[0],UpFractal_1);
   ObjectSetInteger(0,"O_Resistance",OBJPROP_RAY_RIGHT,true);
   ObjectSetInteger(0,"O_Resistance",OBJPROP_COLOR,O_Resistance_Color);
   ObjectSetInteger(0,"O_Resistance",OBJPROP_STYLE,O_Resistance_Style);
   ObjectSetInteger(0,"O_Resistance",OBJPROP_WIDTH,O_Resistance_Width);


double O_ResistancePrice = ObjectGetDouble(0,"O_Resistance",OBJPROP_PRICE,0); // при любом баре дает координату изначальной точки луча, а нужна цена
                                                                              // соответствующая текущему бару или первому
 
MaksGroup:

Добрый день.

Подскажите, пожалуйста, как найти цену трэндовой линии для текущего бара? Пробовал через ObjectGetDouble, но не дает нужного результата. Пример кода:

ObjectGetValueByShift() (только МТ4), ObjectGetValueByTime() (МТ4, МТ5)
Причина обращения: