初学者的问题 MQL5 MT5 MetaTrader 5 - 页 1384

 

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

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

图表_带至顶部

在所有其他图表的顶部显示图表

bool


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

如何定义一个图表标识符也要显示?

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

图表_带至顶部

在所有其他图表的顶部显示图表

bool


如何定义一个图表ID也要显示?

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 是一个在上面的图表。

而不是强制执行,你应该用ChartGetInteger代替ChartSetInteger。

 

下午好。
你能给我一个提示吗--我正在考虑一个机器人,有四个不同的条件--我还不知道要删除哪些条件:我想以后在为不同的时间段进行优化时找出答案。

即:四个条件(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 是上面的图表。

为了不强迫它,用ChartGetInteger代替ChartSetInteger

谢谢

 
JRandomTrader #:

你可以这样做。

或者类似这样的事情。

这里是第一个结构--在(0,1,0,1)的条件下,代码的行为会是什么?

你能否解释一下If条件的主体?

 
qadexys #:

这里是第一个结构--在(0,1,0,1)条件下,代码的行为会是什么?

你能解释一下条件的主体吗?

这里非常简单。如果F1==false,那么( !F1 || f1)将为真,无论条件f1如何。

也就是说,如果Fn==true,条件fn被检查,如果Fn==false,条件fn不被检查。

因此,对于(0, 1, 0, 1),只有条件f2和f4将被检查,如果它们都成立,open_pos()代码将被执行。

 
JRandomTrader #:

这非常简单。如果F1==false,那么( !F1 || f1)将为真,无论条件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满足空头头寸,那么就会返回1。如果是多头,则返回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;
        }