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

 
Здравствуйте!

Может быть у кого-нибудь есть пример кода, который рисует какие-нибудь значки, например, стрелки на графике индикатора, при пересечении линий, если их две, или при пересечении "0" линии, или при любом другом критерии? Желательно, у верхней и нижней границы самомасштабирующегося индикаторного окна.
 
Sergei Vladimirov:
Нажмите "Загрузить". Автоматически загружаются только последние 2048 баров, остальные нужно пнуть.
Так это и вышло после "Загрузить" ...
 
Mike:
Так это и вышло после "Загрузить" ...
Сотрите принудительно папку с архивом истории и запустите терминал - потом загрузите все котировки.
 
Leo59:
Здравствуйте!

Может быть у кого-нибудь есть пример кода, который рисует какие-нибудь значки, например, стрелки на графике индикатора, при пересечении линий, если их две, или при пересечении "0" линии, или при любом другом критерии? Желательно, у верхней и нижней границы самомасштабирующегося индикаторного окна.

Вот из моего индюка, может, поможет. Код для МТ4, выкладываю, как есть. Там еще работа с логами.

void PlotArrowUP(int i)
{
    string sup = "\xE9"; //233
    datetime dt = iTime(NULL, 0, i); 
    double dprice = (WindowPriceMax()-WindowPriceMin())/(100.0/ArrowOffsetInPercentOfScreen); //настроить масштаб под свои нужды
    ObjectCreate("arr1"+ArrowIdx, OBJ_TEXT, 0, dt, FastBuffer[i]-dprice);   
    ObjectSetText("arr1"+ArrowIdx, sup, ArrowFontSize, "Wingdings", ColorArrowUp);
    ArrowIdx++;
    if(EnableLogFile)
    {
        string dts = TimeToStr(TimeCurrent(), TIME_DATE | TIME_MINUTES | TIME_SECONDS);
        FileWrite(LogFile1, dts, "  call PlotArrowUp(i) i=", i, "  FastBuffer[i]=", FastBuffer[i]);
    }
}

void PlotArrowDown(int i)
{
    string sup = "\xEA"; //234
    datetime dt = iTime(NULL, 0, i); 
    double dprice = (WindowPriceMax()-WindowPriceMin())/(100.0/ArrowOffsetInPercentOfScreen);
    dprice*= 2.0;
    ObjectCreate("arr0"+ArrowIdx, OBJ_TEXT, 0, dt, FastBuffer[i]+dprice);   
    ObjectSetText("arr0"+ArrowIdx, sup, ArrowFontSize, "Wingdings", ColorArrowDown);
    ArrowIdx++;
    if(EnableLogFile)
    {
        string dts = TimeToStr(TimeCurrent(), TIME_DATE | TIME_MINUTES | TIME_SECONDS);
        FileWrite(LogFile1, dts, "  call PlotArrowDown(i) i=", i, "  FastBuffer[i]=", FastBuffer[i]);
    }
}
 
Alexey Volchanskiy:

Вот из моего индюка, может, поможет. Код для МТ4, выкладываю, как есть. Там еще работа с логами.

Спасибо Вам Алексей, что откликнулись!

В Ваше примере это через объекты. Интересно, а можно это делать через массивы, чтобы при изменении масштаба, они всегда находились у верхней и нижней границ окна ?
 
Leo59:
Alexey Volchanskiy:
Спасибо Вам Алексей, что откликнулись!

В Ваше примере это через объекты. Интересно, а можно это делать через массивы, чтобы при изменении масштаба, они всегда находились у верхней и нижней границ окна ?

Насчет массивов не понял. Смотрите комменты, я добавил

ObjectCreate("arr0"+ArrowIdx, OBJ_TEXT, 0, dt, FastBuffer[i]+dprice);
// "arr0"+ArrowIdx - формируем уникальное имя стрелки
// FastBuffer[i]+dprice - тут формируется цена, на которой будет рисоваться стрелка
   
ObjectSetText("arr0"+ArrowIdx, sup, ArrowFontSize, "Wingdings", ColorArrowDown);
ArrowIdx++; // для каждой стрелки нужно уникальное имя

 Далее, если надо рисовать на верхней границе, делаем так

ObjectCreate("arr0"+ArrowIdx, OBJ_TEXT, 0, dt, ChartGetDouble(0,CHART_PRICE_MAX,0); 

 И почитайте справку в редакторе, тут подробно расписано с примерами

Справочник MQL4 / Стандартные константы, перечисления и структуры / Константы графиков / Примеры работы с графиком 

 
Alexey Volchanskiy:

Насчет массивов не понял. Смотрите комменты, я добавил

 Далее, если надо рисовать на верхней границе, делаем так

 И почитайте справку в редакторе, тут подробно расписано с примерами

Справочник MQL4 / Стандартные константы, перечисления и структуры / Константы графиков / Примеры работы с графиком 

С изменением

WindowPriceMax() и WindowPriceMin()

объекты нужно будет принудительно перерисовывать на заданном расстоянии от границ окна

 
Leo59:

С изменением

объекты нужно будет принудительно перерисовывать на заданном расстоянии от границ окна

Старые объекты остануться на своих местах - на старых ценах. Если надо их перемещать к границам, надо перерисовывать ручками. Просто я вашей задачи полностью не знаю.

Отследить изменение окна можно через OnChartEvent

 
Alexey Volchanskiy:

Старые объекты остануться на своих местах - на старых ценах. Если надо их перемещать к границам, надо перерисовывать ручками. Просто я вашей задачи полностью не знаю.

Отследить изменение окна можно через OnChartEvent. 

На первый взгляд, задача простая, как три копейки. НО!....
Есть линия любого осциллятора в индикаторном окне, которая болтается относительно "0" с различной амплитудой.
Собственно, задача:
- при пересечении "0" снизу вверх, нарисовать стрелку у нижней границы индикаторного окна,
- при пересечении "0" сверху вниз, нарисовать стрелку у верхней границы индикаторного окна,
- при самомасштабировании графика осциллятора в индикаторном окне, стрелки должны автоматически оставаться у своих границ индикаторного окна.
Т.е. прокручивая чарт по истории взад-вперёд или меняя его горизонтальный масштаб, стрелки всё время у своих границ индикаторного окна.
 
Leo59:
На первый взгляд, задача простая, как три копейки. НО!....
Есть линия любого осциллятора в индикаторном окне, которая болтается относительно "0" с различной амплитудой.
Собственно, задача:
- при пересечении "0" снизу вверх, нарисовать стрелку у нижней границы индикаторного окна,
- при пересечении "0" сверху вниз, нарисовать стрелку у верхней границы индикаторного окна,
- при самомасштабировании графика осциллятора в индикаторном окне, стрелки должны автоматически оставаться у своих границ индикаторного окна.
Т.е. прокручивая чарт по истории взад-вперёд или меняя его горизонтальный масштаб, стрелки всё время у своих границ индикаторного окна.

Задача и есть довольно простая.

При изменении или прокрутке окна вызывается OnChartEvent, в ней передается событие без параметров: 

Событие изменения графика CHARTEVENT_CHART_CHANGE

Если такое событие пришло, определяем левый и правый видимый бар и в этих пределах в индикаторном окне находим все стрелки. Если нашлась - передвигаем ее к нужной границе. Стрелкам при создании давать имена типа UpArrow***** и DownArrow*****, чтобы не парится с анализом. Потом на всякий вызвать ChartRedraw.

Причина обращения: