Características del lenguaje mql5, sutilezas y técnicas - página 97

 
Artyom Trishkin:

Así que ya había una especie de solución en la KB:

Pero no por el guión. Y es bastante difícil para EA, porque sugiere salirse de OnTick en caso de una situación indefinida. Y esta situación podría ocurrir en algún lugar dentro del Asesor Experto. Y no sólo habrá que salir de ahí, para salir de OnTick, sino que puede ser necesario abrir, por ejemplo, dos posiciones a la vez (a la carta). Pero la segunda sólo debería abrirse si la primera se abrió con éxito. En este caso, ser expulsado de OnTick después del primer OrderSend, por decirlo suavemente, no es bueno.

 
fxsaber:

Pero no por el guión. Y es bastante difícil para el EA, porque se sugiere que se salga de OnTick en una situación indefinida. Y esta situación podría darse en algún punto de las entrañas del Asesor Experto. Y no sólo habrá que salir de ahí, para salir de OnTick, sino que puede ser necesario abrir, por ejemplo, dos posiciones a la vez (a la carta). Pero la segunda sólo debe abrirse si la primera se ha completado con éxito. En este caso, ser expulsado de OnTick después del primer OrderSend, por decirlo suavemente, no es bueno.

El guión puede ralentizar el número explícito de posiciones.

Asesor experto... En un EA, tenemos que considerar esto en la lógica de las funciones de apertura de posiciones - se llaman desde el EA con la devolución del resultado de su trabajo. El resultado de la orden de mercado se devuelve a falso. Y entonces el EA funcionará con la lógica inherente a él. Sí, estoy de acuerdo en que es más difícil de implementar en algunos EAs ya hechos que considerar inmediatamente tales probabilidades. Pero para eso está la rama: para que otros sepan y utilicen el conocimiento.

 
Artyom Trishkin:

La secuencia de comandos se puede ralentizar hasta que se reciba un número explícito de posiciones.

También puede ralentizar el Asesor Experto.

El asesor experto... En el Asesor Experto, tendremos que considerar esto en la lógica de la función de apertura de posiciones - se llaman desde el EA con la devolución del resultado de su trabajo. El resultado se devuelve falso si hay una orden de mercado. Y entonces el EA funcionará con la lógica inherente a él. Sí, estoy de acuerdo en que es más difícil de implementar en algunos EAs ya hechos que considerar inmediatamente tales probabilidades. Pero para eso está la rama, para que los demás sepan y utilicen los conocimientos.

Sólo hay que esperar un poco hasta que pase el oficio. Salir del TS hasta el siguiente tick es una decisión terrible.

 
fxsaber:

También puede ralentizar al asesor.

Sólo hay que esperar un poco hasta que el comercio haya pasado. Salir del TS hasta el siguiente tick es una decisión espeluznante.

Pues bien, en ese código, la espera del tiempo establecido se acaba de hacer. Pero no se puede esperar durante horas: espera durante un tiempo un número determinado de intentos para obtener un entorno válido, y luego sale con el resultado. De lo contrario, si esperas mucho tiempo, el entorno comercial puede cambiar mucho, y es demasiado tarde para tomar el borjomi :)

//+------------------------------------------------------------------+
//| Заполняет массивы тикетов позиций                                |
//+------------------------------------------------------------------+
bool FillingListTickets(const uint number_of_attempts)
  {
//--- Проверка состояния окружения
   int n=0,attempts=int(number_of_attempts<1 ? 1 : number_of_attempts);
   while(IsUncertainStateEnv(symb,InpMagic) && n<attempts && !IsStopped())
     {
      n++;
      Sleep(sleep);
     }
   if(n>=attempts && IsUncertainStateEnv(symb,InpMagic))
     {
      Print(__FUNCTION__,": Uncertain state of the environment. Please try again.");
      return false;
     }
//---
 
Artyom Trishkin:

Bueno, ese código sí espera un tiempo determinado, pero no puede esperar horas, sino que espera un número determinado de intentos para obtener un entorno válido. Pero no se puede esperar durante horas - se espera durante algún tiempo para el número especificado de intentos para obtener un entorno válido, a continuación, sale con el resultado. De lo contrario, si esperas mucho tiempo, el entorno comercial puede cambiar mucho, y es demasiado tarde para tomar el borjomi :)

Sí, no me di cuenta de la espera. Eso será. Entonces estaba mucho más atento.

 

En mi opinión, centrarse enPositionsTotal() es una decisión errónea en cualquier caso. Durante el procesamiento de su solicitud, otra posición podría abrirse/cerrarse en la cuenta, por ejemplo, si varios EAs están trabajando. ¿Qué le impide comprobar la respuesta del servidor, tal y como está diseñada por los desarrolladores?

De hecho, no le veo mucho sentido a PositionsTotal, salvo para el control general. Un EA debería controlar claramente los ticks de sus posiciones y trabajar sólo sobre ellos.

 

Después de utilizar ChartIndicatorGet() hay que llamar necesariamente a la función IndicatorRelease(handle). Está escrito en el ejemplo de la función ChartIndicatorGet(), pero no en la nota de la función. Los desarrolladores querían corregir la documentación, pero no lo hicieron. Debido al cierre de la SD, es probable que esto nunca se haga.

Personalmente me encontré con el problema de un indicador "colgado". De hablar con la SD:

Ah, es decir, cuando he ejecutado el indicador X en el gráfico, ha buscado entre todos los indicadores y ha detectado una copia mediante lafunciónChartIndicatorGet()- ha incrementado el contador. He borrado el primer indicador X - contador decreciente, pero me he olvidado del segundo - tiene el indicador "colgado", porque no se ha limpiado su mango?

Sí. Así es exactamente como funciona. Por lo tanto, OnDeinit no funciona.

 

Foro sobre comercio, sistemas de comercio automatizados y prueba de estrategias de comercio

¿Cómo se importan los datos históricos en csv a la costumbre de los símbolos utilizando CustomRatesUpdate?

fxsaber, 2018.08.19 12:01

// Sets the maximum size of an array.
template <typename T>
int ArrayResize( T &Array[] )
{
  int MinSize = ArraySize(Array);
  int MaxSize = INT_MAX;
  int AvgSize;
  
  while ((MinSize < MaxSize - 1) && !IsStopped())
  {
    AvgSize = (int)((MinSize + (long)MaxSize) >> 1);        
    
//    ArrayFree(Array);
    
    if (ArrayResize(Array, (int)AvgSize) == AvgSize)
      MinSize = AvgSize;
    else
      MaxSize = AvgSize;
  }
  
  return(ArrayResize(Array, MinSize));
}
 
La parte inglesa del foro mostró
// Обмен значениями между двумя числовыми переменными
#define  SWAP(A, B) { A += B; B = A - B; A -= B; }
 
fxsaber:
La parte inglesa del foro mostró

¿Para qué? ¿Para ahorrar unos pocos bytes de memoria? Además, con el doble se obtienen números diferentes (== será falso) y los enteros pueden desbordarse.