¿Cómo codificar? - página 306

 

Hola,

Realmente no estaba llegando a ninguna parte con las funciones, las comprobé innumerables veces en vano, así que decidí escribir un montón de mensajes Print() en cada etapa de mi código para ver hasta dónde llega antes de clonarse. En realidad no llega hasta la función GetLots y falla al comprobar mis criterios de compra y venta. Extrañamente no he cambiado esta parte del código, pero algo falla, pero al menos ahora sé en qué centrarme.

 

Hola a todos,

Hoy he probado mi código y ha funcionado relativamente bien. Sin cambiar el código o los criterios de backtest (como las fechas, etc.) hice un backtest una hora más tarde y los resultados son completamente diferentes, como en ningún resultado. Así que me pregunto por qué sucedió esto? ¿Por ejemplo, la conectividad de MT4?

 

...

Si no ha cambiado ningún parámetro, compruebe lo siguiente: cuando ejecute la prueba retrospectiva, abra la pestaña del diario y compruebe si hay errores escritos allí. Los errores en la ejecución de las órdenes podrían ser la causa de los resultados erráticos. También compruebe si los criterios de compra y venta son "sólidos", es decir, si entran en el mismo punto.

crsnape@btinternet.com:
Hola a todos, hoy he probado mi código y ha funcionado relativamente bien. Sin cambiar el código o los criterios de backtest (como las fechas, etc.) hice un backtest una hora más tarde y los resultados son completamente diferentes, como en ningún resultado. Así que me pregunto por qué sucedió esto? ¿Por ejemplo, la conectividad de MT4?
 

No me sale ningún error en mi diario. La primera entrada es esta:

2012.07.22 15:35:37 H4 Period EA EURUSD,H4: cargado con éxito

Seguido de una enorme lista de estos:

2012.07. 22 15:47:07 TestGenerator: unmatched data error (volume limit 56304 at 2012.07.19 12:00 exceeded)

y luego, finalmente:

2012.07. 22 15:47:07 H4 Periodo EA entradas: MagicNumber=42; RiskRewardRatio=3; D1SlowMAPeriod=200; D1FastMAPeriod=50; FastMACDPeriod=12; SlowMACDPeriod=26; SignalPeriod=9; DNCPeriod=120; SL_Period=10;

Pero después nada.

Mi prueba se hizo desde 04.01.2012 - 21.07.2012.

 

...

Entonces usted tiene un problema con las condiciones de entrada (su EA nunca intentó abrir una orden)

crsnape@btinternet.com:
No tengo ningún error en mi diario. La primera entrada es esta:

2012.07.22 15:35:37 H4 Period EA EURUSD,H4: cargado con éxito

Seguido de una enorme lista de estos:

2012.07. 22 15:47:07 TestGenerator: error de datos no coincidentes (límite de volumen 56304 en 2012.07.19 12:00 superado)

y luego, finalmente:

2012.07. 22 15:47:07 H4 Periodo EA entradas: MagicNumber=42; RiskRewardRatio=3; D1SlowMAPeriod=200; D1FastMAPeriod=50; FastMACDPeriod=12; SlowMACDPeriod=26; SignalPeriod=9; DNCPeriod=120; SL_Period=10;

Pero después nada.

Mi prueba se realizó del 04.01.2012 al 21.07.2012.
 

Sí, es extraño porque antes entraba en las posiciones. Tengo algunos print() escritos en mi código desde el principio hasta el final y nada se escribe en el diario en absoluto para registrar incluso los inicios de mi código. Ni siquiera este para comprobar si ya se ha abierto una posición anterior en la barra actual:

if ((GlobalVariableGet (barsGV) == 0) || (GlobalVariableGet (barsGV) < Bars))

{

GlobalVariableSet(HasOrderedGV,false);

GlobalVariableSet(barsGV,Bars);

}

//--- Comprobar la posibilidad de posición larga (BUY)

if (GlobalVariableGet (HasOrderedGV) == false)

{

Print("TEST");

si (... condiciones de entrada...

 

...

Si su EA trató en cualquier etapa de abrir una orden que se han escrito en el diario (error o no, no importa - en caso de que hubiera un error, un error habría estado allí, si se abrió una orden que se escribe allí)

Pero como no hay nada escrito allí, significa que su EA nunca llegó a la etapa de tratar de abrir una orden, y eso sólo puede suceder si su conjunto de condiciones que deben cumplirse en el EA nunca llega a la etapa de abrir una orden. Así que tiene que aclarar sus condiciones. Pruebe desde la condición más simple que usted sabe que se ejecutará, y luego construir la adición de condiciones. De esta manera podrá identificar el paso que le impide abrir órdenes

crsnape@btinternet.com:
Sí, es extraño porque antes estaba entrando en posiciones. Tengo algunos print() escritos en mi código desde el principio hasta el final y no se escribe nada en el diario en absoluto para registrar incluso los inicios de mi código. Ni siquiera este para comprobar si una posición anterior se ha abierto ya en la barra actual:

if ((GlobalVariableGet (barsGV) == 0) || (GlobalVariableGet (barsGV) < Bars))

{

GlobalVariableSet(HasOrderedGV,false);

GlobalVariableSet(barsGV,Bars);

}

//--- Comprobar la posibilidad de posición larga (BUY)

if (GlobalVariableGet (HasOrderedGV) == false)

{

Print("TEST");

si (... condiciones de entrada...
 

He puesto unos cuantos Print()s más después de los comandos if y creo que está fallando en este punto, particularmente la línea roja ya que mi diario deja de imprimir después de este punto.

//--- VARIABLES GLOBALES

string HasOrderedGV = "has_ordered_GV";

string barsGV = "bars_GV";

//--- Determina si la orden ya fue colocada en el bloque de tiempo H4

if ((GlobalVariableGet (barsGV) == 0) || (GlobalVariableGet (barsGV) < Bars))

{

GlobalVariableSet(HasOrderedGV,false);

GlobalVariableSet(barsGV,Bars);

}

Print("Determina si la orden ya está colocada para la barra actual ", HasOrderedGV);

//--- Comprobar la posibilidad de posición larga (BUY)

if (GlobalVariableGet (HasOrderedGV) == false)

{

Encontré este trozo de código en internet y lo utilicé en el mío. Pero ahora me pregunto si funcionará. La variable global barsGV está declarada como una cadena, sin embargo la referencia a 0 en la primera línea. ¿Es esto correcto?

 

...

Ese código funciona bien cuando se ejecuta por primera vez

0 se prueba por la siguiente razón :

double GlobalVariableGet([/TD] [TD]string name)

"Devuelve el valor de una variable global existente o 0 si se produce un error"

El error al recuperar el valor de la variable global sería cuando la variable global no está creada aún. Pero, como he dicho, ese código está bien cuando se ejecuta por primera vez. El problema es el siguiente: imagina que ejecutas un test y la barsGV se pone a 5000 al final del test. Ahora ejecutas el EA de nuevo y las barras siempre van a ser menores que el valor de barsGV (que sigue siendo 5000). Hay que escribir el código de otra manera. Utilice algo como esto

GlobalVariableSet(barsGV,0);

en el init(), y entonces debería funcionar bien para las pruebas consecutivas también. Pero también, artificialmente, "fingirá" que no había ninguna orden abierta en la barra actual cuando inicie el EA, lo que puede ser un error. Es mucho mejor usar la función para contar las órdenes abiertas en la barra actual que usar varibles globales para ese propósito (por múltiples razones)

________________________________________________

PD: el uso de variable(s) global(es) de este modo impide que se utilicen múltiples instancias de un EA (cada variable global es visible desde otro código - cualquier código : EA, script, indicador ..., por lo que si el nombre no es único, se corre el riesgo de una confusión de EAs leyendo y estableciendo la misma variable global al mismo tiempo)

crsnape@btinternet.com:
He puesto unos cuantos Print()s más después de los comandos if y creo que está fallando en este punto, particularmente la línea roja ya que mi diario deja de imprimir después de este punto.

//--- VARIABLES GLOBALES

string HasOrderedGV = "has_ordered_GV";

string barsGV = "bars_GV";

//--- Determina si la orden ya está colocada en el bloque de tiempo H4

if ((GlobalVariableGet (barsGV) == 0) || (GlobalVariableGet (barsGV) < Bars))

{

GlobalVariableSet(HasOrderedGV,false);

GlobalVariableSet(barsGV,Bars);

}

Print("Determina si la orden ya está colocada para la barra actual ", HasOrderedGV);

//--- Comprobar la posibilidad de posición larga (BUY)

if (GlobalVariableGet (HasOrderedGV) == false)

{

Encontré este código en Internet y lo utilicé en el mío. Pero ahora me pregunto si funcionará. La variable global barsGV está declarada como una cadena, sin embargo hace referencia a 0 en la primera línea. ¿Es esto correcto?
 

Ahh... ya veo. Porque las variables globales guardan sus valores en la memoria. Así que como usted dice, cuando termina el backtesting y su en 5000 decir, esto se guarda en la memoria, incluso si el backtesting se vuelve a ejecutar por lo que nunca devolverá falso porque BarsGV isnt por debajo de 5000? Esto es muy profundo.

Y además, si genera un error, pone HasOrderedGV en falso para poder continuar con el resto del código?

¿He entendido bien?

BTW- ¿está permitido esto?

GlobalVariableSet(HasOrderedGV, false);

Porque en el Libro MQL4 dice

datetime GlobalVariableSet([/TD] [TD]string name, double value)

El segundo valor en mi instancia es bool no double?