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

 

leonerd #:
Здравствуйте. А как программно узнать символ и таймфрейм активного чарта в клиентском терминале? Т.е. чарта выбранного в настоящее время во вкладке. Есть какая-то функция из MQL5 для этого?

long  ChartGetInteger(
   long  chart_id,          // идентификатор графика
   int   prop_id,           // идентификатор свойства
   int   sub_window=0       // номер подокна, если требуется
   );

CHART_BRING_TO_TOP

Показ графика поверх всех других

bool  


string  ChartSymbol(
   long  chart_id=0      // идентификатор графика
   );
ENUM_TIMEFRAMES  ChartPeriod(
   long  chart_id=0      // идентификатор графика
   );

Как определить идентификатор графика тоже показать?

Документация по MQL5: Операции с графиками
Документация по MQL5: Операции с графиками
  • www.mql5.com
Операции с графиками - Справочник MQL5 - Справочник по языку алгоритмического/автоматического трейдинга для MetaTrader 5
 
Alexey Viktorov #:

CHART_BRING_TO_TOP

Показ графика поверх всех других

bool  


Как определить идентификатор графика тоже показать?

https://www.mql5.com/ru/docs/constants/chartconstants/charts_samples#chart_foreground

Спасибо. CHART_FOREGROUND наверное больше всего подходит. Мне же не надо принудительно устанавливать активный график, а лишь определить тот, который активен. Правильно ли я понимаю, что придется пройтись по всем открытым графикам с проверкой  CHART_FOREGROUND ?

Документация по MQL5: Константы, перечисления и структуры / Константы графиков / Примеры работы с графиком
Документация по MQL5: Константы, перечисления и структуры / Константы графиков / Примеры работы с графиком
  • www.mql5.com
Примеры работы с графиком - Константы графиков - Константы, перечисления и структуры - Справочник MQL5 - Справочник по языку алгоритмического/автоматического трейдинга для MetaTrader 5
 
leonerd #:

https://www.mql5.com/ru/docs/constants/chartconstants/charts_samples#chart_foreground

Спасибо. CHART_FOREGROUND наверное больше всего подходит. Мне же не надо принудительно устанавливать активный график, а лишь определить тот, который активен. Правильно ли я понимаю, что придется пройтись по всем открытым графикам с проверкой  CHART_FOREGROUND ?

CHART_FOREGROUND это график сверху

А чтобы не ставить принудительно, надо ChartSetInteger заменить на ChartGetInteger

 

Добрый день. 
Могли бы вы подсказать - есть мысли о роботе и там четыре разных условия - какие из них убирать я пока не знаю: хочу это выяснить потом при оптимизации на разных временных периодах. 

То есть: четыре условия (f1,f2,f3,f4). Комбинаций может быть много (0,0,1,1) или (1,0,1,0) и так далее - всего 16 комбинаций. Точнее 15 - вариант (0, 0, 0, 0) не рассматриваем.

Вопрос: как составить логику программы чтобы не описывать в коде все 15 комбинаций. Есть функция проверки каждого из этих условий, а то в каких комбинациях эти условия применяются - проверять как то иначе.

Буду рад если покажете какого нибудь советника, который при лаконичном коде допускает введение множества условий.

 
qadexys #:

Добрый день. 
Могли бы вы подсказать - есть мысли о роботе и там четыре разных условия - какие из них убирать я пока не знаю: хочу это выяснить потом при оптимизации на разных временных периодах. 

То есть: четыре условия (f1,f2,f3,f4). Комбинаций может быть много (0,0,1,1) или (1,0,1,0) и так далее - всего 16 комбинаций. Точнее 15 - вариант (0, 0, 0, 0) не рассматриваем.

Вопрос: как составить логику программы чтобы не описывать в коде все 15 комбинаций. Есть функция проверки каждого из этих условий, а то в каких комбинациях эти условия применяются - проверять как то иначе.

Буду рад если покажете какого нибудь советника, который при лаконичном коде допускает введение множества условий.

Можно так:

input bool F1;
input bool F2;
input bool F3;
input bool F4;

   ...
   if(  ( !F1 || f1)
      &&( !F2 || f2)
      &&( !F3 || f3)
      &&( !F4 || f4)
     )
     {
      open_pos();
     }
   ...

Или как-то так:

#define MODE_f1    0x1
#define MODE_f2    0x2
#define MODE_f3    0x4
#define MODE_f4    0x8

bool expert::create_strategy(ulong m, int om, int cm)
  {
   magic=m;
   open_mode=om;
   close_mode=cm;
   ...
  }

int OnInit()
  {
   ...
   my_strat[i].create_strategy(MAGIC, MODE_f1|MODE_f2|MODE_f4,MODE_c2|MODE_c3);
   ...
  }

expert::check_open()
  {
   ...
   if(  ((open_mode & MODE_f1)==0 || f1)
      &&((open_mode & MODE_f2)==0 || f2)
      &&((open_mode & MODE_f3)==0 || f3)
      &&((open_mode & MODE_f4)==0 || f4)
     )
     {
      open_pos();
     }
   ...
  }
 
Alexey Viktorov #:

CHART_FOREGROUND это график сверху

А чтобы не ставить принудительно, надо ChartSetInteger заменить на ChartGetInteger

спасибо

 
JRandomTrader #:

Можно так:

Или как-то так:

А вот первая конструкция - какое поведение кода будет при условиях (0, 1, 0, 1)?

Могли бы Вы пожалуйста пояснить тело условия If

 
qadexys #:

А вот первая конструкция - какое поведение кода будет при условиях (0, 1, 0, 1)?

Могли бы Вы пожалуйста пояснить тело условия If

Тут всё очень просто. Если F1==false, то ( !F1 || f1) будет true независимо от условия f1.

Т.е., если Fn==true, то условие fn проверяется, а если Fn==false, условие fn не проверяется.

Соответственно, для (0, 1, 0, 1) будут проверяться только условия f2 и f4, и если они оба выполняются, будет выполнен код open_pos()

 
JRandomTrader #:

Тут всё очень просто. Если F1==false, то ( !F1 || f1) будет true независимо от условия f1.

Т.е., если Fn==true, то условие fn проверяется, а если Fn==false, условие fn не проверяется.

Соответственно, для (0, 1, 0, 1) будут проверяться только условия f2 и f4, и если они оба выполняются, будет выполнен код open_pos()

А вот для случая когда f1 и другие не только 0 или 1. Подумал что если условие f1 выполняется для короткой позиции, тогда возвращается единица. Если для длинной - то 2. Если условие не выполняется вовсе - 0. 

Но в такой конструкции вероятно не стоит рассчитывать на такое разнообразие значений параметров и формулировать условие как то иначе?

 
qadexys #:

А вот для случая когда f1 и другие не только 0 или 1. Подумал что если условие f1 выполняется для короткой позиции, тогда возвращается единица. Если для длинной - то 2. Если условие не выполняется вовсе - 0. 

Но в такой конструкции вероятно не стоит рассчитывать на такое разнообразие значений параметров и формулировать условие как то иначе?

У меня наборы условий на открытие в лонг и в шорт рассматриваются отдельно.

Т.е., например, так:

 ...
   if(  ( !F1 || f1==1 )
      &&( !F2 || f2==1 )
      &&( !F3 || f3==1 )
      &&( !F4 || f4==1 )
     )
     {
      open_short();
     }
   else if(  ( !F1 || f1==2 )
           &&( !F2 || f2==2 )
           &&( !F3 || f3==2 )
           &&( !F4 || f4==2 )
          )
     {
      open_long();
     }
 ...

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

Тут можно фактически задать один из 224 вариантов:

   if(true
      && ((OpenMode & MODE_St1)==0 || St_Buf[St_Rq-1]>80)
      && ((OpenMode & MODE_St2)==0 || St_Buf2[St_Rq-1]>80)
      && ((OpenMode & MODE_BB1)==0 || last_tick.bid > bb[BandsReq-1].U)
      && ((OpenMode & MODE_BB2)==0 || last_tick.bid > bb2[BandsReq-1].U)
      && ((OpenMode & MODE_D1)==0  || rt[RtReq-1].high<rt[RtReq-2].high) 
     )
     {
      switch(OpenMode & (MODE_VR|MODE_OR|MODE_A))
        {
         case 0 :
         case MODE_A :
           res=-2;
           break;
         case MODE_VR :
           if((1/VR)>VRO)
             res=-2;
           break;
         case MODE_OR :
           if((1/OR)>VRO)
             res=-2;
           break;
         case MODE_VR|MODE_A :
           if((1/AVR)>VRO)
             res=-2;
           break;
         case MODE_OR|MODE_A :
           if((1/AOR)>VRO)
             res=-2;
           break;
         case MODE_VR|MODE_OR :
           if((1/VR)>VRO && (1/OR)>VRO)
             res=-2;
           break;
         case MODE_VR|MODE_OR|MODE_A :
           if((1/AVR)>VRO && (1/AOR)>VRO)
             res=-2;
           break;
        }