Preguntas y respuestas a los programadores sobre MQL 4 - página 6

 
¿El código es complicado o hay algo más sencillo?
 

1. Almacenar los tickets de pedido en un array o 2 variables.

2. Selecciónelos uno por uno con OrderSelect (la matriz es más conveniente aquí) .

3. Comprueba el tipo para el momento actual.

4. Si el tipo OP_BUY || OP_SELL -> OrderDelete para el segundo ticket.

 

Por favor, ayúdenme con un ejemplo sencillo, entiendo muchas cosas, pero lo de seleccionar el orden es un poco de atasco.

 

Aquí está el código donde el error es ????? No borra el segundo colgante cuando uno de ellos se activa ......


si (MA1<MA2)
{
si(n==0)
{
//==================================================================================================================//

tiket=EnviarOrden(Símbolo(),OP_BUY,Lotes,NormalizeDouble(Ask,Digits),Slip,slb,tpb,NULL,MagicNumber,0,CLR_NONE);
if(tiket<0) Alert("Error # - ",GetLastError()," En el instrumento ", Symbol()); //escribir error//
//================================================================================================================//
t2 = OrderSend(Symbol(), OP_BUYSTOP, Lots*Overlot,OtkrBS, Slip,0,tpb, 0, MagicNumber,expiration);
//================================================================================================================//
t1 = OrderSend(Symbol(), OP_SELLSTOP, Lots*Overlot+1,OtkrSS,Slip,0,slb, 0, MagicNumber,expiration);
//================================================================================================================//

//==================================================================================================================//
}
//==================================================================================================================//
si no
//=================================================================================================================//
si (MA1>MA2)
{
tiket=OrderSend(Symbol(),OP_SELL,Lots,NormalizeDouble(Bid,Digits),Slip,sls,tps,NULL,MagicNumber,0,CLR_NONE);
if(tiket<0) Alert("Error # - ",GetLastError()," En el instrumento ", Symbol()); //escribir error//
//================================================================================================================//
t2 = OrderSend(Symbol(), OP_BUYSTOP, Lots*Overlot+1,OtkrSS1,Slip,0,sls, 0, MagicNumber,expiration);
//================================================================================================================//
t1 = OrderSend(Symbol(), OP_SELLSTOP, Lots*Overlot, OtkrBS1,Slip,0,tps, 0, MagicNumber,expiration);
//================================================================================================================//
}
//==================================================================================================================//
// si se ha activado el SELLSTOP, eliminar el BUYSTOP
if(OrderSelect(t1, SELECT_BY_TICKET))
{
if(OrderType()==OP_SELL)
{
OrderDelete(t2);
}
}
//----
// si se ha activado el BUYSTOP, eliminar el SELLSTOP
if(OrderSelect(t2, SELECT_BY_TICKET))
{
if(OrderType()==OP_BUY)
{
OrderDelete(t1);
}
}

 

Estás confundido con las condiciones. Creo que tienes {} paréntesis en el lugar equivocado:

if ( n == 0 )
{
        if (MA1<MA2) 
        {
                //==================================================================================================================//

                tiket=OrderSend(Symbol(),OP_BUY,Lots,NormalizeDouble(Ask,Digits),Slip,slb,tpb,NULL,MagicNumber,0,CLR_NONE); 
                if(tiket<0) Alert("Ошибка № - ",GetLastError()," На инструменте ", Symbol()); //пишет ошибку// 
                //================================================================================================================//
                t2 = OrderSend(Symbol(), OP_BUYSTOP, Lots*Overlot,OtkrBS, Slip,0,tpb, 0, MagicNumber,expiration);
                //================================================================================================================//
                t1 = OrderSend(Symbol(), OP_SELLSTOP, Lots*Overlot+1,OtkrSS,Slip,0,slb, 0, MagicNumber,expiration);
                //================================================================================================================//

                //==================================================================================================================//
        }
        //==================================================================================================================// 
        else 
        //=================================================================================================================// 
        if (MA1>MA2) 
        {
                tiket=OrderSend(Symbol(),OP_SELL,Lots,NormalizeDouble(Bid,Digits),Slip,sls,tps,NULL,MagicNumber,0,CLR_NONE);
                if(tiket<0) Alert("Ошибка № - ",GetLastError()," На инструменте ", Symbol()); //пишет ошибку//
                //================================================================================================================//
                t2 = OrderSend(Symbol(), OP_BUYSTOP, Lots*Overlot+1,OtkrSS1,Slip,0,sls, 0, MagicNumber,expiration);
                //================================================================================================================//
                t1 = OrderSend(Symbol(), OP_SELLSTOP, Lots*Overlot, OtkrBS1,Slip,0,tps, 0, MagicNumber,expiration);
        //================================================================================================================//
        }
}
//==================================================================================================================//
// если сработал SELLSTOP удаляем BUYSTOP
if(OrderSelect(t1, SELECT_BY_TICKET))
{
        if(OrderType()==OP_SELL)
        {
                OrderDelete(t2);
        }
}
//----
// если сработал BUYSTOP удаляем SELLSTOP
if(OrderSelect(t2, SELECT_BY_TICKET))
{
        if(OrderType()==OP_BUY)
        {
                OrderDelete(t1);
        }
}

O algo así.

 
no funcionó desafortunadamente........
 

Lo sorprendente es que yo tengo un EA similar. He comprobado todo con él, en principio es lo mismo, funciona y este no...

La diferencia es que el otro EA sólo tiene una pose de entrada de compra y dos colgantes.

 

¿boletos en variables globales? (fuera de las funciones de inicio y otras)

Si no es así, se restablecen cada vez que se produce una avería.

Inserte más Print()-s en cada paso del Asesor Experto, entonces usted entenderá donde falla y lo que no hace.

 

¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡HURRA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! Ganador !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!1

¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!

 
hasayama:

¿boletos en variables globales? (fuera de las funciones de inicio y otras)

Si no es así, se restablecen cada vez que se produce una avería.

Inserte más Print()-s en cada paso del Asesor Experto, entonces usted entenderá donde falla y lo que no hace.

Te estoy locamente agradecido, se me ha pasado el punto de que he declarado los tickets como dobles al principio y el orden no puede ser registrado como 1.0 y 2.0. Por eso la función de borrado estaba esperando punto flotante
Razón de la queja: