Preguntas de los principiantes MQL5 MT5 MetaTrader 5 - página 1384

 

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

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

CHART_BRINGING_TO_TOP

Mostrar el gráfico encima de todos los demás gráficos

bool


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

¿Cómo puedo definir un identificador de gráfico para que se muestre también?

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

CHART_BRINGING_TO_TOP

Mostrar el gráfico encima de todos los demás gráficos

bool


¿Cómo puedo definir un ID de gráfico para que se muestre también?

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

Gracias. CHART_FOREGROUND es probablemente el más adecuado. No necesito establecer el gráfico activo a la fuerza, sólo necesito determinar cuál es el activo. ¿Estoy en lo cierto al pensar que tendré que recorrer todos los gráficos abiertos comprobando CHART_FOREGROUND?

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

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

Gracias. CHART_FOREGROUND es probablemente el más adecuado. No es que tenga que forzar el gráfico activo, sino sólo identificar el que está activo. ¿He entendido bien que tengo que pasar por todos los gráficos abiertos comprobando CHART_FOREGROUND?

CHART_FOREGROUND es un gráfico en la parte superior.

Y para no forzarlo, debería reemplazar ChartSetInteger por ChartGetInteger

 

Buenas tardes.
Me puedes dar una pista - estoy pensando en un robot y hay cuatro condiciones diferentes - no sé cuáles eliminar todavía: quiero averiguarlo después cuando optimice para diferentes plazos.

Es decir: cuatro condiciones (f1,f2,f3,f4). Puede haber muchas combinaciones (0,0,1,1) o (1,0,1,0) y así sucesivamente - un total de 16 combinaciones. Exactamente 15 - la variante (0, 0, 0, 0) no se considera.

Pregunta: cómo crear una lógica de programa para no describir las 15 combinaciones en el código. Hay una función para comprobar cada una de estas condiciones, y en qué combinaciones de estas condiciones se aplican - comprobar cómo más.

Me encantaría que me enseñaras algún Asesor Experto, que me permita introducir muchas condiciones en un código conciso.

 
qadexys #:

Buenas tardes.
Me puedes dar una pista - estoy pensando en un robot y hay cuatro condiciones diferentes - no sé cuáles eliminar todavía: quiero averiguarlo después cuando optimice para diferentes plazos.

Es decir: cuatro condiciones (f1,f2,f3,f4). Puede haber muchas combinaciones (0,0,1,1) o (1,0,1,0) y así sucesivamente - un total de 16 combinaciones. Exactamente 15 - la variante (0, 0, 0, 0) no se considera.

Pregunta: cómo crear una lógica de programa para no describir las 15 combinaciones en el código. Hay una función para comprobar cada una de estas condiciones, y en qué combinaciones de estas condiciones se aplican - comprobar cómo más.

Me encantaría que me mostraras algún Asesor Experto, que me permita introducir múltiples condiciones en un código conciso.

Puede que vaya así:

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

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

O algo así:

#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 es el gráfico de la parte superior

Y para no forzarlo, sustituir ChartSetInteger por ChartGetInteger

gracias

 
JRandomTrader #:

Podrías hacer esto:

O algo así:

Y aquí está la primera construcción: ¿cuál sería el comportamiento del código en las condiciones (0, 1, 0, 1)?

¿Podría explicar el cuerpo de la condición If?

 
qadexys #:

Y aquí está la primera construcción: ¿cuál sería el comportamiento del código en condiciones (0, 1, 0, 1)?

¿Podría explicar el cuerpo de la condición Si

Esto es muy sencillo. Si F1==false, entonces ( !F1 || f1) será verdadero independientemente de la condición f1.

Es decir, si Fn==true, se comprueba la condición fn, y si Fn==false, no se comprueba la condición fn.

Por lo tanto, para (0, 1, 0, 1) sólo se comprobarán las condiciones f2 y f4, y si ambas se mantienen, se ejecutará el código open_pos()

 
JRandomTrader #:

Esto es muy sencillo. Si F1==falsa, entonces ( !F1 || f1) será verdadera independientemente de la condición f1.

Es decir, si Fn==true, se comprueba la condición fn, y si Fn==false, no se comprueba la condición fn.

En consecuencia, para (0, 1, 0, 1) sólo se comprobarán las condiciones f2 y f4, y si ambas se mantienen, se ejecutará el código open_pos()

Pero para el caso en que f1 y otros no sean sólo 0 o 1. Pensé que si la condición f1 se satisface para una posición corta, entonces se devuelve una. Si es para una posición larga, devuelve 2. Si la condición no se cumple en absoluto - 0.

Pero en una construcción de este tipo probablemente no deberíamos contar con tal variedad de valores de los parámetros y formular la condición de alguna otra manera...

 
qadexys #:

Pero para el caso en que f1 y otros no sean sólo 0 o 1. Pensó que si la condición f1 se cumple para la posición corta, entonces se devuelve uno. Si para una posición larga devuelve 2. Si la condición no se cumple en absoluto - 0.

Pero tal vez no debamos contar con tal diversidad de valores de los parámetros en este constructo y formular la condición de otra manera, ¿no?

Los conjuntos de condiciones para la apertura en largo y en corto se consideran por separado.

Me refiero, por ejemplo, a esto:

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

Incluso venderé un trozo de mi código real - no revelará ningún conocimiento sin información sobre los valores de "batalla" de las variables y las condiciones de mantenimiento de la posición.

En realidad, aquí puede especificar una de las 224 opciones:

   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ón de la queja: