初心者の方からの質問 MQL5 MT5 MetaTrader 5 - ページ 1308

 
こんにちは!クラスメソッドに enumデータ型を渡す方法を教えてください。 例えば、私はタイムフレームを渡したいです。 私はアドバイザーのヘッダーにenumを作成します。
   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からメソッドを呼び出すときに、列挙された値から3番目の値であるフレーム - 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からメソッドを呼び出すときに、列挙された値から3番目の値であるフレーム - 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:

このエニュメレーションを行うと

のような書き方をしてみてください。

...そして、1ヶ月後にはその意味を理解しようとしている ))))

どうしても書きたいなら、せめて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:

...そして、1ヶ月後にはその意味を理解しようとする ))))

どうしても書きたいなら、せめてint型で書いてください。

ということで、少なくとも著者が出力で得るものを理解することができます。

...変態ですが )))

なぜint型に変換するのか?mql5ではH1から、列挙値が 分数と一致しないため。そして逆に、多くの混乱を招くことになると思うのです。

 
Alexey Viktorov:

なぜint型に変換するのか?mql5ではH1から、列挙値が 分数と一致しないため。そして、私の考えでは、逆に多くの混乱を招くことになります。

enumは名前付き4バイト定数=intであるため

ナンバリング

 
Vladimir Karputov:

質問1:標準のENUM_TIMEFRAMESが あるのに、なぜ独自の列挙を作成するのですか?

回答)グラフィカルなオブジェクトを描画するオブジェクトの名前にこのオブジェクトが作成された場所を言って部分文字列M30があり、オブジェクトデータを配列ダブルに書き込むときに、名前の部分文字列に分割を使用して、私は配列で総当たり列挙によって、壊れた名前と配列の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;

そこで、グラフオブジェクトの特性を格納する配列doubleに値を書き込みます。 そして、ブレークダウン、フィキシング、テストラインを追跡するために、書き込んだdouble配列からtimeframeパラメータを渡す方法を使います。ラインが異なる時間枠で作られるので、その時点でチャート上にどの期間があっても、作られたオブジェクトの時間枠に従ってブレークダウン計算、フィキシング、テストは計算しなければなりません。 私は、配列

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のenumに何か違うものがあるのでしょうか?それとも、メモリが 足りなくなるのが怖いのでしょうか?そんなふざけたことしていいのか...。


ps; あーあ、入力が遅いなぁ(^^;))))私が一行打っている間に、Kira27さんがたくさん打ってくれました......。 そして何か、これはmql4で使われるのではと思われます。

理由: