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

 

Después de las últimas respuestas el panorama se ha aclarado y la más evidente es que no estoy destinado a ser programador :-)

De momento he empezado con el listado más sencillo y esto es lo que ha resultado:


2018.10.20 08:42:43.343 _t1 CADJPY,Daily: tmp1[4] = 86.0999999999999999 2018.10.15 00:00:00

2018.10.20 08:42:43.343 _t1 CADJPY,Daily: tmp1[3] = 85.989999999999999999 2018.10.16 00:00:00

2018.10.20 08:42:43.343 _t1 CADJPY,Daily: tmp1[2] = 86.76000000000001 2018.10.17 00:00:00

2018.10.20 08:42:43.343 _t1 CADJPY,Daily: tmp1[1] = 86.5 2018.10.18 00:00:00

2018.10.20 08:42:43.343 _t1 CADJPY,Daily: tmp1[0] = 85.72 2018.10.19 00:00:00



En algunos casos, por alguna razón, el precio excede la dimensión de dos dígitos significativos después del punto en cualquier dirección.

Y esto sucede sin ningún error en los cálculos, es sólo la salida del valor del precio de la base del gráfico tmp1[i]=close[i];

¿Hay alguna forma de arreglarlo o simplemente ignorarlo?



 

Puedes eliminar todo lo que es relevante para el cinco, y obtener una plantilla para el cuatro.


Esto lo puede escribir alguien que sepa la diferencia entre un cinco y un cuatro, y definitivamente no soy yo :-)


//--- Проверка количества доступных баров
   if(rates_total<fmax(period_ma,4)) return 0;


¿De dónde viene el número 4, cuál es su significado sagrado?

 
psyman:


Esto lo puede escribir alguien que sepa la diferencia entre un cinco y un cuatro, y definitivamente no soy yo :-)



¿De dónde viene el número 4, qué significado sagrado tiene?

Ciertamente no escuchas ni lees... Lo era:

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

Cualquier pregunta para principiantes de MQL4, asistencia y discusión sobre algoritmos y códigos

Artyom Trishkin, 2018.10.18 09:26

//+------------------------------------------------------------------+
//| Custom indicator iteration function                              |
//+------------------------------------------------------------------+
int OnCalculate(const int rates_total,
                const int prev_calculated,
                const datetime &time[],
                const double &open[],
                const double &high[],
                const double &low[],
                const double &close[],
                const long &tick_volume[],
                const long &volume[],
                const int &spread[])
  {
//--- Проверка количества доступных баров (1 - минимально, 4 - оптимально для большинства расчётов. Но всё "по месту"...)
   if(rates_total<4) return 0;
//--- Проверка и расчёт количества просчитываемых баров
   int limit=rates_total-prev_calculated; // 0 - пришел новый тик, новый бар формироваться не начал. 1 - пришел новый тик и начал формироваться новый бар.
   if(limit>1) 
               // если вписать "limit>0", то на нулевом баре будет расчёт только нулевого бара, на каждом новом баре будет полный перерасчёт всей истории
               // если вписать "limit>1", то на нулевом баре будет расчёт только нулевого бара, на открытии нового бара - пересчёт первого и нулевого,
               // при подгрузке истории и на первом запуске - перерасчёт всей истории
     {
      limit=rates_total-1;
      // здесь должна быть инициализация всех используемых буферов индикатора необходимыми значениями (обычно EMPTY_VALUE и 0)
     }
//--- Расчёт индикатора
   for(int i=limit; i>=0 && !IsStopped(); i--)
     {
      // необходимые действия по расчёту индикатора
     }

//--- return value of prev_calculated for next call
   return(rates_total);
  }
//+------------------------------------------------------------------+

 
psyman:

Después de las últimas respuestas el panorama se ha aclarado y la más evidente es que no estoy destinado a ser programador :-)

De momento he empezado con el listado más sencillo y esto es lo que ha resultado:


2018.10.20 08:42:43.343 _t1 CADJPY,Daily: tmp1[4] = 86.0999999999999999 2018.10.15 00:00:00

2018.10.20 08:42:43.343 _t1 CADJPY,Daily: tmp1[3] = 85.989999999999999999 2018.10.16 00:00:00

2018.10.20 08:42:43.343 _t1 CADJPY,Daily: tmp1[2] = 86.76000000000001 2018.10.17 00:00:00

2018.10.20 08:42:43.343 _t1 CADJPY,Daily: tmp1[1] = 86.5 2018.10.18 00:00:00

2018.10.20 08:42:43.343 _t1 CADJPY,Daily: tmp1[0] = 85.72 2018.10.19 00:00:00



En algunos casos, por alguna razón, el precio excede la dimensión de dos dígitos significativos después del punto en cualquier dirección.

Y esto sucede sin ningún error en los cálculos, es sólo la salida del valor del precio de la base del gráfico tmp1[i]=close[i];

¿Hay alguna forma de arreglarlo o simplemente ignorarlo?



Está bien. Para imprimir números fraccionarios, simplemente utilice DoubleToString() con la precisión requerida. En este caso la precisión requerida debe ser Digits()

 
psyman:

Después de las últimas respuestas el panorama se ha aclarado y la más evidente es que no estoy destinado a ser programador :-)

De momento he empezado con el listado más sencillo y esto es lo que ha resultado:


2018.10.20 08:42:43.343 _t1 CADJPY,Daily: tmp1[4] = 86.0999999999999999 2018.10.15 00:00:00

2018.10.20 08:42:43.343 _t1 CADJPY,Daily: tmp1[3] = 85.989999999999999999 2018.10.16 00:00:00

2018.10.20 08:42:43.343 _t1 CADJPY,Daily: tmp1[2] = 86.76000000000001 2018.10.17 00:00:00

2018.10.20 08:42:43.343 _t1 CADJPY,Daily: tmp1[1] = 86.5 2018.10.18 00:00:00

2018.10.20 08:42:43.343 _t1 CADJPY,Daily: tmp1[0] = 85.72 2018.10.19 00:00:00


En algunos casos, por alguna razón, el precio excede la dimensión de dos dígitos significativos después del punto en cualquier dirección.

Y esto sucede sin ningún error en los cálculos, es sólo la salida del valor del precio de la base del gráfico tmp1[i]=close[i];

¿Se puede vencer esto de alguna manera o simplemente ignorarlo?

estos son valores normales para un número real. se puede aprender a escribir programas, todo el mundo empieza por ahí - sólo hay que leer mucho y tratar de escribir y escribir sus propios códigos.

La precisión del número real, la mantisa, y cómo se almacena todo en la memoria, puedes buscarlo en la web, los principios de almacenamiento son los mismos en todas partes.

si quieres una salida bonita utiliza DoubleToStr()

 
Igor Makanu:

estos son valores comunes para un número real, se puede aprender a escribir programas, todo el mundo empieza por ahí - sólo hay que leer mucho y tratar de escribir y escribir sus propios códigos

La precisión del número real, la mantisa, y cómo se almacena todo en la memoria, puedes buscarlo en la web, los principios de almacenamiento son los mismos en todas partes.

si quieres una salida bonita, utiliza DoubleToStr()

Cuando sea posible utilizar funciones compatibles, es mejor ofrecerlas para su uso. De lo contrario, esta epopeya volverá a empezar. En este caso: DoubleToString()

 

¿Cómo se puede evitar que el EA se ejecute en los mismos instrumentos?

Por ejemplo, el EA funciona en la ventana eur/usd, pero cuando se ejecuta en otras ventanas en eur/usd se muestra algún mensaje de alerta. Estaré muy agradecido por la ayuda.

 
gans71:

¿Cómo se puede evitar que el EA se ejecute en los mismos instrumentos?

Por ejemplo, el EA funciona en la ventana eur/usd, pero cuando se ejecuta en otras ventanas en eur/usd se muestra algún mensaje de alerta. Estaré muy agradecido por la ayuda.

Necesitas transferir datos de un EA a otro, busca en el foro

o utilizar las variables globales del terminal (esta es la forma más fácil) - allí puede escribir el valor del primer EA, y las siguientes copias del EA leerán este valor y no se ejecutaránhttps://www.mql5.com/ru/docs/globals

Документация по MQL5: Глобальные переменные терминала
Документация по MQL5: Глобальные переменные терминала
  • www.mql5.com
Глобальные переменные существуют в клиентском терминале 4 недели с момента последнего обращения, после этого автоматически уничтожаются. Обращением к глобальной переменной считается не только установка нового значения, но и чтение значения глобальной переменной.
 
Igor Makanu:

necesitas transferir datos de un EA a otro, busca en el foro

o utilizar las variables globales del terminal (esta es la forma más fácil) - allí puede escribir el valor del primer EA, y las siguientes copias del EA leerán este valor y no se ejecutaránhttps://www.mql5.com/ru/docs/globals

el EA es el mismo, hay que prohibir que se ejecute en los mismos instrumentos
 
gans71:
el EA es el mismo, no se debe permitir que se ejecute en los mismos símbolos

¿y? no podrías haber estudiado la ayuda en 2 minutos

Si te refieres específicamente a cómo pasar una cadena a una variable global, la única forma es crear un nombre para la variable global, es decir, en tu caso ejecutas un EA sobre EURUSD, haz una comprobación

if(GlobalVariableCheck(_Symbol)) .....

Si no existe tal variable, entonces cree una de gran tamaño, así

if(GlobalVariableSet(_Symbol,Magic)==0) Print("Error al escribir en la variable global # ",GetLastError());

luego, al salir del Asesor Experto, eliminar la variable global

como es, el terminal no está a mano, y como que señalé la dirección de búsqueda