오류, 버그, 질문 - 페이지 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);
  }
//+------------------------------------------------------------------+

그리고 전문가

 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
 

다시 예전으로 돌아간다는 뜻)

테스터를 통해 지표 값을 받으면 지표 값 및 과거 데이터와 다릅니다.

확인하려면 EURUSD 기간 M1에 대해 2010년 7월 1일부터 prover.mq5 를 실행하고 로그를 보고 실제 가격을 확인하십시오.

 

안녕하세요, SymbolInfoSessionTrade() 함수를 이해할 수 없습니다. 또는 세션 시작 및 세션 종료라는 마지막 두 매개변수를 이해할 수 없습니다. 내가 읽은 도움말에서:


지정된 기호 및 요일에 대해 지정된 거래 세션 의 시작 시간과 종료 시간을 얻을 수 있습니다.

거래 세션의 시작과 끝 시간을 알아내려면 거래 세션의 시작과 끝(초 단위)을 이미 알고 있어야 합니다. 이는 불일치로 판명되었습니다.

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

안녕하세요, SymbolInfoSessionTrade() 함수를 이해할 수 없습니다. 또는 세션 시작 및 세션 종료라는 마지막 두 매개변수를 이해할 수 없습니다. 내가 읽은 도움말에서:

변수는 시작 및 종료 시간이 기록될 SymbolInfoSessionTrade() 함수의 이러한 매개변수에 전달됩니다.

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

그건 그렇고, 설명서에 오류가 있습니다.

단위                session_index , // 심볼 이름

 
ddd06 :

변수는 시작 및 종료 시간이 기록될 SymbolInfoSessionTrade() 함수의 이러한 매개변수에 전달됩니다.

덕분에 얻었습니다
 

나는 오류를 얻는 것을 단순화했습니다.

다음은 CLOSE 가격 배열을 복사하는 EA입니다.

 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 ;
  }

EURUSD 기간 M1에 대해 2010년 7월 1일부터 Prover.mq5 를 시작하고 로그를 보고 실제 가격을 확인합니다.

그리고 때때로 잘못된 값이 있습니다.

또한 01.00 GBPUSD 가격이 1.49393에서 동결될 때까지 실행을 시작합니다.

나는 한 달 동안 고통을 겪었고 내 다중 통화 고문을 테스트 할 수 없습니다

 
ddd06 :

나는 오류를 얻는 것을 단순화했습니다.

다음은 CLOSE 가격 배열을 복사하는 EA입니다.

EURUSD 기간 M1에 대해 2010년 7월 1일부터 Prover.mq5 를 시작하고 로그를 보고 실제 가격을 확인합니다.

그리고 때때로 잘못된 값이 있습니다.

또한 01.00 GBPUSD 가격이 1.49393에서 동결될 때까지 실행을 시작합니다.

나는 한 달 동안 고통을 겪었고 내 다중 통화 고문을 테스트 할 수 없습니다

불완전한 막대에서 현재 값으로 작업하고 있습니다.

이렇게 시도

 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 ;
  }

이대로는 안 될 것 같은데요, 그쵸?