Cualquier pregunta de los recién llegados sobre MQL4 y MQL5, ayuda y discusión sobre algoritmos y códigos - página 1878

 
Mihail Matkovskij #:

Pues bien, en ENUM_TIMEFRAMES se conocen los valores mínimo y máximo. Por lo tanto, pueden establecerse explícitamente.

Con otros enum, basta con conocer su rango aproximado de valores. Si no se especifican las constantes en la declaración del enum, los valores allí suelen empezar en 0. i_max_enum puede establecerse por cualquier número de dos o tres dígitos: 50, 100, 255.

También puede obtener experimentalmente los valores mínimos y máximos del enum. Anótelos y especifíquelos en StringToEnum para obtener la velocidad más óptima:

int nEnum;

//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
template <typename T>
bool enumFindMinMax(const T _enum, int &__min, int &__max, int _minEnum, int _maxEnum) {
  T enum_;
  int min, max;
  min = INT_MAX; max = INT_MIN;
  nEnum = 0;
  for(int i = _minEnum; i <= _maxEnum && !IsStopped(); i++) {
    enum_ = (T)i;
    if(StringFind(EnumToString(enum_), "::", 0) >= 0)
      continue;
    if (i < min)
      min = i;
    if (i > max)
      max = i;
    nEnum++;
  }
  if (min != INT_MAX && max != INT_MIN) {
    __min = min;
    __max = max;
    return true;
  }
  return false;
}

template <typename T>
bool enumFindMinMax(const T _enum, int &__min, int &__max) { return enumFindMinMax(_enum, __min, __max, INT_MIN, INT_MAX); }

//+------------------------------------------------------------------+
//| Script program start function                                    |
//+------------------------------------------------------------------+
void OnStart() {
  int min, max;
  if (enumFindMinMax((ENUM_ACCOUNT_INFO_DOUBLE)0, min, max, -500, 500))
    printf("enumFindMinMax ENUM_ACCOUNT_INFO_DOUBLE min: %d, max: %d, Count: %d", min, max, nEnum);
  else
    Print("enumFindMinMax Error!");
}

Resultado del guión:

enumFindMinMax ENUM_ACCOUNT_INFO_DOUBLE min: 37, max: 52, Count: 14

Abra ENUM_ACCOUNT_INFO_DOUBLE y vea. El número de constantes es el de la cuenta (14). De esta forma, al inicio de la aplicación puedes manejar todos los enum necesarios, anotar sus valores mínimos y máximos y utilizar StringToEnum correspondientes a los mínimos y máximos con la mejor velocidad.

P.D. La segunda variante de enumFindMinMax con INT_MIN e INT_MAX es realmente muy lenta. Lo intenté al principio. Entonces me cansé de esperar a que enumFindMinMax terminara y puse valores de -500 a 500.

if (enumFindMinMax((ENUM_ACCOUNT_INFO_DOUBLE)0, min, max, -500, 500))

Así, llegué a la conclusión de que no es necesario utilizar todo el rango de int.

Archivos adjuntos:
 

Me encuentro con un comportamiento extraño del terminal.

La situación es la siguiente: un Asesor Experto está trabajando en un gráfico, que en un momento determinado abre otro gráfico y establece un determinado templo en el nuevo gráfico. Esta última plantilla se ha definido para lanzar el segundo EA en el nuevo gráfico.

Todo funciona bien a mitad de semana, pero cuando el mercado está cerrado, los fines de semana, el nuevo templet se inicia en el nuevo gráfico (como se puede ver al cambiar la apariencia del gráfico), pero el segundo EA no se inicia allí. La única manera de "empujar" el segundo Asesor Experto es iniciar manualmente, en cualquier gráfico, cualquier script, incluso uno absolutamente vacío. Entonces el segundo Asesor Experto comienza a trabajar en un nuevo gráfico.

He escrito este código en el primer Asesor Experto tanto usando las funciones ChartOpen y ChartApplyTemplate como usando la clase CChart - siempre resulta lo mismo, en un mercado cerrado el segundo Asesor Experto en un nuevo gráfico no se inicia hasta que yo "empuje" manualmente el terminal de alguna manera.

¿Quién puede haberse enfrentado a una situación así? ¿Cómo afrontarlo, qué manera de "cavar"?

 
akskarabey ChartApplyTemplate como usando la clase CChart - siempre resulta lo mismo, en un mercado cerrado el segundo Asesor Experto en un nuevo gráfico no se inicia hasta que yo "empuje" manualmente el terminal de alguna manera.

¿Quién puede haberse enfrentado a una situación así? ¿Cómo afrontarlo, de qué manera "cavar"?

¿Cómo sabes que no arranca?

P.D.

Pruébalo así

int OnInit()
{
....
....

 ChartRedraw();
  return(INIT_SUCCEEDED);
}
 
Mihail Matkovskij #:

Puede encontrar la constante en enum con una función de fuerza bruta (mismo principio que), traduciéndola con EnumToString y comparándola con la constante deseada. Sólo queda devolver el resultado.

¿Podemos tener un ejemplo (o al menos una línea clave), porque no se me ocurre nada? ¿Tendría que revisar también una enorme lista de valores, cribando todos los que son de izquierdas, o se limitaría a buscar los útiles? De momento no creo que haya nada que cribar, no hay zurdos en la lista... pero no puedo hacerme a la idea.

 
x572intraday #:

¿Puedes darme un ejemplo (o al menos una línea clave), porque no se me ocurre nada? ¿Sería también una enorme lista de valores con la criba de los correctos entre los de la izquierda, o sólo los útiles? De momento no creo que haya nada que cribar, no hay zurdos en la lista... pero no puedo hacerme a la idea.

Para evitar pasar por todos los valores posibles del enum (porque es realmente largo) hay que hacer los siguientes preparativos(algo así como el almacenamiento en caché). Entonces, con la ayuda de esta función puede traducir fácilmente cadenas/filas a enum conociendo los rangos de todos los enum necesarios. O puede buscar un enum en un rango comparativamente pequeño.

template<typename T>
bool StringToEnum(const string i_str, T &o_val, int i_min_enum, int i_max_enum)
{
   for(int i = i_min_enum; i <= i_max_enum && !IsStopped(); i++) {
     o_val = (T)i;
     if(i_str == EnumToString(o_val))
       return(true);
   }
   o_val = WRONG_VALUE;
   return(false);
}


template<typename T>
bool StringToEnum(const string i_str, T &o_val) { return StringToEnum(i_str, o_val, INT_MIN, INT_MAX); } // медленный вариант
 
Vitaly Muzichenko #:

¿Cómo determinaste que no estaba arrancando, cómo puedes saberlo?

P.D.

Pruébalo así

El segundo experto en la sección OnInit hace conclusiones en el registro y no hay mensajes de registro. El registro ni siquiera contiene un mensaje del terminal sobre el inicio del Asesor Experto. Y el nombre del Asesor Experto no aparece en el gráfico en la esquina superior derecha.

 
12345678902003 #:
¿Y qué función se utiliza para ello? ¿Ingresos Mql? Y si uso ObjectGet, debo especificar la propiedad del objeto allí; si tomo OBJPROP_PRICE, cómo debo hacer para que obtenga el precio a la barra actual.

Get es Get. Y hay una función para obtener el precio o el tiempo en una barra de un objeto por el nombre o por el tipo de objeto y el nombre obtener una determinada propiedad del objeto. No se utiliza el número de compás, sino el desfase respecto a cero.

 
Valeriy Yastremskiy #:

Get es Get. Y hay una función para obtener el precio o el tiempo en una barra de un objeto por el nombre o por el tipo de objeto y el nombre obtener una determinada propiedad del objeto. No se utiliza el número de compás, sino el desfase respecto a cero.

Esto puede hacerse utilizando la función ObjectGetValueByTime().

Ejemplo

double p = ObjectGetValueByTime( 0,"имя объекта...",Time[0]);
 
Tengo el siguiente problema - la carpeta Terminal\MQL4\Indicators tiene indicadores en su lista de indicadores, pero el propio terminal MQL4 no tiene estos indicadores en su lista desde la que se arrastran estos indicadores al gráfico. ¿Cómo hacer que estos indicadores aparezcan en la lista de terminales, para que puedan ser utilizados en el gráfico del terminal MQL4 ? En la captura de pantalla de la derecha están los indicadores que están disponibles en el terminal MQL4 y en la de la izquierda están los indicadores del mismo terminal en la carpetaMQL4 4\Indicators (como ejemplo)
Archivos adjuntos:
 
Halina Okopna-Pecuch #:
Tengo el siguiente problema - la lista de indicadores en la carpeta Terminal\MQL4\Indicators contiene indicadores, pero en el terminal MQL4 en su lista desde la que se arrastran estos indicadores en el gráfico, no están. ¿Cómo hacer que estos indicadores aparezcan en la lista de terminales, para que puedan ser utilizados en el gráfico del terminal MQL4 ? En la captura de pantalla de la derecha están los indicadores que están disponibles en el terminal MQL4 y en la de la izquierda están los indicadores del mismo terminal en la carpetaMQL4 4\Indicators (como ejemplo )

Probablemente no sean indicadores.