Вопросы от начинающих MQL5 MT5 MetaTrader 5 - страница 1308

 
Привет!!!   Подскажите а в методы классов как передавать тип данных перечисления?  Допустим я хочу передать таймфрейм.   Создаю в шапке советника перечисления 
   enum frame1 // перечисление именованных констант
     {
      PERIOD_M1,
      PERIOD_M5,
      PERIOD_M15,
      PERIOD_M30,
      PERIOD_H1,
      PERIOD_H4,
      PERIOD_D1,
      PERIOD_W1,
      PERIOD_MN1
     };


Далее, декларирую метод в классе.
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);
И при вызове метода из советника если мне нужно передать из перечисления -  frame  третье значение -  PERIOD_M30  что вписать в вопросики кода ниже?
         Trend_Line_Down[Timer_Down][1]=Signal.Short_Proboy(Trend_Line_Down, Name_Static, ???);     // Флаг пробоя трендовой нулевой свечой
 
Если подумать то вроде как напрашивается написать туда 
 Trend_Line_Down[Timer_Down][1]=Signal.Short_Proboy(Trend_Line_Down, Name_Static, frame1 3);     // Флаг пробоя трендовой нулевой свечой

  но пишет при компиляции ошибку. В чём подвох может быть?

 
Kira27:
Привет!!!   Подскажите а в методы классов как передавать тип данных перечисления?  Допустим я хочу передать таймфрейм.   Создаю в шапке советника перечисления 
Далее, декларирую метод в классе.
И при вызове метода из советника если мне нужно передать из перечисления -  frame  третье значение -  PERIOD_M30  что вписать в вопросики кода ниже?

Вопрос 1: ЗАЧЕМ создавать своё перечисление, если есть стандартное ENUM_TIMEFRAMES

 

Вопрос по поводу стоимости тика.

Для какого размера контракта (размера лота) эта стоимость считается?

Например, данный скрипт для валютной пары EURUSD выдает значения, которые совпадают, а вот для металлов разница в 10 раз. Откуда, почему, как узнать?

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:
Если подумать то вроде как напрашивается написать туда 

  но пишет при компиляции ошибку. В чём подвох может быть?

Если сделаете такое перечисление

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

то можно будет попробовать написать так

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

Если сделаете такое перечисление

то можно будет попробовать написать так

... а потом через месяц будешь пытаться понять чтобы это значило )))

если писать такой уж код, то хотя бы в 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
 };

так хоть понять можно, что автор получит на выходе

...хотя извращение еще то ))))

 
Igor Makanu:

... а потом через месяц будешь пытаться понять чтобы это значило )))

если писать такой уж код, то хотя бы в int приведите 

так хоть понять можно, что автор получит на выходе

...хотя извращение еще то ))))

Зачем в int переводить? Ведь в mql5, начиная с Н1 значение перечисления не равно количеству минут. И на мой взгляд наоборот внесёт сплошные непонятки.

 
Alexey Viktorov:

Зачем в int переводить? Ведь в mql5, начиная с Н1 значение перечисления не равно количеству минут. И на мой взгляд наоборот внесёт сплошные непонятки.

потому что enum это именованные 4-х байтные константы = int

а не количество минут

 
Vladimir Karputov:

Вопрос 1: ЗАЧЕМ создавать своё перечисление, если есть стандартное ENUM_TIMEFRAMES

Ответ))   Нарисовав графический объект на 30м графике в имени объекта есть подстрока М30 говорящая о том где этот объект создан, и при записи данных объекта в массив double, с помощью разбивки имени на подстроки, сравниваю 0индекс массива с разбитым именем,  путем перебора  с  массивом 

//____________________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"; 

Выяснив индекс равной строки в массиве 

NameFrame_Trend_Line

ассоциирую индекс с массивом 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;

полученnое значение пишу в массив double, хранящего характеристики граф. объектов.   Далее для отслеживания пробоя, закрепления, и теста линии использую метод, в который нужно из записанного double массива передавать параметр таймфрейма, так как линии созданы на разных таймфреймах, расчет пробоя, закрепления, теста, должен рассчитываться согласно тайму на котором эти объекты созданы, вне зависимости от того какой период стоит на графике в данный момент.   Планировал ассоциировать значение массива 

TimeFrame

записанного в массив характеристик граф. объектов, вытаскивать по индексу из массива

   enum frame1 // перечисление именованных констант
     {
      PERIOD_M1,
      PERIOD_M5,
      PERIOD_M15,
      PERIOD_M30,
      PERIOD_H1,
      PERIOD_H4,
      PERIOD_D1,
      PERIOD_W1,
      PERIOD_MN1
     };
и передавать в метод расчёта пробоя, закрепления и теста. 
 
Igor Makanu:

потому что enum это именованные 4-х байтные константы = int

а не количество минут

И что? А в перечислении ENUM_TIMEFRAMES они имеют что-то другое? Или есть опасение нехватки памяти? Я не умею так заморачиваться…


ps; Ах как медленно я набираю текст…)))) Пока я набирал одну строку Kira27 набрал вон сколько……… И что-то я подозреваю, это будет использоваться в mql4.

Причина обращения: