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

 
Tapochun:

1.日足ロウソクの開始時刻を決定する。

希望するTFのバー 数を決定します(15分ごとにその日の極値をチェックしたい場合、M15バーとなります)。

3.numバー分のデータをHighで受信します。

3.ループ内で、ハイバーのすべての値を、目的の日のローソクの変数dayHighと比較します(初期値はdayHigh = 0)。

4.high > dayHigh ならば、新しい値を変数 dayHigh に格納します。

これは理解できる、ありがとう。しかし、今のところ私には難しい...というか、ポイント2、ローソク足の本数を求めるには、TFごとに計算をしてレンジに入れる必要があるのでは?

ローソク足の本数を数えることなく、現在のタイムフレームの日付を調べて、その日付のすべての値を調べることはできないのでしょうか?

 
-Aleks-:

それは理解できますね、ありがとうございます。でも今のところ私には複雑です...正確にはポイント2、TFごとに計算をしてレンジに入れてローソク足の本数を求めることでしょうか?

経過したローソク足の本数を判断せずに、現在のタイムフレームの日付を調べて、その日付のすべての値を調べることはできないのでしょうか?

日中のバーの本数を 簡単に割り出すことができます。例えば、15分足のチャートの場合。1日の分数を15で割る(1440 / 15 = 96本、または別のPERIOD_D1/PERIOD_M15 = 96本)。
 
Vitalii Ananev:
日中バーの本数は 簡単に決められます。例えば15分足のチャートの場合。1日の分数を15で割る(1440 / 15 = 96本、または別のPERIOD_D1/PERIOD_M15 = 96本)。
こんなことしちゃダメだ!TFのある日のバーの数が同じであることを事実として受け入れてはいけない!
 
Vitalii Ananev:
1日の小節 数を決めるのは簡単です。例えば、15分足のチャートの場合。1日の分数を15で割る(1440 / 15 = 96バー、または別のPERIOD_D1/PERIOD_M15 = 96)。

数学的には理解できるのですが、関数でどうやるか、それが問題なのです仮にTimeを使って現在時刻を取得し、その後どのように

TFごとに、新しいバーでカウンターを作り、新しい日の始まりでリセットされ、最大1日でゼロにリセットされ、その前に各バーの比較を行うことを考えますが、どのようにプログラムするのでしょうか?

 
Tapochun:
そんなことしちゃダメだ!TFによるある日のバーの数が同じになるということは、決してあってはならないことです

そうですね、例えば金曜日は閉店時間が早いとか...。

つまり、一日を定義して、ローソク足の数を考慮せずに、その日の最大値を求める配列を取らなければならないのですが、どうやるのでしょうか?

 
-Aleks-:

数学的には理解できるのですが、関数でどうやるか、それが問題なのです仮にTimeを使って現在時刻を取得し、その後どのように

TFごとに新しいバーでカウンターを作って、新しい日になったらゼロにするのがいいと思います。 最大1日だけゼロにして、それ以前の各バーを比較したいのですが、どのようにプログラムすればいいでしょうか。

このようにして、おおよそ一日の始まりに相当する最初のバーを見つけることができるのです。

 datetime BeginDay = iTime(Symbol(), PERIOD_D1, iBarShift(Symbol(), PERIOD_D1, Time[NumberBar]));  

 int StartBar = iBarShift(Symbol(), 0, BeginDay);
 
Vitalii Ananev:

これが、大まかな日の始まりに相当する最初のバーの見つけ方です。

例えば、こんなアルゴリズムがあります。

私たちは最初のバーを見つけました - それが形成された時点で、このバーはその日の高値になります。そして、次のバーを取得し、その最大値をチェックし、それが前のものより高ければ、その日の新しい高値であることを意味します。そして、その日の最後の小節まで。

 
#property script_show_inputs
#property strict
//+------------------------------------------------------------------+
//| Входные параметры                                                |
//+------------------------------------------------------------------+
input ENUM_TIMEFRAMES inpUserTimeframe=PERIOD_M15;   // Пользовательский ТФ
//+------------------------------------------------------------------+
//| Script program start function                                    |
//+------------------------------------------------------------------+
void OnStart()
  {
// Определяем время открытия текущего дня
   datetime open_D1=iTime(_Symbol,PERIOD_D1,0);

// Определяем номер первого сформированного бара по пользовательскому ТФ за текущий день
   int last_utf = iBarShift( _Symbol, inpUserTimeframe, open_D1, true );
   if( last_utf == -1 )
     {
      Alert(EnumToString(inpUserTimeframe)+" ОШИБКА #",GetLastError(),": номер бара не определен! "+TimeToStr(open_D1));
      return;
     }

// Определяем максимум дня
   double dayHigh=0;
   double high;
   int highNum=0;

   for(int i=1; i<=last_utf; i++) // Цикл по сформированным свечам за текущий день
     {
      high = iHigh( _Symbol, inpUserTimeframe, i );   // Максимум на i свече
      if( high > dayHigh )                            // Если максимум дня превышен
        {
         dayHigh = high;                              // Запоминаем новый максимум
         highNum = i;                                 // Запоминаем номер свечи
        }
     }

   Alert(EnumToString(inpUserTimeframe)+": максимум дня = ",DoubleToString(dayHigh,_Digits)," обнаружен на свече #",highNum);
  }
ファイル:
toAleks.mq4  3 kb
 
Tapochun,Vitalii Ananev- ありがとうございました。これから、学んだことを活かしていこうと思います。
 
Tapochun:
スクリプトではなく、インジケータを表示することはできますか?時間軸の配列に苦労しているんだ......。見習いたいものです。
理由: