Domande dai principianti MQL5 MT5 MetaTrader 5 - pagina 1308

 
Ciao!!! Puoi dirmi come passare un tipo di dati enum ai metodi di una classe? Diciamo che voglio passare un intervallo di tempo. Creo un enum nell'intestazione di un consigliere
   enum frame1 // перечисление именованных констант
     {
      PERIOD_M1,
      PERIOD_M5,
      PERIOD_M15,
      PERIOD_M30,
      PERIOD_H1,
      PERIOD_H4,
      PERIOD_D1,
      PERIOD_W1,
      PERIOD_MN1
     };


Poi dichiaro un metodo in una classe.
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 quando chiamo un metodo da un EA, se ho bisogno di passare il terzo valore dall'enumerazione - frame - PERIOD_M30, cosa dovrei scrivere nelle domande di codice qui sotto?
         Trend_Line_Down[Timer_Down][1]=Signal.Short_Proboy(Trend_Line_Down, Name_Static, ???);     // Флаг пробоя трендовой нулевой свечой
 
Se ci pensate, è piuttosto allettante scrivere
 Trend_Line_Down[Timer_Down][1]=Signal.Short_Proboy(Trend_Line_Down, Name_Static, frame1 3);     // Флаг пробоя трендовой нулевой свечой

Ma scrive un errore durante la compilazione. Quale potrebbe essere la fregatura?

 
Kira27:
Ciao!!! Puoi dirmi come passare un tipo di dati di enumerazione nei metodi di classe? Diciamo che voglio passare un timeframe. Creo nell'intestazione di EA di enumerazione
Poi dichiaro il metodo nella classe.
E quando chiamo un metodo da un EA, se ho bisogno di passare il terzo valore dall'enumerazione - frame - PERIOD_M30, cosa dovrei scrivere nelle domande di codice qui sotto?

Domanda 1: perché creare la propria enumerazione quando si ha lo standardENUM_TIMEFRAMES

 

Domanda sul costo di una zecca.

Per quale dimensione del contratto (dimensione del lotto) viene calcolato questo valore?

Per esempio, per la coppia di valute EURUSD questo script dà gli stessi valori, ma per i metalli la differenza è di 10 volte. Come, perché e come faccio a saperlo?

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 ci pensate, sembra che si stia chiedendo di scrivere

Ma scrive un errore durante la compilazione. Quale potrebbe essere la fregatura?

Se fate questa enumerazione

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

allora potreste provare a scriverlo in questo modo

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

Se fate questa enumerazione

potresti provare a scriverlo in questo modo

... e poi tra un mese cercherai di capire cosa significa ))))

Se dovete scrivere un codice del genere, almeno scrivetelo in 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
 };

in modo da poter almeno capire cosa ottiene l'autore in uscita

...Anche se è una perversione ))))

 
Igor Makanu:

... e poi un mese dopo cercherai di capire cosa significa ))))

Se dovete scrivere un codice del genere, almeno scrivetelo in int

in modo da poter almeno capire cosa ottiene l'autore in uscita

...Anche se è una perversione ))))

Perché convertirlo in int? Perché in mql5, a partire da H1, il valore di enumerazione non è uguale al numero di minuti. E al contrario, penso che causerà molta confusione.

 
Alexey Viktorov:

Perché convertire in int? Perché in mql5, a partire da H1, il valore di enumerazione non è uguale al numero di minuti. E secondo me, al contrario, causerà molta confusione.

Perché enum è una costante nominata a 4 byte = int

non il numero di minuti

 
Vladimir Karputov:

Domanda 1: perché creare la propria enumerazione se c'èENUM_TIMEFRAMES standard

Risposta)) Disegnando un oggetto grafico nel nome dell'oggetto c'è una sottostringa M30 che dice dove questo oggetto è stato creato, e quando scrivo i dati dell'oggetto in array double, usando la divisione del nome in sottostringhe, confronto l'indice 0 dell'array con un nome rotto, tramite enumerazione a forza 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"; 

Trovare l'indice della stringa uguale nell'array

NameFrame_Trend_Line

associa l'indice all'array 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;

Ottenuto, scrivo il valore nell'array double, che memorizza le caratteristiche degli oggetti del grafico. Poi, per tracciare il breakdown, il fixing e il test della linea, uso un metodo, in cui dovrei passare il parametro timeframe dall'array double scritto; poiché le linee sono create su diversi timeframe, il calcolo del breakdown, il fixing, il test dovrebbero essere calcolati secondo il timeframe in cui questi oggetti sono stati creati, indipendentemente da quale periodo è sul grafico al momento. Ho previsto di associare il valore dell'array

TimeFrame

scritto all'array di caratteristiche degli oggetti grafici da estrarre dall'array per l'indice

   enum frame1 // перечисление именованных констант
     {
      PERIOD_M1,
      PERIOD_M5,
      PERIOD_M15,
      PERIOD_M30,
      PERIOD_H1,
      PERIOD_H4,
      PERIOD_D1,
      PERIOD_W1,
      PERIOD_MN1
     };
e il trasferimento al metodo di calcolo della ripartizione, dell'ancoraggio e della prova.
 
Igor Makanu:

perché enum è una costante nominata a 4 byte = int

non il numero di minuti.

Quindi? Hanno qualcosa di diverso nell'enum ENUM_TIMEFRAMES? O c'è la paura di esaurire la memoria? Non so come si fa a scherzare in questo modo...


ps; Ah, come sono lento a scrivere...)))) Mentre stavo scrivendo una sola riga Kira27 ha digitato un sacco di......... E qualcosa che sospetto sarà usato in mql4.