Обсуждение статьи "Графический конструктор стратегий. Создание торговых роботов без программирования" - страница 6

 
Andrey Barinov:
...

Прокрутку колесиком добавлю в будущих версиях...

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

Внутри функции OnChartEvent() в условии :

if(id == CHARTEVENT_CHART_CHANGE && !a)

1. Использую функцию ChartNavigate и устанавливаю текущий график на позицию -100 баров назад.

2. Устанавливаю номер первого видимого бара с помощью СhartGetInteger(0,FIRST_VISIBLE_BAR) в статическую переменную "Номер_первого_бара".

3. Далее, фиксирую событие графика CHARTEVENT_CHART_CHANGE через раз (для этого использую флаг "a" и флаг "b").

4. Сравниваю, "Номер_первого_бара" и "Номер_этого_бара" (который, также получаю через СhartGetInteger(0,FIRST_VISIBLE_BAR), но на каждом событии CHARTEVENT_CHART_CHANGE, а не один раз как с "Номер_первого_бара")

   и определяю направление смещения графика.

5. Далее, все просто - я двигаю изображение канваса с помощью ObjectSetInteger(0,G_CORE[КАНВАС][_NAME],OBJPROP_YOFFSET,G_CORE[КАНВАС][_FIELD_TO_VIEW_Y_DISTANCE]); возвращаю график на исходную позицию -  ChartNavigate(0,CHART_END,-100);

6. Следующее событие графика я пропускаю, поскольку оно генерируется от вызванной функции ChartNavigate. Потом все повторяется.

Вот код:

 if(id == CHARTEVENT_CHART_CHANGE && !a)
   {
    //------------------------------------  
    if(!Номер_первого_бара)
      {
       ChartNavigate(0,CHART_END,-100); 
       Номер_первого_бара = ChartGetInteger(0,CHART_FIRST_VISIBLE_BAR);
      }
    //------------------------------------    
    Номер_этого_бара = ChartGetInteger(0,CHART_FIRST_VISIBLE_BAR);
    //------------------------------------
    if(Номер_этого_бара > Номер_первого_бара)
      {
       Прокрутка_вниз = 1;
       Прокрутка_вверх = 0;
       Сдвиг = 25;
       a = 1;
      }
    if(Номер_этого_бара  < Номер_первого_бара) 
      {
       Прокрутка_вниз = 0;
       Прокрутка_вверх = 1;
       Сдвиг = -25;
       a = 1;
      }
    //------------------------------------
    G_CORE[КАНВАС][_IMAGE_VIRTUAL_Y] -= Сдвиг;
    //------------------------------------  
    G_CORE[КАНВАС][_FIELD_TO_VIEW_Y_DISTANCE] = G_CORE[Поле_обзора][_Y] - G_CORE[КАНВАС][_IMAGE_VIRTUAL_Y];  
    //------------------------------------
    ObjectSetInteger(0,G_CORE[КАНВАС][_NAME],OBJPROP_YOFFSET,G_CORE[КАНВАС][_FIELD_TO_VIEW_Y_DISTANCE]);
    //------------------------------------    
  }
//------------------------------------------------------
if(b){a = 0; b = 0;} 
if(a == 1){ChartNavigate(0,CHART_END,-100);  b = 1;} 
//------------------------------------------------------

Недостаток этого метода в том, что график на заднем плане дергается. Однако, Ваш конструктор занимает всю видимую его часть и потому это не будет заметно.

Преимущество этого метода в том, что Вы получаете отличную прокрутку колесиком, ничем не уступающую прокрутки окон виндоус. Есть энерция, замедление... Также, при наведении на горизонтальную полосу прокрутки и прокручивании колесика у меня проручивается полотно в горизонтальном положении. Сделать это легко.

С этой прокруткой у пользователей будет ощущение, что они работают в виндоус.)

Так это выглядит: https://www.mql5.com/ru/forum/139237/page7

 
Реter Konow:

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

Внутри функции OnChartEvent() в условии :

1. Использую функцию ChartNavigate и устанавливаю текущий график на позицию -100 баров назад.

2. Устанавливаю номер первого видимого бара с помощью СhartGetInteger(0,FIRST_VISIBLE_BAR) в статическую переменную "Номер_первого_бара".

3. Далее, фиксирую событие графика CHARTEVENT_CHART_CHANGE через раз (для этого использую флаг "a" и флаг "b").

4. Сравниваю, "Номер_первого_бара" и "Номер_этого_бара" (который, также получаю через СhartGetInteger(0,FIRST_VISIBLE_BAR), но на каждом событии CHARTEVENT_CHART_CHANGE, а не один раз как с "Номер_первого_бара")

   и определяю направление смещения графика.

5. Далее, все просто - я двигаю изображение канваса с помощью ObjectSetInteger(0,G_CORE[КАНВАС][_NAME],OBJPROP_YOFFSET,G_CORE[КАНВАС][_FIELD_TO_VIEW_Y_DISTANCE]); возвращаю график на исходную позицию -  ChartNavigate(0,CHART_END,-100);

6. Следующее событие графика я пропускаю, поскольку оно генерируется от вызванной функции ChartNavigate. Потом все повторяется.

Вот код:

Недостаток этого метода в том, что график на заднем плане дергается. Однако, Ваш конструктор занимает всю видимую его часть и потому это не будет заметно.

Преимущество этого метода в том, что Вы получаете отличную прокрутку колесиком, ничем не уступающую прокрутки окон виндоус. Есть энерция, замедление... Также, при наведении на горизонтальную полосу прокрутки и прокручивании колесика у меня проручивается полотно в горизонтальном положении. Сделать это легко.

С этой прокруткой у пользователей будет ощущение, что они работают в виндоус.)

Так это выглядит: https://www.mql5.com/ru/forum/139237/page7

Спасибо.

А чем CHARTEVENT_MOUSE_WHEEL не угодил?

 https://www.mql5.com/ru/docs/constants/chartconstants/enum_chartevents 

Документация по MQL5: Константы, перечисления и структуры / Константы графиков / Типы событий графика
Документация по MQL5: Константы, перечисления и структуры / Константы графиков / Типы событий графика
  • www.mql5.com
Существуют 11 видов событий, которые можно обрабатывать с помощью функции предопределенной функции OnChartEvent(). Для пользовательских событий предусмотрено 65535 идентификаторов в диапазоне от CHARTEVENT_CUSTOM до CHARTEVENT_CUSTOM_LAST включительно. Для генерации пользовательского события необходимо использовать функцию EventChartCustom...
 
Andrey Barinov:

Спасибо.

А чем CHARTEVENT_MOUSE_WHEEL не угодил?

 https://www.mql5.com/ru/docs/constants/chartconstants/enum_chartevents 

Когда я делал прокрутку колесиком, его еще небыло. Поэтому даже не пробывал. (К тому же, пока работаю на МТ4, а там его вроде нет.)

Он дает энерцию и замедление?

 
Реter Konow:

Когда я делал прокрутку колесиком, его еще небыло. Поэтому даже не пробывал. (К тому же, пока работаю на МТ4, а там его вроде нет.)

Он дает энерцию и замедление?

Не знаю, не пробовал. Просто помню что есть такое событие.

 

Добрый день.

Я тот самый НЕПРОГРАММИСТ, для которого существует этот продукт и статья о нем.

Есть вопрос - в познавательных целях я попытался воспроизвести советник из примера номер 1 (пересечение быстрой и медленной МА). Делал все как в статье, буква в букву. В результате советник иногда открывает и тут-же закрывает позиции по несколько штук, моментально создавая убыток. А иногда открывает одиночную позицию, все как положено, закрывает ее при поступлении противоположного сигнала. Все казалось бы хорошо хоть с этими, но заметил что онми всегда только Бай.

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

Вы сможете просмотреть код и подсказать что я сделал не так ?

Файлы:
 
Andrey Barinov:

Не знаю, не пробовал. Просто помню что есть такое событие.

Событие то есть, а никто еще его не использовал.)

Я бы с удовольствием избавился от своего метода из за дергания графика, но на МТ4 точно нет этого события, а на МТ5, пока еще, неизвестно как это работает...

 
 
Sergey Voytsekhovsky:

Добрый день.

Я тот самый НЕПРОГРАММИСТ, для которого существует этот продукт и статья о нем.

Есть вопрос - в познавательных целях я попытался воспроизвести советник из примера номер 1 (пересечение быстрой и медленной МА). Делал все как в статье, буква в букву. В результате советник иногда открывает и тут-же закрывает позиции по несколько штук, моментально создавая убыток. А иногда открывает одиночную позицию, все как положено, закрывает ее при поступлении противоположного сигнала. Все казалось бы хорошо хоть с этими, но заметил что онми всегда только Бай.

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

Вы сможете просмотреть код и подсказать что я сделал не так ?

Начните с изучения шаблона №1. Эта как раз та схема, которая рассмотрена в статье (только добавлен Трал и Безубыток). Можно посмотреть параметры всех элементов и поиграться с ними. 

В Вашем советнике есть ряд ошибок. Одна из них, что в элементе на совершение продаж Вы не поменяли тип сделки (там указано "покупка", вместо продажи).

 
Andrey Barinov:

Начните с изучения шаблона №1. Эта как раз та схема, которая рассмотрена в статье (только добавлен Трал и Безубыток). Можно посмотреть параметры всех элементов и поиграться с ними. 

В Вашем советнике есть рад ошибок. Одна из них, что в элементе на совершение продаж Вы не поменяли тип сделки (там указано "покупка", вместо продажи).

Спасибо, очень приятно удивила оперативность ответа.

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

А в каком месте накосячено то, что за пол секунды, видимо на каждом тике, открывается и сразу закрывается целая серия ордеров, при этом там есть и в покупки и в продажи. ???

 
Sergey Voytsekhovsky:

Спасибо, очень приятно удивила оперативность ответа.

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

А в каком месте накосячено то, что за пол секунды, видимо на каждом тике, открывается и сразу закрывается целая серия ордеров, при этом там есть и в покупки и в продажи. ???

Ну смотрите, у вас вместо продажи открывается покупка. При этом, при сигнале на продажу покупки должны закрываться! Что и происходит. 

Появляется сигнал на продажу, робот по ошибке открывает покупку вместо продажи, и тут же ее закрывает, потом открывает снова и опять закрывает и т.д. 

В остальном все было верно в вашей схеме. 
Причина обращения: