Ayuda a la codificación - página 100

 
dasssi:
mladen

primero espero que ya no estes enojado conmigo..

segundo tengo un error al intentar cargar el Ea

dasssi

Intenta cambiar el nombre del EA (debido a la letra francesa en el nombre podría estar causando un problema - ningún otro problema puede ser la causa de eso ya que es un EA muy simple)

 

gracias ahora funciona/

no se ve bien en el probador de estrategias

 
dasssi:
gracias funciona ahora / no se ve bien en el probador de la estrategia

Es sólo un ejemplo de cómo un indicador debe ser llamado desde un ea cuando se trata de señales. Lejos de ser un EA completo (eche un vistazo a los nuevos EAs en la sección de élite y avanzada y compare el código - usted verá lo que quiero decir). Por lo tanto, era sólo una ayuda a After-rage para resolver su problema de codificación

 

Gracias. Funciona bien para entrar en posiciones. No sé por qué mi EA no funciona, pero no importa. Así que traté de añadir el código para cerrar las órdenes, pero no funciona también. Es extraño porque tomé el código de la estructura para las posiciones de entrada y sólo dupliqué el volumen del lote. ¿Puedes echar un vistazo?

Archivos adjuntos:
 
After-rage:
¡Gracias! Funciona bien para las posiciones de entrada. No sé por qué mi EA no funcionó pero no importa. Así que trato de añadir el código para cerrar las órdenes, pero no funciona también. Es extraño porque tomé el código de la estructura para las posiciones de entrada y sólo dupliqué el volumen del lote. ¿Puedes echar un vistazo?

Después de la rabia

Una forma de hacerlo (cerrar una orden abierta cuando la señal cambia) está en el código ahora

Archivos adjuntos:
 

Muchas gracias. Funciona muy bien. Voy a trabajar en esto y ver por qué me equivoqué.

 

Por ejemplo, me gustaría tener un CCI cuyo período sea igual al ATR, de modo que cuando el ATR cambie, el período del CCI también cambie. El problema es que no sé cómo reiniciar el indicador a través de código... he intentado llamar a init() cuando la nueva barra está abierta y el período cambia correctamente, pero el indicador no se actualiza... el valor de la última barra es correcto, pero quiero que todo el indicador se vuelva a pintar con la nueva configuración... Espero haber sido claro... Gracias.

 
AtApi:
Por ejemplo, me gustaría tener un CCI cuyo periodo sea igual al ATR, de manera que cuando el ATR cambie, el periodo del CCI también cambie. El problema es que no sé cómo reiniciar el indicador a través de código... he intentado llamar a init() cuando la nueva barra está abierta y el período cambia correctamente, pero el indicador no se actualiza... el valor de la última barra es correcto, pero quiero que todo el indicador se vuelva a pintar con la nueva configuración... Espero haber sido claro... Gracias.

Si quieres volver a pintar todos los valores del indi, simplemente pon la cuenta del bucle principal en el inicio a Bars-1 y calcula los valores con la nueva configuración

 

Gracias mladen por su rápida respuesta...

por favor, eche un vistazo a este ejemplo:

extern int IndicatorPeriod = 10;

extern int AtrPeriod= 10;

extern bool DynamicPeriod = TRUE;

int init()

{

if (DynamicPeriod)

{

double atr = NormalizeDouble(100*iATR(0,0,AtrPeriod,0),0);

IndicatorPeriod = atr;

}

}

int start()

{

datetime lastBarOpenTime;

datetime thisBarOpenTime = Time[0];

if (DynamicPeriod)

{

if(thisBarOpenTime != lastBarOpenTime)

{

lastBarOpenTime = thisBarOpenTime;

init();

}

}

int i,counted_bars=IndicatorCounted();

if(counted_bars<0) return(-1);

if(counted_bars>0) counted_bars--;

// is this what you are talking about?

int limit=MathMin(Bars-counted_bars,Bars-1);

for(i=limit; i>=0; i--) //MAIN LOOP

{

wherever calculation

}

}

 
AtApi:
Gracias mladen por tu rápida respuesta...

por favor, eche un vistazo a este ejemplo:

extern int IndicatorPeriod = 10;

extern int AtrPeriod= 10;

extern bool DynamicPeriod = TRUE;

int init()

{

if (DynamicPeriod)

{

double atr = NormalizeDouble(100*iATR(0,0,AtrPeriod,0),0);

IndicatorPeriod = atr;

}

}

int start()

{

datetime lastBarOpenTime;

datetime thisBarOpenTime = Time[0];

if (DynamicPeriod)

{

if(thisBarOpenTime != lastBarOpenTime)

{

lastBarOpenTime = thisBarOpenTime;

init();

}

}

int i,counted_bars=IndicatorCounted();

if(counted_bars<0) return(-1);

if(counted_bars>0) counted_bars--;

// is this what you are talking about?

int limit=MathMin(Bars-counted_bars,Bars-1);

for(i=limit; i>=0; i--) //MAIN LOOP

{

wherever calculation

}

}

AtApi

Si quieres guardar los valores en el buffer (un valor por tiempo exacto para esa barra) entonces sí, esa es la forma correcta. Pero si quieres que todas las barras sean "repintadas", entonces configura el linit para que sea siempre igual aBars-1