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

 
Olá!! Pode dizer-me como passar um enumero de dados aos métodos de classe? Digamos que quero passar um prazo. Crio um enumero no cabeçalho de um conselheiro
   enum frame1 // перечисление именованных констант
     {
      PERIOD_M1,
      PERIOD_M5,
      PERIOD_M15,
      PERIOD_M30,
      PERIOD_H1,
      PERIOD_H4,
      PERIOD_D1,
      PERIOD_W1,
      PERIOD_MN1
     };


Depois declaro um método numa aula.
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);
E ao chamar um método de uma EA, se eu precisar de passar o terceiro valor da enumeração - frame - PERIOD_M30, o que devo escrever nas perguntas de código abaixo?
         Trend_Line_Down[Timer_Down][1]=Signal.Short_Proboy(Trend_Line_Down, Name_Static, ???);     // Флаг пробоя трендовой нулевой свечой
 
Se pensarmos nisso, é um pouco tentador escrever
 Trend_Line_Down[Timer_Down][1]=Signal.Short_Proboy(Trend_Line_Down, Name_Static, frame1 3);     // Флаг пробоя трендовой нулевой свечой

Mas escreve um erro ao compilar. Qual poderá ser a captura?

 
Kira27:
Olá!!! Pode dizer-me como passar dados de enumeração em métodos de classe? Digamos que quero passar um prazo. Eu crio no cabeçalho da EA de enumeração
depois declaro método em classe.
E ao chamar um método de um EA, se eu precisar de passar o terceiro valor da enumeração - frame - PERIOD_M30, o que devo escrever nas perguntas de código abaixo?

Pergunta 1: Porquê criar a sua própria enumeração quando tem oENUM_TIMEFRAMES padrão

 

Uma pergunta sobre o custo de uma carraça.

Para que tamanho de contrato (tamanho de lote) é este valor calculado?

Por exemplo, para o par de moedas EURUSD este guião dá os mesmos valores, mas para os metais a diferença é 10 vezes. Como, porquê e como é que sei?

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:
Se pensarmos bem, parece que estamos a pedir para escrever

Mas escreve um erro ao compilar. Qual poderia ser a captura?

Se fizer esta enumeração

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
 };

então poderia tentar escrevê-lo assim

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

Se fizer esta enumeração

poderia tentar escrevê-lo desta forma

... e dentro de um mês estará a tentar compreender o que significa ))))

Se tiver de escrever um tal código, pelo menos escreva-o em 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 possa ao menos compreender o que o autor recebe em resultado

...Embora seja uma perversão ))))

 
Igor Makanu:

... e um mês depois estará a tentar compreender o que significa ))))

Se vai escrever um tal código, pelo menos escreva-o em int

para que possa ao menos compreender o que o autor recebe em resultado

...Embora seja uma perversão ))))

Porquê convertê-lo em int? Porque em mql5, a partir de H1, o valor da enumeração não é igual ao número de minutos. E, pelo contrário, penso que irá causar muita confusão.

 
Alexey Viktorov:

Porquê converter-se a int? Porque em mql5, a partir de H1, o valor da enumeração não é igual ao número de minutos. E, na minha opinião, pelo contrário, irá causar muita confusão.

Porque a enumeração é uma constante de 4 bytes chamada = int

não o número de minutos

 
Vladimir Karputov:

Pergunta 1: Porquê criar a sua própria enumeração se háENUM_TIMEFRAMES padrão

Resposta) Desenhando um objecto gráfico no nome do objecto existe um substrato M30 que diz onde este objecto foi criado, e ao escrever os dados do objecto para o array duplo, usando a divisão do nome em substratos, eu comparo o índice 0 do array com um nome quebrado, por enumeração de força bruta com um 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 o índice da cadeia igual na matriz

NameFrame_Trend_Line

associar o índice com a 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;

Depois, para acompanhar a decomposição, fixação e linha de teste, utilizo um método, no qual devo passar o parâmetro de tempo a partir da dupla matriz escrita; como as linhas são criadas em diferentes períodos de tempo, o cálculo da decomposição, fixação e teste deve ser calculado de acordo com o período de tempo dos objectos criados, independentemente do período que está no gráfico no momento.

TimeFrame

escrito para o conjunto de características dos objectos gráficos a retirar do conjunto através do índice

   enum frame1 // перечисление именованных констант
     {
      PERIOD_M1,
      PERIOD_M5,
      PERIOD_M15,
      PERIOD_M30,
      PERIOD_H1,
      PERIOD_H4,
      PERIOD_D1,
      PERIOD_W1,
      PERIOD_MN1
     };
e transferência para a avaria, ancoragem e método de cálculo de teste.
 
Igor Makanu:

porque a enumeração é uma constante de 4 bytes chamada = int

e não o número de minutos.

Então? Será que têm algo diferente no enumero ENUM_TIMEFRAMES? Ou será que existe o medo de ficar sem memória? Não sei como brincar assim...


ps; Ah quão lento estou a digitar...)))) Enquanto escrevia uma única linha Kira27 escrevia muito......... e algo que suspeito que será usado em mql4.

Razão: