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

 
Aleksey Vyazmikin:

このメッセージの原因を調べるにはどうしたらよいですか?

プロファイラ

 
Artyom Trishkin:

戻り値が0かどうか確認する方法を知らないのか?また、OnCalculate()をゼロのリターンで終了する方法がわからないのですか?ホームページで情報を検索しようとしたことがないのでしょうか?

  1. 関数から必要な値を取得する
  2. ゼロかどうかを確認する
    1. もし0であれば、0を返す。
    2. 0でない場合は、ステップ3へ
  3. この値で作業する
まさか、このリソースで論理の基本を、レーティングが13000を超える男性に伝えることになるとは......。

これは指標にはならない。

呼び出すたびにチェックするのか、OnTickの開始時に1回で十分なのか、意図的に指定したのですが...。

リターンは私のために許容されない...とテスターで待機をループすることは不可能であり、実際の仕事(またはそうでないか?)

私の評価は、プログラミングのためのものではありません。私はプログラマーではなく、この複雑なビジネスを学んでいるのは、あなたのような人々のおかげです。

ご理解をお願いいたします。

 
Artyom Trishkin:

プロファイラ

1日1回以下ならどうでしょう?

 
こんにちは。ヘンデルはなぜか全期間に設定すると送信されるだけで、特定の期間に設定しても何もない。何が問題なのかわからない。グローバル変数 からではなく、直接handelに入力してみましたが、結果は同じでした。どうしたんですか?1期分からの値が必要です。
//+------------------------------------------------------------------+
//|                                                        77777.mq5 |
//|                        Copyright 2019, MetaQuotes Software Corp. |
//|                                             https://www.mql5.com |
//+------------------------------------------------------------------+
#property copyright "Copyright 2018, MetaQuotes Software Corp."
#property link      "https://www.mql5.com"
#property version   "1.00"
#property strict
#property indicator_chart_window
#property indicator_buffers 1
#property indicator_plots   0
//+----------------------------------------------+
//|  Параметры отрисовки индикатора 1            |
//+----------------------------------------------+
//----
input string xBars="2018.11.19 00:00";            //Дата начала отсчета
input bool DataBars=false;                        //Считать по дате (true)
input int InpMAShift=1;                           //Сдвиг бара расчета 
input ENUM_TIMEFRAMES Timeframes=PERIOD_D1;       //Таймфрейм скользящей
input ENUM_MA_METHOD  Method=MODE_EMA;            //Метод  расчета скользящей
input ENUM_APPLIED_PRICE AppliedPrice=PRICE_CLOSE; //Расчет цены скользящей
input ENUM_LINE_STYLE MAStyle=STYLE_DASH;         //Стиль всех скользящих линий
input int InpMAPeriod1=5;                         //Скользящая 1 периода

//----
int handle_ma,shift;
double BufferPrice[];
//---
int period;
//+------------------------------------------------------------------+
//| Custom indicator initialization function                         |
//+------------------------------------------------------------------+
int OnInit()
  {
//---
   period=(InpMAPeriod1<1 ? 1 : InpMAPeriod1);
//---
   SetIndexBuffer(2,BufferPrice,INDICATOR_CALCULATIONS);
   ArraySetAsSeries(BufferPrice,true);
//--- create MA's handles
   ResetLastError();

//----------------------------------------------------------------+
//                     ПРОБЛЕМА ТУТ 
//
//----------------------------------------------------------------+
   handle_ma=iMA(NULL,PERIOD_D1,period,0,MODE_SMA,PRICE_CLOSE);         //ПРОБЛЕМА ТУТ 
 //  handle_ma=iMA(NULL,PERIOD_CURRENT,period,0,MODE_SMA,PRICE_CLOSE);      // БЕЗ ПРОБЛЕМЫ
   if(handle_ma==INVALID_HANDLE)
     {
      Print("The iMA (",(string)period,") object was not created: Error ",GetLastError());
      return INIT_FAILED;
     }
//---
   return(INIT_SUCCEEDED);
  }
//+------------------------------------------------------------------+
//| Expert deinitialization function                                 | 
//+------------------------------------------------------------------+
void OnDeinit(const int reason)
  {
  ObjectDelete(0,"Proba");
   Comment("");
  }
//+------------------------------------------------------------------+
//| 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[])
  {
//--- Проверка количества доступных баров
   if(rates_total<4) return 0;
//--- Проверка и расчёт количества просчитываемых баров
   int limit=rates_total-prev_calculated;
   if(limit>1)
     {
      limit=rates_total-1;
      ArrayInitialize(BufferPrice,0);
     }
//--- Подготовка данных
   int count=(limit>1 ? rates_total : 2),copied=0;
   copied=CopyBuffer(handle_ma,0,0,count,BufferPrice);
   if(copied!=count) return 0;
//----   
if(DataBars==false)
    shift=InpMAShift;
 else
    shift=iBarShift(NULL,PERIOD_CURRENT,StringToTime(xBars)); 
    
 double ma1=BufferPrice[shift];
 datetime tm=iTime(NULL,Timeframes,shift);
 
 Comment(NormalizeDouble(BufferPrice[shift],_Digits),"    ",shift);
 
 
   HLine("Proba","",tm,ma1,MAStyle,1,Red);

//--- return value of prev_calculated for next call

   return(rates_total);
  }
//+------------------------------------------------------------------+
void HLine(string name,
           string text,
           datetime tm,
           double price,
           int stl,
           int wid,
           color clr)
  {
   if(ObjectFind(0,name)!=0)
     {
      ObjectCreate(0,name,OBJ_HLINE,0,tm,price);
      ObjectSetInteger(0,name,OBJPROP_TIME, tm);
      ObjectSetString(0,name,OBJPROP_TEXT,text); 
      ObjectSetString(0,name,OBJPROP_FONT,"Times New Roman"); 
      ObjectSetInteger(0,name,OBJPROP_FONTSIZE,10); 
      ObjectSetInteger(0,name,OBJPROP_STYLE, stl);
      ObjectSetInteger(0,name,OBJPROP_WIDTH, wid);
      ObjectSetInteger(0,name,OBJPROP_COLOR, clr);
//--- скроем (true) или отобразим (false) имя графического объекта в списке объектов 
      ObjectSetInteger(0,name,OBJPROP_HIDDEN,true); 
     }
  }

 
kopeyka2:
こんにちは。なぜか、handelは全期間に設定すると転送されるだけで、特定の期間に設定すると何もないのです。何が問題なのかわからない。グローバル変数 からではないデータを直接handelに入力してみましたが、結果は同じです。どうしたんですか?
      ResetLastError();
   if(CopyBuffer(handle_ma,0,0,count,BufferPrice)<0)
     {
      PrintFormat("Failed to copy data from the handle_ma indicator, error code %d",GetLastError());
      return(0.0);
     }
//   copied=CopyBuffer(handle_ma,0,0,count,BufferPrice);

エラーを研究し、Artemの言う通り、すべてを10回チェックすること...。

2019.01.25 20:12:26.169 Test777 (Si Splice,M1)  Failed to copy data from the handle_ma indicator, error code 4806

err_invalid_array

4006

不適切な型、不適切なサイズの配列、または破損した動的配列オブジェクト。


err_indicator_data_not_found

4806

要求されたデータが見つからない


 
kopeyka2:
こんにちは。ハンデは全期間に設定すると転送されるだけで、ある期間に設定すると何も起こらないことに気づきました。何が問題なのか理解できない。グローバル変数 からではなく、直接handelに入力してみましたが、結果は同じでした。どうしたんですか?同じ時期の値が必要です。

ScriptorのインジケータからCodeBaseの例を取っているんですよね?そうだろ?そして、彼のコード(最近公開されたもの)の中から、名前にMTFが入っていて、MCPが入っていない例を探してみてください。

MTF=MultiTimeFrame、MCP=MultiCurrencyPair。すなわち、現在のシンボルに関するデータを取得したいが、チャート期間とは別のタイムフレームから取得したい場合、マルチタイムフレーム・インディケーターの例が必要である。MCPでは、標準的なクラスを使用したOOPで、まだ関与しないほうがよいでしょう。混乱しますよ。

例えば、この計算。

//--- Подготовка данных
   int count=(limit>1 ? rates_total : 2),copied=0;
   copied=CopyBuffer(handle_ma,0,0,count,BufferPrice);
   if(copied!=count) return 0;

現在の期間とシンボルで動作するMAに限ります。異なる期間での作業については、計算が異なります。調べてみてください。すべて近いですし、私が教えた方向です。

 
Artyom Trishkin:

ScriptorのインジケータからCodeBaseの例を取っているんですよね?そうだろ?そして、彼のコード(最近公開されたもの)の中から、名前にMTFが入っていて、MCPが入っていない例を探します。

MTF=MultiTimeFrame、MCP=MultiCurrencyPair。すなわち、現在のシンボルに関するデータを取得したいが、チャート期間とは別のタイムフレームから取得したい場合、マルチタイムフレーム・インディケーターの例が必要である。MCPでは、標準的なクラスを使用したOOPで、まだ関与しないほうがよいでしょう。混乱しますよ。

例えば、この計算。

は、現在の期間とシンボルで動作するMAのみです。異なる期間の作品については、計算方法が異なります。検索 - すべてが近いし、方向も教えた。

ありがとうございます...
 
Aleksey Vyazmikin:

エラーを研究し、Artemの言う通り、すべてを10回チェックすること...。

err_invalid_array

4006

不適切な型、不適切なサイズの配列、または破損した動的配列オブジェクト。

ありがとうございました。
 
kopeyka2:
ありがとうございました。

お願いですが、間違ったエラーをコピーしてしまいました、本来は

err_indicator_data_not_found

4806

要求されたデータが見つかりませんでした

ポイントは、TFによってバーの数が違うことで、これを考慮する必要があります。

 
Aleksey Vyazmikin:

お願いですが、間違ったエラーをコピーしてしまいました、本来は

err_indicator_data_not_found

4806

要求されたデータが見つかりませんでした

ポイントは、TFによってバーの数が違うことで、これを考慮する必要があります。

確認していたところです。しかし、問題は、ハンデルを1つの一定の周期に設定したことである。

CopyBuffer 他の時間枠の値は永続的ではありません。設定されたハンドル期間ではその値でしたが、より小さなタイムフレームでは0.0(ゼロ)でした。バッファを求めて移動...。ゼロです。なぜCopyBufferに 渡さないのですか?

理由: