포럼을 어지럽히 지 않도록 모든 초보자 질문. 프로, 놓치지 마세요. 너 없이는 아무데도 - 6. - 페이지 131

 
Sepulca :

두뇌에 좋은 퍼즐. 다음과 같이 시도할 수 있습니다.

차원 4에 대한 테스트 결과입니다. 배열의 X 요소가 선택되지 않은 경우 차원 6에 대해 array[digit] 및 조각을 사용합니다.


나는 당신의 코드를 보았지만 다음은 명확하지 않습니다. 당신은 어떤 단계에서도 원래 배열의 데이터를 읽지 않았습니다. 그 안에 있는 요소의 수만
 
//chief2000 :

나는 당신의 코드를 보았지만 다음은 명확하지 않습니다. 당신은 어떤 단계에서도 원래 배열의 데이터를 읽지 않았습니다. 그 안에 있는 요소의 수만


원래 배열의 데이터가 필요한 이유는 무엇입니까? 나는 당신의 아이디어에 따라 배열 요소 를 선택하고 있습니다. 그리고 샘플의 데이터로 무엇을 할지는 귀하에게 달려 있습니다. 저것들. N[0]=3, N[1]=2, N[2]=1, N[3]=0이면 추가 분석을 위해 array[N[0]], array[N[ 1 ]], 배열[N[2]], 배열[N[3]], N[0]=3이면 N[1]=2, N[2]<0, N[3]<0, 그런 다음 추가 분석을 위해 N[2]<0 및 N[3]<0부터 array[N[0]], array[N[1]]만 사용합니다. 게시물에 따라 반복되지 않는 가능한 모든 조합을 열거합니다(배열 번호 매기기가 0에서 ArraySize(array)-1까지 시작한다는 사실을 고려).

[ 4 ] <=> { 1 2 3 4 }

1 , 12 , 13 , 14 , 123 , 124 , 134 , 1234 , 
2 , 23 , 24 , 234 , 
3 , 34 ,
4

그런 다음 알고리즘에 따라 진행합니다.

 if (NewComb){
// Получили новую комбинацию в массиве N размерностью k    
    
     for (i= 0 ;i<k;i++){ // Перебираем массив N. Если N[i]<0 то элемент array[N[i]] не участвует в выборке.
                     // Например, для размерности 4 если N[0]=3,N[1]=1,N[2}<0,N[3]<0 то это выборка array[3] и array[1]
                     //                             если N[0]=3,N[1]=2,N[2]=1,N[3]=0 то это выборка array[3] и array[2] array[1] и array[0]
     if (N[i]>= 0 ){// использовать как-то array[N[i]]}
    }

   }
 
Sepulca :


그리고 왜 원본 어레이의 데이터가 필요합니까? 나는 당신의 아이디어에 따라 배열 요소를 선택하고 있습니다. 그리고 샘플의 데이터로 무엇을 할지는 귀하에게 달려 있습니다. 저것들. N[0]=3, N[1]=2, N[2]=1, N[3]=0이면 추가 분석을 위해 array[N[0]], array[N[ 1 ]], 배열[N[2]], 배열[N[3]], N[0]=3이면 N[1]=2, N[2]<0, N[3]<0, 그런 다음 추가 분석을 위해 N[2]<0 및 N[3]<0부터 array[N[0]], array[N[1]]만 사용합니다. 게시물에 따라 반복되지 않는 가능한 모든 조합을 열거합니다(배열 번호 매기기가 0에서 ArraySize(array)-1까지 시작한다는 사실을 고려).

그런 다음 알고리즘에 따라 진행합니다.


이제 명확합니다(다음 단계에서 데이터를 읽었습니다. 비-소유 코드로 작업하는 것은 드문 일입니다).
매우 감사합니다!

 

함수에서 오류를 찾는 데 도움이 됩니다.

문제는 MA 위의 막대를 계산하면 함수가 올바른 값을 반환한다는 것입니다.

그러나 MA 미만인 경우 함수는 항상 1(일)을 반환합니다.

 int CheckFiltr ()
   {
   int i= 1 ;
   for (;;)
      {
       if ( NormalizeDouble (High[i],Norm)&& NormalizeDouble (Low[i],Norm)< NormalizeDouble ( iMA ( NULL , 0 ,PerMa, 0 ,MetMa,AplPr,i),Norm)|| NormalizeDouble (High[i],Norm)&& NormalizeDouble (Low[i],Norm)> NormalizeDouble ( iMA ( NULL , 0 ,PerMa, 0 ,MetMa,AplPr,i),Norm))
         {
         i++;
         Comment ( "Фильтр = ", i);         
         }
       else break ;
      }
   return (i);
   }
 
MarkTrade :

함수에서 오류를 찾는 데 도움이 됩니다.

문제는 MA 위의 막대를 계산하면 함수가 올바른 값을 반환한다는 것입니다.

그러나 MA 미만인 경우 함수는 항상 1(일)을 반환합니다.

코드를 크게 최적화할 수 있지만 이 방법이 더 좋습니다. 방금 문법을 수정했습니다.

 int CheckFiltr ()
   {
   int i= 1 ;
   int Norm= Digits ;
   for (;;)
      {
       if (
           (   NormalizeDouble (High[i],Norm)< NormalizeDouble ( iMA ( NULL , 0 ,PerMa, 0 ,MetMa,AplPr,i),Norm)
            && NormalizeDouble (Low[i] ,Norm)< NormalizeDouble ( iMA ( NULL , 0 ,PerMa, 0 ,MetMa,AplPr,i),Norm)
           )
          ||
           (   NormalizeDouble (High[i],Norm)> NormalizeDouble ( iMA ( NULL , 0 ,PerMa, 0 ,MetMa,AplPr,i),Norm) 
            && NormalizeDouble (Low[i] ,Norm)> NormalizeDouble ( iMA ( NULL , 0 ,PerMa, 0 ,MetMa,AplPr,i),Norm)
           )
         )

         {
         i++;
         Comment ( "Фильтр = " ,i);         
         }
       else break ;
      }
   return (i);
   }
 
paladin80 :

귀하의 예에서는 실제로 차이가 없지만 어떤 경우에도 배열의 시작과 끝을 지정해야 합니다.

배열이 큰 경우 반복 시작이 중요합니다. 예를 들어, 조건이 일반적으로 배열의 끝에서 발생하는 경우 끝에서 시작하는 것이 가장 좋습니다. 이 예는 주문/포지션을 검색하는 데 일반적입니다. 물론 이 경우 검색이 먼저 수행되면 프로그램은 어쨌든 이 지점에 도달하지만 더 많은 리소스가 소비됩니다.


다시 한번 감사합니다! 이제 "확인된" 막대의 수를 최적화하려고 했지만 창에 결과가 없습니다. 나는 처음부터 끝까지 세어보려고 애썼지만 허사였다.

 extern int number= 3 ;
//------------------------------------+
for ( int x=number; x>= 1 ; x--)
{
 if (Open[x]==Open[x- 1 ]) continue ;
     if (Open[x]<Open[x- 1 ])
   {
   //--- action
   }
 else {
     if (Open[x]>Open[x- 1 ])
   {
   //--- action
  }
 }
}
 
Sepulca :
코드를 크게 최적화할 수는 있지만 이 방법이 더 좋습니다.


그것이 작동하는 방식입니다... 감사합니다!

내 버전이 작동하지 않는 이유를 이해하기 위해 ...

 
MarkTrade :


그것이 작동하는 방식입니다... 감사합니다!

내 버전이 작동하지 않는 이유를 이해하기 위해 ...


코드 자세히 살펴보기

 if ( NormalizeDouble (High[i],Norm)&& NormalizeDouble (Low[i],Norm)< NormalizeDouble ( iMA ( NULL , 0 ,PerMa, 0 ,MetMa,AplPr,i),Norm)
|| NormalizeDouble (High[i],Norm)&& NormalizeDouble (Low[i],Norm)> NormalizeDouble ( iMA ( NULL , 0 ,PerMa, 0 ,MetMa,AplPr,i),Norm))
     
첫 번째 항을 0과 비교하기만 하면 됩니다. 사실이든 아니든.
 
MarkTrade :


그것이 작동하는 방식입니다... 감사합니다!

내 버전이 작동하지 않는 이유를 이해하기 위해 ...

귀하의 코드:

 int CheckFiltr ()
   {
   int i= 1 ;
   for (;;)
      {
       if ( NormalizeDouble (High[i],Norm)&&
           NormalizeDouble (Low[i],Norm)< NormalizeDouble ( iMA ( NULL , 0 ,PerMa, 0 ,MetMa,AplPr,i),Norm)
            ||    
           NormalizeDouble (High[i],Norm)&&
           NormalizeDouble (Low[i],Norm)> NormalizeDouble ( iMA ( NULL , 0 ,PerMa, 0 ,MetMa,AplPr,i),Norm))
         {
         i++;
         Comment ( "Фильтр = " ,i);         
         }
       else break ;
      }
   return (i);
   }

어쩌면 더 명확해

oops .. 이미 대답했습니다. 예, 정규화 없이 할 수 있습니다.

 
Roger :


코드 자세히 살펴보기

첫 번째 멤버를 0과 비교하기만 하면 됩니다. 사실이든 아니든.


즉, "if and b c 보다 크다면"은 정확하지 않지만 "if ac 보다 크고 b c 보다 크다면"은 맞습니다. 제가 당신을 올바르게 이해했나요?