MQL4 및 MQL5에 대한 초보자 질문, 알고리즘 및 코드에 대한 도움말 및 토론 - 페이지 567

 
PolarSeaman :

여전히 날아다닌다.

[i+ 1 ] 이(가) 있고 +2가 더 있는지 확인해야 합니다.

일반적으로 다음과 같이 해야 합니다.

limit=(rates_total<cb || cb<= 0 ) ? rates_total- 1 : cb;
if (limit<= 0 ) return ( 0 );
 
Ihor Herasko :

검사가 근본적으로 잘못되었기 때문입니다. Bars가 1000을 반환하고 cb도 1000을 반환했다고 가정해 보겠습니다. 그런 다음 루프에서 첫 번째 반복에서 i 값은 1000을 얻습니다. 루프 본문의 첫 번째 조건에서:

배열에서 한 번에 두 개의 종료: 인덱스 1000과 인덱스 1001로 막대에 액세스. 결국 차트에 1000개의 막대가 있는 경우 첫 번째 막대의 인덱스는 0이고 마지막 막대는 999입니다.

더 나아가 사이클의 본체를 따라 역사상 훨씬 더 먼 바에 대한 호소가 있습니다.

초기 점검 시 이 모든 사항을 고려해야 합니다.

올바르게 확인하는 방법? MQL4 도움말에서 IndicatorCounted() 함수의 예를 살펴보십시오. 이제는 IndicatorCounted()를 Rates_total(Bars) 및 prev_calculated(IndicatorCounted()) 변수를 공유하는 것으로 바꾸는 것이 좋습니다.

고마워, 발견

 int counted_bars= IndicatorCounted (); 
     if (counted_bars> 0 ) counted_bars--;

무엇과 비교할 것인가? 예제에서 limit 로 시작

 limit= Bars -counted_bars;

이 "cb"를 무엇과 비교해야 합니까?

 
PolarSeaman :

고마워, 발견

무엇과 비교할 것인가? 예제에서 limit 로 시작

이 "cb"를 무엇과 비교해야 합니까?

지표 데이터가 표시되는 막대 수 를 제한해야 하는 경우 다음을 수행하는 것이 좋습니다.

 int GetRecalcIndex( int & total, const int ratesTotal, const int prevCalculated)
{
   total = ratesTotal - 2 - barsig;                                                                         
                                                   
   if (cb > 0 && cb < total)
      total = MathMin (cb, total);                      
                                                   
   if (prevCalculated < ratesTotal - 1 )                     
   {       
      InitializeBuffers();     // Это функция, которая должна заново инициализировать все индикаторные буфера, т. к. имеем дело с первой загрузкой индикатора или подкачкой истории
       return (total);
   }
   
   return ( MathMin (ratesTotal - prevCalculated, total));                            
}

다음과 같이 사용하십시오.

 int total;   
int limit = GetRecalcIndex(total, rates_total, prev_calculated);                                

for ( int i = limit; i >= 0 ; --i)
{
  ...
}
총 값은 표시기 설정 값을 기반으로 액세스할 수 있는 역사상 가장 깊은 막대의 인덱스입니다.
 
Taras Slobodyanik :

[i+ 1 ] 이(가) 있고 +2가 더 있는지 확인해야 합니다.

일반적으로 다음과 같이 해야 합니다.

나는 이것을 정확히 이렇게 썼습니다. ... 배열이 'HiLo.mq4'(122,15)에서 범위를 벗어났습니다.

+2를 더 확인하려면 무엇을 확인해야 하나요?


 
Ihor Herasko :

지표 데이터가 표시되는 막대 수 를 제한해야 하는 경우 다음을 수행하는 것이 좋습니다.

다음과 같이 사용하십시오.

총 값은 표시기 설정 값을 기반으로 액세스할 수 있는 역사상 가장 깊은 막대의 인덱스입니다.

컴파일러는 맹세합니다.

'InitializeBuffers' - 함수가 정의되지 않았습니다. HiLo.mq4 161 7

이 기능에 대한 도움말에는 아무 것도 없습니다.
 
PolarSeaman :

컴파일러는 맹세합니다.

'InitializeBuffers' - 함수가 정의되지 않았습니다. HiLo.mq4 161 7

이 기능에 대한 도움말에는 아무 것도 없습니다.

나는 이것이 모든 표시기 버퍼를 초기화해야 하는 함수라고 댓글에 썼습니다. 이것은 사용자 정의 기능입니다. 나는 다음과 같이 가지고있다 :

 void InitializeBuffers()
{
   ArrayInitialize (g_indValues, EMPTY_VALUE );
   ArrayInitialize (g_tempBuffer, EMPTY_VALUE );
}

당신은 다른 다른 버퍼에. 표시기 가 그래픽 개체와 함께 작동하는 경우 판독값의 초기 렌더링이 완료되어야 하므로 여기에서 모든 개체를 삭제해야 합니다.

 
Ihor Herasko :

나는 이것이 모든 표시기 버퍼를 초기화해야 하는 함수라고 댓글에 썼습니다. 이것은 사용자 정의 기능입니다. 나는 다음과 같이 가지고있다 :

당신은 다른 다른 버퍼에. 표시기 가 그래픽 개체와 함께 작동하는 경우 판독값의 초기 렌더링이 완료되어야 하므로 여기에서 모든 개체를 삭제해야 합니다.

감사합니다. 하지만 아무 것도 변경되지 않았습니다. 'HiLo.mq4'의 범위를 벗어난 배열(130,15)

. 뭐가 문제 야?

 #property copyright "Copyright ©  november 2015"
#property strict 

#property indicator_chart_window
#property indicator_buffers 6

#property indicator_color1 RoyalBlue       //DodgerBlue
#property indicator_color2 Crimson         //OrangeRed
#property indicator_color3 Black   //White
#property indicator_color4 Black   //White
#property indicator_color5 Black             //White
#property indicator_color6 Black         //Red

#property indicator_width1 2
#property indicator_width2 2

#property indicator_style3 STYLE_DOT
#property indicator_style4 STYLE_DOT

input int     p        = 10 ;     // Период
input int     s        = 5 ;     // Угол наклона
input double distance = 2.0 ;   // Ширина канала
input bool    showBb   = false ;   // Границы канала
input bool    showCl   = true ;   // Центральная линия
input int     barsig   = 1 ;     // Сигнальная свеча (номер)
input int     arrots   = 0 ;     // Стрелка (отступ)
input int     arrsz    = 0 ;     // Стрелка (размер)
input int     ATR      = 1000 ;   // Период ATR
input int     cb       = 1000 ;   // Сколько свечей в истории

double fx1[],fx2[],hp[];
double z1,z2,ki;
int fs;

double upper[],lower[];
double upar[],dnar[];

//+------------------------------------------------------------------+
//| Custom indicator initialization function                         |
//+------------------------------------------------------------------+
int OnInit ( void )
  {
//--- indicator buffers mapping
IndicatorBuffers ( 7 );
SetIndexBuffer ( 0 ,fx1);
SetIndexBuffer ( 1 ,fx2);
SetIndexBuffer ( 2 ,lower);
SetIndexBuffer ( 3 ,upper);
SetIndexBuffer ( 4 ,upar);
SetIndexBuffer ( 5 ,dnar);
SetIndexBuffer ( 6 ,hp);


SetIndexStyle ( 4 , DRAW_ARROW , 0 ,arrsz);
SetIndexArrow ( 4 , 233 );
SetIndexStyle ( 5 , DRAW_ARROW , 0 ,arrsz);
SetIndexArrow ( 5 , 234 );

   if (showBb)
   { SetIndexStyle ( 2 , DRAW_LINE );
     SetIndexStyle ( 3 , DRAW_LINE );
   }
   else
   { SetIndexStyle ( 2 , DRAW_NONE );
     SetIndexStyle ( 3 , DRAW_NONE );
   }
   
     if (showCl)
   { SetIndexStyle ( 0 , DRAW_LINE );
     SetIndexStyle ( 1 , DRAW_LINE );
   }
   else
   { SetIndexStyle ( 0 , DRAW_NONE );
     SetIndexStyle ( 1 , DRAW_NONE );
   }

SetIndexEmptyValue ( 0 , 0.0 );
SetIndexEmptyValue ( 1 , 0.0 );

//---
   return ( INIT_SUCCEEDED );
  }
  
//+------------------------------------------------------------------+
//| 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[])
  {
//---
   int i,limit;
//   limit=(rates_total<cb || cb<=0) ? rates_total-2 : cb;
//if (limit<=0) return(0);
 int total;   
 limit = GetRecalcIndex(total, rates_total, prev_calculated);                                

for ( int i = limit; i >= 0 ; --i)
{ 
  
  
   SetIndexDrawBegin ( 0 , Bars -cb);
   SetIndexDrawBegin ( 1 , Bars -cb);

double avg;

ki= 2.0 /(p+ 1 );

for (i=cb; i>= 0 ; i--) {fx1[i]= Close [i];}

for ( int m= 0 ; m<=s; m++)
{
z1=fx1[ 0 ];
for (i= 0 ; i<=cb; i++) {z1=z1+(fx1[i]-z1)*ki; hp[i]=z1;}

z2=fx1[cb];
for (i=cb; i>= 0 ; i--) {z2=z2+(fx1[i]-z2)*ki; fx1[i]=(hp[i]+z2)/ 2 ;}
}

fs= 0 ;
for (i=cb; i>= 0 ; i--)
{
if (fx1[i]>fx1[i+ 1 ]) fs= 1 ;
if (fx1[i]<fx1[i+ 1 ]) { if (fs== 1 ) fx2[i+ 1 ]=fx1[i+ 1 ]; fs= 2 ;}
if (fs== 2 ) fx2[i]=fx1[i]; else fx2[i]= 0.0 ;

avg = iATR ( NULL , 0 ,ATR, i+ 10 );
upper[i] = hp[i] + distance*avg;
lower[i] = hp[i] - distance*avg;

if ( Close [i+ 1 +barsig]<upper[i+ 1 +barsig] && Close [i+barsig]>upper[i+barsig])
 dnar[i] = High [i]+arrots* Point ; else dnar[i] = EMPTY_VALUE ;
 
if ( Close [i+ 1 +barsig]>lower[i+ 1 +barsig] && Close [i+barsig]<lower[i+barsig])
 upar[i] = Low [i]-arrots* Point ; else upar[i] = EMPTY_VALUE ; 
}
}
//--- return value of prev_calculated for next call
   return (rates_total);
  }
  

int GetRecalcIndex( int & total, const int ratesTotal, const int prevCalculated)
{
   total = ratesTotal - 2 - barsig;                                                                         
                                                   
   if (cb > 0 && cb < total)
      total = MathMin (cb, total);                      
                                                   
   if (prevCalculated < ratesTotal - 1 )                     
   {       
       InitializeBuffers();    // Это функция, которая должна заново инициализировать все индикаторные буфера, т. к. имеем дело с первой загрузкой индикатора или подкачкой истории
       return (total);
   }
   
   return ( MathMin (ratesTotal - prevCalculated, total));                            
}

void InitializeBuffers()
{
   ArrayInitialize (fx1, EMPTY_VALUE );
   ArrayInitialize (fx2, EMPTY_VALUE );
   ArrayInitialize (lower, EMPTY_VALUE );
   ArrayInitialize (upper, EMPTY_VALUE );
   ArrayInitialize (upar, EMPTY_VALUE );
   ArrayInitialize (dnar, EMPTY_VALUE );
   ArrayInitialize (hp, EMPTY_VALUE );
}
 
PolarSeaman :

감사합니다. 하지만 아무것도 변경되지 않았습니다. 뭐가 문제 야?

물론 결과는 변하지 않습니다. 결국, 주요 원인(cb의 주기)을 제거하지 않았습니다. 이 주기는 잘못 구성되어 있습니다.

 for (i=cb; i>= 0 ; i--)

이를 제거하고 대신 루프를 제한해야 합니다. 두 곳 모두에서.

 
Ihor Herasko :

물론 결과는 변하지 않습니다. 결국, 당신은 주된 이유(cb의 주기)를 제거하지 않았습니다. 이 주기는 잘못 구성되어 있습니다.

이를 제거하고 대신 주기를 제한해야 합니다. 두 곳 모두에서.

그런 사이클이 3개 있는데 교체했는데 터미널이 멈춥니다.

 

나는 그것을 했고, 그것은 멈추지 않고, 충돌하지 않는다. 그러나 첫 번째 버퍼(fx2)에는 3개의 값이 있다: price, 0.0, 164874239.218492.

sell_1_B= NormalizeDouble ( iCustom ( Symbol (), 0 , "HiLo" , 1 , 1 ), Digits );

값이 Sell_1_B!=EMPTY_VALUE이고 Sell_1_B!=0이면 가격이 있다는 의미가 아닙니다.

신호를 얻는 방법?