エラー、バグ、質問 - ページ 1343

 
StrategyTester:

こんにちは。

MT5とそのテスターについての質問です。

私は自分で書いた多通貨のExpert Advisorを持っていて、2つの通貨ペアの間のいくつかの比率を計算する自分で書いた多通貨のインディケータを 呼び出すようにしています。テストとデバッギング中に問題が見つかりました。ターミナルでは、ある瞬間、ライン「A」がライン「B」より高くなり、ストラテジーテスターでは、同じ瞬間、同じインディケータの設定、視覚化をオンにすると、ライン「A」がライン「B」より低くなります。また、一般的に、ターミナルでのインジケーターラインの外観は、ストラテジーテスターでのそれとは根本的に異なります。質問:MT5 Testerの不具合なのか、コードのエラーなのか?


はっきり言いますが、インジケーターの再描画が表示されているのです。

 
Karputov Vladimir:
常にインジケータは端末にあるように描かれています。テスターでは、いくつかのモード(すべてのティック、数学的価格など)を試す必要があるかもしれません。
全ティック」、「M1のOHLC」、「始値のみ」を試してみました。結果は同じで、インジケータは再描画されます。オプションの「数学的計算」はアクティブではなく、使用できません。
 
StrategyTester:
全ティック」、「M1のOHLC」、「始値のみ」を試しました。結果は同じで、インジケータは再描画されます。オプションの「数学的計算」はアクティブではなく、使用できません。
その場合、コードの提供をお願いします。
 

開発者への質問:どのような場合にシンボルの履歴が非同期とみなされるか、すなわちSeriesInfoInteger(symbol, period,SERIES_SYNCHRONIZED) が false を返すか

ポイントは、あるシンボルについて履歴があるにもかかわらず、すべてのタイムフレームで偽の値が返される状況に時々遭遇することです(Barsや他の関数がゼロ以外の値を返す)。 何が原因なのでしょうか?

 

そんな問題もあります。CopyTime、CopyCloseなどを通じて、インジケータ内の複数のシンボル/タイムフレームの履歴を読み込むと、インジケータがしばしば点滅します。これはレンダリングの結果ではなく(バーの再計算は行われない)、単に画像全体が数秒間のうちに消え、再び現れるものです。 また、数秒ではなく、まるまる数秒続くこともあります。 通常、チャートをスクロールする際に観察される現象です。要求された時系列が小さい場合は、この問題は発生しません。

これがどう関係するのか、開発者のコメントを聞きたいものです。

 
Karputov Vladimir:
その場合、コードの提供をお願いします。

端末とテスターの違いとインジケーターのコードのイラストを同封します。

//+------------------------------------------------------------------+
//|                                             Indicator1_6test.mq5 |
//+------------------------------------------------------------------+
#property copyright ""
#property link      ""
#property version   "1.6"
#property indicator_separate_window
#property indicator_separate_window
#property indicator_buffers 2
#property indicator_plots 2
#property  indicator_color1 SkyBlue
#property  indicator_color2 Yellow
#property  indicator_type1 DRAW_LINE
#property  indicator_type2 DRAW_LINE
//---
enum TT{_close=0,_open=1,_high=2,_low=3};
//---
input string activ1="GBPUSD",activ2="EURUSD";
input TT PriceType=_close;
input int Len=100;
//---
double ratio[],avr[];string NN[]={"rr1","rr2","aa1","aa2"};
//---
void setv(int i,double v){ObjectSetDouble(0,NN[i],OBJPROP_PRICE,v);}
//---
int OnInit()
{
   SetIndexBuffer(0,ratio);
   PlotIndexSetString(0,PLOT_LABEL,"Ratio");
   SetIndexBuffer(1,avr);
   PlotIndexSetString(1,PLOT_LABEL,"Avr");
   ArraySetAsSeries(ratio,1);
   ArraySetAsSeries(avr,1);
   for(int i=0;i<4;i++)ObjectCreate(0,NN[i],22,0,0,0);
return(INIT_SUCCEEDED);
}
//---
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=0;double zz[4];

  if(prev_calculated==0){limit=MathMin(Bars(activ1,0),Bars(activ2,0));limit--;}
  else limit=rates_total-prev_calculated;
  if(limit==0)limit=1;
  double Price1[],Price2[]; ArraySetAsSeries(Price1,1); ArraySetAsSeries(Price2,1);
  getV(Price1,Price2,limit);
  for(int i=0;i<limit;i++){if(Price1[i]>0&&Price2[i]>0)ratio[i]=Price1[i]/Price2[i];else ratio[i]=ratio[i+1];}
  
  double sred=0,sum=0; 
  for(int i=0;i<limit;i++)
      {
      sred=0;
      avr[i]=SimpleMA(i,Len,ratio);
      
      for(int j=i;j<i+Len;j++)
        {
        if(j>=ArraySize(ratio))break;
      if(ratio[j]==0||ratio[j]==EMPTY_VALUE){sred=0;break;}
      sred=1;
        }
      }
      
  if(prev_calculated!=0)for(int i=0;i<10;i++)if(ratio[i]==0)ratio[i]=ratio[i+1];
  
zz[0]=ratio[1];zz[1]=ratio[2]; zz[2]=avr[1];zz[3]=avr[2];
for(int i=0;i<4;i++)setv(i,zz[i]);
return(rates_total);
}
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
void getV(double&Price1[],double&Price2[],int limit)
{
if(PriceType==_close){CopyClose(activ1,PERIOD_CURRENT,0,limit,Price1);CopyClose(activ2,PERIOD_CURRENT,0,limit,Price2);}
if(PriceType==_open){CopyOpen(activ1,PERIOD_CURRENT,0,limit,Price1);CopyOpen(activ2,PERIOD_CURRENT,0,limit,Price2);}
if(PriceType==_high){CopyHigh(activ1,PERIOD_CURRENT,0,limit,Price1);CopyHigh(activ2,PERIOD_CURRENT,0,limit,Price2);}
if(PriceType==_low){CopyLow(activ1,PERIOD_CURRENT,0,limit,Price1);CopyLow(activ2,PERIOD_CURRENT,0,limit,Price2);}
}
//---
double SimpleMA(const int position,const int period,const double &price[])
  {
//---
   double result=0.0;
//--- check position
      //--- calculate value
      if(position+period+1>ArraySize(price))return(0);
      for(int i=0; i<period; i++) result+=price[position+i];
      result/=period;
   return(result);
  }
//---
 

一般的に関数で

Copy

は別の問題がある。

この関数が呼ばれると、EAが「フリーズ」することがあるという事実を知り、大量のシンボルを使ってプログラムを書き、各シンボルの文字通り過去3日間の履歴で計算を行いました。

以前、数分間すべてがハングアップする瞬間がありましたが、それがコピー機能のせいだとほとんど分かりませんでした。 この機能は、150~200のシンボルを安全に処理した後にハングアップし、別のシンボルでもハングアップします...。

ハングアップ時間は5秒から2〜3分まで...。

 
EAのコピー関数は同期式であり、利用できない場合はデータのページングを期待する。
 
StrategyTester:

端子とテスターの違いとインジケーターのコードの説明図を添付します。

関数にエラーがあります。

//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
void getV(double&Price1[],double&Price2[],int limit)
  {
   if(PriceType==_close)
     {
      CopyClose(activ1,PERIOD_CURRENT,0,limit,Price1);
      CopyClose(activ2,PERIOD_CURRENT,0,limit,Price2);
     }
   if(PriceType==_open)
     {
      CopyOpen(activ1,PERIOD_CURRENT,0,limit,Price1);
      CopyOpen(activ2,PERIOD_CURRENT,0,limit,Price2);
     }
   if(PriceType==_high)
     {
      CopyHigh(activ1,PERIOD_CURRENT,0,limit,Price1);
      CopyHigh(activ2,PERIOD_CURRENT,0,limit,Price2);
     }
   if(PriceType==_low)
     {
      CopyLow(activ1,PERIOD_CURRENT,0,limit,Price1);
      CopyLow(activ2,PERIOD_CURRENT,0,limit,Price2);
     }
  }

急いで他のシンボルのデータをコピーしようとしている。してはいけません。まず、データをダウンロードし、準備し、チェックする必要がある...。ここでは、データアクセスの整理について 説明します。

 
Karputov Vladimir:

関数にエラーがあります。

急いで他のキャラクターのデータをコピーしようとしている。これではいけない。まず、データを読み込み、準備し、確認する必要があります。以下は、「データアクセスの整理」の説明です。

ご指摘ありがとうございます。拝見させていただきます。