¿Cómo codificar? - página 322

 

Hola,

mi solicitud es sólo para información, por el momento.

¿Si tengo un indicador que crea un gráfico offline sin calcular el pasado sino sólo los datos en vivo es posible adjuntarlo en la plantilla del probador de estrategias y crear un gráfico offline con los datos del historial?

Gracias.

 
mladen:
jayjonbeach,

Está probando el valor de trendCurr una y otra vez en el bucle sin cambiarlo (por lo que siempre devolverá NONE)

Intenta poner el iCustom() en el bucle y luego prueba ese valor. Algo como esto :

if (trendCurr>0)

{

for(int i=1; i<=lookback; i++)

{

int testValue = iCustom(NULL,StepMaTimeFrame,"StepMA_v7",Length,Kv,StepSize,MA_Mode,Advance,Percentage,UpDownShift,HighLow,ColorMode,5,StepMaBarToTest+i);

if (testValue<0) return(LONG);

}

return(NONE);

}

Estimado señor. Sólo tengo dos palabras sobre esto, pero vale la pena repetirlas...

¡¡¡GRACIAS, GRACIAS y GRACIAS!!!

Efectivamente, tu código funcionó perfectamente, y apostaría a que me ahorraste otras12 o muchas más horas de examinar otros bucles 'for', de prueba y error, etc. antes de que finalmente diera con lo que publicaste.

En realidad pensé que quería probar trendCurr una y otra vez en el bucle, pero ahora veo el error gracias a ti, y veo cómo tu solución de cambiar el Stepbartotest con "i" es de hecho la solución perfecta, el uso de "i" aquí es en realidad la clave, sin embargo, no parece del todo obvio, al menos para un novato como yo podría haber pasado algún tiempo antes de que me diera cuenta de esto...

Mientras que tu código funcionó como se pretendía, mi bloque completo no, hay un resultado no intencionado muy interesante al tener este bucle ejecutado dentro del criterio LONG:

if(VeintiunaEMA > CincuentaCincoEMA)

{

if (trendCurr>0) // comprueba la corriente del filtro de pasos

{

if (Oferta > VeintiunaEMA)

{

for(int i=0; i<=lookback; i++)

{

int testValue = iCustom(NULL,StepMaTimeFrame, "StepMA_v7",Length,Kv,StepSize,MA_Mode,Advance,Percentage,UpDownShift,HighLow,ColorMode,5,StepMaBarToTest+i);

if (testValue<0) return(LONG);

}

return(NONE);

}

}

}

Lo que ocurre ahora, es que cuando se cumplen los ifs, el bucle se comprueba y si es cierto compra, si no no hace nada, genial. Sin embargo, todo el bloque de código está actuando como un bucle "while", ya que mientras if(TwentyOneEMA > FiftyFiveEMA) sea verdadero, el resto del código que está debajo SIGUE ejecutándose, y si las demás condiciones se hacen todas verdaderas, ¡el tonto compra! Veo el error obvio de mi estructura de código aquí.... (Estoy pensando que otro bucle for similar podría probar las EMA's, para asegurarse de que el cruce de EMA es uno NUEVO)

Esto no es necesariamente una mala cosa sin embargo (como algunos análisis implicaría), de hecho esto es un poco como lo que mi próximo objetivo era, de una manera diferente, necesita mucho más pruebas, pero por ahora voy a dejar esta revisión en su lugar en este bot y comenzar las próximas revisiones en una copia.

Lo que iba a hacer después de conseguirlo mirando al pasado, era si el bucle pasado resulta falso, quería que comprobara las PRÓXIMAS 10 barras para una señal de Paso, y si se convierte en verdadero, tomar el comercio (estaba pensando en usar un bucle while para esto?). Así que esto ya está sucediendo, excepto que NO hay un límite de 10 barras en su mirada hacia adelante, y no estoy seguro de cómo debo estructurar todo el asunto para que funcione correctamente. (Creo que podría comprobar la señal de paso, y si es cierto buscar un nuevo cruce de MA en las últimas 10 barras, pero tengo que repetir todo el bloque para esto y creo que debe haber una mejor manera más eficiente / elegante)

Gracias de nuevo por su ayuda, esto va a venir en muy útil en el futuro la codificación estoy seguro.

 

Hola,

Intento modificar el indicador adjunto. Prácticamente cuando un everage móvil toca el precio se alarma y cambia el marco de tiempo donde se toca. Puse un retardo en la alarma que es el respeto, pero después de una alarma si cambio el marco de tiempo que ingnore.

¿Se puede arreglar?

Graciasmedie_mobili.mq4

Archivos adjuntos:
 

dasio

Con los indicadores no se puede cambiar eso. Los indicadores restablecen el alcance global y las variables estáticas a los valores por defecto cuando haces eso, así que no puedes mantener algunos valores cuando cambias de marco de tiempo o de símbolo. Podrías utilizar las variables globales (las que se gestionan con las funciones "GlobalVariable...") pero eso complicaría mucho tu código (para múltiples instancias, múltiples símbolos, ...) y en mi opinión no merece la pena el esfuerzo

dasio:
Hola,

Intento modificar el indicador adjunto. Prácticamente cuando un everage móvil toca el precio se alarma y cambia el marco de tiempo donde se toca. Pongo un retardo en la alarma que se respeta pero después de una alarma si cambio el timeframe lo ingnora.

¿Se puede arreglar?

Graciasmedie_mobili.mq4
 

...

Sólo una adición al post anterior: una cosa que no es tan conocida - EAs están tratando esas variables (alcance global y variables estáticas) de manera diferente - no se restablecen cuando el marco de tiempo o el símbolo se cambia. Aquí hay un EA muy, muy simple que mostrará a aquellos que estén interesados en él cómo esos valores no se restablecen en los EAs como en los indicadores

int counter = 0;

int init()

{

return(0);

}

int start()

{

static int counterStart = 0;

counterStart++;

counter++;

Comment("counter from start : "+counterStart," counter using global scope : "+counter);

return(0);

}

Esto es incluso una causa de algunos errores en algunos Eas (si el EA no tiene en cuenta que la variable no se va a restablecer cuando el marco de tiempo o el símbolo se cambian algunos errores muy extraños en el trabajo de EA puede suceder)

 
mladen:
dasio Del código no puedo ver cuál es la intención del código. De todas formas, aquí tienes un código en el que puedes elegir si quieres utilizar el rango real como valor "básico" del indicador (es la primera parte de tu código) o quieres utilizar la segunda parte de tu código como valor "básico"

Otra vez gracias mladen.

¿Es posible añadir otra línea basada en esta condición?

¿Dibujar una línea horizontal = al everage de los Work[] que son > de Avg[] siempre basados en días periodo?

Gracias

 

Enmienda de la señal

Hola Mladen,

Quiero añadir parada de venta o parada de la señal de compra a este código .....e.g si la línea de la señal estocástica es más de la principal, dejar de vender e.t.c, he añadido al código, pero no está funcionando ... pls ayuda

if(Period()==240)

{

static datetime lastAlerted=0;

double ist_main=iStochastic(NULL,240,8,3,3,MODE_SMA,0,MODE_MAIN,0);

double ist_signal=iStochastic(NULL,240,8,3,3,MODE_SMA,0,MODE_SIGNAL,0);

double RSIP1=iRSI(NULL,240,14,PRICE_CLOSE,0);

double RSIP2=iRSI(NULL,240,70,PRECIO_CIERRE,0);

double b4enCCI=iCCI(NULL,240,6,PRECIO_TIPICO,1);

double nowenCCI=iCCI(NULL,240,6,PRECIO_TIPICO,0);

double b4trCCI=iCCI(NULL,240,14,PRECIO_TIPICO,1);

double nowtrCCI=iCCI(NULL,240,14,PRECIO_TIPICO,0);

// alertas

if((ist_main>ist_signal)&&(RSIP1>RSIP2)&&(nowenCCI >0&&nowenCCI>b4enCCI)&&(nowtrCCI>0&&nowtrCCI>b4trCCI)&&(lastAlerted!=Time[0]))

{

lastAlerted=Time[0]; Alert("Flecha de compra","\n", "Lahora actual es ",TimeToStr(CurTime()),"\n",Symbol());

}

if((ist_main<ist_signal)&&(RSIP1<RSIP2)&&(nowenCCI <0&&nowenCCI<b4enCCI)&&(nowtrCCI<0&&nowtrCCI<b4trCCI)&&(lastAlerted!=Time[0]))

{

lastAlerted=Time[0]; Alert("Flecha de venta","\n", "La hora actual es ",TimeToStr(CurTime()),"\n",Symbol());

}

}

 

Puedes probar algo como esto:

if(Period()==240)

{

static datetime lastAlerted=0;

double ist_main=iStochastic(NULL,240,8,3,3,MODE_SMA,0,MOD E_MAIN,0);

double ist_signal=iStochastic(NULL,240,8,3,3,MODE_SMA,0,M ODE_SIGNAL,0);

double RSIP1=iRSI(NULL,240,14,PRICE_CLOSE,0);

double RSIP2=iRSI(NULL,240,70,PRICE_CLOSE,0);

double b4enCCI=iCCI(NULL,240,6,PRICE_TYPICAL,1);

double nowenCCI=iCCI(NULL,240,6,PRICE_TYPICAL,0);

double b4trCCI=iCCI(NULL,240,14,PRICE_TYPICAL,1);

double nowtrCCI=iCCI(NULL,240,14,PRICE_TYPICAL,0);

// alerts

alertType = "do nothing";

if((ist_main>ist_signal)&&(RSIP1>RSIP2)&&(nowenCCI >0&&nowenCCI>b4enCCI)&&(nowtrCCI>0&&nowtrCCI>b4trC CI)&&(lastAlerted!=Time[0]))

{

lastAlerted=Time[0]; Alert("Buy Arrow","\n","Current time is ",TimeToStr(CurTime()),"\n",Symbol()); alertType="buy";

}

if((ist_main<ist_signal)&&(RSIP1<RSIP2)&&(nowenCCI <0&&nowenCCI<b4enCCI)&&(nowtrCCI<0&&nowtrCCI<b4trC CI)&&(lastAlerted!=Time[0]))

{

lastAlerted=Time[0]; Alert("Sell Arrow","\n","Current time is ",TimeToStr(CurTime()),"\n",Symbol()); alertType="sell";

}

if (alertType=="do nothing")

{

lastAlerted=Time[0]; Alert("Stop previous action","\n","Current time is ",TimeToStr(CurTime()),"\n",Symbol());

}

}
Mastercash:
Hola Mladen,

Quiero añadir parada de venta o parada de la señal de compra a este código .....e.g si la línea de la señal estocástica es más de la principal, dejar de vender e.t.c, he añadido al código, pero no está funcionando ... pls ayuda

if(Period()==240)

{

static datetime lastAlerted=0;

double ist_main=iStochastic(NULL,240,8,3,3,MODE_SMA,0,MODE_MAIN,0);

double ist_signal=iStochastic(NULL,240,8,3,3,MODE_SMA,0,MODE_SIGNAL,0);

double RSIP1=iRSI(NULL,240,14,PRICE_CLOSE,0);

double RSIP2=iRSI(NULL,240,70,PRECIO_CIERRE,0);

double b4enCCI=iCCI(NULL,240,6,PRECIO_TIPICO,1);

double nowenCCI=iCCI(NULL,240,6,PRECIO_TIPICO,0);

double b4trCCI=iCCI(NULL,240,14,PRECIO_TIPICO,1);

double nowtrCCI=iCCI(NULL,240,14,PRECIO_TIPICO,0);

// alertas

if((ist_main>ist_signal)&&(RSIP1>RSIP2)&&(nowenCCI >0&&nowenCCI>b4enCCI)&&(nowtrCCI>0&&nowtrCCI>b4trCCI)&&(lastAlerted!=Time[0])

{

lastAlerted=Time[0]; Alert("Flecha de compra","\n", "La hora actual es ",TimeToStr(CurTime()),"\n",Symbol());

}

if((ist_main<ist_signal)&&(RSIP1<RSIP2)&&(nowenCCI <0&&nowenCCI<b4enCCI)&&(nowtrCCI<0&&nowtrCCI<b4trCCI)&&(lastAlerted!=Time[0]))

{

lastAlerted=Time[0]; Alert("Flecha de venta","\n", "La hora actual es ",TimeToStr(CurTime()),"\n",Symbol());

}

}
 

Bueno, estoy atascado de nuevo. Estoy tratando de corregir el EA de mirar hacia el futuro debido a la forma en que mi código fue estructurado.

Mi código de la señal comienza con un "si", y siempre y cuando eso es cierto, el resto del código siguiente sigue ejecutando, como debería (esto no era un problema antes de insertar el primer bucle for, pero ahora es). Así que he intentado un montón de cosas diferentes para corregir esto, pero nada está funcionando También he comprobado el manual, pero nada se destacó allí, tal vez dos "para" bucles en el mismo bloque no está permitido?

Aquí está lo que creo que es mi mejor esfuerzo (sólo mostrando LONG para la brevedad), no hay errores, pero el EA no hace operaciones, por lo que probablemente he jodido el bucle de nuevo:

if (NumOrders == 0)

{

if(VeintiunaEMA > CincuentaCincoEMA+Separación)

{

if (trendCurr>0)

{

for(int i=0; i<=lookbackma; i++)

int testValue1 = iMA(NULL,0,EMA1,0,MODE_EMA,PRICE_CLOSE,i);

int testValue2 = iMA(NULL,0,EMA2,0,MODE_EMA,PRICE_CLOSE,i);

if (testValue1 < testValue2-Separación2)

{

if (Bid TwentyOneEMA) // filtro de noticias

{

for(i=0; i<=lookback; i++)

{

int testValue3 = iCustom(NULL,StepMaTimeFrame, "StepMA_v7",Length,Kv,StepSize,MA_Mode,Advance,Percentage,UpDownShift,HighLow,ColorMode,5,StepMaBarToTest+i);

if (testValue3 <0 && NumOrders < maxorders) return(LONG);

}

return(NONE);

}

}

}

}

}

==========

Nota: Intenté if (testValue1 < testValue2-Separation2) continue; pero marcó 'continue' como un error Si no se permiten 2 bucles, entonces supongo que mi siguiente tarea de añadir otro bucle podría ser errónea...

 
jayjonbeach:
Bueno estoy atascado de nuevo. Estoy tratando de corregir el EA de mirar hacia el futuro debido a la forma en que mi código fue estructurado.

Mi código de señalización comienza con un "if", y mientras eso sea cierto, el resto del código que sigue se sigue ejecutando, como debería (esto no era un problema antes de insertar el primer bucle for, pero ahora sí). Así que he intentado un montón de cosas diferentes para corregir esto, pero nada está funcionando También he comprobado el manual, pero nada se destacó allí, tal vez dos "para" bucles en el mismo bloque no está permitido?

Aquí está lo que creo que es mi mejor esfuerzo (sólo mostrando LONG para la brevedad), no hay errores, pero el EA no hace operaciones, por lo que probablemente he jodido el bucle de nuevo:

if (NumOrders == 0)

{

if(VeintiunaEMA > CincuentaCincoEMA+Separación)

{

if (trendCurr>0)

{

for(int i=0; i<=lookbackma; i++)

int testValue1 = iMA(NULL,0,EMA1,0,MODE_EMA,PRICE_CLOSE,i);

int testValue2 = iMA(NULL,0,EMA2,0,MODE_EMA,PRICE_CLOSE,i);

if (testValue1 < testValue2-Separación2)

{

if (Bid TwentyOneEMA) // filtro de noticias

{

for(i=0; i<=lookback; i++)

{

int testValue3 = iCustom(NULL,StepMaTimeFrame, "StepMA_v7",Length,Kv,StepSize,MA_Mode,Advance,Percentage,UpDownShift,HighLow,ColorMode,5,StepMaBarToTest+i);

if (testValue3 <0 && NumOrders < maxorders) return(LONG);

}

return(NONE);

}

}

}

}

}

==========

Nota: Intenté con if (testValue1 < testValue2-Separation2) continue; pero marcó 'continue' como un error . Si no se permiten 2 bucles, entonces supongo que mi próxima tarea de añadir otro bucle podría ser errónea...

Bien, creo que lo he descubierto, era la forma en que estructuré el bucle for, porque las cosas no iban a "terminar" directamente después de este primer bucle, necesitaba ser estructurado de forma ligeramente diferente al segundo bucle, al menos esa es la conclusión a la que llegué mirando algunos otros bots. Una prueba rápida muestra que lo siguiente funciona, aunque hay que hacer más pruebas

NumOrders = CalculateCurrentOrders();

if (NumOrders == 0)

{

if(VeintiunaEMA > CincuentaCincoEMA+Separación)

{

if (trendCurr>0)

{

for(int i=0; i<=lookbackma; i++)

{

int testValue1 = iMA(NULL,0,EMA1,0,MODE_EMA,PRICE_CLOSE,i);

int testValue2 = iMA(NULL,0,EMA2,0,MODE_EMA,PRICE_CLOSE,i);

si (testValue1 <! testValue2-Separación2)

{

Print("No Trade");

romper;

}

if (Bid TwentyOneEMA) continue; // filtro de noticias

for(int j=0; j<=lookback; j++)

{

int testValue3 = iCustom(NULL,StepMaTimeFrame, "StepMA_v7",Length,Kv,StepSize,MA_Mode,Advance,Percentage,UpDownShift,HighLow,ColorMode,5,StepMaBarToTest+j);

if (testValue3 <0 && NumOrders < maxorders) return(LONG);

}

return(NONE);

}

}

}

}