Funciones útiles de KimIV - página 31

 
ShestkoFF писал (а) >>
Bueno, yo no lo bloquearía, por supuesto. Habría pasado por alto el error y habría decidido qué hacer con él.

Si se bloquea el EA en este punto, puede quedar una posición abierta por este EA, lo que sería un desastre.

Ahora has respondido a tu propia pregunta sobre la larga pausa. Se hace para esperar la señal para abrir una posición o establecer una orden.

Gracias, Vasily, una vez más por haberme llevado por el mal camino. Casi me apresuré a arreglar los códigos... Y gracias de nuevo por devolverme a mi camino :-)

 
KimIV писал (а) >>

:-) Ahora has respondido a tu propia pregunta sobre la larga pausa. Se hace con el fin de esperar la señal para abrir una posición o establecer una orden.

Gracias, Vasily, una vez más por haberme llevado por el mal camino. Casi me apresuré a arreglar los códigos... Y gracias de nuevo por devolverme a mi camino :-)

Para ser sincero, no entiendo la lógica.
Por ejemplo, hemos colocado una orden de 0,000001 lotes. El servidor, por supuesto, nos abofetea por ello.
En lugar de cambiar el lote (fuera de la función), hacemos una pausa.
Como resultado de esta ruptura podemos perder la señal para establecer una orden, pero deberíamos cambiar el lote en lugar de esperar.
Por eso no estoy de acuerdo con la pausa. Simplemente debemos dejar esta función y pasar el código de error hacia arriba y manejarlo allí.
Si seguimos mi camino, ¡podríamos no perder una operación rentable! Y puede que incluso tengamos una pérdida :)

P.D.: Te desviaré del camino falso :)

 
Pensaba que la función de cálculo del lote debería llamarse inmediatamente (en lugar de ir al principio), yendo al principio sólo después de que el contador de errores se desborde
 
Prival писал (а) >>
y he pensado, que hay que llamar a la función de cálculo de lote a la vez (y no ir a la parte superior), yendo a la parte superior sólo después del desbordamiento del contador de errores

¡¡¡Sí, por supuesto que hay que llamar a esta función inmediatamente, pero si se produce un error!!!
Salir a la parte superior llamo a una situación en la que tiene que salir de la función SetOrder.
Yo lo veo aproximadamente así


int ticket = SetOrder(.....);

si (ticket > 0) {

// todo bien

} si no {

// corregir el error lógico

}


int SetOrder(....) // devuelve una entrada o un número de error sólo con signo negativo.
{

int ticket = OrderSend(....)

si (ticket < 0) {

// corregir los errores de orden de los conjuntos

}

}


Así que creo que hay que distinguir entre los errores lógicos y los errores de configuración del orden. Espero dar hoy un ejemplo de aplicación.
 
ShestkoFF писал (а) >>
Para ser sincero, no entiendo la lógica.

He construido la función de cálculo del tamaño del lote de tal manera que sólo devuelve un lote incorrecto (cero) si no hay suficiente dinero. En otros casos, el lote se normaliza y se conduce dentro de los límites entre los tamaños mínimo y máximo. Si no hay suficiente dinero, hay que esperar a que se cierre alguna posición.

ShestkoFF escribió (a) >>
Si ha pedido un lote de 0,000001. Nuestro servidor seguramente nos ha dado un tirón de orejas.

¿Por qué lo hicimos? ¿Por qué aprobamos deliberadamente el tamaño de lote equivocado? ¿Cómo podemos justificar este comportamiento?

ShestkoFF escribió(a) >>.

Simplemente debemos dejar esta función y pasar el código de error hacia arriba y manejarlo allí.

¿Qué nos aportará? ¿Tendremos un tamaño de lote diferente? ¿Por qué no conseguimos el tamaño de lote adecuado de inmediato? Da las razones. Analicemos...
 

Sólo creo que su función es una función de biblioteca, es decir, universal, y por lo tanto debe dividir todos los errores en 2 categorías:

  • errores que deben ser procesados dentro de la función SetOrder (errores de conexión, recotizaciones...)
  • Errores que deberían ser procesados fuera de la función SetOrder (tamaño de lote erróneo, paradas erróneas...)

Функцию расчёта размера лота я строю таким образом, что неверный лот (ноль) она выдаст только в случае не хватки денег. В остальных случаях лот нормализуется и загоняется в рамки между минимальным и максимальным размерами. Если денег не хватает, то надо ждать, когда закроется какая-нибудь позиция.

Esta es la lógica de sus expertos, otras personas pueden tener una lógica diferente. Por eso pondría el error con los lotes erróneos en el externo

bloque de comprobación de errores.

Esa es mi visión de este caso :) Como he escrito más arriba, espero dar hoy un ejemplo de aplicación.

 

Mi versión de la moda:



int ModeInt(int array[])
{
   int size = ArraySize(array);
   
   if (size == 0) 
   {
      Print("Invalid parameter in function ModeInt(int array[]). It should be at least one element.");
      return(0);
   }
   
   int buffer[];
   ArrayCopy(buffer, array); 
   ArraySort(buffer);
   
   int max = 0;
   int maxValue = 0;
   
   int startIndex = 0;
   int startValue = buffer[0];
   
   for (int i = 1; i < size; i++)
   {
      if (buffer[i] > startValue)
      {
         if (max < i - startIndex)
         {
            max = i - startIndex;
            maxValue = buffer[startIndex];
         }
         
         startIndex = i;
         startValue = buffer[i];
      }
   }
   
   if (max < size - startIndex)
   {
      max = size - startIndex;
      maxValue = buffer[startIndex];
   }
   
   return (maxValue);
}
 
double ModeDouble(double array[], double interval)
{
   int size = ArraySize(array);
   
   if (size == 0) 
   {
      Print("Invalid first parameter in function ModeDouble(double array[], double interval). It should be at least one element.");
      return(0);
   }
   
   if (interval <= 0) 
   {
      Print("Invalid second parameter in function ModeDouble(double array[], double interval). It should be > 0 .");
      return(0);
   }
   
   double buffer[];
   ArrayCopy(buffer, array); 
   ArraySort(buffer);
   
   int max = 0;
   double maxValue = 0;
   
   int startIndex = 0;
   double startValue = buffer[0];
   
   double sum = startValue;
   
   for (int i = 1; i < size; i++)
   {
      if (buffer[i] >= startValue + interval)
      {
         if (max < i - startIndex)
         {
            max = i - startIndex;
            maxValue = (sum)/max;
         }
         
         startIndex = i;
         startValue = buffer[i];
         sum = 0;
      }
      sum += buffer[i];
   }
   
   if (max < size - startIndex)
   {
      max = size - startIndex;
      maxValue = (sum)/max;
   }
 
   return (maxValue);
}
 
TheXpert писал (а) >>

Mi versión del mod:


Estimado TheXpert, su código parece muy compacto. Lo cual, por supuesto, es una gran ventaja. >> Gracias.

 
Tal y como prometí, voy a publicar mi versión de la función.
Se adjunta un Asesor Experto que utiliza la función. He utilizado el AI Expert Advisor como base.
No he tenido tiempo de comprobar la función por tiempo. En otras palabras, creo que la señal debe ser revisada de nuevo después de 8 minutos.
Añadida la generación de errores del servidor de comercio que permitirá examinar el funcionamiento de la función en detalle y detectar errores.
int errTest[] = {0, 128, 0, 142, 0, 143, 0, 4, 132};
errTest - secuencia de errores generados, sin error 0. Se trata de una secuencia aleatoria y no hay ningún tipo de trampa en ella.


Estoy esperando algunas críticas :)

Archivos adjuntos:
 
ShestkoFF писал (а) >>
Tal y como prometí, voy a publicar mi versión de la función.
El archivo adjunto contiene el EA donde se utiliza esta función. He utilizado como base el AI Expert Advisor.
No he tenido tiempo suficiente para comprobar cómo funciona el tiempo. Es decir, creo que hay que volver a comprobar la señal cuando hayan pasado 8 minutos.
Añadida la generación de errores del servidor de comercio que permitirá estudiar a fondo el funcionamiento de la función y detectar errores.
errTest - secuencia de errores generados, sin error 0. Se trata de una secuencia aleatoria y no hay ningún tipo de trampa en ella.


Estoy esperando las críticas :)

No me importa mucho la función, puedo decir una cosa :), no voy a ser original y decir como siempre :) -- demasiado sobrecargado.

Como resultado, el Asesor Experto se ha convertido en un código limpio y claro de 32KB en el que no tengo ganas de enredar.


Hay preguntas sobre el código.

1. Si desactiva el Asesor Experto, no volverá a funcionar hasta que se reinicie. ¿Por qué no hacerla esperar durante un periodo de tiempo relativamente largo?

2. La red neuronal, en primer lugar, nunca emite la señal de un plano. En segundo lugar, ¿cómo puedes esperar que optimice algo, si no tiene umbral? Al no tener umbral matas el 80% de su ya baja eficiencia (lineal, eso sí).



SZZH: No te ofendas, estoy pluriempleado como crítico en este hilo :) .

Razón de la queja: