[ARCHIVO] Cualquier pregunta de novato, para no saturar el foro. Profesionales, no pasen de largo. En ninguna parte sin ti - 3. - página 595

 
Wanderer1000:
Instalé MetaTrader 4, abrí una cuenta demo. Intento de abrir/cerrar órdenes. ¿Cómo puedo hacer ahora que el propio terminal active una orden de venta cuando el precio sube y una orden de compra cuando baja, utilizando información como "necesitas una diferencia de 2 velas para cerrar la orden anterior y abrir una nueva"?
Escribir un EA, tal vez)
 
nadya:

Buenas noches. Pregunta: Cuando cierro parte de una operación, el EA como que abre una nueva operación con una nueva entrada. ¿La magia del nuevo orden sigue siendo la misma?


 

¿ALGUIEN PUEDE EXPLICAR POR QUÉ TODOS LOS INTERCAMBIOS SON SÓLO EN LA COMPRA? No tengo operaciones en SELL, el indicador de bandera antes de if() en SELL es siempre 1 por alguna razón, WHY???? es long&short en la configuración.

TAMBIÉN QUIERO PREGUNTAR POR QUÉ DEJO QUE MI EA PIERDA ALGUNAS POSICIONES QUE PODRÍA ABRIR? ¡NO PUEDO ENTRAR!

¡Este es el código(la declaración de las variables está truncada):
double upfr,dnfr=0.0;//niveles de los últimos fractales
int flag=0;

int start() //abrir en la ruptura del fractal y cerrar después de s velas
{
if(iFractals(Symbol(),PERIOD_H1,MODE_UPPER,4)!=0)
{
upfr=iFractals(Symbol(),PERIOD_H1,MODE_UPPER,4);
}
if(iFractals(Symbol(),PERIOD_H1,MODE_UPPER,4)==0)
{
upfr=0;
}
if(iFractals(Symbol(),PERIOD_H1,MODE_LOWER,4)!=0)
{
dnfr=iFractals(Symbol(),PERIOD_H1,MODE_LOWER,4);
}
if(iFractals(Symbol(),PERIOD_H1,MODE_LOWER,4)==0)
{
dnfr=0;
}
//Operar órdenes por PROBIT
H=iHigh(Symbol(),PERIOD_H1,1);
L=iLow(Symbol(),PERIOD_H1,1);
tOpen=iTime(Symbol(),PERIOD_H1,1);
if(H>upfr && flag==0) //si el fractal está arriba y se supera el nivel del fractal
{
tClose=tOpen+s*stime*60;
OrderSend(Symbol(),OP_BUY,lots,Ask,slippage,NULL,NULL);
flag=1;
}
if(L<dnfr)
Print(L," -L dnfr- ",dnfr," flag- ",flag);
if(L<dnfr && flag==0)//si el fractal está abajo y el nivel del fractal está abajo
{
tClose=tOpen+s*stime*60;
OrderSend(Symbol(),OP_SELL,lots,Bid,slippage,NULL,NULL);
flag=1;
}
// CERRAR ÓRDENES POR FIN DE TIEMPO
if(Time[1]>=tClose && flag==1)// si el tiempo designado ha pasado
{
Print("CLOSE FUNCTION");
OrClose();
flag=0;
upfr=0;
dnfr=0;
}
return(0);
}

Archivos adjuntos:
 

Me encontré con esto...

Al eliminar un EA, tiene que eliminar las órdenes pendientes

Hay dos variantes

1. Simplemente borra todo...

int deinit()
{
int i;
//----
for(i=OrdersTotal()-1; i>=0;i--)
{
if(OrderSelect(i,SELECT_BY_POS))
{
if (OrderType() == OP_BUYSTOP)
{
OrderDelete(OrderTicket());
}
if (OrderType() == OP_SELLSTOP)
{
OrderDelete(OrderTicket());
}
}
}


//----
return(0);
}

2. Selectivamente...

int deinit()
{

OrderSelect(ticket1,SELECT_BY_TICKET,MODE_TRADES);
OrderDelete(ticket1);
OrderSelect(ticket2,SELECT_BY_TICKET,MODE_TRADES);
OrderDelete(ticket2);

return(0);
}

Ahora, la pega es que en la demo, funciona bien en ambos casos... Pero en la vida real... sólo un lote pendiente es eliminado por alguna razón... Pregunta: ¿quién sabe por qué?

 
DOCTORS:

Me encontré con esto...

Al eliminar un EA, tiene que eliminar las órdenes pendientes

Hay dos variantes

1. Simplemente borra todo...

int deinit()
{
int i;
//----
for(i=OrdersTotal()-1; i>=0;i--)
{
if(OrderSelect(i,SELECT_BY_POS))
{
if (OrderType() == OP_BUYSTOP)
{
OrderDelete(OrderTicket());
}
if (OrderType() == OP_SELLSTOP)
{
OrderDelete(OrderTicket());
}
}
}


//----
return(0);
}

2. Selectivamente...

int deinit()
{

OrderSelect(ticket1,SELECT_BY_TICKET,MODE_TRADES);
OrderDelete(ticket1);
OrderSelect(ticket2,SELECT_BY_TICKET,MODE_TRADES);
OrderDelete(ticket2);

return(0);
}

Ahora, la pega es que en la demo, funciona bien en ambos casos... Pero en la vida real... sólo un lote pendiente se borra por alguna razón... La pregunta: ¿quién sabe por qué?

IMHO "no tiene suficiente tiempo":

El tiempo de ejecución de la función especial deinit() está limitado a 2,5 segundos. Si el código de una función especial deinit() se ejecuta durante más tiempo del especificado, el terminal cliente terminará forzosamente la función especial deinit() y el programa en su conjunto.

 
ilunga:

En mi opinión, "no a tiempo":

La función especial deinit() tiene un tiempo de ejecución de 2,5 segundos. Si el código de la función especial deinit() se ejecuta más de este tiempo, el terminal cliente terminará forzosamente la función especial deinit() y el programa en su conjunto.

:(

Es decir, ¿no hay esperanza? A grandes rasgos, comenzamos con el uso del script para cerrar las órdenes pendientes... Y luego cerramos el búho... Bonito auto-transporte...

Una pregunta más - el asistente ha puesto los colgantes https://forum.mql4.com/ru/42300/page588

Cuando cambio de plazo, las órdenes se borran por alguna razón...

 
DOCTORS:

:(

¿Entonces no hay esperanza? A grandes rasgos, empezamos con un script para cerrar los colgantes... y luego cerramos el búho... Bonito auto-transporte...

Una pregunta más - el asistente ha puesto los colgantes https://forum.mql4.com/ru/42300/page588

Cuando cambio de plazo, las órdenes se borran por alguna razón...

El script o alguna otra forma de ordenar al EA que termine su operación (por ejemplo, a través de una variable global)

cambio de marco temporal = reinicio del Asesor Experto

 
ilunga:

o un script, o alguna otra forma de ordenar al EA que termine (por ejemplo, a través de una variable global)

cambio de marco temporal = reinicio del Asesor Experto

La variable funciona - ¡muchas gracias!
Hmm... ¿no hay forma de evitar el cambio de horario?
 
Miembros del foro, por favor, ayuden a modificar los pedidos
 
Pregunta: en el modo de prueba visual las líneas del indicador se dibujan sólo al final de la prueba, ¿es así para todos o estoy haciendo algo mal?