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

 
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.

 
Alexey Volchanskiy:

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

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

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

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

Алексей, а Вы сами, не пробовали прикинуть, как эта "довольно простая" задача будет работать? Вы программист профессионал с системным образованием, а я - самоучка на изучении, применении и модификации работающих алгоритмов. Мне это не одолеть, поэтому и вопросы задаю. Две недели уже парюсь над этой проблемой. Помогите пожалуйста, если это Вам не очень в тягость.
 
Leo59:
Алексей, а Вы сами, не пробовали прикинуть, как эта "довольно простая" задача будет работать? Вы программист профессионал с системным образованием, а я - самоучка на изучении, применении и модификации работающих алгоритмов. Мне это не одолеть, поэтому и вопросы задаю. Две недели уже парюсь над этой проблемой. Помогите пожалуйста, если это Вам не очень в тягость.

Я по образованию радиоконструктор )) То есть меня учили даже не электронике (ее был самый минимум) и не программированию, а как спроектировать ящик для радиоаппаратуры )) Но я в свое время был неплохим электронщиком, сам научился. Потом также самоучкой освоил программирование с нуля. Так что корки о высшем образование именно в нашей области не нужны )) Нужно желание и труд.

По теме. Пишем для 4-ки или 5-ки?