[¡AVISO CERRADO!] Cualquier pregunta de novato, para no saturar el foro. Profesionales, no pasen. No puedo ir a ningún sitio sin ti. - página 656

 
artmedia70:
¿Qué puede causar un desbordamiento de pila? Cuando se abre una posición con una gran toma (la toma se calcula a partir de la volatilidad y se multiplica por 100, el tamaño es 41*100), entonces se escribe un desbordamiento de pila en el registro y... ...sólo tómalo. No se abren más posiciones hasta que esta se cierre, y esta, por supuesto, no se cerrará por el enorme TP.... Y el EA no funciona correctamente en absoluto, porque debería cerrar todas las posiciones cuando se alcanza el beneficio total predefinido de las posiciones abiertas... Pero no ocurre, aunque esta posición lleva mucho tiempo con enormes beneficios, unos dos mil puntos... ¿Cómo puedo combatirlo? No se puede asegurar la situación en la que todas las posiciones abiertas desborden la pila, y todo se ponga patas arriba...


la pila no puede desbordarse sólo con un número que está fuera del rango de tipos - habrá otro error

Los datos pasados a una función o una llamada recursiva a una función sin salir pueden desbordar la pila.

start() también es una función - quizás tengas muchas variables ahí.

la pila es una región de memoria donde se almacenan los valores intermedios (variables locales) de una función; puedes estar rompiendo la pila tú mismo si utilizas arrays dinámicos y no has comprobado correctamente el ámbito del array, es decir, estás escribiendo datos no en un array sino en una región de memoria que viene justo después del array

intenta mover algunas de las matrices a variables globales - ponlas en la parte superior del tablero

ZS: al menos es igual en todos los lenguajes de programación - creo que es igual en mql

 
IgorM:


la pila no puede desbordarse sólo con un número que está fuera del rango de tipos - habrá otro error

Los datos pasados a una función o una llamada recursiva a una función sin salir pueden desbordar la pila.

start() también es una función - quizás tengas muchas variables ahí.

la pila es una región de memoria donde se almacenan los valores intermedios (variables locales) de una función; puedes estar rompiendo la pila tú mismo si utilizas arrays dinámicos y no has comprobado correctamente el ámbito del array, es decir, estás escribiendo datos no en un array, sino en una región de memoria que viene justo después del array

intenta mover algunas de las matrices a variables globales - ponlas en la parte superior del tablero

ZS: al menos es igual en todos los lenguajes de programación - creo que es igual en mql

Igor, sabes que hasta ahora he evitado usar arrays... Sólo tengo un par de arrays en mi código - un array de órdenes antes del tick y un array de órdenes después del tick. Los tengo definidos en el área de variables globales. Lo curioso es que moví el código para abrir estas posiciones a otro lugar del EA y el error desapareció. Parece que había una llamada recursiva para abrir órdenes, aunque no me he molestado en ello. Simplemente decidí que no sería apropiado colocar la apertura inmediatamente después de cerrar todas las posiciones en el código para comprobar si se alcanzó el beneficio total y se cerraron todas las posiciones... Me he hecho un lío... :)
 
artmedia70:
Igor, sabes que hasta ahora he evitado usar arrays... Sólo tengo un par de arrays en mi código - un array de órdenes antes del tick y un array de órdenes después del tick. Los tengo definidos en el área de variables globales. Lo curioso es que moví el código para abrir estas posiciones a otro lugar del EA y el error desapareció. Parece que había una llamada recursiva para abrir órdenes, aunque no me he molestado en ello. Simplemente decidí que no sería adecuado colocar la apertura inmediatamente después de cerrar todas las posiciones en el código para comprobar si se alcanzó el beneficio total y se cerraron todas las posiciones... Me he hecho un lío... :)

Hice una plantilla para crear un EA - cuando se coloca una orden, la bandera de tal orden se establece inmediatamente y después, antes de abrir una nueva orden de este tipo, siempre compruebo la bandera - si la orden existe, pero estoy escribiendo EAs con una sola orden
 
IgorM:

Hace tiempo que hice una plantilla para crear un EA - cuando pongo una orden, inmediatamente pongo una señal (bandera) de que tal orden existe, y luego antes de abrir una nueva orden de este tipo siempre compruebo la bandera - si tal orden existe, pero escribo EAs con una sola orden
Bueno, yo, y creo que todo el mundo, tiene sus propios desarrollos, plantillas y demás lindezas. Esta no es la cuestión. Sigo luchando con los drawdowns y probando diferentes métodos, funciones y demás. Si trabajo estrictamente con la tendencia, no puedo entender cómo captar el agotamiento de la tendencia si en uno, el TF más antiguo la tendencia ya se ha convertido en un plano, mientras que en el más joven sigue ahí, pero está llegando a su fin. Al abrir una posición en una orden baja, la probabilidad de que provoque un drawdown y no se cierre a tiempo es alta. Ahora estoy intentando trabajar con gráficos de 4 horas a partir del gráfico de 4 horas, donde definimos la dirección y trabajamos sólo en esta dirección en todos los mínimos. El momento de la transición de la tendencia al plano lo tengo más o menos identificado, vamos a ver los resultados.
 
Craft:


Sí, obtuve "0", pero ¿qué debo hacer? No puedo hacerlo de las dos maneras (incluso probé con períodos iguales), probé con ambos Print("NormalizeDouble(c1b_1..."), pero obtuve ceros (sólo c1b[i] muestra el valor, todos los demás incluyendo c1s[i] son ceros), ¿puede ayudarme a llevar uno de ellos a una condición de trabajo o compartir una pista, si nota algún defecto?

Nuevo:

Antiguo:

Entero:


Yuri, en el futuro, si el código se repite al menos dos veces, debería asignarse a un método, y no necesitarás montones de arrays abarrotando el código.
He aquí un método para ti:

//+------------------------------------------------------------------+
double iCCIAverage(string cci_symbol, int cci_timeframe, int cci_period, int cci_applied_price, int ma_period, int ma_method, int ma_shift){
   double array[];
   int loop_array;
   ArrayResize(array,ma_period + ma_shift);
   for(int loop = ma_period + ma_shift - 1; loop >= 0; loop--, loop_array++)array[loop_array] = iCCI(cci_symbol, cci_timeframe, cci_period, cci_applied_price, loop);
   return(iMAOnArray(array, 0, ma_period, 0, ma_method, ma_shift));
}
//+------------------------------------------------------------------+

Creo que todo está claro con los parámetros, introduce los datos y variando el parámetro ma_shift consigue el desplazamiento que necesitas. Tenga en cuenta que este método se puede utilizar como una plantilla, sólo cambiar los métodos de acceso para los indicadores i...(...) o iCustom(...). Ahora su bloque de decisiones de comercio se ve como debe ser:

//--------------------------------------------------------------- 5 --
   // Торговые критерии
if (NormalizeDouble(iCCIAverage(Symbol(), 0, PeriodB, PRICE_TYPICAL, AvgB, MODE_SMA, 1),4)<NormalizeDouble(iCCIAverage(Symbol(), 0, PeriodB, PRICE_TYPICAL, AvgB, MODE_SMA, 2),4) &&
   NormalizeDouble(iCCIAverage(Symbol(), 0, PeriodB, PRICE_TYPICAL, AvgB, MODE_SMA, 2),4)>NormalizeDouble(iCCIAverage(Symbol(), 0, PeriodB, PRICE_TYPICAL, AvgB, MODE_SMA, 3),4))
     {                                          // 
      Opn_B=true;                               // Критерий откр. Buy
      Cls_S=true;                               // Критерий закр. Sell
     }
if (NormalizeDouble(iCCIAverage(Symbol(), 0, PeriodS, PRICE_TYPICAL, AvgS, MODE_SMA, 1),4)>NormalizeDouble(iCCIAverage(Symbol(), 0, PeriodS, PRICE_TYPICAL, AvgS, MODE_SMA, 2),4) &&
   NormalizeDouble(iCCIAverage(Symbol(), 0, PeriodS, PRICE_TYPICAL, AvgS, MODE_SMA, 2),4)<NormalizeDouble(iCCIAverage(Symbol(), 0, PeriodS, PRICE_TYPICAL, AvgS, MODE_SMA, 3),4))
     {                                          // 
      Opn_S=true;                               // Критерий откр. Sell
      Cls_B=true;                               // Критерий закр. Buy
     }
//--------------------------------------------------------------- 6 --

En consecuencia, no hay necesidad ahora de "viejos" y "nuevos" variantes, las operaciones se abren de acuerdo a los criterios dados (por lo que he entendido que tiene un patrón de tres barras de tops / troughs suavizado iCC). Hay una variante corregida en el archivo.

Archivos adjuntos:
21_2.mq4  14 kb
 

Hola.

Me pueden dar el código para escribir los precios desde que se abrió el pedido en el array.

Cómo hacer que cada nuevo precio se añada a la matriz.

 
zelek:

Hola.

Me pueden dar el código para escribir los precios desde que se abrió el pedido en el array.

Cómo hacer que cada nuevo precio se añada a la matriz.


Por favor, sea más específico en su pregunta

Si te interesa el precio actual en el momento de realizar el pedido, puedes añadir una llamada al código que se encargue de almacenar el precio actual en el array global con el cambio del contador de índices del array, que podrás ver posteriormente desde cualquier punto del código.

 

cómo comprobar el rendimiento de un EA - Sólo me gustaría mostrar el tiempo de ejecución del código en milisegundos

¿cuánto mejor es el rendimiento de MT5 frente a MT4?

 
IgorM:

cómo comprobar el rendimiento de un EA - Sólo me gustaría mostrar el tiempo de ejecución del código en milisegundos

¿cuánto mejor es el rendimiento de MT5 frente a MT4?


GetTickCount ayudaría https://docs.mql4.com/ru/common/GetTickCount
 
DDFedor:

GetTickCount ayudará a https://docs.mql4.com/ru/common/GetTickCount


gracias si es lo que buscaba, ¿alguien ha medido la velocidad del mismo tipo de código para mt4 y mt5?