¿Cómo codificar? - página 301

 

Hola Mladen,

Gracias por la explicación, pero ¿a qué te refieres con el valor de las primeras barras cerradas? ¿Es el valor de las primeras barras cerradas o el de las barras actuales o después? ¿Y qué significa entonces corriente+0 o corriente+1?

saludos

Terrance

mladen:
Terrance

MODE_MAIN significa que estás leyendo el valor de la línea estocástica. MODE_SIGNAL significa que estás leyendo el valor de la línea de señal estocástica.

En cuanto a SHIFT: es el mismo para todos los indicadores (incluso los personalizados). Por ejemplo: SHIFT=0 significa el valor de la barra actual, SHIFT=1 significa el valor de la primera barra cerrada y así sucesivamente...
 

...

Terrance

La barra actual no es por definición una barra cerrada

La primera barra antes de la barra actual es la primera barra cerrada

tkuan77:
Hola Mladen,

Gracias por la explicación, pero ¿a qué te refieres con el valor de la primera barra cerrada? ¿Es el valor de la primera barra cerrada o la barra actual o después? ¿Y qué significa entonces actual+0 o actual+1?

saludos

Terrance
 

Hola Mladen,

Entonces, ¿tengo razón al decir que

current+0 es lo mismo que el valor 0,

current+1 es lo mismo que el valor 1,

current+2 es lo mismo que el valor 2,

y así sucesivamente..... para SHIFT?

Por ejemplo

iStochastic(NULL, 0, 3, 3, 3, MODE_SMMA, 0, MODE_SIGNAL, Current + 1); es lo mismo que iStochastic(NULL, 0, 3, 3, 3, MODE_SMMA, 0, MODE_SIGNAL, 1);

¿Estoy en lo cierto?

Saludos

Terrance

mladen:
Terrance

La barra actual no es por definición una barra cerrada

La primera barra antes de la actual es la primera barra cerrada
 

...

Terrance

iStochastic(NULL, 0, 3, 3, 3, MODE_SMMA, 0, MODE_SIGNAL, 0); es el actual

iStochastic(NULL, 0, 3, 3, 3, MODE_SMMA, 0, MODE_SIGNAL, 1); es el primer cerrado (anterior)

...

...

iStochastic(NULL, 0, 3, 3, 3, MODE_SMMA, 0, MODE_SIGNAL,Bars-1); es el más antiguo del gráfico

PD: en este post tienes más información sobre las barras : https://www.mql5.com/en/forum/173124

tkuan77:
Hola Mladen,

Entonces, ¿tengo razón al decir que

current+0 es lo mismo que el valor 0,

current+1 es lo mismo que el valor 1,

current+2 es lo mismo que el valor 2,

y así sucesivamente..... para SHIFT?

Por ejemplo

iStochastic(NULL, 0, 3, 3, 3, MODE_SMMA, 0, MODE_SIGNAL, Current + 1); es lo mismo que iStochastic(NULL, 0, 3, 3, 3, MODE_SMMA, 0, MODE_SIGNAL, 1);

¿Estoy en lo cierto?

Saludos

Terrance
 

Hola Mladen,

Gracias por la gran ayuda, como siempre.

Saludos

Terrance

mladen:
Terrance

iStochastic(NULL, 0, 3, 3, 3, MODE_SMMA, 0, MODE_SIGNAL, 0); es el actual

iStochastic(NULL, 0, 3, 3, 3, MODE_SMMA, 0, MODE_SIGNAL, 1); es el primer cerrado (anterior)

...

...

iStochastic(NULL, 0, 3, 3, 3, MODE_SMMA, 0, MODE_SIGNAL,Bars-1); es el más antiguo del gráfico

PD: en este post tienes más información sobre los bares : https://www.mql5.com/en/forum/173124
 

Algunos problemas

Hola a todos,

He probado mi código y es muy casi allí. Tengo algunas dudas que espero que me puedan ayudar.

He puesto esto en int init():

if (Bars < D1FastMAPeriod || Bars < D1SlowMAPeriod)

{

Alert("ERROR- BARRAS INSUFICIENTES PARA CALCULAR LA SMA EN EL GRÁFICO DIARIO");

return(0);

}

El SlowMAPeriod es 200. Cuando hago un backtest a partir del 01.01.2009 me da este error aunque puedo ver claramente en mi gráfico que hay suficientes barras para calcular la SMA de 200 desde 2008. ¿Me estoy perdiendo algo aquí?

2. Coloco operaciones del gráfico H4 pero sólo en la dirección de la tendencia diaria. Dibujo los valores utilizando el siguiente código:

SlowMACurrent = iMA(Symbol(), PERIOD_D1, D1SlowMAPeriod, 0, MODE_SMA, PRICE_CLOSE, 1);

FastMACurrent = iMA(Symbol(), PERIOD_D1, D1FastMAPeriod, 0, MODE_SMA, PRICE_CLOSE, 1);

Luego, cuando busco una posición larga, hago referencia a ella mediante

if (FastMACurrent > SlowMACurrent && ... etc ... )

¿Es esto correcto ya que no parece estar filtrando mis operaciones correctamente?

3. También utilizo un filtro de tendencia en el gráfico H4 tomando sólo posiciones largas cuando el precio ha superado el máximo anterior de los últimos 120 períodos (y luego se mantiene por encima del mínimo de los 120 períodos). Utilizo este código:

Donchian_Low = Low;

Donchian_High = High;

static bool UpTrend = FALSE;

static bool DownTrend = FALSE;

if (Ask > Donchian_High) {UpTrend = TRUE; DownTrend = FALSE;}

if (Bid < Donchian_Low) {UpTrend = FALSE; DownTrend = TRUE;}

Entonces uso el siguiente código (digamos que para posiciones largas)

if (FastMACurrent > SlowMACurrent && UpTrend == TRUE && DownTrend == FALSE ... etc ... )

Pero parece que no funciona porque cuando compruebo mi gráfico backtested contra un Canal de Donchian de 120 Periodos no empata. ¿Alguna idea?

Gracias de antemano.

 

...

1. Colócalo al inicio de la función start(). Init no es fiable cuando se trata de datos como Bares

2. Esa condición es verdadera siempre que FastMACurrent > SlowMACurrent. ¿Es eso lo que querías o quizás estás buscando cruces?

3. Probablemente esté relacionado con el punto 2. Hay que "acotar" las condiciones en las que se pueden introducir órdenes ya que de esta forma se cubren demasiadas posibilidades

crsnape@btinternet.com:
Hola a todos,

He probado mi código y casi lo tengo. Tengo algunas dudas que espero me puedan ayudar.

He puesto esto en int init():

if (Bars < D1FastMAPeriod || Bars < D1SlowMAPeriod)

{

Alert("ERROR- BARRAS INSUFICIENTES PARA CALCULAR LA SMA EN EL GRÁFICO DIARIO");

return(0);

}

El SlowMAPeriod es 200. Cuando hago un backtest desde el 01.01.2009 me da este error, aunque puedo ver claramente en mi gráfico que hay suficientes barras para calcular la SMA de 200 desde 2008. ¿Me estoy perdiendo algo aquí?

2. Coloco operaciones del gráfico H4 pero sólo en la dirección de la tendencia diaria. Dibujo los valores utilizando el siguiente código:

SlowMACurrent = iMA(Symbol(), PERIOD_D1, D1SlowMAPeriod, 0, MODE_SMA, PRICE_CLOSE, 1);

FastMACurrent = iMA(Symbol(), PERIOD_D1, D1FastMAPeriod, 0, MODE_SMA, PRICE_CLOSE, 1);

Luego, cuando busco una posición larga, hago referencia a ella mediante

if (FastMACurrent > SlowMACurrent && ... etc ... )

¿Es esto correcto ya que no parece estar filtrando mis operaciones correctamente?

3. También utilizo un filtro de tendencia en el gráfico H4 tomando sólo posiciones largas cuando el precio ha superado el máximo anterior de los últimos 120 períodos (y luego se mantiene por encima del mínimo de los 120 períodos). Utilizo este código:

Donchian_Low = Low;

Donchian_High = High;

static bool UpTrend = FALSE;

static bool DownTrend = FALSE;

if (Ask > Donchian_High) {UpTrend = TRUE; DownTrend = FALSE;}

if (Bid < Donchian_Low) {UpTrend = FALSE; DownTrend = TRUE;}

Entonces uso el siguiente código (digamos que para posiciones largas)

if (FastMACurrent > SlowMACurrent && UpTrend == TRUE && DownTrend == FALSE ... etc ... )

Pero parece que no funciona porque cuando compruebo mi gráfico backtested contra un Canal de Donchian de 120 Periodos no empata. ¿Alguna idea?

Gracias de antemano.
 

Hola mladen,

1. De acuerdo, lo haré.

2. Por ejemplo, si la MA rápida está por encima de la MA lenta en el gráfico diario, sólo quiero que considere las posiciones largas en el gráfico H4. ¿Entonces creo que he codificado esto correctamente?

3. No estoy seguro de lo que quieres decir, pero he puesto esto bajo init start()

static bool UpTrend = FALSE;

static bool DownTrend = FALSE;

if (Ask > Donchian_High) {UpTrend = TRUE; DownTrend = FALSE;}

if (Bid < Donchian_Low) {UpTrend = FALSE; DownTrend = TRUE;}

¿Debo poner las variables bool estáticas al principio para hacerlas globales? ¿Podría ser esta la causa?

 

...

3. Qué pasa cuando Pregunta Donchian_Low (que es la mayoría de las veces). Tus variables estáticas siguen mostrando los estados "antiguos" aunque ya no sean válidos ("hereda" el estado y así está señalando que está por encima o por debajo aunque ya no lo esté). Comprueba si eso es lo que te está causando problemas

crsnape@btinternet.com:
Hola mladen,

1. Con OK bastará.

2. Por ejemplo, si la MA rápida está por encima de la MA lenta en el gráfico diario, sólo quiero que considere posiciones largas en el gráfico H4. ¿Entonces creo que he codificado esto correctamente?

3. No estoy seguro de lo que quieres decir, pero he puesto esto bajo init start()

static bool UpTrend = FALSE;

static bool DownTrend = FALSE;

if (Ask > Donchian_High) {UpTrend = TRUE; DownTrend = FALSE;}

if (Bid < Donchian_Low) {UpTrend = FALSE; DownTrend = TRUE;}

¿Debería poner las variables bool estáticas al principio para hacerlas globales? ¿Podría ser esta la causa?
 

Buen punto. Voy a echar un vistazo a eso.

Una pregunta sobre las funciones, ¿es posible llamar a una función dentro de otra función? Por ejemplo, tengo esta función:

string GetWinLossPreviousShort (int LastOpenTicket, string WinLossPreviousShort)

{

si (... etc

Para luego llamarla

double GetLotsLong (int LowRisk, int HighRisk, double SLDistanceLong, string GetWinLossPreviousShort)