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

 
Hola!!! ¿Me podéis decir cómo pasar un tipo de dato enum a los métodos de una clase? Digamos que quiero pasar un plazo de tiempo. Creo un enum en la cabecera de un asesor
   enum frame1 // перечисление именованных констант
     {
      PERIOD_M1,
      PERIOD_M5,
      PERIOD_M15,
      PERIOD_M30,
      PERIOD_H1,
      PERIOD_H4,
      PERIOD_D1,
      PERIOD_W1,
      PERIOD_MN1
     };


Entonces declaro un método en una clase.
public:
                     Signal_Line();
                    ~Signal_Line();
   double               Time_Frame(double &Trend_Line_Down[][], int Frame, int Down);

   int               Short_Proboy(double &Trend_Line_Down[][], string Name_Static, int Down, ENUM_TIMEFRAMES);
Y cuando se llama a un método desde un EA, si necesito pasar el tercer valor de la enumeración - marco - PERIOD_M30, ¿qué debo escribir en las preguntas de código de abajo?
         Trend_Line_Down[Timer_Down][1]=Signal.Short_Proboy(Trend_Line_Down, Name_Static, ???);     // Флаг пробоя трендовой нулевой свечой
 
Si lo piensas, es un poco tentador escribir
 Trend_Line_Down[Timer_Down][1]=Signal.Short_Proboy(Trend_Line_Down, Name_Static, frame1 3);     // Флаг пробоя трендовой нулевой свечой

Pero escribe un error al compilar. ¿Cuál puede ser la trampa?

 
Kira27:
Hola!!! ¿Me pueden decir cómo pasar el tipo de datos de la enumeración en los métodos de la clase? Digamos que quiero pasar un plazo. Creo en la cabecera de EA de la enumeración
Luego declaro el método en la clase.
Y cuando se llama a un método desde un EA, si necesito pasar el tercer valor de la enumeración - marco - PERIOD_M30, ¿qué debo escribir en las preguntas de código de abajo?

Pregunta 1: ¿Por qué crear una enumeración propia cuando se dispone del estándarENUM_TIMEFRAMES

 

Una pregunta sobre el coste de una garrapata.

¿Para qué tamaño de contrato (tamaño de lote) se calcula este valor?

Por ejemplo, para el par de divisas EURUSD este script da los mismos valores, pero para los metales la diferencia es de 10 veces. ¿Cómo, por qué y cómo lo sé?

int OnStart()
  {
//---
    // цена тика для символа
    double symb_tick_price = SymbolInfoDouble(_Symbol, SYMBOL_TRADE_TICK_VALUE);
    // рассчитаная цена символа (для Forex, CFD - формула из справки)
    // Profit  = (close_price - open_price) * Contract_Size * Lots
    // т.е. берем размер тика и считаем по этой формуле
    // -> TickPrice  = TickSize * Contract_Size * Lots
    double symb_lot_size = 1.0;
    double symb_tick_size = SymbolInfoDouble(_Symbol, SYMBOL_TRADE_TICK_SIZE);
    double symb_contract_size = SymbolInfoDouble(_Symbol, SYMBOL_TRADE_CONTRACT_SIZE);
    double calc_symb_tick_price = symb_tick_size * symb_contract_size * symb_lot_size;
    PrintFormat("Цена тика SYMBOL_TRADE_TICK_VALUE=%f, Цена тика ВЫЧИСЛЕННАЯ=%f", symb_tick_price, calc_symb_tick_price);
//---
   return(INIT_SUCCEEDED);
  }


NG      0       13:31:42.450    testTickPrice (EURUSD,H1)       Цена тика SYMBOL_TRADE_TICK_VALUE=1.000000, Цена тика ВЫЧИСЛЕННАЯ=1.000000
OE      0       13:31:56.924    testTickPrice (XAGUSD,H1)       Цена тика SYMBOL_TRADE_TICK_VALUE=0.500000, Цена тика ВЫЧИСЛЕННАЯ=5.000000
CE      0       13:40:00.848    testTickPrice (XAUUSD,H1)       Цена тика SYMBOL_TRADE_TICK_VALUE=0.100000, Цена тика ВЫЧИСЛЕННАЯ=1.000000
 
Kira27:
Si se piensa en ello, parece que se está pidiendo que se escriba

Pero da un error al compilar. ¿Cuál podría ser la trampa?

Si hace esta enumeración

enum frame1 // перечисление именованных констант
 {
  m1  = PERIOD_M1,
  m5  = PERIOD_M5,
  m15 = PERIOD_M15,
  m30 = PERIOD_M30,
  h1  = PERIOD_H1,
  h4  = PERIOD_H4,
  d1  = PERIOD_D1,
  W1  = PERIOD_W1,
  MN1 = PERIOD_MN1
 };

entonces puedes intentar escribirlo así

 Trend_Line_Down[Timer_Down][1]=Signal.Short_Proboy(Trend_Line_Down, Name_Static, (ENUM_TIMEFRAMES)m30);     // Флаг пробоя трендовой нулевой свечой
 
Alexey Viktorov:

Si hace esta enumeración

puedes intentar escribirlo así

... y luego en un mes estarás tratando de entender lo que significa ))))

Si tiene que escribir un código de este tipo, al menos hágalo en int

enum frame1 // перечисление именованных констант
 {
  m1  = (int)PERIOD_M1,
  m5  = (int)PERIOD_M5,
  m15 = (int)PERIOD_M15,
  m30 = (int)PERIOD_M30,
  h1  = (int)PERIOD_H1,
  h4  = (int)PERIOD_H4,
  d1  = (int)PERIOD_D1,
  W1  = (int)PERIOD_W1,
  MN1 = (int)PERIOD_MN1
 };

para que al menos puedas entender lo que el autor obtiene en la salida

...Aunque es una perversión ))))

 
Igor Makanu:

... y un mes después estarás tratando de entender lo que significa ))))

Si vas a escribir un código así, al menos escríbelo en int

para que al menos puedas entender lo que el autor obtiene en la salida

...Aunque es una perversión ))))

¿Por qué convertirlo en int? Porque en mql5, a partir de H1, el valor de la enumeración no es igual al número de minutos. Y al contrario, creo que causará mucha confusión.

 
Alexey Viktorov:

¿Por qué convertir a int? Porque en mql5, a partir de H1, el valor de la enumeración no es igual al número de minutos. Y en mi opinión, al contrario, causará mucha confusión.

Porque enum es una constante de 4 bytes con nombre = int

no el número de minutos

 
Vladimir Karputov:

Pregunta 1: ¿Por qué crear una enumeración propia si existe el estándarENUM_TIMEFRAMES

Respuesta)) Al dibujar un objeto gráfico en el nombre del objeto hay una subcadena M30 que dice dónde se creó este objeto, y al escribir los datos del objeto en el array double, utilizando la división del nombre en subcadenas, comparo el índice 0 del array con un nombre roto, por enumeración de fuerza bruta con un array

//____________________string Массив таймфреймов______________________________
   NameFrame_Trend_Line[1]="M1";
   NameFrame_Trend_Line[2]="M5";
   NameFrame_Trend_Line[3]="M15";
   NameFrame_Trend_Line[4]="M30";
   NameFrame_Trend_Line[5]="H1";
   NameFrame_Trend_Line[6]="H4";
   NameFrame_Trend_Line[7]="Daily";
   NameFrame_Trend_Line[8]="Weekly";
   NameFrame_Trend_Line[9]="Monthly"; 

Encontrar el índice de la cadena igual en la matriz

NameFrame_Trend_Line

asociar el índice con la matriz int

//___________________int Массив таймфреймов__________________________________________
   TimeFrame[1]=1;
   TimeFrame[2]=5;
   TimeFrame[3]=15;
   TimeFrame[4]=30;
   TimeFrame[5]=60;
   TimeFrame[6]=240;
   TimeFrame[7]=1440;
   TimeFrame[8]=10080;
   TimeFrame[9]=43200;

obtenido, escribo el valor en el array double, que almacena las características de los objetos del gráfico. Luego, para el seguimiento de la línea de desglose, fijación y prueba, utilizo un método, en el que debo pasar el parámetro timeframe del array double escrito; como las líneas se crean en diferentes timeframes, el cálculo de desglose, fijación, prueba debe calcularse según el timeframe de los objetos creados, independientemente del periodo que esté en el gráfico en ese momento. He previsto asociar el valor del array

TimeFrame

escrito en la matriz de características de los objetos gráficos que se extraen de la matriz por el índice

   enum frame1 // перечисление именованных констант
     {
      PERIOD_M1,
      PERIOD_M5,
      PERIOD_M15,
      PERIOD_M30,
      PERIOD_H1,
      PERIOD_H4,
      PERIOD_D1,
      PERIOD_W1,
      PERIOD_MN1
     };
y traslado al método de cálculo de averías, anclajes y pruebas.
 
Igor Makanu:

porque enum es una constante de 4 bytes con nombre = int

no el número de minutos.

¿Y qué? ¿Tienen algo diferente en el enum ENUM_TIMEFRAMES? ¿O hay miedo a quedarse sin memoria? No sé cómo se puede jugar así...


ps; Ah, qué lento estoy escribiendo...)))) Mientras yo escribía una sola línea Kira27 escribió un montón de......... Y algo que sospecho que se utilizará en mql4.