MQL4、MQL5に関する初心者からの質問、アルゴリズムやコードに関するヘルプ、ディスカッションなど。 - ページ 695

 
psyman:

なぜか15時からのループでバーがつかめない。

条件としてif(i<24)と書くと、ログにはその日の各バーの時刻が表示されますが、必要な条件を満たしていません。


また、どのようなタイムフレームでインジケータを動かしているのでしょうか?

 
 
psyman:

いずれもSentinel。

効くんです。

//+------------------------------------------------------------------+
//|                                                     TestHour.mq5 |
//|                        Copyright 2018, MetaQuotes Software Corp. |
//|                             https://mql5.com/ru/users/artmedia70 |
//+------------------------------------------------------------------+
#property copyright "Copyright 2018, MetaQuotes Software Corp."
#property link      "https://mql5.com/ru/users/artmedia70"
#property version   "1.00"
#property indicator_separate_window
#property indicator_buffers 1
#property indicator_plots   1
#property strict
//--- plot Hour
#property indicator_label1  "Hour"
#property indicator_type1   DRAW_HISTOGRAM
#property indicator_color1  clrRed
#property indicator_style1  STYLE_SOLID
#property indicator_width1  #ifdef __MQL4__ 2 #else 6 #endif 
//--- input parameters
input uchar    InpHour  =  15;   // The required hour
//--- indicator buffers
double         BufferHour[];
//--- global variables
int            hour_req;
//+------------------------------------------------------------------+
//| Custom indicator initialization function                         |
//+------------------------------------------------------------------+
int OnInit()
  {
//--- set global variables
   hour_req=int(InpHour>23 ? 23 : InpHour);
//--- indicator buffers mapping
   SetIndexBuffer(0,BufferHour,INDICATOR_DATA);
//--- setting indicator parameters
   IndicatorSetString(INDICATOR_SHORTNAME,"Hour("+(string)hour_req+")");
#ifdef __MQL4__
   SetIndexLabel(0,"Hour("+(string)hour_req+")");
#else 
   PlotIndexSetString(0,PLOT_LABEL,"Hour("+(string)hour_req+")");
   ArraySetAsSeries(BufferHour,true);
#endif 
   IndicatorSetInteger(INDICATOR_DIGITS,0);
//---
   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[])
  {
//--- Установка массивов буферов как таймсерий
#ifdef __MQL5__
   ArraySetAsSeries(time,true);
#endif 
//--- Проверка количества доступных баров
   if(rates_total<1) return 0;
//--- Проверка и расчёт количества просчитываемых баров
   int limit=rates_total-prev_calculated;
   if(limit>1)
     {
      limit=rates_total-1;
      ArrayInitialize(BufferHour,0);
     }
//--- Подготовка данных

//--- Расчёт индикатора
   for(int i=limit; i>=0 && !IsStopped(); i--)
     {
      int hour=GetTimeHour(time[i]);
      BufferHour[i]=(hour==hour_req ? (hour>0 ? hour : 0.1) : 0);
     }

//--- return value of prev_calculated for next call
   return(rates_total);
  }
//+------------------------------------------------------------------+
//| Возвращает час указанного времени                                |
//+------------------------------------------------------------------+
int GetTimeHour(const datetime time)
  {
   #ifdef __MQL4__
   return TimeHour(time);
   #endif 
   MqlDateTime tm;
   if(!TimeToStruct(time,tm)) return WRONG_VALUE;
   return tm.hour;
  }
//+------------------------------------------------------------------+
 

ありがとうございます。でも、経験や知識の負担がない人にとっては、とても複雑で、混乱しますよ :-)


BufferHour[i]=(hour==hour_req ? (hour>0 ? hour : 0.1) : 0);

バッファにデータを転送する際に、なぜチェックアワー>0にするのか?また、そうでない場合、なぜ0.1を割り当てるのでしょうか?



メインチャートでハイライトをしたいのですが、線ではなく、月、水、水...の曜日 順でSetIndexArrow(0, 140); (もっと簡単な方法があるのかもしれませんが、今のところ他に思いつきません)、なぜかメインウィンドウの4ではあなたのコードを動かすことができず、5ではすでにそのプロパティがありません。

 
psyman:

ありがとうございます。でも、経験や知識の負担がない人にとっては、とても複雑で、混乱しますよ :-)


バッファにデータを転送する際に、なぜチェックアワー>0に するのか?また、そうでない場合、なぜ0.1を割り当てるのでしょうか?



メインチャートでハイライトをしたいのですが、線ではなく、月、水、水...の曜日 順でSetIndexArrow(0, 140); (もっと簡単な方法があるのかもしれませんが、今のところ他に思いつきません) しかし、なぜかメインウィンドウの4ではあなたのコードが動作せず、5ではそのようなプロパティは存在しません。

バッファに時値が格納される。また、時分が0であれば、ヒストグラムは描画されません。そこで、時間がゼロかどうかを確認し(設定でゼロ時間を検索するように設定しています)、ゼロであれば、時間の値(ゼロ)ではなく、0.1をバッファに入力して、ヒストグラム列を表示させる必要があるのです。これは、インジケータDigitsが0に設定されているため、データウィンドウに0.1ではなく、0という値が表示されます。

 
psyman:

ありがとうございます。でも、経験や知識の負担がない人にとっては、とても複雑で、混乱しますよ :-)


バッファにデータを転送する際に、なぜチェックアワー>0にするのか?また、そうでない場合、なぜ0.1を割り当てるのでしょうか?



メインチャートでハイライトをしたいのですが、線ではなく、月、水、水...の曜日 順で SetIndexArrow(0, 140);(もっと簡単な方法があるのかもしれませんが、今のところ他に思いつきません)、なぜかメインウィンドウの4ではあなたのコードが動作しませんし、5ではすでにそのプロパティは 存在しません。

PlotIndexSetInteger(0,PLOT_ARROW,140);

ただし、週数と同じ数のバッファを作成する必要があります。そして、それぞれのバッファには、140から149までのアローコードが与えられている - 1,2,3,4,5,6,7,8,9,10 - 10週間あれば1年は大丈夫?たった70日のことだ。それとも、どうしたかったのでしょうか?

 
皆さん、ごきげんよう。
助けてください!
このBB MACD - MetaTrader 4用インジケータは、私がここからダウンロードしたものですhttps://www.mql5.com/en/code/9325
この指標は、2つのサイクルで算出されます。
直前のMACDバッファのデータを使ってボリンジャーバンドを算出します。

メインサイクルのカウント方向を変更し、1サイクルで全てを一気に計算する試みと、同時に
同時に、ボリンジャーバンドを計算する際の追加サイクルをなくすために、大失敗に終わった。
このインジケーターは、手を加えていないものと同じ結果をもたらしますが、ヒストリーを計算する際にターミナルに乱暴なブレーキがかかります。
1ヶ月の時間軸で放置しても気づかないが、15分の時間軸で放置した場合

再起動が必要です。

どうしたらいいのか迷ってしまいますね。

プログラムの中で最も遅い場所を計算する方法を提案できる人に尋ねることができます。

ヒントをありがとうございました。


これがオリジナルで、以下は同じものを私が変更したものです。

//+------------------------------------------------------------------+
//|                                               Custom BB_MACD.mq4 |
//|                                     Copyright © 2005, adoleh2000 |
//|                                       http://www.metaquotes.net/ |
//+------------------------------------------------------------------+

#property  copyright "Copyright © 2005, adoleh2000"
#property  link      "http://www.metaquotes.net/"
//---- indicator settings
#property  indicator_separate_window
#property  indicator_buffers 4
#property  indicator_color1  Lime    //bbMacd up
#property  indicator_color2  Magenta //bbMacd up
#property  indicator_color3  Blue    //Upperband
#property  indicator_color4  Red     //Lowerband
//---- indicator parameters
extern int FastLen = 12;
extern int SlowLen = 26;
extern int Length = 10;
extern double StDv = 2.5;
//----
int loopbegin;
int shift;
double zeroline;
//---- indicator buffers
double ExtMapBuffer1[];  // bbMacd
double ExtMapBuffer2[];  // bbMacd
double ExtMapBuffer3[];  // Upperband Line
double ExtMapBuffer4[];  // Lowerband Line
//---- buffers
double bbMacd[];
double Upperband[];
double Lowerband[];
double avg[];
double bbMacdline;
double sDev;
double mean;
double sumSqr;
//+------------------------------------------------------------------+
//| Custom indicator initialization function                         |
//+------------------------------------------------------------------+
int init()
  {
//---- 6 additional buffers are used for counting.
   IndicatorBuffers(8);   
//---- drawing settings     
   SetIndexBuffer(0, ExtMapBuffer1); // bbMacd line
   SetIndexStyle(0, DRAW_ARROW);
   SetIndexArrow(0, 108);
   IndicatorDigits(Digits + 1);
//----
   SetIndexBuffer(1, ExtMapBuffer2); // bbMacd line
   SetIndexStyle(1, DRAW_ARROW);
   SetIndexArrow(1, 108);
   IndicatorDigits(Digits + 1);
//----   
   SetIndexBuffer(2, ExtMapBuffer3); // Upperband line
   SetIndexStyle(2, DRAW_LINE, STYLE_SOLID, 1);
   IndicatorDigits(Digits + 1);
//----   
   SetIndexBuffer(3, ExtMapBuffer4); // Lowerband line
   SetIndexStyle(3, DRAW_LINE, STYLE_SOLID, 1);
   IndicatorDigits(Digits + 1);
//----
   SetIndexBuffer(4, bbMacd);
   SetIndexBuffer(5, Upperband);        
   SetIndexBuffer(6, Lowerband);
   SetIndexBuffer(7, avg);    
//---- name for DataWindow and indicator subwindow label
   IndicatorShortName("BB MACD(" + FastLen + "," + SlowLen + "," + Length+")");
   SetIndexLabel(0, "bbMacd");
   SetIndexLabel(1, "Upperband");
   SetIndexLabel(2, "Lowerband");  
//---- initialization done
   return(0);
  }
//+------------------------------------------------------------------+
//| Custor indicator deinitialization function                       |
//+------------------------------------------------------------------+
int deinit()
  {
//----
   return(0);
  }
//+------------------------------------------------------------------+
//| Custom BB_MACD                                                   |
//+------------------------------------------------------------------+
int start()
  {
   int limit;
   int counted_bars = IndicatorCounted();
//---- check for possible errors
   if(counted_bars < 0) 
       return(-1);
//---- last counted bar will be recounted
   if(counted_bars > 0) 
       counted_bars--;
   limit = Bars - counted_bars;
//----
   for(int i = 0; i < limit; i++)
       bbMacd[i] = iMA(NULL, 0, FastLen, 0, MODE_EMA, PRICE_CLOSE, i) - 
                   iMA(NULL, 0, SlowLen, 0, MODE_EMA, PRICE_CLOSE, i);
//----
   for(i = 0; i < limit; i++)
     {
       avg[i] = iMAOnArray(bbMacd, 0, Length, 0, MODE_EMA, i);
       sDev = iStdDevOnArray(bbMacd, 0, Length, MODE_EMA, 0, i);  
       Upperband[i] = avg[i] + (StDv * sDev);
       Lowerband[i] = avg[i] - (StDv * sDev);
       ExtMapBuffer1[i]=bbMacd[i];     // Uptrend bbMacd
       ExtMapBuffer2[i]=bbMacd[i];     // downtrend bbMacd
       ExtMapBuffer3[i]=Upperband[i];  // Upperband
       ExtMapBuffer4[i]=Lowerband[i];  // Lowerband
       //----
       if(bbMacd[i] > bbMacd[i+1])
           ExtMapBuffer2[i] = EMPTY_VALUE;
       //----
       if(bbMacd[i] < bbMacd[i+1])
           ExtMapBuffer1[i] = EMPTY_VALUE;
     }
//---- done
   return(0);
  }
//+------------------------------------------------------------------+


//================


//+------------------------------------------------------------------+
//|                                               Custom BB_MACD.mq4 |
//|                                     Copyright © 2005, adoleh2000 |
//|                                       http://www.metaquotes.net/ |
//+------------------------------------------------------------------+

/*
Осторожно!!!
В том коде мной изменено направление расчёта главного цикла. Осторожно!!! Этот индикатор очень медленно выполняется!!! Его можно бросить только на недельный или месячный таймфрейм где в истории мало баров, если ниже 4х часов то терминал вешается!!! */
#property  copyright "Copyright © 2005, adoleh2000" #property  link      "http://www.metaquotes.net/" //---- indicator settings #property  indicator_separate_window #property  indicator_buffers 4 #property  indicator_color1  Lime    //bbMacd up #property  indicator_color2  Magenta //bbMacd up #property  indicator_color3  Blue    //Upperband #property  indicator_color4  Red     //Lowerband //---- indicator parameters extern int FastLen = 12; extern int SlowLen = 26; extern int Length = 10; extern double StDv = 2.5; //---- int loopbegin; int shift; double zeroline; //---- indicator buffers double ExtMapBuffer1[];  // bbMacd double ExtMapBuffer2[];  // bbMacd double ExtMapBuffer3[];  // Upperband Line double ExtMapBuffer4[];  // Lowerband Line //---- buffers double bbMacd[]; double Upperband[]; double Lowerband[]; double avg[]; double bbMacdline; double sDev; double mean; double sumSqr; //+------------------------------------------------------------------+ //| Custom indicator initialization function                         | //+------------------------------------------------------------------+ int init()   { //---- 6 additional buffers are used for counting.    IndicatorBuffers(8);   //---- drawing settings        SetIndexBuffer(0, ExtMapBuffer1); // bbMacd line    SetIndexStyle(0, DRAW_ARROW);    SetIndexArrow(0, 108);    IndicatorDigits(Digits + 1); //----    SetIndexBuffer(1, ExtMapBuffer2); // bbMacd line    SetIndexStyle(1, DRAW_ARROW);    SetIndexArrow(1, 108);    IndicatorDigits(Digits + 1); //----      SetIndexBuffer(2, ExtMapBuffer3); // Upperband line    SetIndexStyle(2, DRAW_LINE, STYLE_SOLID, 1);    IndicatorDigits(Digits + 1); //----      SetIndexBuffer(3, ExtMapBuffer4); // Lowerband line    SetIndexStyle(3, DRAW_LINE, STYLE_SOLID, 1);    IndicatorDigits(Digits + 1); //----    SetIndexBuffer(4, bbMacd);    SetIndexBuffer(5, Upperband);            SetIndexBuffer(6, Lowerband);    SetIndexBuffer(7, avg);     //---- name for DataWindow and indicator subwindow label    IndicatorShortName("BB MACD-2(" + FastLen + "," + SlowLen + "," + Length+")");    SetIndexLabel(0, "bbMacd");    SetIndexLabel(1, "Upperband");    SetIndexLabel(2, "Lowerband");            //---- initialization done    return(0);   } //+------------------------------------------------------------------+ //| Custor indicator deinitialization function                       | //+------------------------------------------------------------------+ int deinit()   { //----    return(0);   } //+------------------------------------------------------------------+ //| Custom BB_MACD                                                   | //+------------------------------------------------------------------+ int start()   {    int limit, i,MaxPeriod;    int counted_bars = IndicatorCounted(); //---- check for possible errors    if(counted_bars < 0)        return(-1); //---- last counted bar will be recounted    if(counted_bars > 0)        counted_bars--;    limit = Bars - counted_bars;             if(counted_bars==0){              for(i=Bars-1; i>=1; i--) bbMacd[i]=0.0;//обнулим первый рассчитываемый массив              MaxPeriod= MathMax(MathMax(FastLen,SlowLen), Length);//это самые старые бары в истории которые не будем рассчитывать       limit=limit-MaxPeriod;    }    //      //---- основной цикл   for(i=limit; i>=1; i--){//ЦЦЦЦЦЦЦЦЦЦЦЦЦЦЦЦЦЦЦЦЦЦЦЦЦЦЦЦЦЦЦЦЦЦЦЦЦЦЦЦЦЦЦЦЦЦЦЦЦЦЦЦЦЦЦЦЦЦЦЦЦЦЦЦЦЦ //В этом месте изменено направление пересчёта в основном цикле. //И все расчёты зависимых друг от друга буферов производятся последовательно  в одном цикле. //Дополнительный цикл расчета удалён.        bbMacd[i] = iMA(NULL, 0, FastLen, 0, MODE_EMA, PRICE_CLOSE, i) -                    iMA(NULL, 0, SlowLen, 0, MODE_EMA, PRICE_CLOSE, i);                           avg[i] = iMAOnArray(bbMacd, 0, Length, 0, MODE_EMA, i);        sDev = iStdDevOnArray(bbMacd, 0, Length, MODE_EMA, 0, i);          Upperband[i] = avg[i] + (StDv * sDev);        Lowerband[i] = avg[i] - (StDv * sDev);        ExtMapBuffer1[i]=bbMacd[i];     // Uptrend bbMacd        ExtMapBuffer2[i]=bbMacd[i];     // downtrend bbMacd        ExtMapBuffer3[i]=Upperband[i];  // Upperband        ExtMapBuffer4[i]=Lowerband[i];  // Lowerband        //----        if(bbMacd[i] > bbMacd[i+1])            ExtMapBuffer2[i] = EMPTY_VALUE;        //----        if(bbMacd[i] < bbMacd[i+1])            ExtMapBuffer1[i] = EMPTY_VALUE;      }//ЦЦЦЦЦЦЦЦЦЦЦЦЦЦЦЦЦЦЦЦЦЦЦЦЦЦЦЦЦЦЦЦЦЦЦЦЦЦЦЦЦЦЦЦЦЦЦЦЦЦЦЦЦЦЦЦЦЦЦЦЦЦЦЦЦЦЦЦЦЦЦЦЦЦЦЦЦЦЦЦЦЦЦЦЦЦЦЦ //---- done    return(0);   } //+------------------------------------------------------------------+
BB MACD
BB MACD
  • www.mql5.com
BB_MACD Indicator.
 
Northwest:
皆さん、ごきげんよう。
助けてください!
このBB MACD - MetaTrader 4用インジケータは、私がここからダウンロードしたものですhttps://www.mql5.com/en/code/9325
この指標は、2つのサイクルで算出されます。
直前のMACDバッファのデータを使ってボリンジャーバンドを算出します。

メインサイクルのカウント方向を変え、1サイクルで全てを一度に計算する試みと、同時に
同時に、ボリンジャーバンドを計算する際の追加サイクルをなくすために、大失敗に終わった。
このインジケーターは、手を加えていないものと同じ結果をもたらしますが、ヒストリーを計算する際にターミナルに乱暴なブレーキがかかります。
1ヶ月の時間軸で放置しても気づかないが、15分の時間軸で放置した場合

再起動が必要です。

どうしたらいいのか迷ってしまいますね。

プログラムの中で最も遅い場所を計算する方法を提案できる人に尋ねることができます。

ヒントをありがとうございました。


これがオリジナルで、以下は同じものを私が変更したものです。


//================


全部返せ、コンピュータを虐めるな

iBandsOnArray, iStdDevOnArray は、配列に格納されたデータに対して計算されます。

一方、配列は1ループで埋め尽くされる

 
Alekseu Fedotov:

すべてを元に戻し、コンピュータを酷使しないこと

iBandsOnArray, iStdDevOnArray は、配列に格納されたデータに対して計算されます。

一方、配列は1サイクルで埋め尽くされる

1.すべてを元に戻し、コンピュータを拷問しては いけません。

申し訳ありませんが、元に戻りません。 インジケーターを左から右へ数えるようにしなければなりません。

迷惑をかけているのではなく、本来の目的のために使っているのです。

2.iBandsOnArray, iStdDevOnArray は、配列に格納されたデータを用いて算出される

はい、bbMacd[]配列のデータを使って計算されていますね。

3.1ループで配列が埋まる

1では、それとも1では?

1つの配列を埋めるために、この配列が満たされる個人ループが必要だと言っているのでしょうか?

配列が一杯になり、それ以上の操作はできないのですか?


なぜインジケータが遅くなるのか、その場所をどう計算するのかが重要なんです。

質問は増えるが、答えはない。

残念ながら、あなたは何の手がかりも示していない。

 

EAのタイムフレーム変更時に再初期化を無効にするには?


ここにいくつかの情報があります。

電子ブックOnDeinitとOnInitを実行しても、グローバルクラスのオブジェクトが変更されない

https://www.mql5.com/ru/forum/170952/page61#comment_6132824


mql4でも正しいですか?