¿Cómo codificar? - página 67

 

¿contador?

Llevo tantos meses programando indicadores que soy un poco deficiente en cuanto a expertos, pero tengo la intención de solucionarlo. En el camino necesito un poco de ayuda. En el experto que he montado hago que compruebe al cierre de la barra si hay una condición que justifique el cierre de la operación.

Empiezo con una variable global,

//--- Global variable

datetime PreviousBar; // record candle/bar time[/CODE]

and set one bool in init()

int init()

{

do_this = true;

}

[/CODE]

blah blah boring stuff.... etc, etc

then in the main loop I have:

[CODE]

if(do_this == true)

{

PreviousBar = Time[0];

do_this= false; // so it does this only once only

}

if(NewBar() == true)

{

if(TotalOpenOrders() == blah blah close my order you crazy monkey)

}

and outside the main loop I have:

[CODE]//--- returns true if current bar just formed

bool NewBar()

{

if(PreviousBar<Time[0])

{

PreviousBar = Time[0];

return(true);

}

else

{

return(false);

}

return(false);

}

OK, así que está configurado para hacer una vez por barra. Lo que quiero hacer es tener una función que incremente 90 segundos o 60 segundos o lo que sea, entonces establece un bool a verdadero después de que se incrementa ese tiempo. Básicamente quiero comprobar los indicadores cada 60, 90, 120 segundos o lo que sea en lugar de al cierre de la barra. ¿Cómo lo hago?

Gracias por cualquier ayuda,

- nittany1

 
nittany1:
Llevo tantos meses programando indicadores que soy un poco deficiente en cuanto a expertos, pero tengo la intención de solucionarlo. En el camino necesito un poco de ayuda. En mi experto que armé tengo que comprobar al cierre de la barra si hay una condición que justifique el cierre de la operación.

Empiezo con una variable global,

//--- Global variable

datetime PreviousBar; // record candle/bar time[/CODE]

and set one bool in init()

int init()

{

do_this = true;

}

[/CODE]

blah blah boring stuff.... etc, etc

then in the main loop I have:

[CODE]

if(do_this == true)

{

PreviousBar = Time[0];

do_this= false; // so it does this only once only

}

if(NewBar() == true)

{

if(TotalOpenOrders() == blah blah close my order you crazy monkey)

}

and outside the main loop I have:

[CODE]//--- returns true if current bar just formed

bool NewBar()

{

if(PreviousBar<Time[0])

{

PreviousBar = Time[0];

return(true);

}

else

{

return(false);

}

return(false);

}

OK, así que está configurado para hacer una vez por barra. Lo que quiero hacer es tener una función que incremente 90 segundos o 60 segundos o lo que sea, entonces establece un bool a true después de que se incremente ese tiempo. Básicamente quiero comprobar los indicadores cada 60, 90, 120 segundos o lo que sea en lugar de al cierre de la barra. ¿Cómo lo hago?

Gracias por cualquier ayuda,

- nittany1

Esto debería hacerlo. Recuerde que MT utiliza la ejecución basada en ticks, por lo que la precisión por segundo no es posible (a menos que usted haga un bucle con todo en el sub. Init()).

if (CallIndicatorsCheck())

{

// su código aquí

}

bool CallIndicatorsCheck()

{

static datetime Oldtime;

int Secs = 90;

bool Bandera;

if (CurrTime() >= Oldtime) {

Oldtime = CurrTime() + Secs;

Flag = true; }

return(Flag);

}

 

Colocación de comentarios

¿Podría alguien mostrarme el código para colocar un comentario en laesquina superiorderecha de la pantalla, en lugar de la superior izquierda por defecto?

Gracias.

 
wolfe:
¿Podría alguien mostrarme el código para colocar un comentario en laesquina superior derecha de la pantalla, en lugar de la superior izquierda por defecto? Gracias!

No se puede. Del manual de MQL4:

void Comment( ...)La función emite el comentario definido por el usuario en la esquina superior izquierda del gráfico.

Si se necesita por muerte se podrían crear objetos.

 
wolfe:
¿Podría alguien mostrarme el código para colocar un comentario en laesquina superior derecha de la pantalla, en lugar de la superior izquierda por defecto? Gracias!

LinusGuy tiene razón; no hay una forma directa. La solución fácil es rellenar el comentario con espacios --

Comment(" ¡hola mundo!");

desplazará el texto a la derecha.

También puedes poner saltos de línea para bajar la página.

Comment("\Nsu texto");

o combinar los saltos de línea y el espacio para imprimir en la esquina inferior derecha de la pantalla.

mog

 
mog:
LinusGuy tiene razón; no hay una forma directa. La solución más fácil es rellenar el comentario con espacios.

Comentario(" ¡Hola mundo!");

desplazará el texto hacia la derecha.

También puede poner en la línea de alimentación para bajar la página.

Comment("\Nsu texto");

o combinar los saltos de línea y el espacio para imprimir en la esquina inferior derecha de la pantalla.

mog

Gracias por la ayuda. Lo probaré.

 

no hay nuevas operaciones durante X barras después de una operación perdedora

hola equipo - espero que alguien pueda ayudar por favor..

¿Cómo puedo evitar que una nueva operación comience durante 10 barras si la última operación fue una pérdida?

saludos

 

La función de abajo devolverá true mientras el historial de la cuenta tenga una operación con pérdidas que se haya cerrado en o después de la apertura de la 10ª barra pasada (la barra actual es 0),

y devuelve falso en caso contrario.

bool postMortem()

{

datetime since = Time[ bar+10 ];

for ( int i = OrdersHistoryTotal() - 1; i >= 0; i-- ) {

if ( ! OrderSelect( i, SELECT_BY_POS, MODE_HISTORY )

continue;

if ( OrderProfit() = since )

return( true );

}

return( false );

}

[/PHP]

If you add that function to your EA, then include a statement like the following in the start() function, then Bob's your uncle.

[PHP]if ( postMortem() ) return( 0 );
 

muchas gracias por eso - lo probaré

saludos

 

Chicos, ¿tenéis el mismo problema?

He codificado un experto. Quiero abrir una posición cuando el precio es el mismo que un indicador. Para ello utilizo la siguiente sentencia

//para comprar

double indicatorpast = icustom(....................,1);

double indicatornow = icustom(....................,0);

if (close[1]indicatornow) OpenBUY();

si (close[1]>indicadorpasado && close[0]<indicadornuevo) OpenSELL();

pero con este satatement, el experto abre posiciones no sólo cuando el precio cruza el indicador, sino que también abre posiciones por encima del indicador. Quiero que el experto abra posiciones SOLO cuando el precio cruce el indicador, así que he probado esto:

//para comprar

double indicatorpast = icustom(....................,1);

double indicatornow = icustom(....................,0);

if (close[1]<indicatorpast && close[0]==indicatornow) OpenBUY();

if (close[1]>indicatorpast && close[0]==indicatornow) OpenSELL();

Pero esta declaración no está realizando.

¿Sabe usted lo que está sucediendo? Porque creo que no hay errores en la declaración.

Saludos.

Razón de la queja: