Problema con el código EA 2 (gestor de SL)

 

Hola,

Gracias de nuevo con su ayuda mientras estoy aprendiendo MQL.

Aquí está mi siguiente problema.... Estoy MUY cerca de este one.... Lo tengo haciendo todo lo que quiero que ... Sin embargo, está modificando los SLs en cada tick si el GAP es más de este criterio, en lugar de sólo ejecutar una vez ...

Es un código muy simple, y un problema muy simple que no soy capaz de resolver en esta etapa, y cualquier ayuda sería asistir a mi aprendizaje..

Esto es sólo el LADO DE COMPRA atm, sin embargo, he escrito las asignaciones para el IFGAP para OP_SELL lado para más adelante.


La función de este EA es:

1. iniciar un comercio de compra si uno no existe.

2. en el nivel de TP 1, mueva el SL hacia arriba.... en el nivel de TP 2, mueva el SL hacia arriba de nuevo.... en el nivel de TP 3, mueva el SL hacia arriba de nuevo la última vez. Bonito y simple realmente..


El problema de noob que estoy teniendo es:

1. Ejecuta mi OrderModify EVERYTICK si sobre GAP... No se me ocurre cómo cambiar la lógica, pero una vez que se me muestra, lo sabré para el futuro...


Gracias de antemano.

Saludos cordiales y felices pips a todos.


int start()
{
    if (Bars < 10)
    {
        Comment("Not enough bars");
        return (0);
    }
    if (Terminated == true)
    {
        Comment("EA Terminated.");
        return (0);
    }
    
    OnEveryTick();
    
}

void OnEveryTick()
{
    if (DetectBrokerDigits == false && FiveDigitBroker) PipValue = 10;
    if (DetectBrokerDigits && (NDigits == 3 || NDigits == 5)) PipValue = 10;
    
    IfGap_Level_1();
    IfGap_Level_2();
    IfGap_Level_3();
    IfBUYOrderDoesNotExist();
    
}

void IfGap_Level_1()
{
    for (int i=OrdersTotal()-1; i >= 0; i--)
    if (OrderSelect(i, SELECT_BY_POS, MODE_TRADES))
    {
        if (OrderSymbol() == Symbol() && OrderMagicNumber() == BUY_Magic)
        {
            if ((Gap_Level_1 < 0 && ((OrderType() == OP_BUY && Ask - OrderOpenPrice() < Gap_Level_1*PipValue*Point) ||
            (OrderType() == OP_SELL && OrderOpenPrice() - Bid < Gap_Level_1*PipValue*Point))) ||
            ((Gap_Level_1 > 0 && ((OrderType() == OP_BUY && Ask - OrderOpenPrice() > Gap_Level_1*PipValue*Point) ||
            (OrderType() == OP_SELL && OrderOpenPrice() - Bid > Gap_Level_1*PipValue*Point)))))
            {
                BuyOrderModifyLevel_1();
                
            }
        }
    }
    else
    Print("OrderSelect() error - ", ErrorDescription(GetLastError()));
    
}

void BuyOrderModifyLevel_1()
{
    for (int i=OrdersTotal()-1; i >= 0; i--)
    if (OrderSelect(i, SELECT_BY_POS, MODE_TRADES))
    {
        if (OrderType() == OP_BUY && OrderSymbol() == Symbol() && OrderMagicNumber() == BUY_Magic)
        {
            double price = Ask;
            if (UseAskLineorNot == false)
            {
                price = OrderOpenPrice();
            }
            bool ret = OrderModify(OrderTicket(), OrderOpenPrice(), price - BuyStoploss_Level_1*PipValue*Point, price + BuyTakeprofit_Level_1*PipValue*Point, 0, Modify_Order_Colour);
            if (ret == false)
            Print("OrderModify() error - ", ErrorDescription(GetLastError()));
        }
    }
    
}

void IfGap_Level_2()
{
    for (int i=OrdersTotal()-1; i >= 0; i--)
    if (OrderSelect(i, SELECT_BY_POS, MODE_TRADES))
    {
        if (OrderSymbol() == Symbol() && OrderMagicNumber() == 1)
        {
            if ((Gap_Level_2 < 0 && ((OrderType() == OP_BUY && Ask - OrderOpenPrice() < Gap_Level_2*PipValue*Point) ||
            (OrderType() == OP_SELL && OrderOpenPrice() - Bid < Gap_Level_2*PipValue*Point))) ||
            ((Gap_Level_2 > 0 && ((OrderType() == OP_BUY && Ask - OrderOpenPrice() > Gap_Level_2*PipValue*Point) ||
            (OrderType() == OP_SELL && OrderOpenPrice() - Bid > Gap_Level_2*PipValue*Point)))))
            {
                BuyOrderModifyLevel_2();
                
            }
        }
    }
    else
    Print("OrderSelect() error - ", ErrorDescription(GetLastError()));
    
}

void BuyOrderModifyLevel_2()
{
    for (int i=OrdersTotal()-1; i >= 0; i--)
    if (OrderSelect(i, SELECT_BY_POS, MODE_TRADES))
    {
        if (OrderType() == OP_BUY && OrderSymbol() == Symbol() && OrderMagicNumber() == 1)
        {
            double price = Ask;
            if (true == false)
            {
                price = OrderOpenPrice();
            }
            bool ret = OrderModify(OrderTicket(), OrderOpenPrice(), price - BuyStoploss_Level_2*PipValue*Point, price + BuyTakeprofit_Level_2*PipValue*Point, 0, White);
            if (ret == false)
            Print("OrderModify() error - ", ErrorDescription(GetLastError()));
        }
    }
    
}

void IfGap_Level_3()
{
    for (int i=OrdersTotal()-1; i >= 0; i--)
    if (OrderSelect(i, SELECT_BY_POS, MODE_TRADES))
    {
        if (OrderSymbol() == Symbol() && OrderMagicNumber() == 1)
        {
            if ((Gap_Level_3 < 0 && ((OrderType() == OP_BUY && Ask - OrderOpenPrice() < Gap_Level_3*PipValue*Point) ||
            (OrderType() == OP_SELL && OrderOpenPrice() - Bid < Gap_Level_3*PipValue*Point))) ||
            ((Gap_Level_3 > 0 && ((OrderType() == OP_BUY && Ask - OrderOpenPrice() > Gap_Level_3*PipValue*Point) ||
            (OrderType() == OP_SELL && OrderOpenPrice() - Bid > Gap_Level_3*PipValue*Point)))))
            {
                BuyOrderModifyLevel_3();
                
            }
        }
    }
    else
    Print("OrderSelect() error - ", ErrorDescription(GetLastError()));
    
}

void BuyOrderModifyLevel_3()
{
    for (int i=OrdersTotal()-1; i >= 0; i--)
    if (OrderSelect(i, SELECT_BY_POS, MODE_TRADES))
    {
        if (OrderType() == OP_BUY && OrderSymbol() == Symbol() && OrderMagicNumber() == 1)
        {
            double price = Ask;
            if (true == false)
            {
                price = OrderOpenPrice();
            }
            bool ret = OrderModify(OrderTicket(), OrderOpenPrice(), price - BuyStoploss_Level_3*PipValue*Point, price + BuyTakeprofit_Level_3*PipValue*Point, 0, White);
            if (ret == false)
            Print("OrderModify() error - ", ErrorDescription(GetLastError()));
        }
    }
    
}

void IfBUYOrderDoesNotExist()
{
    bool exists = false;
    for (int i=OrdersTotal()-1; i >= 0; i--)
    if (OrderSelect(i, SELECT_BY_POS, MODE_TRADES))
    {
        if (OrderType() == InitialOrderType && OrderSymbol() == Symbol() && OrderMagicNumber() == BUY_Magic)
        {
            exists = true;
        }
    }
    else
    {
        Print("OrderSelect() error - ", ErrorDescription(GetLastError()));
    }
    
    if (exists == false)
    {
        Initial_BuyOrder();
        
    }
}

void Initial_BuyOrder()
{
    double SL = Ask - InitialBuyStoploss*PipValue*Point;
    if (BuyStoploss_Level_3 == 0) SL = 0;
    double TP = Ask + Initial_Takeprofit*PipValue*Point;
    if (Initial_Takeprofit == 0) TP = 0;
    int ticket = -1;
    if (true)
    ticket = OrderSend(Symbol(), OP_BUY, InitialBuyLots, Ask, 4, 0, 0, "My Expert", BUY_Magic, 0, Blue);
    else
    ticket = OrderSend(Symbol(), OP_BUY, InitialBuyLots, Ask, 4, SL, TP, "My Expert", BUY_Magic, 0, Blue);
    if (ticket > -1)
    {
        if (true)
        {
            OrderSelect(ticket, SELECT_BY_TICKET);
            bool ret = OrderModify(OrderTicket(), OrderOpenPrice(), SL, TP, 0, Blue);
            if (ret == false)
            Print("OrderModify() error - ", ErrorDescription(GetLastError()));
        }
            
    }
    else
    {
        Print("OrderSend() error - ", ErrorDescription(GetLastError()));
    }
}



int deinit()
{
    if (ClearAllObjects) ObjectsDeleteAll();
    
    
}

 
Funky:

El problema de novato que estoy teniendo es:

1. Ejecuta mi OrderModify EVERYTICK si sobre GAP... No se me ocurre como cambiar la logica, pero una vez que se me muestre, lo sabre para el futuro..

Si no quieres ejecutarlo por cada tick ¿cuándo quieres ejecutarlo ? te refieres a cada tick pero solo una vez ? para ello solo tienes que comprobar si el SL & TP ya han sido ajustados .

Otro comentario . . . IfGap_Level_1 () recorre todas las órdenes abiertas buscando las que coinciden con el símbolo y el número mág ico, luego comprueba si la orden está en beneficio de una determinada cantidad, etc... si lo está llama a BuyOrderModifyLevel_1 (), esta función recorre todas las órdenes abiertas buscando las que coinciden con el símbolo y el número mágico y es una compra... ¿ves un poco de repetición aquí? ¿por qué no pasas simplemente el número de entrada de IfGap_Level_1() a BuyOrderModifyLevel_1()?

 
Funky:

Hola,

Gracias de nuevo con su ayuda mientras estoy aprendiendo MQL.

Aquí está mi siguiente problema.... Estoy MUY cerca de este one.... Lo tengo haciendo todo lo que quiero que ... Sin embargo, está modificando los SLs en cada tick si el GAP es más de este criterio, en lugar de sólo ejecutar una vez ...

Es un código muy simple, y un problema muy simple que no soy capaz de resolver en esta etapa, y cualquier ayuda sería asistir a mi aprendizaje..

Esto es sólo el LADO DE COMPRA atm, sin embargo, he escrito las asignaciones para el IFGAP para OP_SELL lado para más adelante.


La función de este EA es:

1. iniciar una operación de compra si no existe.

2. en el nivel de TP 1, mover el SL hacia arriba.... en el nivel de TP 2, mover el SL hacia arriba otra vez.... en el nivel de TP 3, mover el SL hacia arriba otra vez la última vez. Bonito y simple realmente...


El problema de novato que estoy teniendo es:

1. Ejecuta mi OrderModify EVERYTICK si sobre GAP... No se me ocurre cómo cambiar la lógica, pero una vez que se me muestra, voy a saber para el futuro ...


Gracias de antemano.

Saludos cordiales y felices pips a todos.


Usted no es un NOOB. A juzgar por la elegante capacidad de ser capaz de escribir y luego llamar a las funciones, la forma en que lo hizo. Usted debe ser capaz de ver por sí mismo, que su función de llamadas (profundidad de la lógica, etc) puede ser simplificado tal vez a 1-2 funciones.

En lugar de:

OrderOpenPrice() 

en su condición:

if ((Gap_Level_1 < 0 && ((OrderType() == OP_BUY && Ask - OrderOpenPrice() < Gap_Level_1*PipValue*Point) ||

¿ha considerado/intentado utilizar OrderStopLoss()?

 
RaptorUK:

Si no quieres ejecutarlo por cada tick ¿cuándo quieres ejecutarlo? ¿te refieres a cada tick pero sólo una vez? para ello sólo tienes que comprobar si el SL & TP ya han sido ajustados....

Otro comentario . . . IfGap_Level_1 () recorre todas las órdenes abiertas buscando las que coinciden con el Símbolo y el Número Mágico, luego comprueba si la orden está en beneficio de una determinada cantidad, etc... si lo está llama a BuyOrderModifyLevel_1 (), esta función recorre todas las órdenes abiertas buscando las que coinciden con el Símbolo y el Número Mágico y es una Compra... ¿ves un poco de repetición aquí? ¿por qué no pasas simplemente el Número de Entrada de IfGap_Level_1() a BuyOrderModifyLevel_1()?

Hola de nuevo Raptor, gracias de nuevo por su tiempo. Tal y como lo he planteado, sí que parece confuso. Supongo que estoy teniendo problemas para unir todos estos componentes correctamente. De momento el principal problema que tengo es que "se modifican las órdenes en cada tick", aunque ahora veo otros problemas también después de tus comentarios. Con la última parte de lo que has dicho, si te entiendo, ¿te refieres a insertar el código BuyOrderModify dentro del IfGap_Level_1 dentro de un {} después de comprobar si se ha alcanzado el Gap en lugar de en su propio {}? ¿Como en este ejemplo de abajo?


void OverGap1_soModify()
{
    for (int i=OrdersTotal()-1; i >= 0; i--)
    if (OrderSelect(i, SELECT_BY_POS, MODE_TRADES))
    {
        if (OrderSymbol() == Symbol() && OrderMagicNumber() == BUY_Magic)
        {
            if ((Gap_Level_1 < 0 && ((OrderType() == OP_BUY && Ask - OrderOpenPrice() < Gap_Level_1*PipValue*Point) ||
            (OrderType() == OP_SELL && OrderOpenPrice() - Bid < Gap_Level_1*PipValue*Point))) ||
            ((Gap_Level_1 > 0 && ((OrderType() == OP_BUY && Ask - OrderOpenPrice() > Gap_Level_1*PipValue*Point) ||
            (OrderType() == OP_SELL && OrderOpenPrice() - Bid > Gap_Level_1*PipValue*Point)))))
               {
                double price = Ask;
                if (UseAskLineorNot == false)
                {
                 price = OrderOpenPrice();
                 }
            bool ret = OrderModify(OrderTicket(), OrderOpenPrice(), price - BuyStoploss_Level_1*PipValue*Point, price + BuyTakeprofit_Level_1*PipValue*Point, 0, Modify_Order_Colour);
            if (ret == false)
            Print("OrderModify() error - ", ErrorDescription(GetLastError()));
                
            }
        }
    }
    else
    Print("OrderSelect() error - ", ErrorDescription(GetLastError()));
    
}

Y sabes, me estoy sintiendo como dejavue con mi otro EA en cierto modo ahora que la caja está tomando forma (aquí https://forum.mql4.com/42870 - similitud no intencional, ya que es un EA diferente con un propósito diferente, sin embargo esto está apuntando a las mismas áreas que necesito aprender como incluir dos funciones juntas, prometo que no estaba tratando de llenar el foro con la redundancia) ...

Por lo tanto, puedo preguntar en el offchance si una variable IFNEWORDEREXIST = TRUE en el mismo lugar resolvería otra cuestión. Verás, quiero que la última operación abierta que se hizo en ModeTrades sea la que esté comparando con el IfGap_Level_X en todo momento (supongo que esa parte es similar a la otra).


Una vez que arregle ese error con OrderModify sucediendo en EVERYTICK mientras está atascado dentro de ese {} si ese cuadro de arriba no es correcto, y trate con el problema de selección de la última orden, me enfrentaré entonces con el siguiente drama que mientras IfGap_Level_3 se satisface, también lo hace IfGap_Level_2, y IfGap_Level_1.

En cierto modo quiero que el EA actúe como gestor de SL, y (a pesar de la única orden de compra inicial) lo voy a utilizar para gestionar múltiples operaciones. La primera compra fue sólo para poder hacer un backtest bien. Me gustaría que este código:

Si el Pips de la orden llega a IfGap_Level_1, quiero que vaya a BuyOrderModifyLevel_1, para luego modificar las órdenes existentes, y olvidar esta parte del código.

Si el Pips de la orden llega a IfGap_Level_2, quiero que vaya a BuyOrderModifyLevel_2, luego modifique las órdenes existentes, y olvide esta parte del código

Si el Pips de la orden llega a IfGap_Level_3, quiero que vaya a BuyOrderModifyLevel_3, luego modifique las órdenes existentes, y olvide esta parte del código

Espero no estar muy equivocado, al principio me pareció sencillo.

Esperaba poder insertar un "break;" o algo así al final de cada bloque y salir airoso de este código...
diostar:

Usted no es un NOOB. A juzgar por la elegante capacidad de ser capaz de escribir y luego llamar a las funciones, la forma en que lo hizo. Usted debe ser capaz de ver por sí mismo, que sus llamadas a la función (la profundidad de la lógica, etc) se puede simplificar tal vez a 1-2 funciones.

En lugar de:

en su condición:

¿has considerado/intentado usar OrderStopLoss()?

Ah, gracias diostar, usted es demasiado amable con sus comentarios. Estoy bien en la escritura de secuencias de comandos básicos, sin embargo, no estoy lejos de ese nivel, y ahora la unión de todo me está causando un dolor de cabeza. Gracias por los ánimos sin embargo, las fórmulas y demás tienen sentido para mí, no tanto la gramática/sintaxis del programa.

Creo que puede ser correcto lo que dices, al condensar el código en 1-2 funciones, sólo que no estoy seguro de cómo...

Si tuviera la experiencia, tendría el IFGAP y el MODIFY ORDER en un solo bloque como creo que tanto tú como Raptor están sugiriendo, sin embargo estaba jugando a lo seguro en esta etapa... Supongo que si fuera un profesional, tendría los TPs en un array o switch, y establecería old TP=oldTP+TPincrement_Level, y podría tenerlo todo en un bloque en unas 10 líneas de código... Eventualmente haré esto en el último If Gap & ModifyOrder {} para que el incremento del SL sea escalonado a intervalos programables, sin embargo los primeros quiero dejarlos para que se establezcan manualmente dependiendo de las condiciones del mercado...

No he considerado usar OrderStopLoss() en la fórmula. Supongo que como voy a variar un poco los SLs para los primeros movimientos, realmente lo quiero basado en OrderOpenPrice y los Pips que ha aumentado desde que se abrió. No había explicado muy bien el EA, disculpas. Gracias por tu tiempo también compañero, se agradece mucho.

 
Funky:

Hola de nuevo Raptor, gracias de nuevo por tu tiempo. Tal y como lo he planteado, sí que parece confuso. Supongo que estoy teniendo problemas para unir todos estos componentes correctamente. De momento el principal problema que tengo es que "se modifican las órdenes en cada tick", aunque ahora veo otros problemas también después de tus comentarios. Con la última parte de lo que has dicho, si te entiendo, ¿te refieres a insertar el código BuyOrderModify dentro del IfGap_Level_1 dentro de un {} después de comprobar si se ha alcanzado el Gap en lugar de en su propio {}? ¿Como en este ejemplo?

Podría hacer eso pero no es realmente lo que quería decir....

Echa un vistazo a esto para ver si tiene sentido. . .

          (OrderType() == OP_SELL && OrderOpenPrice() - Bid > Gap_Level_1*PipValue*Point)))))
            {
                BuyOrderModifyLevel_1(OrderTicket() );    //  <-----  pass the ticket number to the function
                
            }
.
.
.


void BuyOrderModifyLevel_1(int Ticket)
{
    if (OrderSelect(Ticket, SELECT_BY_TICKET, MODE_TRADES))
    {
       double price = Ask;
       if (UseAskLineorNot == false)
       {
          price = OrderOpenPrice();
       }
       bool ret = OrderModify(Ticket, OrderOpenPrice(), price - BuyStoploss_Level_1*PipValue*Point, price + BuyTakeprofit_Level_1*PipValue*Point, 0, Modify_Order_Colour);
       if (ret == false)
       Print("OrderModify() error - ", ErrorDescription(GetLastError()));
     
    }
    
}

La otra cosa que mencioné fue sobre la comprobación de si la orden ya había sido modificada por ver lo que es SL y TP fueron, en otras palabras, si usted ya ha modificado la orden en la última garrapata no lo hacen de nuevo en esta garrapata ... ¿es lo que estaba buscando hacer?

 
RaptorUK:

Podrías hacer eso pero no es realmente lo que quería decir...

Echa un vistazo a esto para ver si tiene sentido...

La otra cosa que mencioné fue sobre la comprobación de si la orden ya había sido modificada por ver lo que es SL y TP fueron, en otras palabras, si usted ya ha modificado la orden en la última garrapata no lo hacen de nuevo en esta garrapata ... ¿es eso lo que estaba buscando hacer?


Esto es genial para mi aprendizaje... No me había dado cuenta de que se podía poner (OrderTicket()) después del nombre de una función, genial. Así que eso atribuye el número de ticket de mi último pedido abierto, genial. Este es un consejo muy muy útil para las cosas que estoy en el atm, gracias.

(OrderType() == OP_SELL && OrderOpenPrice() - Bid > Gap_Level_1*PipValue*Point)))))
            {
                BuyOrderModifyLevel_1(OrderTicket() );    //  <-----  pass the ticket number to the function
                
            }

y aquí veo que has hecho la variable Ticket. La verdad es que no sabía que se podía declarar una variable en esta parte del código. ¿Se puede hacer esto porque se le dio un valor en la última parte de arriba? Entiendo cómo podría funcionar, entonces, utiliza este último número de Ticket de pedido del comercio aquí en lugar de mi 'inespecífico' OrderTicket(). Tiene sentido. Será mucho más preciso que OrderSelect(i++.. etc para mí.

void BuyOrderModifyLevel_1(int Ticket)
{
    if (OrderSelect(Ticket, SELECT_BY_TICKET, MODE_TRADES))
    {
       double price = Ask;
       if (UseAskLineorNot == false)
       {
          price = OrderOpenPrice();
       }
       bool ret = OrderModify(Ticket, OrderOpenPrice(), price - BuyStoploss_Level_1*PipValue*Point, price + BuyTakeprofit_Level_1*PipValue*Point, 0, Modify_Order_Colour);
       if (ret == false)
       Print("OrderModify() error - ", ErrorDescription(GetLastError()));
     
    }
    
}


Es casi la 1 de la mañana aquí, así que voy a echar un vistazo más de cerca mañana, gracias por su tiempo .... Tengo la sensación de que voy a tener que insertar esta lógica en el bloque "If_Gap_Levels{}" en lugar del bloque "BuyModify{}". No lo había explicado con demasiada claridad, disculpas. Creo que este consejo me ayudará a comprobar esa última entrada para GAP, y luego MODIFICAR TODOS los pedidos anteriores con ese OP_BUY y BUY_Magic etc.

La otra cosa que mencioné fue sobre la comprobación de si la orden ya había sido modificada mirando a ver cuál era su SL y TP, en otras palabras, si ya has modificado la orden en el último tick no lo hagas de nuevo en este tick... ¿es eso lo que estabas buscando hacer?

Sí, esto es exactamente donde estoy atascado en realidad ... No estoy seguro de cómo especificar esto... ¿Hago un valor bool de NeedsModifying = false, y luego lo convierto en True cuando se cumplen los criterios de IfGap? Puedo pensar en la lógica, sólo no la sintaxis, sin embargo, he aprendido de sus consejos para mí en mi última EA para incluso ser capaz de sugerir mi última frase. Gracias de nuevo Raptor.

 
Funky:

Esto es genial para mi aprendizaje... No me había dado cuenta de que se podía poner (OrderTicket()) después del nombre de una función en primer lugar, genial. Entonces, ¿eso atribuye mi Ticket que cumple el criterio Gap a esa función BuyOrderModifyLevel_1? Este es un consejo muy muy útil para las cosas que estoy en atm, gracias.

y aquí veo que has hecho la variable Ticket. La verdad es que no sabía que se podía declarar una variable en esta parte del código. ¿Se puede hacer esto porque se le dio un valor en la última parte de arriba? Entiendo cómo podría funcionar, entonces, utiliza este último número de Ticket de pedido del comercio aquí en lugar de mi 'inespecífico' OrderTicket(). Tiene sentido. Será mucho más preciso que OrderSelect(i++.. etc para mí.

Es parte de la definición de la función. . . como cualquiera de las funciones estándar, por ejemplo OrderModify ( https://docs.mql4.com/trading/OrderModify ) OrderModify es una función a la que se le pasan variables, un mínimo de 5 variables, la 6ª es opcional. puede hacer exactamente lo mismo con sus propias funciones . . .

Eres bienvenido. Noche.

 
RaptorUK:

Es parte de la definición de la Función . . . como cualquiera de las Funciones estándar, por ejemplo OrderModify ( https://docs.mql4.com/trading/OrderModify ) OrderModify es una función y le pasas variables, un mínimo de 5 variables, la 6ª es opcional. puedes hacer exactamente lo mismo con tus propias Funciones . . .

Eres bienvenido. Noche.


Gracias Raptor.... ah que me atrapó mientras yo estaba editando la última frase en ese puesto, como sí que tenía razón con lo que yo estaba después ...

Gracias por recordarme ese .doc de nuevo... es curioso que haya leído ese .doc en particular en OrderMofidy tantas veces... Antes me parecía chino ese manual, sin embargo a medida que avanzo, se destacan consejos más avanzados. Lo volveré a leer ahora, y apuesto a que será tan claro como la luz del día esa característica que mencionaste para mí, sin embargo gracias por señalármelo para que supiera buscarlo.

-copiado de arriba, ya que había editado esa última parte sin saberlo mientras escribías....

La otra cosa que mencioné fue sobre la comprobación de si la orden ya había sido modificada por ver lo que es SL y TP fueron, en otras palabras, si usted ya ha modificado la orden en el último tick no lo hacen de nuevo en esta garrapata ... ¿es eso lo que estabas buscando hacer?

Sí, esto es exactamente donde estoy atascado en realidad ... No estoy seguro de cómo especificar esto... ¿Hago un valor bool de NeedsModifying = false, y luego lo convierto en True cuando se cumple el criterio IfGap? Puedo pensar en la lógica, sólo no la sintaxis, sin embargo, he aprendido de sus consejos para mí en mi última EA para incluso ser capaz de sugerir mi última frase. Gracias de nuevo Raptor.

Buenas noches desde Australia.

 
RaptorUK:

Es parte de la definición de la Función . . . como cualquiera de las Funciones estándar, por ejemplo OrderModify ( https://docs.mql4.com/trading/OrderModify ) OrderModify es una función y le pasas variables, un mínimo de 5 variables, la 6ª es opcional. puedes hacer exactamente lo mismo con tus propias Funciones . . .

Eres bienvenido. Buenas noches.


Hola Raptor,

Llevé las cosas un poco más allá usando las ideas que me has mostrado. Me he dado cuenta de que tu código habría solucionado mi problema, pero entonces una vez que las órdenes lleguen a mi segundo nivel de TP, será difícil de manejar..

No me di cuenta de que podía dejar de lado el OrderSelect i++ y simplemente elegir mi propia Entrada en esa ecuación, así que he probado esto ya que resolverá todos mis problemas con las operaciones múltiples... ¿funcionaría esto?

Si alguien me puede confirmar que este código funcionaría, estaría encantado... gracias de nuevo por el apoyo ;)

void BuyPendingOrder_1()
{
    int expire = TimeCurrent() + 60 * 0;
    double price = NormalizeDouble(Ask, NDigits) + PriceOffset_1*PipValue*Point;
    double SL = price - BuyStoploss_1*PipValue*Point;
    if (BuyStoploss_1 == 0) SL = 0;
    double TP = price + BuyTakeprofit_1*PipValue*Point;
    if (BuyTakeprofit_1 == 0) TP = 0;
    if (0 == 0) expire = 0;
    int PendingOrderTicket_1 = OrderSend(Symbol(), OP_BUYSTOP, BuyLots_1, price, 4, SL, TP, "EA_Pending_Order1", BUY_Magic, expire, Blue);
     ///--^^^----^^^ allocate this ticket number to PendingOrderTicket_1 above
    if (PendingOrderTicket_1 == -1)
    {
        Print("OrderSend() error - ", ErrorDescription(GetLastError()));
    }
    
}

void IfGap_Level_1()
{
    if (OrderSelect(PendingOrderTicket_1,SELECT_BY_POS,MODE_TRADES)) ///--<<<---- select ticket number from PendingOrderTicket_1
    {
        if (OrderSymbol() == Symbol() && OrderMagicNumber() == BUY_Magic)
        {
            if ((Gap_Level_1 < 0 && ((OrderType() == OP_BUY && Ask - OrderOpenPrice() < Gap_Level_1*PipValue*Point) ||
            (OrderType() == OP_SELL && OrderOpenPrice() - Bid < Gap_Level_1*PipValue*Point))) ||
            ((Gap_Level_1 > 0 && ((OrderType() == OP_BUY && Ask - OrderOpenPrice() > Gap_Level_1*PipValue*Point) ||
            (OrderType() == OP_SELL && OrderOpenPrice() - Bid > Gap_Level_1*PipValue*Point)))))
            {
                BuyOrderModifyLevel_1; ///--<<<----if PendingOrderTicket_1 is over Gap_Level_1, then proceed to BuyOrderMoidfyLevel_1 section etc
                
            }
        }
    }
    else
    Print("OrderSelect() error - ", ErrorDescription(GetLastError()));
    
}

void BuyOrderModifyLevel_1() 
{
    if (OrderSymbol() == Symbol() && OrderMagicNumber() == BUY_Magic)  ///--<<<----select all trades of that pair and magic
    {
        
            double price = Ask;
            if (UseAskLineorNot == false)
            {
                price = OrderOpenPrice();
            }
            bool ret = OrderModify(OrderTicket(), OrderOpenPrice(), price - BuyStoploss_Level_1*PipValue*Point, price + BuyTakeprofit_Level_1*PipValue*Point, 0, Modify_Order_Colour);
             ///--^^^^^^---- modify all trades of that pair and magic if it made it this far
            if (ret == false)
            Print("OrderModify() error - ", ErrorDescription(GetLastError()));
            
    }
    
}
 

Hay un problema al hacer lo que estás sugiriendo.......

Imagínese que su EA se está ejecutando . . . entonces su MT4 se interrumpe por cualquier razón, fallo de alimentación, caída de MT4, el PC necesita un reinicio, etc . . su código no puede recoger desde donde lo dejó porque ya no tiene el valor correcto para PendingOrderTicket_1

 
RaptorUK:

Hay un problema al hacer lo que estás sugiriendo.......

Imagina que tu EA se está ejecutando . . . luego tu MT4 se interrumpe por cualquier razón, fallo de energía, caída de MT4, el PC necesita un reinicio, etc . . . tu código no puede recoger desde donde lo dejó porque ya no tiene el valor correcto para PendingOrderTicket_1


Hola Raptor, gracias de nuevo.

¿Es ese el único problema del código anterior? Creo que en el peor de los casos el PendingOrderTicket_1 no se modificaría, y se cerraría en su SL.

¿Está bien cómo he utilizado la función OrderSelect?

 if (OrderSelect(PendingOrderTicket_1,SELECT_BY_POS,MODE_TRADES)) ///--<<<---- select ticket number from PendingOrderTicket_1

El gran problema que creo que voy a tener, es que cuando el OrderTicket_1 esté por encima del primer Gap_Level1, seguirá modificando la orden EN CADA Critério que se cumpla.

¿Es este el caso? Si es así, ¿el código de abajo lo arreglaría?

bool HasBeenExecuted = false;
/// (further up in declared variables^^^)

void BuyOrderModifyLevel_1()
{
if (OrderSymbol() == Symbol() && OrderMagicNumber() == BUY_Magic)
      {
        
            double price = Ask;
            if (UseAskLineorNot == false)
            {
                price = OrderOpenPrice();
            }
            bool ret = OrderModify(OrderTicket(), OrderOpenPrice(), price - BuyStoploss_Level_1*PipValue*Point, price + BuyTakeprofit_Level_1*PipValue*Point, 0, Modify_Order_Colour);
             HasBeenExecuted = false;
            if (ret == false)
            Print("OrderModify() error - ", ErrorDescription(GetLastError()));
            {
            HasBeenExecuted = true;
            }
     }    
   
}


¿O tendría que hacerlo con el CheckGapLevel_1, para que sólo lo compruebe una vez? Y si es así, ¿lo he hecho correctamente abajo???? ¿Hay algún lugar donde deba poner un "break"?

bool HasBeenExecuted = false;
/// (further up in declared variables^^^)

void IfGap_Level_1()
{
    if (OrderSelect(PendingOrderTicket_1,SELECT_BY_POS,MODE_TRADES))
    {
        if (OrderSymbol() == Symbol() && OrderMagicNumber() == BUY_Magic)
        {
            if ((Gap_Level_1 < 0 && ((OrderType() == OP_BUY && Ask - OrderOpenPrice() < Gap_Level_1*PipValue*Point) ||
            (OrderType() == OP_SELL && OrderOpenPrice() - Bid < Gap_Level_1*PipValue*Point))) ||
            ((Gap_Level_1 > 0 && ((OrderType() == OP_BUY && Ask - OrderOpenPrice() > Gap_Level_1*PipValue*Point) ||
            (OrderType() == OP_SELL && OrderOpenPrice() - Bid > Gap_Level_1*PipValue*Point)))))
            HasBeenExecuted = false;
            {
            HasBeenExecuted = true;                
            BuyOrderModifyLevel_1;
               
            }
        }
    }
    else
    Print("OrderSelect() error - ", ErrorDescription(GetLastError()));
    
}

Gracias de nuevo ;)