¿Cómo codificar? - página 119

 

Estoy tratando de averiguar si esto está mal;

for (int i=qqea_alert_x_candles_ago; i>0; i--) {

// int i = 1;

qqea_up = iCustom(NULL,0, "QQE Alert v3",0,i);

qqea_down = iCustom(NULL,0, "QQE Alert v3",1,i);

if (qqea_up < qqea_down) {

si (i == 1) qqeacross = True;

qqea_long = True

qqea_short = False;

} else if (qqea_up > qqea_down) {

si (i == 1) qqeacross = True

qqea_long = False

qqea_short = True;

}

}

}

debería comprobar si la señal es válida hasta las barras "qqea_alert_x_candles_ago", pero entonces tiene (i == 1) que i==1 sólo ocurre una vez ?

 
matrixebiz:
Estoy tratando de averiguar si esto es incorrecto;

for (int i=qqea_alert_x_candles_ago; i>0; i--) {

// int i = 1;

qqea_up = iCustom(NULL,0, "QQE Alert v3",0,i);

qqea_down = iCustom(NULL,0, "QQE Alert v3",1,i);

Print("qqea_up: ", qqea_up, "qqea_down: ", qqea_down);

si (qqea_up < qqea_down) {

si (i == 1) qqeacross = True;

qqea_largo = True

qqea_short = False;

} else if (qqea_up > qqea_down) {

si (i == 1) qqeacross = True

qqea_long = False

qqea_short = True;

}

}

}

debería comprobar si la señal es válida hasta las barras "qqea_alert_x_candles_ago", pero entonces tiene (i == 1) que i==1 sólo ocurre una vez?

A simple vista tu código parece correcto, eso suponiendo que "qqea_alert_x_candles_ago" > 0.

Su problema si esto no está funcionando es más que probable en relación con iCustom.

Para que esta función funcione correctamente necesitas pasar un elemento de entrada por cada elemento de entrada en el indicador real. Si no lo hace, o pasa los tipos de datos incorrectos, icustom no devolverá nada.

He añadido una sentencia Print en el código anterior. Utilícela para determinar si los valores devueltos por iCustom contienen realmente algo.

Saludos,

Hiachiever

 

Necesito ayuda con el código para contar barras

Mi EA tiene una serie de opciones para calcular el stoploss de una posición abierta. Una de esas opciones es utilizar el mínimo del último "x" número de barras de precios.

La línea de código que se utiliza actualmente dentro del EA para calcular el stoploss (SL) de esta opción para una posición larga es

SL=iLow(Symbol(),Period(),iLowest(Symbol(),Period(),MODE_LOW,StopLossBars,0));

StopLossBars es una variable de entrada externa.

El problema que tengo es que quiero que el valor de StopLossBars aumente con cada barra contada desde que se abrió la posición hasta que una de mis otras condiciones para el stoploss sobrepase esta condición. Supongo que una línea de código como

StopLossBars = StopLossBars + BarsCountedSincePositionOpened

haría el truco. Desafortunadamente mi codificación está bastante limitada a cortar y pegar y no sé cómo calcular o codificar BarsCountedSincePositionOpened.

¿Podría alguien decirme cómo hacerlo, por favor?

 
hiachiever:
A primera vista tu código parece correcto, es decir, asumiendo que "qqea_alert_x_candles_ago" > 0.

Su problema si esto no está funcionando es más que probable en relación con iCustom.

Para que esta función funcione correctamente es necesario pasar un elemento de entrada por cada elemento de entrada en el indicador real. Si no lo hace, o pasa los tipos de datos incorrectos, icustom no devolverá nada.

He añadido una sentencia Print en el código anterior. Utilícela para determinar si los valores devueltos por iCustom contienen realmente algo.

Saludos,

Hiachiever

El código es de otro EA pero estaba pensando que cuando el bucle va a "qqea_alert_x_candles_ago" > 1 entonces esta declaración "if (i == 1) qqeacross = True;" sería False ahora, ¿correcto? Cuando debería seguir siendo True hasta que i>qqea_alert_x_candles_ago.

 

Ayuda a

Estimados todos,

Tengo esta codificación de un colega. Él me dijo, que debe ser un muy buen indicador de señalización SMA entradas hacia arriba o hacia abajo. ¿Puede alguien ayudarme a crear un indicador con esta codificación a continuación.

/*[[

Nombre := SMA Up and Down

Ventana separada := no

Primer Color := Azul

Primer Tipo de Dibujo:= Línea

Usar Segundo Dato := Si

Segundo Color := Rojo

Segundo Tipo de Dibujo := Línea

]]*/

Entradas : MAPeriod(10), Bandwide_UP(20),Bandwide_DOWN(20);

Variables : shift(0), cnt(0), sum(0), loopbegin1(0), loopbegin2(0), first(True), prevbars(0);

Variables : MA(0);

SetLoopCount(0);

// comprobaciones iniciales

Si MAPeriod < 1 Then Exit;

// comprueba la carga de barras adicionales o la recarga total

Si Bars 1 Entonces primero = True;

prevbars = Bars;

// loopbegin1 y loopbegin2 impiden el recuento de las barras contadas excluyendo las actuales

Si first Entonces Begin

loopbegin1 = Bars-MAPeriod-1;

Si loopbegin1 < 0 Then Exit; // no hay suficientes barras para contar

loopbegin2 = Bars-MAPeriod-1;

If loopbegin2 < 0 Then Exit; // no hay suficientes barras para el recuento

first = False; // este bloque debe ser evaluado una sola vez

Fin;

// convergencia-divergencia

loopbegin1 = loopbegin1+1; // la barra actual debe ser contada también

Para shift = loopbegin1 Downto 0 Begin

MA = iMA(MAPeriod,MODE_SMA,shift);

SetIndexValue(shift,(MA+Bandwide_UP*point));

SetIndexValue2(shift,(MA-Bandwide_DOWN*punto));

loopbegin1 = loopbegin1-1; // evitar el recuento de barras anteriores

Fin;

Un saludo,

Rogerio

 

necesito ayuda con el código

necesito ayuda con el siguiente código de momento sólo abre una orden si AC está por encima o por debajo de cero y quiero que se abra si el rojo cambia a verde y visa verser

double AC1 = iAC(NULL, 0, Current + 0);

double AC2 = iAC(NULL, 0, Current + 1);

if ((AC1 < AC2)) Orden = SIGNAL_CLOSEBUY;

 
matrixebiz:
El código es de otro EA pero estaba pensando que cuando el bucle llega a "qqea_alert_x_candles_ago" > 1 entonces esta declaración "if (i == 1) qqeacross = True;" sería False ahora, ¿correcto? Cuando debería seguir siendo True hasta i>qqea_alert_x_candles_ago.

No, eso no es correcto.

En el bucle for estás empezando en 6 y decrementando hasta 1. Esto significa que en el bucle final que ejecuta el bucle for lleva a cabo la comprobación"if (i == 1) qqeacross = True;". El resultado final es que la salida será verdadera si qqeacross ha ocurrido.

El único problema que esto puede presentar es si qqeacross fue establecido como verdadero en un looop anterior. Para superar esto debe tener qqeacross = false; antes del bucle for. De esta forma te aseguras que si qqeacross = true, entonces fue establecido por el bucle que acaba de terminar.

Saludos,

hiachiever

 
Pussy Galore:
Mi EA tiene varias opciones para calcular el stoploss de una posición abierta. Una de esas opciones es utilizar el mínimo de las últimas "x" barras de precio.

La línea de código utilizada actualmente dentro del EA para calcular el stoploss (SL) de esta opción para una posición larga es

SL=iLow(Symbol(),Period(),iLowest(Symbol(),Period(),MODE_LOW,StopLossBars,0));

StopLossBars es una variable de entrada externa.

El problema que tengo es que quiero que el valor de StopLossBars aumente con cada barra contada desde que se abrió la posición hasta que una de mis otras condiciones para el stoploss sobrepase esta condición. Supongo que una línea de código como

StopLossBars = StopLossBars + BarsCountedSincePositionOpened

haría el truco. Desafortunadamente mi codificación es bastante limitada a cortar y pegar y no sé cómo calcular o codificar BarsCountedSincePositionOpened.

¿Podría alguien decirme cómo hacerlo, por favor?

La forma de hacerlo es crear un vriable en el ámbito global (es decir, antes de init)

por ejemplo

int BarCount;

int init ()

Luego en su código de stop loss utilice lo siguiente:

if (BarCount<Bars)

{

SL=iLow(Symbol(),Period(),iLowest(Symbol(),Period(),MODE_LOW,StopLossBars,0));

StopLossBars++;

BarCount=Bares;

}

Esto incrementará StopLossBars en 1 en cada nueva barra.

La única otra adición a su código sería restablecer 'StopLossBars' a su valor original por defecto cuando se abre una nueva operación.

Saludos,

Hiachiever

 
denis68:
necesito ayuda con el siguiente código por el momento sólo abre una orden si AC está por encima o por debajo de cero y quiero que se abra si el rojo cambia a verde y visa verser

double AC1 = iAC(NULL, 0, Current + 0);

double AC2 = iAC(NULL, 0, Current + 1);

if ((AC1 < AC2)) Orden = SIGNAL_CLOSEBUY;

Bueno, lo que hice fue abrir o mostrar los otros dos buffers en el código del indicador rem'ing estas dos líneas;

// SetIndexLabel(1,NULL);

// SetIndexLabel(2,NULL);

Luego con mi AC modificado hice una llamada a iCustom;

double ac1 = iCustom(NULL, 0, "AcceleratorMod", 1, 1);

double ac2 = iCustom(NULL, 0, "AcceleratorMod", 2, 1);

double ac11 = iCustom(NULL, 0, "AcceleratorMod", 1, 2);

double ac22 = iCustom(NULL, 0, "AcceleratorMod", 2, 2);

bool acbuy = ac2==0 && ac11==0; // El rojo cambia a verde

bool acsell = ac1==0 && ac22==0; // El verde cambia a rojo

Espero que esto ayude

 

matrixebiz a que te refieres con remover estas dos líneas; y como lo hago, no puedo entrar al código del indicador AC que he intentado,