오류, 버그, 질문 - 페이지 1343

 
StrategyTester :

안녕하세요.

MT5 및 테스터에 대한 질문입니다.

두 통화 쌍 간의 특정 비율을 계산하는 자체 작성 다중 통화 표시기 를 호출하는 자체 작성 다중 통화 Expert Advisor가 있습니다. 테스트 및 디버깅 과정에서 문제를 발견했습니다. 터미널에서 특정 시점에서 "A" 라인이 "B" 라인 위에 있고 테스터에서 동시에 동일한 표시기 설정을 사용합니다. 시각화가 켜져 있으면 "A" 줄은 "B" 줄 아래에 있습니다. 그리고 일반적으로 터미널의 표시선 모양은 테스터의 모양과 근본적으로 다릅니다. 질문: 이것은 MT5 테스터의 결함입니까 아니면 코드의 오류입니까?


명확히 하자면, 관찰되는 지표를 다시 그리는 것입니다.

 
Karputov Vladimir :
표시기는 항상 터미널에 있는 그대로 그려집니다. 테스터에서 여러 모드(모든 눈금, 수학 가격 등)를 시도해야 할 수도 있습니다.
"All ticks", "OHLC on M1", "Only open prices"를 시도했습니다. 결과는 동일합니다. 표시기가 다시 그려집니다. " 수학 계산 " 옵션은 활성화되어 있지 않으며 사용할 수 없습니다.
 
StrategyTester :
"All ticks", "OHLC on M1", "Only open prices"를 시도했습니다. 결과는 동일합니다. 표시기가 다시 그려집니다. " 수학 계산 " 옵션은 활성화되어 있지 않으며 사용할 수 없습니다.
이 경우 스튜디오의 코드입니다.
 

개발자에 대한 질문: 어떤 조건에서 심볼에 의한 히스토리가 동기화되지 않은 것으로 간주됩니까? SeriesInfoInteger (기호, 마침표, SERIES_SYNCHRONIZED)가 false를 반환합니까?

사실은 이력이 있지만(막대 및 기타 함수가 0이 아닌 값을 반환함) 일부 기호의 경우 모든 시간 프레임에 대해 false가 지속적으로 반환되는 상황이 가끔 있습니다. 이유는 무엇입니까?

 

그리고 또 다른 문제. 누군가를 만나기도 합니다. CopyTime, CopyClose 등을 통해 여러 기호/시간 프레임에 대한 기록을 읽을 때 표시기에서 표시등이 자주 깜박입니다. 이것은 그리기 결과가 아니지만(바는 거기에서 다시 계산되지 않음), 단순히 전체 이미지가 1초 미만 동안 사라졌다가 다시 나타납니다. 그리고 그것은 분수가 아니라 전체 초 동안 발생합니다. 이것은 일반적으로 그래프를 스크롤할 때 관찰됩니다. 요청된 시계열이 적으면 문제가 발생하지 않습니다.

이것이 어떻게 연결될 수 있는지에 대한 개발자의 의견을 듣고 싶습니다.

 
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

다른 문제가 있습니다

이 함수가 호출되면 어드바이저를 "고정"시킬 수 있다는 사실을 발견했습니다. 많은 수의 기호를 사용하여 프로그램을 작성하고 각 기호에 대해 문자 그대로 지난 3일의 이력을 계산했습니다.

그래서 모든 것이 몇 분 동안 중단되는 순간이 있었는데 이것이 복사 기능인지 확인하기가 어려웠습니다. 동시에 이 기능은 150-200자를 원활하게 처리한 다음 전화를 끊고 다른 문자에 호버링이 발생했습니다...

중단 시간은 5초에서 2-3분 사이였습니다...

 
Expert Advisors의 복사 기능은 동기식이며 데이터가 없는 경우 교환될 데이터를 기다립니다.
 
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 :

기능 오류:

급하게 다른 캐릭터의 데이터를 복사하려고 합니다. 당신은 할 수 없습니다. 데이터를 먼저 로드, 준비, 확인해야 합니다... 다음은 설명입니다. 데이터에 대한 액세스 구성  

팁 고마워. 내가 지켜볼게.