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

 
Artyom Trishkin # :

항상 확인이 있었습니다: if(limit>1) limit=rates_total-1. 계산에 i+그러나 없는 경우입니다. 있는 경우 이러한 "무언가"가 구성에 포함되어야 합니다. limit=rates_total-1-how much_that.

그것 없이는 항상 범위를 벗어난 배열이 있었습니다. 결국 Rates_total은 Bars()에 불과합니다. 따라서 5000개의 막대가 있고 인덱스 5000을 참조하는 경우 배열을 넘어갑니다(막대 수는 0부터 시작).

귀하의 예에서 한계 계산이 올바르지 않습니다.

다음과 같아야 합니다.

그리고 제한> 1을 확인한 후

한계가 여전히 1보다 크면 한계 = 비율_총-1

Artyom 감사합니다! 그리고 끓여서 죄송합니다.
정확히는 수표가 있어야 하는데 깜빡했네요.
내 코드에 아직 주석이 있습니다.
// 계산된 막대의 수를 확인 하고 계산합니다.
복사 붙여넣기가 저절로 느껴지기도 하고, 나에게 오해가 있었던 모양이다.
확인을 통해 모든 것이 제대로 작동합니다. 고맙습니다.

 
Roman # :

Artyom 감사합니다!
정확히는 수표가 있어야 하는데 깜빡했네요.
확인을 통해 모든 것이 제대로 작동합니다. 고맙습니다.

물론이죠. 한계 계산이 정확합니다. 그것은 당신에게 옳지 않습니다 - 나는 위에서 이것에 주의를 기울였습니다.

 int limit = rates_total - 1 -prev_calculated;

-1 여기에 있으면 안됩니다 .

rate_total이 5000이고 이전 OnCalculate() 호출(prev_calculated)에서 계산된 막대가 5000개 있는 경우 제한은 -1과 같습니다. 따라서 사이클이 전혀 실행되지 않습니다.

지표를 계산하는 방법을 선택하려면(0 막대의 눈금으로 또는 새 막대가 열릴 때만) 계산 방법을 나타내는 변수를 입력하십시오.

int end = (각 틱 ? WRONG_VALUE : 0);

루프는 다음과 같습니다. for(int i=limit; i>end; i--) { //... }

한계 계산이 정확하고 루프가 원하는 대로 됩니다.

 

올바른 코드입니다.

i>=0 각 틱

새 막대의 경우 i>0

 //+------------------------------------------------------------------+
//| Custom indicator iteration function                              |
//+------------------------------------------------------------------+
int OnCalculate ( const int rates_total,       
                 const int prev_calculated,   
                 const int begin,             
                 const double & price[])      
{
   ArraySetAsSeries (price, true );
   ArraySetAsSeries (IndBuff, true );
   
   //-------------------------------------------------------------------------
   //Расчёт и проверка количества просчитываемых баров
   int limit = rates_total-prev_calculated;
   
   if (limit> 1 ) 
      limit = rates_total- 1 ;
   

   //-------------------------------------------------------------------------
   //Расчёт индикатора
   for ( int i=limit; i>= 0 ; i--)
   {

      IndBuff[i] = price[i]; 

   }
   

   return (rates_total);
}
 
Nikolai Semko # :
또는

어떻게 해야할지 물어보지도 않았는데... 텔레파시가 휴가에서 돌아왔나? ;)

 
Roman # :

올바른 코드입니다.

i>=0 각 틱

새 막대의 경우 i>0

 ArraySetAsSeries (IndBuff, true );

OnInit()로 옮기는 것이 좋습니다.

 
Artyom Trishkin # :

어떻게 해야할지 물어보지도 않았는데... 텔레파시가 휴가에서 돌아왔나? ;)

:)
Artem, 몇 분 전에 등록한 사람이 "오류, 버그, 질문 "을 가장 먼저 본 것을 보기 위해 텔레파시가 될 필요는 없습니다.
양배추를 무료로 자르고 너무 긴장하지 않도록 할 수 있는지 묻는 물푸레 나무 그루터기 ...

 
Nikolai Semko # :

:)
Artem, 몇 분 전에 등록한 사람이 "오류, 버그, 질문 "을 가장 먼저 본 것을 보기 위해 텔레파시가 될 필요는 없습니다.
양배추를 무료로 자르고 너무 긴장하지 않도록 할 수 있는지 묻는 물푸레 나무 그루터기 ...

아마도 그는 튜터에게 투자하여 Bentley를 위해 자신의 돈을 줄이기 위해 프로그래머의 노력을 사용하기로 결정했을까요? :)

 
Artyom Trishkin # :

아마도 그는 튜터에게 투자하여 Bentley를 위해 자신의 돈을 줄이기 위해 프로그래머의 노력을 사용하기로 결정했을까요? :)

거의 없다, 아르템.
프로그래머의 잠재력이 있다면 모호함과 모호함을 허용하지 않을 것입니다.
:)
 
Roman # :

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

그냥 아무 생각 없이 복사-붙여넣기 방법(및 자동 채우기 곡선)을 사용하여 표시기 주기의 디자인을 고대부터 끌어온 것입니다.

여전히 현재 인터페이스로:

for(int bar=prev_calculated>0?prev_calculates-1:0 ; bar<rates_total; bar++) {

   int i=rates_total-1; // i используем если обращения как ArraySetSeries(x,true), иначе bar

   ....

}

return rates_total;

각 호출에서 마지막 막대를 다시 계산해야 하는 경우 이 경우 prev_calculated-1로 붐비는 것이 필요합니다.

 
Maxim Kuznetsov # :

그냥 아무 생각 없이 복사-붙여넣기 방법(및 자동 채우기 곡선)을 사용하여 표시기 주기의 디자인을 고대부터 끌어온 것입니다.

여전히 현재 인터페이스로:

for(int bar=prev_calculated>0?prev_calculates-1:0 ; bar<rates_total; bar++) {

   int i=rates_total-1; // i используем если обращения как ArraySetSeries(x,true), иначе bar

   ....

}

return rates_total;

각 호출에서 마지막 막대를 다시 계산해야 하는 경우 이 경우 prev_calculated-1로 붐비는 것이 필요합니다.

예, 그 성명서에 흥분했습니다.
예전에는 효과가 있었지만 지금은 작동하지 않을 때 신경 틱이 시작됩니다))
그리고 당신은 모든 것을 다시 확인하기 시작하고, 당신이 확실히 기억하지 못하는 어떤 기능을 잊어버리고, 당신이 깨뜨린 것에 대해 부당하게 죄를 짓기 시작합니다.
그리고 그것은 모두 카피파스타의 잘못입니다. 많은 사람들이 이것을 경험했다고 생각합니다.

일반적으로 저는 개발자들이 지표와 전문가를 위한 맞춤형 템플릿 을 만들 수 있도록 제안하고 싶었습니다.
마법사 창에서 선택할 수 있습니다.

중

일부 C/C++ 편집기에는 이 기능이 있습니다.
매우 편리합니다. 주로 작업하는 메인 블랭크를 리벳을 박은 다음 마스터에 로드하기만 하면 됩니다.
표준 MQL 템플릿은 그렇지 않습니다.
어쨌든 템플릿을 작성한 다음 복사하여 붙여 넣을 수 있다고 말할 수 있습니다.
그리고 다시 우리는 교활한 단어 복사-붙여넣기로 돌아갑니다. 그리고 자동화가 가능하고 프로그래머의 운명을 경감시킬 수 있다는 사실은 어떻게 든 고려되지 않습니다.