Errores, fallos, preguntas - página 567

 
Así que CTrade funcionó... Es sólo un archivo necesario para rehacer todo... Un submarino de helicóptero de nuevo... Y te dije que no sé cómo, no boom... :)
 

Sí... en principio es lo mismo...

 

La nueva construcción ha dejado de copiar estructuras simples en el bucle. Aquí hay un script de prueba:

//+------------------------------------------------------------------+
//|                                             Test_Copy_Struct.mq5 |
//+------------------------------------------------------------------+
struct  trade_settings
  {
   int      reopened;
   int      reverse; 
   int      TrailingStop;
   int      WithoutlossLevel;
   int      WithoutlossProfit;
   double   LossToReverse;
   int      MAPeriod;
   int      MA_use;
   double   Lots;
   int      takeprofit; 
  };
trade_settings arr_tr_set_ini[3]={  
 {60,90,1000,100,900,2000.0,105,1,0.13,2700},   // EURUSD
 {130,1298,400,300,600,1000.0,130,1,0.1,2800},  // GBPUSD
 {110,140,200,600,800,1000.0,85,0,0.15,1700}};   // AUDUSD 
trade_settings symb_default={110,130,200,1300,1500,3000.0,100,1,0.1,1000};

class CTest_Copy_Struct
  {  
protected:
   trade_settings    m_tr_set;
public:
   void              Copy_tr_set(const trade_settings& tr_set){m_tr_set=tr_set;}
   void              Print_tr_set(){printf("Setting reopened=%u overpos=%u TrailingStop=%u WithoutlossLevel=%u WithoutlossProfit=%u" 
                        ,m_tr_set.reopened,m_tr_set.reverse,m_tr_set.TrailingStop,m_tr_set.WithoutlossLevel,m_tr_set.WithoutlossProfit);
                        printf("LossToReverse=%.2f MAPeriod=%u MA_use=%u Lots=%.2f takeprofit=%u"
                        ,m_tr_set.LossToReverse,m_tr_set.MAPeriod,m_tr_set.MA_use,m_tr_set.Lots,m_tr_set.takeprofit);}
   void              Zero(){ZeroMemory(m_tr_set);} 
  };

void OnStart()
  {
   CTest_Copy_Struct Test; 
   Test.Zero();
   Test.Print_tr_set();
   Print("------------------------------");
   Test.Copy_tr_set(arr_tr_set_ini[0]);
   Test.Print_tr_set();
   Print("------------------------------");
   Test.Copy_tr_set(arr_tr_set_ini[2]);
   Test.Print_tr_set();
   Print("------------------------------");
   Test.Copy_tr_set(symb_default);
   Test.Print_tr_set();
   int total=ArraySize(arr_tr_set_ini);
   for(int i=0;i<3;i++)
     {
      Print("i=",i);
      Test.Copy_tr_set(arr_tr_set_ini[i]);
      Test.Print_tr_set();
     } 
  }
//+------------------------------------------------------------------+
Документация по MQL5: Основы языка / Типы данных / Структуры и классы
Документация по MQL5: Основы языка / Типы данных / Структуры и классы
  • www.mql5.com
Основы языка / Типы данных / Структуры и классы - Документация по MQL5
 
Valmars:

Resultado:

2011.11.13 09:30:44 Test_Copy_Struct (EURUSD,M15) Violación de acceso leída a 0x00000000209FFFAC en 'E:\NArchivos de Programa\NCampeonato_2011\MQL5\Scripts\NTest_Copy_Struct.ex5'
2011.11.13 09:30:44 Test_Copy_Struct (EURUSD,M15) i=0
2011.11.13 09:30:44 Test_Copy_Struct (EURUSD,M15) LossToReverse=3000.00 MAPeriod=100 MA_use=1 Lots=0.10 takeprofit=1000
2011.11.13 09:30:44 Test_Copy_Struct (EURUSD,M15) Setting reopened=110 overpos=130 TrailingStop=200 WithoutlossLevel=1300 WithoutlossProfit=1500
2011.11.13 09:30:44 Test_Copy_Struct (EURUSD,M15) ------------------------------
2011.11.13 09:30:44 Test_Copy_Struct (EURUSD,M15) LossToReverse=1000.00 MAPeriod=85 MA_use=0 Lots=0.15 takeprofit=1700
2011.11.13 09:30:44 Test_Copy_Struct (EURUSD, M15) Setting reopened=110 overpos=140 TrailingStop=200 WithoutlossLevel=600 WithoutlossProfit=800
2011.11.13 09:30:44 Test_Copy_Struct (EURUSD,M15) ------------------------------
2011.11.13 09:30:44 Test_Copy_Struct (EURUSD,M15) LossToReverse=2000.00 MAPeriod=105 MA_use=1 Lots=0.13 takeprofit=2700
2011.11.13 09:30:44 Test_Copy_Struct (EURUSD,M15) Setting reopened=60 overpos=90 TrailingStop=1000 WithoutlossLevel=100 WithoutlossProfit=900
2011.11.13 09:30:44 Test_Copy_Struct (EURUSD,M15) ------------------------------
2011.11.13 09:30:44 Test_Copy_Struct (EURUSD,M15) LossToReverse=0.00 MAPeriod=0 MA_use=0 Lots=0.00 takeprofit=0
2011.11.13 09:30:44 Test_Copy_Struct (EURUSD,M15) Setting reopened=0 overpos=0 TrailingStop=0 WithoutlossLevel=0 WithoutlossProfit=0

 

https://www.mql5.com/ru/docs/basis/function/events dice al final:"Para una mejor comprensión será útil ejecutar el indicador cuyo código se adjunta a continuación. "

Ejecuta el código. Durante el fin de semana. No ha habido una mejor comprensión: estaba bien como estaba, creo, pero se han añadido las peores impresiones. No hay ticks en el fin de semana, por lo que prev_calculated = 0 en este momento siempre, cuando se pasa de timeframe a timeframe:

Sin embargo, en un momento dado aparece este valor (¡no hay reconexión, sinceramente noble!):

y líneas divertidas en el gráfico:

O la mitad de divertido, como esto:

Incluso había líneas al principio de la historia en forma de ZigZag (por desgracia, olvidé hacer una captura de pantalla y no pude reproducirla).

Las líneas también aparecen en otras TF, pero de forma más dispersa. Puedes comprobarlo fácilmente por ti mismo.

¿Era exactamente lo que los autores querían decir?

¿Por qué el resultado de prev_calculado es al menos desigual en ausencia de ticks, si no es extraño? ¿Funciona algo mal al saltar de TF a TF?

¿Deberían haber aparecido estas líneas (o cualquier otra) fuera de las garrapatas?

En casos raros, ¿puede el salto relativamente frecuente de TF a TF generar algún tipo de pseudotick que inicie el cálculo de los valores de las barras en el historial, etc.?

¿Debo esperar que se elimine el comportamiento errático del terminal? ¿O debo aprender las matemáticas?

¿Quizás estoy intentando hacer algo que no debería hacer? En ese caso, justifique su punto de vista.

Tengo muchas preguntas... pero esto es sólo el principio...

Документация по MQL5: Основы языка / Функции / Функции обработки событий
Документация по MQL5: Основы языка / Функции / Функции обработки событий
  • www.mql5.com
Основы языка / Функции / Функции обработки событий - Документация по MQL5
 

Continúa...

Hay una frase en el mismo enlace:"Nota: si la función OnCalculate devuelve un valor nulo, no se muestran los valores del indicador en la DataWindow del terminal cliente. "

Esta es la cuestión... Si es necesario, aceptaré con gusto cualquier crecimiento del brazo y correré inmediatamente a enderezarlo si es necesario. Pero. En los indicadores de complejidad simple y media se puede salir de alguna manera de algunas situaciones de tropiezo. Pero a medida que el código se vuelve más complejo, cualquier función de Copy... () (tanto tomando como argumento el mango de otro indicador como sin él) comienza a complicar la situación, como personalmente pienso, tratando con la programación MQL hace una semana. Entonces llega un momento límite en el que no se sabe qué más se puede cambiar en el código, porque todo lo que se puede cambiar se ha cambiado, y el resto, según me parece, no se debe cambiar, porque no tiene nada que ver con el problema. O bien, se produce un pensamiento absolutamente desarmante: cambiar todo el algoritmo, porque no se han tenido en cuenta las peculiaridades y caprichos del terminal. Al fin y al cabo, mientras se estudia el MQL a través de la documentación, hay que lidiar con los matices, que los desarrolladores han callado, muy probablemente de forma inadvertida. Y el programador de MQL nunca aprende muchas cosas después de estudiar completamente la documentación... Y lo que es más decepcionante, usando MQL, o bien no puedes corregir muchos de los caprichos del terminal en absoluto, o bien puedes usar muletas dudosas y un día estrellarte dolorosamente...

Bueno... Hoy me he vuelto un poco loco. Es el fin de semana.

Y esto es lo que quería decirte esta mañana...

https://www.mql5.com/ru/forum/1111/page570#comment_117425 - He resuelto completamente el problema principal de cómo el indicador no se renderiza en el arranque inicial del terminal (espero que nadie discuta que nada debe impedir que un indicador fractal se renderice correctamente en todo el historial aunque no haya ticks...)

Lo fue:

            CopyHigh(_Symbol,PERIOD_M1,TimeUpBuffer[shift+1]-1,
                                    TimeUpBuffer[shift],
                                    exact_extremum);

sustituido por:

            if(CopyHigh(_Symbol,PERIOD_M1,TimeUpBuffer[shift+1]-1,
                                       TimeUpBuffer[shift],
                                       exact_extremum)<0) return(0);

Admito mi falta de atención y el consiguiente formalismo pernicioso.

Pero. Ayudó en el caso más sencillo (simplifiqué a propósito el indicador inicial). En un indicador más complejo estas operaciones no fueron útiles - en un momento dado los cambios no mostraron ninguna diferencia, especialmente ahora que hay muchas funciones de copia. Y me gustaría mucho recibir una instrucción sensata sobre cómo y dónde ir a continuación. Al fin y al cabo, se invierte mucho tiempo en algo que funciona desde el principio. Hasta ahora, ni siquiera sé si es culpa mía o del terminal. Y no estoy seguro de que sea sólo una falta de si yvuelve... Parece sospechoso aquí y allá, como por ejemplo...

Enviaré el código a los desarrolladores en mi personal si es necesario; al mismo tiempo puedo adjuntar un código similar, pero implementado de una manera diferente y que funciona sin problemas de inmediato (aunque, no se ajusta a las tareas y objetivos que estoy explorando).

 
¿Es el proceso de registro de la función de impresión en la pestaña de Expertos de la Terminal, así como en la RAM y el archivo en el disco un proceso separado o no? Parece estar separado, el terminal no se congela, pero ¿por qué durante el proceso de registro intensivo se ralentiza como si estuviera cargado de ladrillos? ¿Hay alguna forma de descargarlo? Si he decidido dar salida a elementos de array de tamaño más bien medio, los retrasos son bastante notables, y me olvidaré de dar salida a valores de elementos de array de mayor tamaño a la vez.
Документация по MQL5: Основы языка / Переменные
Документация по MQL5: Основы языка / Переменные
  • www.mql5.com
Основы языка / Переменные - Документация по MQL5
 

Hay una fuerte sospecha de que el terminal se está metiendo con la caché (estoy casi fuera de onda, así que...). Peor - incluso MetaEditor afecta de alguna manera el manejo de lo que está pasando en el terminal en ese momento.

Más de una vez me he encontrado con un problema, cuando he modificado el código del programa MQL (que imprime los datos de depuración en el registro de la pestaña Expert Advisor), lo he vuelto a compilar, he ido a la ventana del Terminal y he visto que se repetían los resultados anteriores, aunque puedo decir con seguridad que no se trata de algún tipo de reelaboración retardada de la ejecución del programa anterior no completado. Así, parece que estoy compilando el código actualizado en MetaEditor con F7 y enviándolo a ejecutar, y mientras tanto se le ordena al terminal que reproduzca el código antiguo (desde la caché, o algo así como "amañar" las páginas de memoria por el SO). Curiosamente, es posible deshacer/descargar la versión anterior de .ex5-code "atascada en los dientes" no sólo descargando completamente el proceso de terminal.exe, sino en algunos casos raros - simplemente cerrando el MetaEditor. Entiéndelo como quieras, sólo he contado lo que he observado personalmente.

Recientemente, hubo una situación en la que el diseño:

Print(1);
for(int e=0; e<ArraySize(Arr); e++)
{
   Print(Arr[e]);
}
El gráfico muestra sólo el valor del primer Print, pero era inútil esperar la salida de los elementos del array. Después de la eliminación de la primera impresión y la recompilación, la salida cíclica de los elementos de la matriz comenzó al instante. ¿Es una conspiración secreta de Prints contra la Comunidad MQL5 o soy el único que tiene tan mala suerte?

Además, quiero señalar que estos extraños casos de comportamiento del terminal se observaron no en una instancia de MT5 sobrecargada con ventanas de gráficos, objetos gráficos y programas MQL, sino con una sola ventana de gráfico limpia (sin contar el contorno de un indicador en ejecución).

 
x100intraday Olvídese de los problemas: escríbalo en C o en cualquier otro lenguaje. Al fin y al cabo, todo lo que necesitamos del terminal es obtener cotizaciones, información sobre la cuenta y ejecutar órdenes, y el resto puede escribirse en un entorno de programación especializado y conectarse mediante una biblioteca. De lo contrario, cambiarán algo en un momento y no habrá respuesta a por qué no funciona, si el proyecto es grande. No necesitas esas aventuras :) Y si el Asesor Experto al mismo tiempo tiene que recompilar y ponerse al día con el mantenimiento de las órdenes actuales, perderá dinero, porque tendrá que averiguar qué y por qué...
 
ivandurak:

1. El código ArrayInitialize no funciona, si descomento el bucle, todo va bien.

Y cuando se declaran variables en la clase y el indicador en el nivel global con el mismo nombre - aparece la advertencia.

1. El PlotIndexSetDouble(z,EMPTY_VALUE) se utiliza para los buffers de los indicadores en el inite.

2. Aparece. Entonces hay que hacer algo al respecto, se recomienda marcar los miembros de la clase con el prefijo "m_".

Документация по MQL5: Пользовательские индикаторы / PlotIndexSetDouble
Документация по MQL5: Пользовательские индикаторы / PlotIndexSetDouble
  • www.mql5.com
Пользовательские индикаторы / PlotIndexSetDouble - Документация по MQL5