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

 
Kira27 #:
ハイ!!どこで間違えたか教えてください!!自分でもよくわかりません(笑)

275個のツールのうち、27個を処理し、スクリプトを強制終了させると、スタックしてメモリを占拠し、エラー文字列を生成するのです。

この配列の場合

   double bufer_MA[];  //Буфер для хендла

で、それを使って

         CopyBuffer(MA200,0,TimeCurrent(),5,bufer_MA); // заполнение масива bufer_MA хендлом MA200 выбранного тайма

それは全く正しいことではありません。

それとも私が何か勘違いしているのでしょうか?

 
Alexey Viktorov #:

この配列の場合

で、それを使って

は全く正しくない。

それとも何か誤解があったのでしょうか?

いろいろと問題があるんです。

 
Alexey Viktorov #:

この配列の場合

で、それを使って



Пример:



//+------------------------------------------------------------------+ 
//|                                              TestCopyBuffer3.mq5 | 
//|                        Copyright 2009, MetaQuotes Software Corp. | 
//|                                              https://www.mql5.com | 
//+------------------------------------------------------------------+ 
#property copyright "2009, MetaQuotes Software Corp." 
#property link      "https://www.mql5.com" 
#property version   "1.00"
 
#property indicator_separate_window 
#property indicator_buffers 1 
#property indicator_plots   1 
//---- plot MA 
#property indicator_label1  "MA" 
#property indicator_type1   DRAW_LINE 
#property indicator_color1  clrRed 
#property indicator_style1  STYLE_SOLID 
#property indicator_width1  1 
//--- input parameters 
input bool               AsSeries=true; 
input int                period=15; 
input ENUM_MA_METHOD     smootMode=MODE_EMA; 
input ENUM_APPLIED_PRICE price=PRICE_CLOSE; 
input int                shift=0; 
//--- indicator buffers 
double                   MABuffer[]; 
int                      ma_handle; 
//+------------------------------------------------------------------+ 
//| Custom indicator initialization function                         | 
//+------------------------------------------------------------------+ 
int OnInit() 
  { 
//--- indicator buffers mapping 
   SetIndexBuffer(0,MABuffer,INDICATOR_DATA); 
   Print("Параметр AsSeries = ",AsSeries); 
   Print("Индикаторный буфер после SetIndexBuffer() является таймсерией = ", 
         ArrayGetAsSeries(MABuffer)); 
//--- set short indicator name 
   IndicatorSetString(INDICATOR_SHORTNAME,"MA("+period+")"+AsSeries); 
//--- set AsSeries (depends on input parameter) 
   ArraySetAsSeries(MABuffer,AsSeries); 
   Print("Индикаторный буфер после ArraySetAsSeries(MABuffer,true); является таймсерией = ", 
         ArrayGetAsSeries(MABuffer)); 
//--- 
   ma_handle=iMA(Symbol(),0,period,shift,smootMode,price); 
   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[]) 
  { 
//--- check if all data calculated 
   if(BarsCalculated(ma_handle)<rates_total) return(0); 
//--- we can copy not all data 
   int to_copy; 
   if(prev_calculated>rates_total || prev_calculated<=0) to_copy=rates_total; 
   else 
     { 
      to_copy=rates_total-prev_calculated; 
      //--- last value is always copied 
      to_copy++; 
     } 
//--- try to copy 
   if(CopyBuffer(ma_handle,0,0,to_copy,MABuffer)<=0) return(0); 
//--- return value of prev_calculated for next call 
   return(rates_total); 
  } 
//+------------------------------------------------------------------+
 

は全く正しくない。

それとも何か誤解があったのでしょうか?

なぜ間違っているかというと、関数への例では


CopyBuffer

と使用します。

 

Alexey Viktorov #:


それとも何か誤解があったのでしょうか?

このスクリプトのポイントは、1分から4時間のタイムフレームでマーケットウォッチの各商品を調べ、MA200を超える価格を見つけ、この事実が検出された場合、6つのタイムフレームすべてでMAを超える価格を持つシンボルの名前を含むアラートを生成することです。

 
Artyom Trishkin #:

いろいろと問題があるんです。

より具体的に、差し支えなければ)

 
Kira27 #:

より具体的に、差し支えなければ)

配列のインデックスが気持ち悪い...。同じデータをループでコピーする...新しいハンドルをループで作成する - No words...

他は見たくもない、申し訳ない

 
Artyom Trishkin #:

配列のインデックスが気持ち悪い...。同じデータをループでコピーする...新しいハンドルをループで作成する - No words...

残りのコードは見たくもない、申し訳ない

配列のインデックスがよくわからないのですが、どのような配列が嫌なのでしょうか? CopyBuffer関数の43行目のデータは、1分から4Hまでの異なる時間枠のハンドルをコピーします。5つのMA指標の価格が、最初の5バー分コピーされ、ハンドルと5バーの配列は繰り返しごとにゼロにされます。

ArrayFree(bufer_MA);


となり、ハンドルが削除される。

 IndicatorRelease(MA200); //Удаление хендла

274シンボル、それぞれを6タイムフレームで処理するアルゴリズムを、他の方法で提案していただければ。 ただ、このスレッドはなんだか--初心者からの質問ということで、私がプロなら、たぶん質問はないでしょうね。

 

異なる状況でのハンドルの作成は コストがかからないと思われる、プリロードなしの単なるポインタか? 主な作業はCopyBufferで行われる

ループ内のハンドルを外す必要はないので、確認が必要かもしれません。 個人的には、最初の作成時のみ一定の問題があり、Sleep()でチャートを読み込むか、相場を事前に読み込む機能で解決しています。

開発者が自分で決めるべきで、OnInitではスピードは重要ではなく、7つのシンボルを持つ最初のインジケーターのことです。

----------

ハンドルの作成はどのように行われるのですか?特別なループでは、可用性をチェックする必要があるのですか?

 
Fast235 #:

異なる状況でのハンドルの作成は コストがかからないと思われる、プリロードなしの単なるポインタか? 主な作業はCopyBufferで行われる

ループ内のハンドルを削除する必要はありません。 個人的には、最初の作成時のみ一定の問題があります。Sleep()でチャートをロードするか、クォート関数をプリロードすることで解決します。

開発者が自分で決めるべきで、OnInitではスピードは重要ではなく、7つのシンボルを持つ最初のインジケーターのことです、エラーは常に異なる繰り返しで表示されます

----------

ハンドルの作成はどのように行われるのですか?特別なループでは、可用性をチェックする必要があるのですか?

私に言っているのか、それとも現地の専門家に聞いているのか......)

 
Kira27 #:

私に言っているのか、それともここの専門家に聞いているのか)

ハンドルの作成と削除について。

動作する、正しい方法に興味がある、開発者が教えてくれることを期待する。

理由: