初学者的问题 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);
而当从EA中调用一个方法时,如果我需要从枚举中传递第三个值--框架--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:
你好!!你能告诉我如何在类方法 中传递枚举数据类型吗? 比方说,我想传递一个时间框架。我在枚举的EA标题中创建 ,然后我在类中声明方法。而当从EA中调用一个方法时,如果我需要从枚举中传递第三个值--框架--PERIOD_M30,我在下面的代码问题中应该怎么写?

问题1:既然有标准的ENUM_TIMEFRAMES,为什么还要创建自己的枚举?

 

一个关于蜱虫的费用问题。

这个值是针对哪种合约大小(手数)计算的?

例如,对于欧元兑美元货币对,该脚本给出了相同的数值,但对于金属来说,差别是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中,从H1开始,枚举值就 不等于分钟数了。而恰恰相反,我认为这将造成很多混乱。

 
Alexey Viktorov:

为什么要转换为int?因为在mql5中,从H1开始,枚举值就 不等于分钟数了。而在我看来,恰恰相反,这将造成很多混乱。

因为枚举是一个命名为4字节的常数 = int

而不是分钟数

 
Vladimir Karputov:

问题1:如果有标准的ENUM_TIMEFRAMES,为什么还要创建自己的枚举?

答案))绘制一个图形对象,在对象的名称中有一个子串M30,说这个对象是在哪里创建的,当把对象数据写入数组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;

然后,为了跟踪分解、固定和测试线,我使用了一个方法,在这个方法中,我应该从写好的双数组中传递时间框架参数;因为线是在不同的时间框架上创建的,分解计算、固定、测试应该根据创建对象的时间框架来计算,而不管此刻图表上是什么时期。 我计划将数组的值关联到

TimeFrame

写入图形对象的特征数组,通过索引从数组中拉出

   enum frame1 // перечисление именованных констант
     {
      PERIOD_M1,
      PERIOD_M5,
      PERIOD_M15,
      PERIOD_M30,
      PERIOD_H1,
      PERIOD_H4,
      PERIOD_D1,
      PERIOD_W1,
      PERIOD_MN1
     };
并转入分解、锚定和试验计算方法。
 
Igor Makanu:

因为枚举是一个命名为4字节的常数 = int

而不是分钟数。

那么?他们在ENUM_TIMEFRAMES枚举中有什么不同吗?还是担心内存 不够用?我不知道如何像这样乱来......


ps; 啊,我打字好慢啊...))))当我在打单行字的时候,Kira27打了很多.........,还有一些我怀疑这将在mql4中使用。

原因: