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

 

チャート上でもテスター上でもうまく動くインジケーターの例をみんなに教えてくれるとうれしいです。

バージョンを変更したところ、チャート上のインジケータの 値は履歴と一致するようになりましたが、テスターの値は一致しません。

私は何か悪いことをしたのだろうか?

#property indicator_separate_window
#property indicator_buffers 2
#property indicator_plots   2
//--- plot Label1
#property indicator_label1  "I1"
#property indicator_type1   DRAW_LINE
#property indicator_color1  Red
#property indicator_style1  STYLE_SOLID
#property indicator_width1  1
//--- plot Label2
#property indicator_label2  "I2"
#property indicator_type2   DRAW_LINE
#property indicator_color2  Green
#property indicator_style2  STYLE_SOLID
#property indicator_width2  1
//--- indicator buffers
double         I1Buffer[];
double         I2Buffer[];
int OnInit()
  {
   SetIndexBuffer(0,I1Buffer,INDICATOR_DATA);
   SetIndexBuffer(1,I2Buffer,INDICATOR_DATA);
   return(0);
  }
int OnCalculate (const int rates_total,      // размер входных таймсерий
                 const int prev_calculated,  // обработано баров на предыдущем вызове
                 const datetime& time[],     // Time
                 const double& open[],       // Open
                 const double& high[],       // High
                 const double& low[],        // Low
                 const double& close[],      // Close
                 const long& tick_volume[],  // Tick Volume
                 const long& volume[],       // Real Volume
                 const int& spread[])        // Spread
  {
   string Symbol_1="EURUSD",Symbol_2="GBPUSD";
   if(rates_total<1) return(0);
   double Arr1[],Arr2[];
   int end,rez0,rez1,rez_0,rez_1;
   datetime ld1[],ld2[];
   end=MathMin((int)SeriesInfoInteger(Symbol_1,0,SERIES_BARS_COUNT)-1,(int)SeriesInfoInteger(Symbol_2,0,SERIES_BARS_COUNT)-1);
   end=MathMin(end,rates_total-prev_calculated+1);
   rez0=CopyClose(Symbol_1,PERIOD_CURRENT, 0,end, Arr1);
   rez_0=CopyTime(Symbol_1,PERIOD_CURRENT, 0,end, ld1);
   if(rez0==-1){Print("Ошибка копирования ",Symbol_1," ",GetLastError()); return(0);}
   if(rez0!=rez_0){Print("Не сходятся цены с временем",Symbol_1," ",GetLastError()); return(0);}
   rez1=CopyClose(Symbol_2,PERIOD_CURRENT, 0,end, Arr2);
   rez_1=CopyTime(Symbol_2,PERIOD_CURRENT, 0,end, ld2);
   if(rez1==-1){Print("Ошибка копирования ",Symbol_2," ",GetLastError()); return(0);}
   if(rez1!=rez_1){Print("Не сходятся цены с временем",Symbol_2," ",GetLastError()); return(0);}
   if(rez1!=rez0){Print("Ошибка Синхронизации"); return(0);}
  
   ArraySetAsSeries(Arr1,true);
   ArraySetAsSeries(Arr2,true);
   ArraySetAsSeries(ld1,true);
   ArraySetAsSeries(ld2,true);
    
   int li=rates_total-1;
   I1Buffer[li]=Arr1[0]+0.26;
   I2Buffer[li]=Arr2[0];
   li--;
  
   int shift1=0,shift2=0;  
   for(int i=1;i<end-MathMax(shift2,shift1);i++)
     {      
      if(time[li]==ld1[i+shift1])I1Buffer[li]=Arr1[i+shift1]+0.26;
      else if(time[li]>ld1[i+shift1]&&i!=0){shift1--;I1Buffer[li]=I1Buffer[li+1];}
      else if(time[li]<ld1[i+shift1]&&i!=0){shift1++;I1Buffer[li]=I1Buffer[li+1];}
            
      if(time[li]==ld2[i+shift2])I2Buffer[li]=Arr2[i+shift2];
      else if(time[li]>ld2[i+shift2]&&i!=0){shift2--;I2Buffer[li]=I2Buffer[li+1];}
      else if(time[li]<ld2[i+shift2]&&i!=0){shift2++;I2Buffer[li]=I2Buffer[li+1];}
      li--;
     }
   return(rates_total);
  }
//+------------------------------------------------------------------+

そして、Expert Advisor

int Handle;
int bars,i;
void OnInit()
  {
   Handle=iCustom(NULL,0,"proverka");
  }

void OnTick()
  {
   double   buf1[],buf2[];
   datetime time[];
//---
   if(bars==Bars(_Symbol,_Period))return;
   bars=Bars(_Symbol,_Period);
   CopyTime(_Symbol,_Period,0,2,time);
   if(CopyBuffer(Handle,0,0,2,buf1)<0 || CopyBuffer(Handle,1,0,2,buf2)<0) Print("Ошибка копирования значений индикаторных буферов ",GetLastError(),"!!");
   if(i>100)return;
   i++;
   Print("Время "+TimeToString(time[1],TIME_DATE|TIME_MINUTES),"   буф1-",buf1[1],"   буф2-",buf2[1]);
   return;
  }
ファイル:
proverka.mq5  4 kb
prover__1.mq5  1 kb
 

だから、私は昔のように戻ってきたのです)

テスターでインジケーターの値を取得した場合、インジケーターの値やヒストリカルデータとは異なる値になります。

これを確認するために、2010年7月1日からEURUSDのM1期間についてprover.mq5を 実行し、ログを見て、実際の価格を確認してみましょう。

 

こんにちは、SymbolInfoSessionTrade()関数というか、最後の2つのパラメータ、セッションの開始とセッションの終了が理解できません。ヘルプで読めます。


指定したシンボルと曜日のセッションの 開始時刻と終了時刻を取得します。

取引セッションの開始時間と終了時間を調べるには、すでに取引セッションの開始時間と終了時間(秒単位)を知っていなければならないことがわかりました。これは一貫性がありません。

Документация по MQL5: Получение рыночной информации / SymbolInfoSessionQuote
Документация по MQL5: Получение рыночной информации / SymbolInfoSessionQuote
  • www.mql5.com
Получение рыночной информации / SymbolInfoSessionQuote - Документация по MQL5
 
kirill190982:

SymbolInfoSessionTrade() 関数、特に最後の2つのパラメータ、session startとsession endが理解できません。ヘルプで読んだことがあります。

これらのパラメータに、SymbolInfoSessionTrade() 関数は、開始時間と終了時間を記録する変数を渡します。

void OnTick()
  {
   datetime ld_start, ld_end;
   SymbolInfoSessionTrade(
   _Symbol,    // имя символа
   MONDAY,      // день недели
   0,           // Порядковый номер сессии
   ld_start,    // время начала сессии
   ld_end       // время окончания сессии
   );
   
   Print(ld_start," - ",ld_end);
  }

ところで、helpに間違いがあります。

uintsession_index,// シンボル名

 
ddd06:

SymbolInfoSessionTrade() 関数のこれらのパラメータには、開始時刻と終了時刻を書き込む変数が渡されます。

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

エラーが出るのを簡略化しました。

以下は、CLOSE価格の配列をコピーするExpert Advisorです。

int bars,i;
void OnTick()
  {
   if(bars==Bars(_Symbol,_Period))return;
   bars=Bars(_Symbol,_Period);
   if(i>100)return;
   i++;  
   datetime time[];  
   double Arr1[],Arr2[];
   CopyTime(_Symbol,_Period,0,2,time);
   CopyClose("EURUSD",PERIOD_CURRENT, 0, 2, Arr1);
   CopyClose("GBPUSD",PERIOD_CURRENT, 0, 2, Arr2);
   Print("Время "+TimeToString(time[1],TIME_DATE|TIME_MINUTES),"  mas1(EURUSD)-",Arr1[1],"   mas2(GBPUSD)-",Arr2[1]);
   return;
  }

2010年7月1日からM1期間のEURUSDでprover.mq5を 実行し、ログを見て、実際の価格を確認してみましょう。

時折、誤った値を目にすることがあります

また、GBPUSDの価格は01.00まで1.49393で凍結しており、その後、実行を開始します。

多通貨のExpert Advisorをテストすることができず、1ヶ月間苦しんでいます。

 
ddd06:

エラーが出るのを簡略化しました。

以下は、CLOSE価格の配列をコピーするExpert Advisorです。

2010年7月1日からM1期間のEURUSDでprover.mq5を 実行し、ログを見て、実際の価格を確認してみましょう。

そして、時折、誤った値を目にすることがあります。

また、GBPUSDの価格は01.00まで1.49393で凍結しており、その後、実行を開始します。

1ヶ月間、この症状に悩まされ、多通貨のExpert Advisorをテストすることができません。

未完成のバーの現在値で作業している。

お試しください

Print("Время "+TimeToString(time[0],TIME_DATE|TIME_MINUTES),"  mas1(EURUSD)-",Arr1[0],"   mas2(GBPUSD)-",Arr2[0]);

または配列の時系列を設定する。

 
stringo:

未完成のバーの現在値で作業していることになります。

このように試してみてください。

または配列の時系列を設定する。

続き
int bars,i;
void OnTick()
  {
   if(bars==Bars(_Symbol,_Period))return;
   bars=Bars(_Symbol,_Period);
   if(i>100)return;
   i++;  
   datetime time[];  
   double Arr1[],Arr2[];
   CopyTime(_Symbol,_Period,0,2,time);
   CopyClose("EURUSD",PERIOD_CURRENT, 0, 2, Arr1);
   CopyClose("GBPUSD",PERIOD_CURRENT, 0, 2, Arr2);
   Print("Время "+TimeToString(time[0],TIME_DATE|TIME_MINUTES),"  mas1(EURUSD)-",Arr1[0],"   mas2(GBPUSD)-",Arr2[0]);
   return;
  }

そして、なぜ引用が冒頭にあるのか、頑なに答えようとしませんね。

EURUSDでは、一致し始めたようです)

 

もしそうなら、2つの時間配列を保持する必要があります。ある時はEURUSDから、ある時はGBPUSDからコピーする

 
stringo:

もしそうなら、2つの時間配列を保持する必要があります。ある時間はEURUSDから、他の時間はGBPUSDからコピーされるべきです。

まあね。

int bars,i;
void OnTick()
  {
   if(bars==Bars(_Symbol,_Period))return;
   bars=Bars(_Symbol,_Period);
   if(i>100)return;
   i++;  
   datetime time1[],time2[];  
   double Arr1[],Arr2[];
   CopyTime("EURUSD",_Period,0,2,time1);
   CopyTime("GBPUSD",_Period,0,2,time2);
   CopyClose("EURUSD",PERIOD_CURRENT, 0, 2, Arr1);
   CopyClose("GBPUSD",PERIOD_CURRENT, 0, 2, Arr2);
   Print("Время EURUSD"+TimeToString(time1[0],TIME_DATE|TIME_MINUTES), "  Время GBPUSD"+TimeToString(time2[0],TIME_DATE|TIME_MINUTES),"    mas1(EURUSD)-",Arr1[0],"   mas2(GBPUSD)-",Arr2[0]);
   return;
  }

そんなことではいけないと思うのですが、どうでしょう?