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

 
Николай К:

エラー 4806 - requested data not found を解決する方法を教えてください。ボリンジャーの平均化期間の異なるデータをインジケータから取得したい。OnInitでHandleを受け取っていますが、私の目的ではOnCalculateで 受け取るべきで、そのためエラーになっています。例によって理解できるように助けてください。


コード
 
//+------------------------------------------------------------------+
//|                                                          вап.mq5 |
//|                                  Copyright 2021, MetaQuotes Ltd. |
//|                                             https://www.mql5.com |
//+------------------------------------------------------------------+
#property copyright "Copyright 2021, MetaQuotes Ltd."
#property link      "https://www.mql5.com"
#property version   "1.00"
#property indicator_separate_window
//+------------------------------------------------------------------+
//| Custom indicator initialization function                         |
//+------------------------------------------------------------------+
int OnInit()
  {
//--- indicator buffers mapping

//---
   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 limit=rates_total-prev_calculated;
   if(limit>1) 
     {
      limit=rates_total-1;                 
     }
   for(int i=limit; i>=0 && !IsStopped(); i--)
     {
      if(i>=rates_total-10) 
         continue;

      ArrayInitialize(middle1,0);
      ArrayInitialize(middle2,0);


      for(BandsPeriod=2; BandsPeriod<=5; BandsPeriod++)
        {
         int T=3;
         Handle1=iMA(Symbol(),PERIOD_CURRENT,BandsPeriod,InpBandsShift,MODE_SMA,PRICE_HIGH);
         Handle2=iMA(Symbol(),PERIOD_CURRENT,BandsPeriod,InpBandsShift,MODE_SMA,PRICE_LOW);
         count=Bars(Symbol(),PERIOD_CURRENT)-10;
         if(!iGetArray(Handle1,BASE_LINE,start_pos,count,middle1) ||
            !iGetArray(Handle2,BASE_LINE,start_pos,count,middle2))// ||
            //CopyRates(Symbol(),PERIOD_CURRENT,start_pos,count,rates)!=count)

           {
            return(false);
           }
        }
      //--- return value of prev_calculated for next call
      return(rates_total);
     }
     }
//+------------------------------------------------------------------+
   
bool iGetArray(const int handle,const int buffer,const int start_pos,
               const int count,double &arr_buffer[])
  {
   bool result=true;
   if(!ArrayIsDynamic(arr_buffer))
     {
      if(1==1)
         PrintFormat("ERROR! EA: %s, FUNCTION: %s, this a no dynamic array!",__FILE__,__FUNCTION__);
      return(false);
     }
   ArrayFree(arr_buffer);
//--- reset error code
   ResetLastError();
//--- fill a part of the iBands array with values from the indicator buffer
   int copied=CopyBuffer(handle,buffer,start_pos,count,arr_buffer);
   if(copied!=count)
     {
      //--- if the copying fails, tell the error code
      if(1==1)
         PrintFormat("ERROR! EA: %s, FUNCTION: %s, amount to copy: %d, copied: %d, error code %d",
                     __FILE__,__FUNCTION__,count,copied,GetLastError());
      //--- quit with zero result - it means that the indicator is considered as not calculated
      return(false);
     }
   return(result);
  }
//+------------------------------------------------------------------+
こんな感じで大雑把に整理、整合性が取れなくてすみません。
 
Николай К:
このように整理すると、整合性が取れなくて申し訳ないです。

MQL5のインジケータ・ハンドルはOnInit()で作成する必要があります!

 
Vladimir Karputov:

MQL5のインジケータ・ハンドルはOnInit()で作成する必要があります!

そうすると、平均化期間ごとに別々のハンドルになるのでしょうか?

 
Николай К:
このような構成になっています。一貫性がなくて申し訳ありません。

リソースが解放されない...効率は悪いが正解

iMA(...)を使って操作した後、不要になったらIndicatorReleaseを 呼び出す必要があります。

IndicatorRelease()関数は、このインジケータ・ハンドルが渡されたコンピュータ・メモリからインジケータを解放する役割を果たします。

また、インジケータハンドルはOnDeinit以外ならどこでも作成可能です。ただ、「作成ミスがあった場合の対処法」については心配です。

 
Vladimir Karputov @Maxim Kuznetsov 接着剤か釘か?))単純な作業-複雑な準備、mql4では1、2回で完了しました。では、異なるタイムフレームや平均期間のボリンジャーデータをエラーなく1つの配列に集めるにはどうすればよいのでしょうか?
 
Николай К:
ウラジーミル・カルプトフ @マキシム・クズネツォフ 釘を打つか、それとも釘を打つか?))単純な作業-複雑な準備、mql4ではワンツーで完了しました。では、異なるタイムフレームや平均期間のボリンジャーデータをエラーなく1つの配列に集めるにはどうすればよいのでしょうか?

さすがにハンドルは全部食っただろ、枯渇資源だ...解放してやれよ。

hdl=iMA(....)

if (hdl!=INVALID_HANDLE) {

    /// do something

   IndicatorRelease(hdl);

}

4から5への移行を容易にするために、fxsaberがライブラリで行った方法を見る。

 
MakarFX:
インジケーターの動作を確認してから、EAを見るのが一番です。

インジケータでは、-outputs if...のような行はなく、すべてのティックが 処理され、ロボットでは、すべてのティックが来るのです。

バーが変更され、新しい信号まで、全体のM1は信号がありません、すべてのティックが見ている信号を思い出して、新しいバーを処理することはありません。

しかも、一度に3つの端子でテストしなければならないので、3つの端子を手にしたまま埋もれてしまうのです。

 
Fast235:

インジケータでは、-outputs if...のような行はなく、すべてのティックが 処理され、ロボットでは、すべてのティックが来るのです。

バーが変更され、新しい信号まで、全体のM1は信号がありません、すべてのティックが見ている信号をリコール、新しいバーを処理することはありません。

ロボットはあらゆる面で無信号。

もしかしたら、インジケータではバーが変化したときだけシグナルが出るのかもしれませんね...。

もちろんコードを見たほうがいい。

 
アルテムさん、こんにちは。

私は諸事情によりMQL4でコーディングすることになり、不格好な構造を自分で考えなければならなくなりました。
もしかしたら、MQL4にはすでにそのようなクラス群があるのでしょうか?
ありがとうございました。)