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

 
-Aleks-:

助けてください!(MQL4)

M15チャートで、各バーを考慮した日の開始時刻を 取得する必要があります - インジケータ用。

現在のバー(0)を考慮して秒単位で計算することにしましたが、私の勘違いでしょうか。

D_Shift=(Open_time-pos*15*60-(Open_time-Open_timeTF))/1440*60;

インジケーターのためなら。

int OnCalculate(const int rates_total,
                const int prev_calculated,
                const datetime &time[],
                const double &open[],
                const double &high[],
                const double &low[],
                const double &close[],
                const long &tick_volume[],
                const long &volume[],
                const int &spread[])
  {
   int            temp_day;
   MqlDateTime    dt_struct;
   TimeToStruct(time[0],dt_struct);
   temp_day=dt_struct.day;

   for(int i=0;i<rates_total-1;i++)
     {
      TimeToStruct(time[i],dt_struct);
      if(dt_struct.day<temp_day)
        {
         Print("Start day ",time[i-1]);
         break;
        }
     }

//--- done
   return(rates_total);
  }

しかし:このコードはOnCalculate()が入力されるたびに実行されます - あなたのニーズに応じて、bool フラグを追加するか、別の関数にコードを配置することができます。

 
Karputov Vladimir:

インジケーター用なら。

しかし:このコードはOnCalculate()のたびに実行されます - あなたのニーズに応じて、またはbool フラグを追加したり、別の関数にコードを配置します。

ありがとうございますが、再計算を行うためにすべてのティックで 良いものではありません - 私は私のコードが動作しない理由を理解したいが、私はあなたのコードを分析する必要がある、ログに奇妙な数字が返されます。

オープンタイムTF 1454715900
オープン時間 1454284800
デルタ_1S 431100
デルタ_M15 479

その日の最初のバーと現在のバーの間に479本の差があることが判明しました。

 
-Aleks-:

ありがとうございます、しかし、すべてのティックで再計算することは良くありません - 私はあなたのコードを考える必要があります、しかし、私は私のコードが動作しない理由を理解したい一方で、ログは奇妙な数字を返します。

オープンタイムTF 1454715900
オープン時間 1454284800
デルタ_1S 431100
デルタ_M15 479

その日の最初のバーと現在のバーの間に479本の差があることが判明しました。

私は超能力者ではないことを示しましたが、それが理由です。

しかし、OnCalculate()が 入力されるたびにこのコードが実行 されますここで、あなたのニーズに応じてbool フラグを追加するか、別の関数にコードを配置 します。

 
Karputov Vladimir:

私は超能力者ではないことを指摘したのですが、それが理由です。

なぜ、ここで超能力が必要なのでしょうか?上のコードには変数があり、その変数が返す数値を示し、なぜそうなっているのか、逆にそうなっていないのか、と問いかけました - コードによると。
 
私はこの仕事の初心者で、OnCalculate 関数を使った ことがないので、rates_totalがそこで何を計算する のか、そして最も重要なことは、それをどこに返す のかが理解できません。私も全部別の関数にするのはよくわかりません...コメントがないとわかりにくいですね。
 
-Aleks-:
私はこの仕事の初心者で、OnCalculate 関数を使ったことがないのでrates_totalがそこで何を計算して いるのか、さらに言えば、どこに返せばいい のかがわかりません。私も全部別の関数にするのはよくわかりません...コメントがないとわかりにくいですね。

以下は、MQL4インジケーターの全コードです。

//+------------------------------------------------------------------+
//|                                                    Start day.mq4 |
//|                        Copyright 2016, MetaQuotes Software Corp. |
//|                                             https://www.mql5.com |
//+------------------------------------------------------------------+
#property copyright "Copyright 2016, MetaQuotes Software Corp."
#property link      "https://www.mql5.com"
#property version   "1.00"
#property strict
#property indicator_chart_window
//--- input parameters
input int      timer=10; // seconds
//--- parameter
bool           IsDefineTime=true; // true -> you can define time
//+------------------------------------------------------------------+
//| Custom indicator initialization function                         |
//+------------------------------------------------------------------+
int OnInit()
  {
//--- indicator buffers mapping
   EventSetTimer(timer);
//---
   IsDefineTime=true;
//---
   return(INIT_SUCCEEDED);
  }
//+------------------------------------------------------------------+
//| Custom indicator iteration function                              |
//+------------------------------------------------------------------+
int OnCalculate(const int rates_total,
                const int prev_calculated,
                const datetime &time[],
                const double &open[],
                const double &high[],
                const double &low[],
                const double &close[],
                const long &tick_volume[],
                const long &volume[],
                const int &spread[])
  {
//---
   int            temp_day;
   MqlDateTime    dt_struct;
   TimeToStruct(time[0],dt_struct);
   temp_day=dt_struct.day;

   if(IsDefineTime)
     {
      for(int i=0;i<rates_total-1;i++)
        {
         TimeToStruct(time[i],dt_struct);
         if(dt_struct.day<temp_day)
           {
            Print("Start day ",time[i-1]);
            IsDefineTime=false;
            break;
           }
        }
     }
//--- return value of prev_calculated for next call
   return(rates_total);
  }
//+------------------------------------------------------------------+
//| Timer function                                                   |
//+------------------------------------------------------------------+
void OnTimer()
  {
//---
   IsDefineTime=true; // true -> you can define time
  }
//+------------------------------------------------------------------+

動作のアルゴリズム:インジケータを起動するときに、タイマーの時間間隔(例えば10秒)を設定します。

//+------------------------------------------------------------------+
//| Timer function                                                   |
//+------------------------------------------------------------------+
void OnTimer()
  {
//---
   IsDefineTime=true; // true -> you can define time
  }

となり、IsDefineTime 変数に値trueが 代入される。何のために?IsDefineTime=trueの場合、OnCalculate()でループに入り、一日の開始時刻を決定することができます。

   if(IsDefineTime)
     {
      for(int i=0;i<rates_total-1;i++)
        {
         TimeToStruct(time[i],dt_struct);
         if(dt_struct.day<temp_day)
           {
            Print("Start day ",time[i-1]);
            IsDefineTime=false;
            break;
           }
        }
     }

このループでは、time[] 配列(この配列にはオープニングタイムの値が格納されています)を右端のバー(インデックスは "0")から順に走査していきます。一日の始まりが見つかったら、その値を解除し、変数IsDefineTimeにfalseを 代入します。このようにして、タイマーが再び作動するまで、一日の始まりの時間を決定するサイクルに入ることを防いでいます。

ファイル:
Start_day.mq4  3 kb
 

カルプトフ ウラジミール さん、ご説明ありがとうございます。しかし、これでどのように問題が解決するのでしょうか?

大まかに言えば、一日の始まりのバーに対応する現在の時間枠のバーを知る必要があります。各バーで把握し、それに応じて計算し、インジケータを描画する必要があります。

 
-Aleks-:

カルプトフ ウラジミール さん、ご説明ありがとうございます。しかし、これでどのように問題が解決するのでしょうか?

大まかに言えば、一日の始まりのバーに対応する現在の時間枠のバーを知る必要があります。すべてのバーでそれを把握し、それに応じて計算し、インジケータを描画する必要があります。

そうやって質問して、そうやって答えてもらったんですね :) .また、この日の最初のバーの時間ではなく、このバーのインデックスが必要な場合、それは、この日の始まりを印刷するときにここにあります。

.
.
.
Print("Start day ",time[i-1]);
.
.
.

インデックス[i-1]を使用します - これは、その日の最初のバーの番号です。

 
Karputov Vladimir:

あなたが尋ねたように、あなたはあなたの答えを得ました :) .また、その日の最初のバーの時間ではなく、このバーのインデックスが必要な場合は、その日の始まりを印刷するときに、ここにあります。

インデックス[i-1]を使用します - これは、その日の最初のバーの番号です。

そうですね~、紛らわしく聞いてしまいました。

作ったアプリにインジケーターがあるのですが、正しくカウントされないんです。私はひどく頭が悪いので、どうすれば日足の最初のバーに対応する指数を正しく判定させることができるのか、皆さんの説明を受けても理解できません。

横柄な態度で申し訳ないのですが、あなたのコードと私のコードを組み合わせる方法を教えていただけませんか?

ファイル:
 

-Aleks-:

どうすれば、日足開始時の最初のバーに対応するインデックスを正しく検出できるようになりますか?

という感じです。

datetime Day00=86400*(TimeCurrent()/86400);//начало дня
int bar_shift=iBarShift(_Symbol,PERIOD_CURRENT,Day00);//индекс первого бара текущего дня
理由: