Cualquier pregunta de novato, para no saturar el foro. Profesionales, no pasen de largo. En ninguna parte sin ti - 6. - página 131

 
Sepulca:

Una buena tarea para el cerebro. Puedes probarlo así:

Resultado de la prueba de la dimensión 4. Si no se selecciona el elemento X del array, en caso contrario se utiliza array[digit] y el fragmento para la dimensión 6:


He mirado tu código, pero no entiendo lo siguiente: no has leído los datos del array original en ningún momento. sólo el número de elementos que contiene
 
//chief2000:

He mirado tu código, pero lo que no entiendo es lo siguiente: no has leído los datos del array original en ninguno de los pasos. sólo has leído el número de elementos que hay en él


¿Por qué necesito los datos de la matriz original? Sólo estoy muestreando los elementos del array según tu idea. Y tú decides qué hacer con los datos muestreados. Es decir si N[0]=3, si N[1]=2, si N[2]=1, si N[3]=0, utilizamos array[N[0]], array[N[1]], array[N[2]], array[N[3]] para el análisis posterior, y si N[0]=3, N[1]=2, N[2]<0, N[3]<0, entonces para el análisis posterior utilizamos sólo array[N[0]], array[N[1]] porque N[2]<0 y N[3]<0. Probamos todas las combinaciones posibles que no se repiten según tu post (teniendo en cuenta que la numeración del array empieza desde 0 hasta ArraySize(array)-1):

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

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

Y luego actuar según su algoritmo:

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:


¿Por qué necesito los datos de la matriz original? Simplemente estoy muestreando elementos de la matriz según su idea. Y tú decides qué hacer con los datos muestreados. Es decir si N[0]=3, si N[1]=2, si N[2]=1, si N[3]=0, utilizamos array[N[0]], array[N[1]], array[N[2]], array[N[3]] para el análisis posterior, y si N[0]=3, N[1]=2, N[2]<0, N[3]<0, entonces para el análisis posterior utilizamos sólo array[N[0]], array[N[1]] porque N[2]<0 y N[3]<0. Enumeramos todas las combinaciones posibles que no se repiten según tu post (teniendo en cuenta que la numeración de los arrays empieza de 0 a ArraySize(array)-1):

Y luego proceda según su algoritmo:


Ahora está claro (he leído los datos en el siguiente paso, sólo que no estoy acostumbrado a trabajar con código que no es mío).
¡Muchas gracias!

 

Ayúdame a encontrar un error en la función.

El problema es que si se cuentan las barras por encima de la MA, la función devuelve el valor correcto.

Pero si está por debajo de la MA, la función siempre devuelve 1 (uno)

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:

Ayúdame a encontrar un error en la función.

El problema es que si se cuentan las barras por encima de la MA, la función devuelve el valor correcto.

Pero si está por debajo de la MA, la función siempre devuelve 1 (uno)

A primera vista esto es mejor, aunque el código se puede optimizar considerablemente, ya que sólo he corregido la gramática:

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:

Para tu ejemplo no hay ninguna diferencia, pero tienes que especificar el principio y el final de la matriz de todos modos.

El comienzo marca la diferencia si la matriz es grande. Por ejemplo, si la condición se activa como una regla al final de la matriz, es mejor empezar por el final. Este ejemplo es típico de la búsqueda por orden/posición. Por supuesto, si usted hace la búsqueda primero en este caso, el programa llegará a este punto de todos modos, pero tomará más recursos.


Gracias de nuevo. Ahora he intentado optimizar el número de barras "comprobables", pero los resultados en la ventana no están ahí. Intenté empezar a contar tanto desde el principio como desde el final, pero fue en vano.

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:
A primera vista, esto es mejor, aunque el código podría optimizarse considerablemente:


Esto funciona... Gracias.

Sólo necesito entender por qué mi versión no quiere funcionar...

 
MarkTrade:


Funciona así... Gracias.

Ojalá entendiera por qué mi versión no quiere funcionar...


Examine detenidamente su código

 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))
     
Simplemente estás comparando el primer término con cero, es decir, verdadero o falso.
 
MarkTrade:


Funciona... Gracias.

Ojalá entendiera por qué mi versión no quiere funcionar...

Su código:

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);
   }

Tal vez sea más fácil de entender...

Uy... ya te lo han dicho, puedes hacerlo sin normalizar...

 
Roger:


Examine detenidamente su código

Simplemente se compara el primer término con cero, es decir, verdadero o falso.


Entonces, la expresión "si a y c son mayores que c" no es correcta, pero "si a es mayor que c y c es mayor que c" sí lo es.
Razón de la queja: