Perguntas de Iniciantes MQL5 MT5 MetaTrader 5 - página 1384

 

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

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

GRÁFICO_MARCAS_ATÉ_AO_ALTO

Mostrar gráfico no topo de todos os outros gráficos

bool


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

Como definir também uma identificação gráfica para mostrar?

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

GRÁFICO_MARCAS_ATÉ_AO_ALTO

Mostrar gráfico no topo de todos os outros gráficos

bool


Como definir também uma identificação gráfica para mostrar?

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

Obrigado. O CHART_FOREGROUNDO é provavelmente o mais adequado. Não preciso de definir o gráfico activo à força, só preciso de determinar qual deles está activo. Tenho razão em pensar que terei de percorrer todos os gráficos abertos verificando CHART_FOREGROUNDO ?

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

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

Obrigado. O CHART_FOREGROUNDO é provavelmente o mais adequado. Não é que eu precise de definir à força o gráfico activo, mas apenas identificar aquele que está activo. Compreendo correctamente que tenho de percorrer todos os gráficos abertos verificando CHART_FOREGROUNDO ?

CHART_FOREGROUNDO é um gráfico no topo.

E, para não o impor, deve substituir ChartSetInteger por ChartGetInteger

 

Boa tarde.
Pode dar-me uma dica - estou a pensar num robô e há quatro condições diferentes - ainda não sei quais remover: quero descobrir mais tarde quando optimizar para prazos diferentes.

Ou seja: quatro condições (f1,f2,f3,f4). Pode haver muitas combinações (0,0,1,1) ou (1,0,1,0) e assim por diante - um total de 16 combinações. Exactamente 15 - a variante (0, 0, 0, 0, 0) não é considerada.

Pergunta: como criar a lógica do programa para não descrever todas as 15 combinações no código. Existe uma função para verificar cada uma destas condições, e em que combinações destas condições se aplicam - verificar de que outra forma.

Ficaria contente se me pudesse mostrar algum consultor especializado, o que me permite introduzir muitas condições num código conciso.

 
qadexys #:

Boa tarde.
Pode dar-me uma dica - estou a pensar num robô e há quatro condições diferentes - ainda não sei quais remover: quero descobrir mais tarde quando optimizar para prazos diferentes.

Ou seja: quatro condições (f1,f2,f3,f4). Pode haver muitas combinações (0,0,1,1) ou (1,0,1,0) e assim por diante - um total de 16 combinações. Exactamente 15 - a variante (0, 0, 0, 0, 0) não é considerada.

Pergunta: como criar a lógica do programa para não descrever todas as 15 combinações no código. Existe uma função para verificar cada uma destas condições, e em que combinações destas condições se aplicam - verificar de que outra forma.

Ficaria feliz se me mostrasse algum consultor especializado, o que me permite introduzir múltiplas condições num código conciso.

Posso ir assim:

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

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

Ou algo parecido com isto:

#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_FOREGROUNDO é o gráfico no topo

E para não o forçar, substituir ChartSetInteger por ChartGetInteger

obrigado

 
JRandomTrader #:

Poderia fazer isto:

Ou algo parecido com isto:

E aqui está a primeira construção - qual seria o comportamento do código nas condições (0, 1, 0, 1)?

Poderia explicar o corpo da condição de If

 
qadexys #:

E aqui está a primeira construção - qual será o comportamento do código sob (0, 1, 0, 1) condições?

Poderia explicar o corpo da condição se

Aqui é muito simples. Se F1==falso, então ( !F1 ||| f1) será verdadeiro independentemente da condição f1.

Isto é, se Fn===verdadeiro, a condição fn é verificada, e se Fn===falso, a condição fn não é verificada.

Assim, para (0, 1, 0, 1) apenas as condições f2 e f4 serão verificadas, e se ambas forem mantidas, o código open_pos() será executado

 
JRandomTrader #:

Isto é muito simples. Se F1==falso, então ( !F1 ||| f1) será verdadeiro independentemente da condição f1.

Isto é, se Fn===verdadeiro, a condição fn é verificada, e se Fn===falso, a condição fn não é verificada.

Correspondentemente, para (0, 1, 0, 1) apenas as condições f2 e f4 serão verificadas, e se ambas as condições se mantiverem, o código open_pos() será executado

Mas para o caso em que f1 e outros não são apenas 0 ou 1. Pensei que se a condição f1 for satisfeita para uma posição curta, então uma é devolvida. Se for para uma posição longa, regressa 2. Se a condição não for preenchida de todo - 0.

Mas numa tal construção não deveríamos provavelmente contar com uma tal variedade de valores de parâmetros e formular a condição de outra forma?

 
qadexys #:

Mas para o caso em que f1 e outros não são apenas 0 ou 1. Pensou-se que se a condição f1 for cumprida para posição curta, então é devolvida uma. Se, para uma posição longa, regressar 2. Se a condição não for preenchida de todo - 0.

Mas talvez não devêssemos contar com uma tal diversidade de valores de parâmetros nesta construção e formular a condição de outra forma, deveríamos?

Os conjuntos de condições para a abertura longa e curta são considerados separadamente.

Quero dizer, por exemplo, desta forma:

 ...
   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();
     }
 ...

Até venderei um pedaço do meu verdadeiro código - não revelará qualquer conhecimento sem informação sobre os valores "de batalha" das variáveis e condições de posse de posição.

Pode de facto especificar aqui uma das 224 opções:

   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;
        }
Razão: