Ayuda a la codificación - página 557

 
mntiwana:
Estimado MLADEN,

Puede ser mi solicitud anterior borrado accidentalmente como la mayoría de las cosas que se ejecutan aquí y allá, buscando y ajustar su lugar exacto, pero estamos fácil y la comodidad con hacer nuestro trabajo, como un recordatorio que le solicite para algunos simples trailing stop con el código de BE que quiero añadir / fusionar en la EA adjunto que alteré con su amable ayuda y orientación, pero no estoy en la prisa, cuando es posible para usted, yo sé lo mucho que se extendió y esperando por usted, gracias.

saludos

simple_ma_cross_eamod-hp.mq4

OK. Se hará

 
 

Hola a todos,

Gracias por tomarse el tiempo de leer mi post. Soy un novato absoluto cuando se trata de código. He intentado un par de cosas para conseguir este EA para trabajar, pero no eran la respuesta. Estoy estudiando las variables globales, ya que creo que necesita esto para recordar lo que ha ocurrido en lugar de reiniciar cuando un refresco / recarga, etc se ha producido. Funciona perfectamente en un backtest, pero por alguna razón cuando se ejecuta en vivo que acaba de dejar de tomar las operaciones o el cierre de ellos para el caso y yo no puedo entenderlo. También estoy tratando de aprender a hacer estas cosas, pero sólo estoy empezando, así que perdóname si hago las cosas mal. El EA tiene un tiempo de inicio y parada y en ese tiempo puede abrir x operaciones y cuando este se cierra entonces se completa un ciclo. Está configurado para permitir sólo 1 ciclo por período de tiempo.

Puede alguien mirar este código para ver cuál es el problema por favor. Muchas gracias por cualquier ayuda

maa1

quantum_shaolin_1.3.2.mq4

quantum.mq4

Archivos adjuntos:
 

Hola Mladen,

Tengo un indicador de escáner que dice cuántos indicadores indican una oportunidad de compra o de venta en un símbolo en particular, y escanea el símbolo en múltiples marcos de tiempo.

El problema es que el indicador dice que siempre hay indicadores que indican, incluso cuando en realidad no lo hacen. Cuando este es el caso, la cantidad del indicador es siempre el mismo número.

Por favor, mire el código de abajo:

double BufferALL[22];

int Timeframe[7][3]={15,,, 60,,, 240,,, 1440,,, 10080,,, 43200,, ,,};

for(x=0; x<=5; x++) {

if ((SymbolBars[y][x]==iBars(symbol[y],Timeframe[x][0]))&&(SymbolBars[y][x+1]==iBars(symbol[y],Timeframe[x+1][0]))) continue;

BufferALL[0]=indi1(symbol[y],Timeframe[x][0]);

//BufferALL[1]=ind2i(symbol[y],Timeframe[x][0]);

BufferALL[2]=ind3i(symbol[y],Timeframe[x][0]);

BufferALL[3]=ind4i(symbol[y],Timeframe[x][0]);

BufferALL[4]=ind5i(symbol[y],Timeframe[x][0]);

BufferALL[5]=indi(symbol[y],Timeframe[x][0]);

BufferALL[6]=indi(symbol[y],Timeframe[x][0]);

BufferALL[7]=indi(symbol[y],Timeframe[x][0]);

BufferALL[8]=indi(symbol[y],Timeframe[x][0]);

BufferALL[9]=indi(symbol[y],Timeframe[x][0]);

BufferALL[10]=indi(symbol[y],Timeframe[x][0]);

BufferALL[11]=indi(symbol[y],Timeframe[x][0]);

BufferALL[12]=indi(symbol[y],Timeframe[x][0]);

BufferALL[13]=indi(symbol[y],Timeframe[x][0]);

BufferALL[14]=indi(symbol[y],Timeframe[x][0]);

BufferALL[15]=indi(symbol[y],Timeframe[x][0]);

BufferALL[16]=indi(symbol[y],Timeframe[x][0]);

BufferALL[17]=indi(symbol[y],Timeframe[x][0]);

BufferALL[18]=indi(symbol[y],Timeframe[x][0]);

BufferALL[19]=indi(symbol[y],Timeframe[x][0]);

BufferALL[20]=indi(symbol[y],Timeframe[x][0]);

BufferALL[21]=indi(symbol[y],Timeframe[x][0]);

for(z=0; z<=14; z++){

if (BufferALL[z] >=534653647457) Timeframe[x][1]=Timeframe[x][1]+1;

if (BufferALL[z] <=543456346463) Timeframe[x][2]=Timeframe[x][2]+1;

}

for(z=15; z<=21; z++){

if (BufferALL[z] >= 22345654) Timeframe[x][2]=Timeframe[x][2]+1; //>

if (BufferALL[z] <= 11111111111) Timeframe[x][1]=Timeframe[x][1]+1; //<

}

} // end of timeframe loop 6 iterations

Cuando todo se muestra en un mensaje de alerta obtengo algo como EURUSD: 15m/60m/4u/1d/1w/1mo está indicando una oportunidad de compra 7/7/7/7/.

Esto significa que sumó 7 indicadores para cada marco de tiempo que claramente es erróneo. Incluso lo indica cuando saco todas las llamadas de función. Cuando hago esto todos los elementos de BufferALL[] están vacíos.

Pero aparentemente el valor EMPTY sigue siendo un valor que puede ser comparado con otro valor como 534653647457 por ejemplo. Cuando utilizo la comparación >= o = 534653647457 para == 534653647457 los mensajes /7/7/7/7/7 se detienen. ¿Cómo puedo remediarlo?

 
mrcodix:
Hola Mladen,

Tengo un indicador de escáner que dice cuántos indicadores indican una oportunidad de compra o de venta en un símbolo en particular, y escanea el símbolo en múltiples marcos de tiempo.

El problema es que el indicador dice que siempre hay indicadores indicando, incluso cuando en realidad no los hay. Cuando este es el caso, la cantidad del indicador es siempre el mismo número.

Por favor, mire el código de abajo:

double BufferALL[22];

int Timeframe[7][3]={15,,, 60,,, 240,,, 1440,,, 10080,,, 43200,, ,,};

for(x=0; x<=5; x++) {

if ((SymbolBars[y][x]==iBars(symbol[y],Timeframe[x][0]))&&(SymbolBars[y][x+1]==iBars(symbol[y],Timeframe[x+1][0]))) continue;

BufferALL[0]=indi1(symbol[y],Timeframe[x][0]);

//BufferALL[1]=ind2i(symbol[y],Timeframe[x][0]);

BufferALL[2]=ind3i(symbol[y],Timeframe[x][0]);

BufferALL[3]=ind4i(symbol[y],Timeframe[x][0]);

BufferALL[4]=ind5i(symbol[y],Timeframe[x][0]);

BufferALL[5]=indi(symbol[y],Timeframe[x][0]);

BufferALL[6]=indi(symbol[y],Timeframe[x][0]);

BufferALL[7]=indi(symbol[y],Timeframe[x][0]);

BufferALL[8]=indi(symbol[y],Timeframe[x][0]);

BufferALL[9]=indi(symbol[y],Timeframe[x][0]);

BufferALL[10]=indi(symbol[y],Timeframe[x][0]);

BufferALL[11]=indi(symbol[y],Timeframe[x][0]);

BufferALL[12]=indi(symbol[y],Timeframe[x][0]);

BufferALL[13]=indi(symbol[y],Timeframe[x][0]);

BufferALL[14]=indi(symbol[y],Timeframe[x][0]);

BufferALL[15]=indi(symbol[y],Timeframe[x][0]);

BufferALL[16]=indi(symbol[y],Timeframe[x][0]);

BufferALL[17]=indi(symbol[y],Timeframe[x][0]);

BufferALL[18]=indi(symbol[y],Timeframe[x][0]);

BufferALL[19]=indi(symbol[y],Timeframe[x][0]);

BufferALL[20]=indi(symbol[y],Timeframe[x][0]);

BufferALL[21]=indi(symbol[y],Timeframe[x][0]);

for(z=0; z<=14; z++){

if (BufferALL[z] >=534653647457) Timeframe[x][1]=Timeframe[x][1]+1;

if (BufferALL[z] <=543456346463) Timeframe[x][2]=Timeframe[x][2]+1;

}

for(z=15; z<=21; z++){

if (BufferALL[z] >= 22345654) Timeframe[x][2]=Timeframe[x][2]+1; //>

if (BufferALL[z] <= 11111111111) Timeframe[x][1]=Timeframe[x][1]+1; //<

}

} // end of timeframe loop 6 iterations

Cuando todo se muestra en un mensaje de alerta obtengo algo como EURUSD: 15m/60m/4u/1d/1w/1mo está indicando una oportunidad de compra 7/7/7/7/.

Esto significa que sumó 7 indicadores para cada marco de tiempo que claramente es erróneo. Incluso lo indica cuando saco todas las llamadas de función. Cuando hago esto todos los elementos de BufferALL[] están vacíos.

Pero aparentemente el valor VACÍO sigue siendo un valor que puede ser comparado con otro valor como 534653647457 por ejemplo. Cuando utilizo la comparación >= o = 534653647457 a == 534653647457 los mensajes /7/7/7/7/7 se detienen. ¿Cómo puedo remediarlo?

mrcodix

Sin saber exactamente qué hacen los indicadores (cuáles son sus valores de retorno) todo lo que puedo hacer son conjeturas, y eso no ayudaría en absoluto

 
mladen:

mrcodix

Sin saber exactamente qué hacen los indicadores (cuáles son sus valores de retorno) todo lo que puedo hacer son conjeturas, y eso no ayudaría en absoluto

Estimado Mladen,

No es necesario conocer los valores de retorno porque no son los indicadores los culpables. Verás, el mismo problema surge cuando desactivo todas las funciones de llamada añadiendo un "//" delante de cada línea de código (convirtiéndolas en líneas de comentario). Lo mismo ocurre con los valores detrás del = en esta parte:

for(z=0; z<=14; z++){

if (BufferALL[z] >=534653647457) Timeframe[x][1]=Timeframe[x][1]+1;

if (BufferALL[z] <=543456346463) Timeframe[x][2]=Timeframe[x][2]+1;

}

for(z=15; z<=21; z++){

if (BufferALL[z] >= 22345654) Timeframe[x][2]=Timeframe[x][2]+1; //>

if (BufferALL[z] <= 11111111111) Timeframe[x][1]=Timeframe[x][1]+1; //<

}[/CODE]

it might aswell be something like

for(z=0; z<=14; z++){

if (BufferALL[z] >=1111111111111) Timeframe[x][1]=Timeframe[x][1]+1;

if (BufferALL[z] <=2222222222222) Timeframe[x][2]=Timeframe[x][2]+1;

}

for(z=15; z<=21; z++){

if (BufferALL[z] >= 333333333333) Timeframe[x][2]=Timeframe[x][2]+1; //>

if (BufferALL[z] <= 444444444444) Timeframe[x][1]=Timeframe[x][1]+1; //<

}

it will give the same exact alert message that says /15m/60m/4u/1d/1w/1mo/ is indicating a buying opportunity /7/7/7/7/7/7/. I disabled all the function call lines with // so the BufferALL[22] elements should be EMPTY, they shoulden't contain any value whatsoever. Yet, when the computer comes at the if condition parts BufferALL[z] >=1111111111111 etc it ALWAYS states that the "value" thats inside BufferALL[z] is larger then 11111111111 (or any value you wish to put behind it). The only way to make these additions stop is by changing the if condition = into ==. When the computer asks whether the empty value of BufferALL[z] is exactly the same as 11111111 or 22222 or whatever value you wish to compare, it doesen't return a true and Timeframe is not added with +1. Please try it for youself. I will add the message construction code below:

[CODE]

int SymbolBars[216][7];

if (((Timeframe[0][1] > 0) && (Timeframe[1][1] > 0) && (SymbolBars[y][0]!=iBars(symbol[y],Timeframe[0][0]))&&(SymbolBars[y][1]!=iBars(symbol[y],Timeframe[1][0]))) || ((Timeframe[1][1] > 0) && (Timeframe[2][1] > 0)&& (SymbolBars[y][1]!=iBars(symbol[y],Timeframe[1][0]))&&(SymbolBars[y][2]!=iBars(symbol[y],Timeframe[2][0]))) || ((Timeframe[2][1] > 0) && (Timeframe[3][1] > 0)

&& (SymbolBars[y][2]!=iBars(symbol[y],Timeframe[2][0]))&&(SymbolBars[y][3]!=iBars(symbol[y],Timeframe[3][0]))) || ((Timeframe[3][1] > 0) && (Timeframe[4][1] > 0) && (SymbolBars[y][3]!=iBars(symbol[y],Timeframe[3][0]))&&(SymbolBars[y][4]!=iBars(symbol[y],Timeframe[4][0]))) || ((Timeframe[4][1] > 0) && (Timeframe[5][1] > 0)&& (SymbolBars[y][4]!=iBars(symbol[y],Timeframe[4][0])) &&(SymbolBars[y][5]!=iBars(symbol[y],Timeframe[5][0]))))

{

if (Timeframe[0][1]>0)

{

StringAdd(alarmbericht,"15m/");

StringAdd(indicatoraantal,StringConcatenate(Timeframe[0][1],"/"));

SymbolBars[y][0]=iBars(symbol[y],15);

}

if (Timeframe[1][1]>0)

{

StringAdd(alarmbericht,"60m/");

StringAdd(indicatoraantal,StringConcatenate(Timeframe[1][1],"/"));

SymbolBars[y][1]=iBars(symbol[y],60);

}

if (Timeframe[2][1]>0)

{

StringAdd(alarmbericht,"4u/");

StringAdd(indicatoraantal,StringConcatenate(Timeframe[2][1],"/"));

SymbolBars[y][2]=iBars(symbol[y],240);

}

if (Timeframe[3][1]>0)

{

StringAdd(alarmbericht,"1d/");

StringAdd(indicatoraantal,StringConcatenate(Timeframe[3][1],"/"));

SymbolBars[y][3]=iBars(symbol[y],1440);

}

if (Timeframe[4][1]>0)

{

StringAdd(alarmbericht,"1w/");

StringAdd(indicatoraantal,StringConcatenate(Timeframe[4][1],"/"));

SymbolBars[y][4]=iBars(symbol[y],10080);

}

if (Timeframe[5][1]>0)

{

StringAdd(alarmbericht,"1mo/");

StringAdd(indicatoraantal,StringConcatenate(Timeframe[5][1],"/"));

SymbolBars[y][5]=iBars(symbol[y],43200);

}

Alert(+symbol[y]+" "+alarmbericht+" are indicating a selling opportunity. " +indicatoraantal+".");

alarmbericht = "";

indicatoraantal = "";

}

if (((Timeframe[0][2] > 0) && (Timeframe[1][2] > 0) && (SymbolBars[y][0]!=iBars(symbol[y],Timeframe[0][0]))&&(SymbolBars[y][1]!=iBars(symbol[y],Timeframe[1][0]))) || ((Timeframe[1][2] > 0) && (Timeframe[2][2] > 0)&& (SymbolBars[y][1]!=iBars(symbol[y],Timeframe[1][0]))&&(SymbolBars[y][2]!=iBars(symbol[y],Timeframe[2][0]))) || ((Timeframe[2][2] > 0) && (Timeframe[3][2] > 0)

&& (SymbolBars[y][2]!=iBars(symbol[y],Timeframe[2][0]))&&(SymbolBars[y][3]!=iBars(symbol[y],Timeframe[3][0]))) || ((Timeframe[3][2] > 0) && (Timeframe[4][2] > 0) && (SymbolBars[y][3]!=iBars(symbol[y],Timeframe[3][0]))&&(SymbolBars[y][4]!=iBars(symbol[y],Timeframe[4][0]))) || ((Timeframe[4][2] > 0) && (Timeframe[5][2] > 0)&& (SymbolBars[y][4]!=iBars(symbol[y],Timeframe[4][0])) &&(SymbolBars[y][5]!=iBars(symbol[y],Timeframe[5][0]))))

{

if (Timeframe[0][2]>0)

{

StringAdd(alarmbericht,"15m/");

StringAdd(indicatoraantal,StringConcatenate(Timeframe[0][2],"/"));

SymbolBars[y][0]=Bars(symbol[y],15);

}

if (Timeframe[1][2]>0)

{

StringAdd(alarmbericht,"60m/");

StringAdd(indicatoraantal,StringConcatenate(Timeframe[1][2],"/"));

SymbolBars[y][1]=Bars(symbol[y],60);

}

if (Timeframe[2][2]>0)

{

StringAdd(alarmbericht,"4u/");

StringAdd(indicatoraantal,StringConcatenate(Timeframe[2][2],"/"));

SymbolBars[y][2]=Bars(symbol[y],240);

}

if (Timeframe[3][2]>0)

{

StringAdd(alarmbericht,"1d/");

StringAdd(indicatoraantal,StringConcatenate(Timeframe[3][2],"/"));

SymbolBars[y][3]=Bars(symbol[y],1440);

}

if (Timeframe[4][2]>0)

{

StringAdd(alarmbericht,"1w/");

StringAdd(indicatoraantal,StringConcatenate(Timeframe[4][2],"/"));

SymbolBars[y][4]=Bars(symbol[y],10080);

}

if (Timeframe[5][2]>0)

{

StringAdd(alarmbericht,"1mo/");

StringAdd(indicatoraantal,StringConcatenate(Timeframe[5][2],"/"));

SymbolBars[y][5]=Bars(symbol[y],43200);

}

Alert(+symbol[y]+" "+alarmbericht+" are indicating a buying oppertunity. " +indicatoraantal+".");

alarmbericht = "";

indicatoraantal = "";

}
 

Mladen,

Aquí está un ejemplo de la mensajería de alerta continua cuando elimino todas las llamadas de los indicadores convirtiéndolos en líneas de comentario.

Cuando se trata de una oportunidad de compra, todas las sumas de los indicadores en todos los marcos de tiempo posibles son 15. Cuando es una oportunidad de venta es 7. El BufferALL[] está VACÍO por lo que esto no tiene ningún sentido.

Por último, me gustaría mencionar algo fuera del tema. En el pasado pregunté algo sobre el indicador de escáner escaneando múltiples símbolos sucesivamente. Me preguntaba si no obtendría todos los ticks en los símbolos que cambian con más frecuencia cuando el indicador está unido a un gráfico en el que el símbolo actual no se actualiza con tanta frecuencia (menos ticks por segundo). Eso significaría que, en teoría, el indicador podría estar todavía en la barra de 5 minutos de las 20:05 mientras que los símbolos de actualización más rápida que también se supone que debe escanear ya están en las 20:10. Simplemente porque una nueva barra comienza en el primer tick después de las 20:04:59, y no cuando el reloj llega a las 20:05:00. Usted respondió a esto diciendo que todos los símbolos se comprobarán con una velocidad de comprobación fija porque en la nueva versión de metatrader el procedimiento de inicio {retorno} ya no se activa en cada nuevo tick. En su lugar se activa en una velocidad fija. Esto resultó no ser cierto. Después de convertir todos mis indicadores en funciones que están incluidas en el código de mi indicador de escáner, el indicador completo todavía hacía que mt4 se congelara cuando lo ejecutaba. Así que usando iCustom() para llamar al código o insertando el código y convirtiéndolo en una función interna no hace ninguna diferencia, todavía se congela. Pero he encontrado una solución para esto por la zanja de la 215 iteración largo maestro para el bucle (cada iteración un símbolo diferente de symbol[y] está siendo tratado) y reemplazarlo con una variable que recibe una adición después de cada garrapata. Utilizo esto para decirle al ordenador qué símbolo debe utilizar, así que ahora en lugar de intentar analizar todos los 216 símbolos en cada tick (lo que hace que todo se congele) sólo se analiza un símbolo en cada tick. Cuando la variable de adición llega a 215 se reinicia a 0 y todo el ciclo de 216 comienza de nuevo. Ahora todos los símbolos están siendo analizados, aunque un poco más lento que cuando se han analizado todos los 216 en cada tick (si no se congela offcourse).... De todos modos. El punto es que Start{} sólo se activa cuando el símbolo actual en el gráfico se está actualizando. Eso significa que tarda más en recorrer los 216 símbolos cuando el indicador es un símbolo menos activo (como una acción) en contraposición a un símbolo muy activo (como el EURUSD). Así que Start{} se sigue activando en cada nuevo tick.

Archivos adjuntos:
 

Hola Mladen y Mrtools, pido un gran placer.

Sería amable de resolver el problema de dos errores al compilar el indicador adjunto.

Gracias de antemano

Moreno

PD: Perdón por mi inglés :-)

Archivos adjuntos:
 
morenokosta:
Hola Mladen y Mrtools, les pido un gran placer.

Sería amable de resolver el problema de dos errores al compilar el indicador adjunto.

Gracias de antemano

Moreno

PS: Lo siento por mi Inglés :-)

morenokosta

Ese indicador nos parece bien tal y como está

No es necesario hacer ningún cambio de código

 

Hola Mladen

¿Puede usted por favor, añadir la alerta en este indicador, soy un novato.

Gracias

Archivos adjuntos:
cross.mq4  2 kb
Razón de la queja: