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

 
Roman # :

그리고 모든 것은 IndBuff 버퍼가 Rates_total + 1까지 할당되지 않았기 때문입니다.
그리고 ArrayResize 는 적용되지 않습니다.
구성을 위해 파산했습니다. 이제 if-를 통해 모든 것을 차단하시겠습니까?

for(int i= limit - 1 ;....

최소..

 
Roman # :

그리고 모든 것은 IndBuff 버퍼가 Rates_total + 1까지 할당되지 않았기 때문입니다.
그리고 ArrayResize 는 적용되지 않습니다.


마이너스 1이 필요한 곳입니다 :))
그런 다음 인쇄물에 치수가 모두 정상임을 표시합니다.
논리 사용:
limit = 0이면 새 틱
limit = 1이면 새로운 막대를 의미합니다.
limit > 1이면 전체 지표를 다시 계산하는 것이 좋습니다.
 
Maxim Kuznetsov # :

for(int i= limit - 1 ;....

최소..

가장 짜증나는 것이 무엇인지 아십니까? 모든 행동은 경고 없이 조용히 변경됩니다.
그러면 사람들은 고통을 받습니다. 이 메타 트레이더에 지쳤습니다.

 
Roman # :

가장 짜증나는 것이 무엇인지 아십니까? 모든 행동은 경고 없이 조용히 변경됩니다.
그러면 사람들은 고통을 받습니다. 이 메타 트레이더에 지쳤습니다.

모든 것이 그대로 남아 있습니다.
당신의 관절
팁 - 디버거를 사용하는 방법을 배우고 인쇄할 필요가 없습니다. 또한 모든 잼을 즉시 볼 수 있습니다.
 
Roman # :

가장 짜증나는 것이 무엇인지 아십니까? 모든 행동은 경고 없이 조용히 변경됩니다.
그러면 사람들은 고통을 받습니다. 이 메타 트레이더에 지쳤습니다.

지표 계산의 변화를 눈치채지 못했습니다. 위에서 Nikolai는 rate_total-prev_calculated로 계산된 한계 값의 의미를 올바르게 설명했습니다.

그리고 그것은 네 번째 터미널에서도 수년 동안 작동했습니다.

 
Nikolai Semko # :
마이너스 1이 필요한 곳입니다 :))
그런 다음 인쇄물에 치수가 모두 정상임을 표시합니다.
논리 사용:
limit = 0이면 새 틱
limit = 1이면 새로운 막대를 의미합니다.
limit > 1이면 전체 지표를 다시 계산하는 것이 좋습니다.

Nikolai, 나는 구조와 하나를 위해 알고 있습니다.
하지만 나는 항상 함께 일했고, 나는 그것에 익숙해져서 더 편리합니다.
그러나 오랫동안 나는 for의 이상한 점을 발견했고 계속 그것을 다루기를 미루었습니다.
이전에는 잘 작동했습니다.

틱의 경우 i>=0
막대 i>0의 경우

그리고 if-ov가 필요하지 않은 것은 아닙니다.

 
Roman # :



1단계: 'MQL5 마법사'를 사용하여 공백 생성:

 //+------------------------------------------------------------------+
//|                                                       Simple.mq5 |
//|                              Copyright © 2022, Vladimir Karputov |
//|                       https://www.mql5.com/en/users/barabashkakvn |
//+------------------------------------------------------------------+
#property copyright "Copyright © 2022, Vladimir Karputov"
#property link        " https://www.mql5.com/en/users/barabashkakvn "
#property version    "1.00"
#property indicator_chart_window
#property indicator_buffers 1
#property indicator_plots    1
//--- plot Close
#property indicator_label1    "Close"
#property indicator_type1    DRAW_LINE
#property indicator_color1    clrRed
#property indicator_style1    STYLE_SOLID
#property indicator_width1    1
//--- input parameters
input int       Input1= 9 ;
//--- indicator buffers
double          CloseBuffer[];
//+------------------------------------------------------------------+
//| Custom indicator initialization function                         |
//+------------------------------------------------------------------+
int OnInit ()
  {
//--- indicator buffers mapping
   SetIndexBuffer ( 0 ,CloseBuffer, INDICATOR_DATA );
   
//---
   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[])
  {
//---
   
//--- return value of prev_calculated for next call
   return (rates_total);
  }
//+------------------------------------------------------------------+


2단계: 'limit'의 철자를 정확하게 지정하고 닫기 배열을 사용하세요. iClose를 호출하지 마세요!!!

 //+------------------------------------------------------------------+
//|                                                       Simple.mq5 |
//|                              Copyright © 2022, Vladimir Karputov |
//|                       https://www.mql5.com/en/users/barabashkakvn |
//+------------------------------------------------------------------+
#property copyright "Copyright © 2022, Vladimir Karputov"
#property link        " https://www.mql5.com/en/users/barabashkakvn "
#property version    "1.00"
#property indicator_chart_window
#property indicator_buffers 1
#property indicator_plots    1
//--- plot Close
#property indicator_label1    "Close"
#property indicator_type1    DRAW_LINE
#property indicator_color1    clrRed
#property indicator_style1    STYLE_SOLID
#property indicator_width1    1
//--- input parameters
input int       Input1= 9 ;
//--- indicator buffers
double          CloseBuffer[];
//+------------------------------------------------------------------+
//| Custom indicator initialization function                         |
//+------------------------------------------------------------------+
int OnInit ()
  {
//--- indicator buffers mapping
   SetIndexBuffer ( 0 ,CloseBuffer, INDICATOR_DATA );
//---
   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 limit=prev_calculated- 1 ;
   if (prev_calculated== 0 )
      limit= 0 ;
   for ( int i=limit; i<rates_total; i++)
     {
      CloseBuffer[i]=close[i];
     }
//--- return value of prev_calculated for next call
   return (rates_total);
  }
//+------------------------------------------------------------------+


결과:

오류가 없습니다.

파일:
Simple.mq5  5 kb
 
Vladimir Karputov # :

1단계: 'MQL5 마법사'를 사용하여 공백 생성:


2단계: 'limit'의 철자를 정확하게 지정하고 닫기 배열을 사용하세요. iClose를 호출하지 마세요!!!


결과:

오류가 없습니다.

직접적인 i++ 예제에 감사드립니다.
그러나 내가 역주기를 가지고 있다는 사실을 눈치 채지 못했습니다.
그리고 iClose를 예로 들면 인덱스 i가 향후 다른 기능에서 사용된다는 것을 보여줘야 합니다.

 
Roman # :

Nikolai, 나는 구조와 하나를 위해 알고 있습니다.

그렇지 않으면

니콜라이 셈코
논리 사용:
limit = 0이면 새 틱
limit = 1이면 새 막대를 의미합니다(버퍼 Rates_total -1의 마지막 요소이고 Rates_total이므로 오버플로가 있음)를 의미합니다.
limit > 1 이면 전체 지표를 다시 계산하는 것이 좋습니다.

나는 여기서 실수를 했다
더 나은 사용
제한 != 1인 경우

전체 논리는 다음과 같습니다.

limit = rates_total - prev_calculated;
if (limit == 0 ) {..} // новый тик
else if ( limit == 1 ) {..} // новый бар
else {..} // полный пересчет всего индикатора
나는 일부가 분개하고 제한 == 2이면 모든 것을 다시 계산하는 이유를 말할 것임을 이해합니다.
그러나 제한이 1과 같지 않고 0과 같지 않으면 표시기의 첫 번째 초기화이거나 무언가 잘못되었습니다(예: 서버의 연결 실패 또는 실패).
또한 prev_calculated가 Rates_total보다 큰 상황에 두 번 이상 부딪쳤습니다. 아마도 그것은 일종의 결함이었고 지금은 수정되었지만 그 이후로 나는 위험하지 않은 방식으로 그러한 디자인을 사용하고 있습니다.
 
Nikolai Semko # :

제한 != 1인 경우

차이점이 뭐야? 0보다 작을 수 있습니까?