Problema con el código EA 2 (gestor de SL) - página 2

 
Funky:

Hola Raptor, gracias de nuevo.

1. ¿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.

2. ¿Es correcto cómo he utilizado la función OrderSelect?

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.

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

Gracias de nuevo ;)

1. Es algo que me ha saltado a la vista que romperá tu código.


2. Tu OrderSelect está mal ( https://docs.mql4.com/trading/OrderSelect ) si vas a seleccionar usando el número de ticket tienes que usar SELECT_BY_TICKET no SELECT_BY_POS

3. No creo que sea así, lo que has hecho, creo, sólo significa que esa función sólo se llama una vez... ¿qué pasa cuando tienes la siguiente Orden que necesita ser modificada? ¿qué pasa si tienes dos órdenes abiertas al mismo tiempo?

No estoy 100% familiarizado con lo que estás haciendo, no tengo tiempo de mirar tu código con suficiente detalle para hacerlo... pero, tengo una pregunta.

¿No puedes mirar el OrderOpenPrice() de una orden, su OrderStopLoss() y su OrderTakeProfit() y determinar si ya se ha modificado al nivel 1 2 o 3?

 
RaptorUK:

1. Es algo que me saltó a la vista que romperá su código.


2. Tu OrderSelect está mal ( https://docs.mql4.com/trading/OrderSelect ) si vas a seleccionar usando el número de ticket tienes que usar SELECT_BY_TICKET no SELECT_BY_POS

3. No creo que sea así, lo que has hecho, creo, sólo significa que esa función sólo se llama una vez... ¿qué pasa cuando tienes la siguiente Orden que necesita ser modificada? ¿qué pasa si tienes dos órdenes abiertas al mismo tiempo?

No estoy 100% familiarizado con lo que estás haciendo, no tengo tiempo de mirar tu código con suficiente detalle para hacerlo... pero, tengo una pregunta.

¿No puedes mirar el OrderOpenPrice() de una orden, su OrderStopLoss() y su OrderTakeProfit() y determinar si ya se ha modificado al nivel 1 2 o 3?

Gracias Raptor, tu visión me ha sido muy útil...

Entiendo totalmente con las limitaciones de tiempo también, su tiempo y consejos ha sido muy apreciado.... No estaba tratando de pedir a nadie que lo escribiera por mí, así que no fui muy detallado... lo que presenta el problema de que sin mucho detalle es difícil ofrecer ayuda, así que disculpas..... En este caso, era más bien el código lo que me preocupaba mientras aprendía y tus consejos me han venido genial

1. 2. He estado reventando para reunirlo para probarlo, así que podría arreglar el problema de la salida de energía más adelante cuando tenga más experiencia.

2. Cambiaré a SELECT_BY_TICKET, en lugar de POS, muchas gracias.

3. 3. Quiero que el GAP_Level1 sólo se invoque una vez, así que tal vez esté en lo cierto con la forma en que lo he montado todo .... Para responder a su pregunta, estoy tratando de mirar el último billete de la orden pendiente, para ver si se pone sobre mi marca TradeUp. Cuando eso ocurre, me gustaría que arrastrara todas mis órdenes anteriores hacia arriba (esta vez seleccionando por número mágico para obtenerlas todas)... A estas alturas, tengo otra Orden Pendiente abierta, y cuando llegue a Gap_Level2, tendré un bloque BuyModify_Level2, con el mismo código.... ¿es plausible?

Espero estar escribiendo con mi lógica, realmente me senté con papel como sugeriste esta vez para descifrarlo... ;)

 
Funky:


3. Quiero que el GAP_Level1 sólo se invoque una vez, así que quizás esté en lo cierto con la forma en que lo he encadenado todo.... Para responder a su pregunta, estoy tratando de mirar el último billete de la orden pendiente, para ver si se pone sobre mi marca TradeUp. Cuando eso ocurre, me gustaría que arrastrara todas mis órdenes anteriores hacia arriba (esta vez seleccionando por número mágico para obtenerlas todas)... A estas alturas, tengo otra Orden Pendiente abierta, y cuando llegue a Gap_Level2, tendré un bloque BuyModify_Level2, con el mismo código.... ¿es plausible?


¿Cómo (o en qué parte de su código) establecerá HasBeenExecuted = false ; para que IfGap_Level_1() se ejecute para el segundo conjunto de operaciones?
 
RaptorUK:
¿Cómo (o en qué parte de su código) establece HasBeenExecuted = false ; para que IfGap_Level_1() se ejecute para el segundo conjunto de operaciones?

Buena pregunta compañero.

Iba a poner en bool esa variable al principio de las variables internas debajo de las que exporto. Iba a hacer un GAP_Level_1, GAP_Level_2,GAP_Level_3, GAP_Level_4, GAP_Level_5 etc. Así que una vez que llega a GAP_Level_1, puede olvidarse de este primer nivel de brecha.

Me has hecho pensar, te lo agradezco mucho. Ahora veo un problema.

Me he dado cuenta de que cuando una operación alcanza un SL, y comienza de nuevo, quiero que la primera operación busque Gap_Level_1 de nuevo y gire. Y, por supuesto, eso causará un problema, ya que iba a vincular PendingOrder_1 con GAP_Level_1, PendingOrderLevel_Level_2 con GAP_Level2.

Supongo que aún puedo lograrlo, pero no habría pensado en esto a no ser que mencionaras.....

Se me ocurren tres soluciones... La primera se adapta un poco mejor a mi capacidad cerebral jaja ;)

1. Si voy a IF LAST TRADE IS LOSS, entonces BORRAR TODAS LAS ORDENES PEN DIENTES, y reiniciarlas si una operación alcanza un SL. Así que la Orden Pendiente 1 va al Nivel de Gap_1, dejará de ser la Orden Pendiente_5 la siguiente operación abierta que va al Nivel de Gap_5. Después de que se alcance un SL, todas mis operaciones abiertas se cerrarán ya que todas comparten el mismo SL, por lo que cerrar mis órdenes pendientes y reiniciar la lógica podría estar bien.

2. La otra opción que se me ocurre (gracias a tu consejo con mi otro problema de código de hace unas semanas), es insertar una variable booleana después de que se haga la primera operación llamada NEWTRADE, y luego tener un bloque IFNEWTRADE==1, entonces ir a GAP_Level1. Esto me hace pensar, supongo que podría ir IFNEWTRADE1 en el bloque de orden pendiente 1, y IFNEWTRADE2 en el bloque de orden pendiente 2 y así sucesivamente... entonces IFNEWTRADE2==1 ir a GAP_Level2.

EDIT (después de un café): 3. Acabo de pensar, qué pasa si ordeno las órdenes por tiempo (ahora sé que uno puede ordenar múltiples órdenes de muchas maneras), y asignar una variable interger llamada ORD_SELECT_NUMBER basada en el TIEMPO. Entonces, después de ORD_SELECT_NUMBER == 1, ir a GAP_Level1, y luego buscar el siguiente ORD_SELECT_NUMBER usando ese comando ORDER_SELECT_NUMBER ++.

Estoy bien en la escritura de la orden única EAs basado en las señales, etc, es sólo esta cosa orden múltiple que honestamente me mata ... Mi EA está trabajando como es, y obtiene buenos resultados, es sólo una locura de usar, ya que se modifica en EVERYTICK, y sólo utiliza mi más pequeño Gap_Level atm obviamente desde que estoy trabajando en cómo atar todo junto por encima de ...

Wow, pero gracias de nuevo Raptor, así como el conocimiento de codificación veo lo importante que es la buena lógica también, gracias por hacerme pensar.

 
Funky:

Vaya, pero gracias de nuevo Raptor, además del CONOCIMIENTO DE CODIFICACIÓN veo lo importante que es una buena LÓGICA también, gracias por hacerme pensar.

Lo has entendido mal... todo el software, no importa el lenguaje en el que esté codificado, C++, Perl, Pascal, Fortran, Assembler, etc. trata de resolver problemas. Si la lógica detrás de tu solución es defectuosa, no importa lo buen codificador que seas... la solución viene primero, el código viene después.
 
RaptorUK:
Tienes eso al revés... todo el software, no importa en qué lenguaje esté codificado, C++, Perl, Pascal, Fortran, Assembler, etc es sólo para resolver problemas. Si la lógica detrás de tu solución es defectuosa, no importa lo buen codificador que seas... la solución viene primero, el código viene después.

Entiendo lo que dices... Un constructor sin planos de construcción, no llegará lejos, aunque sea el mejor constructor del mundo. El plan inicial es casi más importante, te entiendo.

Me has sido de gran ayuda Raptor, y quería darte las gracias de nuevo.

Me decanté por la perezosa opción 1 de arriba.

Han sido horas y horas de programación, mi EA ronda los 85k (por lo que sólo he posteado un fragmento), así que aún estoy por informar de cómo me ha ido después de completar este dinosaurio. Estoy teniendo bastante suerte en este momento, las órdenes se seleccionan correctamente. Estoy estudiando sobre la marcha, ya que está lejos de los EAs de una sola orden que estoy acostumbrado a escribir. Me he metido de lleno en este proyecto y estoy aprendiendo a nadar. Voy a publicar de nuevo como voy.

Gracias de nuevo Raptor :)

 
Funky:

Entiendo lo que dices... Un constructor sin planos de construcción, no llegará lejos, aunque sea el mejor constructor del mundo. El plan inicial es casi más importante, te entiendo.

Me has sido de gran ayuda Raptor, y quería darte las gracias de nuevo.

Me decanté por la perezosa opción 1 de arriba.

Han sido horas y horas de programación, mi EA ronda los 85k (por lo que sólo he posteado un fragmento), así que aún estoy por informar de cómo me ha ido después de completar este dinosaurio. Estoy teniendo bastante suerte en este momento, las órdenes se seleccionan correctamente. Estoy estudiando sobre la marcha, ya que está lejos de los EAs de una sola orden que estoy acostumbrado a escribir. Me he metido de lleno en este proyecto y estoy aprendiendo a nadar. Voy a publicar de nuevo cómo voy.

Gracias de nuevo Raptor :)

Una vez que te veas ampliando en tus recursos de código, y haya funciones que se puedan hacer comunes para el uso de cualquier EA futuro, sí considera usar library/include, etc.

Porque una vez que se convierte en tiranosaurio, los códigos se pierden en su propio Parque Juraissico, sobre todo cuando los necesitas de nuevo para cualquier uso futuro.

 
diostar:

Una vez que te veas ampliando tus recursos de código, y haya funciones que se puedan hacer comunes para cualquier uso futuro de EA, considera usar la biblioteca/include, etc.

Porque una vez que se convierte en tiranosaurio, los códigos se pierden en su propio Parque Juraissico, especialmente cuando los necesitas de nuevo para cualquier uso futuro.



Jaja amigo, eso me hizo reír. Veo que eso puede pasar.

Para ser honesto he encontrado un inserto de la biblioteca llamada 'OrderSendReliable.mqh'. Voy a terminar este EA en primer lugar, entonces iba a publicar de nuevo cómo me fui con ese inserto de la biblioteca con ese otro puesto EAcode que había ido como creo que podría arreglar la cosa mercado caliente.

Tuve una risa, porque ahora puedo ver, cómo con la experiencia, habría todo tipo de #incluye en la parte superior de la EA, jaja, y que llevan alrededor de una caché de 1 mb de archivos para cada EA.

Sabes que tu comentario me hace pensar, acaba de hacer clic. He estado cortando y pegando código entre mis EAs cuando consigo una {sección} que me gusta, y los relaciono (por ejemplo, esa {sección} que estaba teniendo problemas en ese otro post que mencioné antes). Ni siquiera había pensado en hacer eso como una inserción de la biblioteca, y sólo hacer referencia a ella ... Estoy muy lejos de ese tipo de cosas... Yo estaba a punto de empezar mi primera biblioteca incluyen después de este EA con que uno para ver cómo funcionan.... las posibilidades son tan cool. Es bastante adictivo este MQL.

Oh sí todo está en marcha con mi código también, funciona perfectamente para su propósito, yo estaba apareciendo de nuevo para dar un gran agradecimiento :) ..

Realmente aprecio el apoyo de ustedes, me gustaría poder describir cuánto en palabras ;)

 

Puedes tener tus propios conjuntos de funciones de la biblioteca "core", que te recomiendo encarecidamente que consideres antes, que después.

Yo también empecé con mi primer EA, lo mismo, copiar, pegar, copiar-pegar....

El punto de inflexión fue cuando estaba haciendo este EA para mi antiguo servicio militar ex-co, ya retirado. Eso cambió todo, empecé a usar la biblioteca por primera vez.

Todavía mantengo esa biblioteca hasta el día de hoy. Si puede ofrecerte ideas, ayudarte a salir adelante... aquí está su cabecera, compañero:

#define PI              3.1415629
#define GOLDEN_RATIO    1.618

#import "command.ex4"
   bool     isInit();
   bool     isFractional(string ins);
   bool     isOrderLimit(int cap);
   bool     isRiskLimit(double risk);
   
   int      ioSession(int h);
   string   ioWkday(datetime d);
   double   ioOrderPriceLvl(string ins, int type, double oPrice);    
   double   ioPriceLvl(string ins,double dPrice);
   bool     ioTrailStop(string ins, int tkt, int type, double oPrice,int lvl, double stop=0);
   int      ioTotalOrd(int magic);
         
   int      opClose(string ins,int ticket,int cmd,double lLot,bool Activate.NO_BREAK_ONE=false);
   int      opOpen(string ins, int cmd, double lLot, double lPrice, double lLoss, double lProfit, string comment,int EA.Id, int lSlip=0, bool Activate.NO_BREAK_ONE=false);
   int      opModify(string ins, int ticket,int cmd,double lPrice,double lLoss,double lProfit,bool Activate.NO_BREAK_ONE=false);   
   double   opStopLvl(string ins,double p);
   double   opNorm(string ins,double price);
   double   opNormL(string ins,double d);   
   double   opPoint(string ins);
   
   double   intelLot(string market, double risk,double stop); 
   double   intelCorrel(string s1,string s2, int f, int type);   
   int      intelPriceMove(string ins, int p, int L);
   int      intelTrend(string ins, int p, int q);   
#import

espero que esto ayude....

 
diostar:

Usted puede tener sus propios conjuntos de funciones de la biblioteca "núcleo", que recomiendo encarecidamente a considerar antes, que más tarde.

Yo también empecé con mi primer EA, lo mismo, copiar, pegar, copiar ....

El punto de inflexión fue cuando estaba haciendo este EA para mi antiguo servicio militar ex-co, ya retirado. Eso cambió todo, empecé a usar la biblioteca por primera vez.

Todavía conservo esa biblioteca hasta hoy. Si te puede ofrecer ideas, ayudarte a salir adelante... aquí tienes su cabecera, compañero:

Espero que esto ayude....


Hola Diostar, está muy bien compañero, gracias por compartir esa información, aún no había leído sobre las bibliotecas. Me parece una forma estupenda de llevar variables y tenerlas predefinidas para después. Voy a pensar en ello. Me gusta cómo has dicho "antes que después", me gustan los consejos así, gracias compañero. Me recuerda a aprender a tocar la guitarra, cuando 20 años después pienso que me gustaría haber hecho "tal y tal" desde el principio, habría hecho los últimos 20 años más fáciles, lol. Voy a investigar más sobre esto, gracias.

Ah justo cuando pensaba que estaba en llamas, tengo un drama, que no se me ocurre resolver. Estoy teniendo problemas con la selección de las órdenes correctas en estas dos secciones de unión:

Podría mostrar dos de mis ejemplos, y mostrar los efectos, mi cerebro simplemente no va a hacer clic en este...

Ejemplo 1:

Recorre las órdenes anteriores exactamente como quiero, sin embargo las modifica en TODOS LOS TIEMPOS

(el drama original con el orden de selección Raptor me ayudó con dejó de los niveles de conflicto, por lo que el SL slopping alrededor de esa razón antes también. Me sentí esta última parte fácil de resolver, pero ha sido en él durante días se siente tratando de evitar que suceda cada garrapata..)

void IfGap_SELLLevel_00()
{
    if (OrderSelect(FirstRunSell_ticket_00,SELECT_BY_TICKET,MODE_TRADES)) 
    {
        if (OrderSymbol() == Symbol() && OrderMagicNumber() == SELL_Magic01)
        {
            if ((Gap_Level_00 < 0 && (OrderType() == OP_SELL && OrderOpenPrice() - Bid < Gap_Level_00*PipValue*Point))
             || (Gap_Level_00 > 0 && (OrderType() == OP_SELL && OrderOpenPrice() - Bid > Gap_Level_00*PipValue*Point)))
            {
                IfGap_SELLLevel_00AlreadyExe = false;
            }
            if (IfGap_SELLLevel_00AlreadyExe == false)
            {
                IfGap_SELLLevel_00AlreadyExe = true;
                SellOrderModifyLevel_00();
            }
        }
    }
    
    
}

void SellOrderModifyLevel_00()
{
    for (int i=OrdersTotal()-1; i >= 0; i--)
    if (OrderSelect(i, SELECT_BY_POS, MODE_TRADES))
    {
        if (OrderType() == OP_SELL && OrderSymbol() == Symbol() && OrderMagicNumber() == SELL_Magic01) 
        { 
            double Level_00_SL = Bid + Stoploss_Level_00*PipValue*Point;
            if (Stoploss_Level_00 == 0) Level_00_SL = 0;
            double Level_00_TP = Bid - Takeprofit_Level_00*PipValue*Point;
            if (Takeprofit_Level_00 == 0) Level_00_TP = 0;
            bool ret00 = OrderModify(OrderTicket(), OrderOpenPrice(), Level_00_SL, Level_00_TP, 0, Modify_Order_Colour);
            if (ret00 == false)
            Print("OrderModify() error - ", ErrorDescription(GetLastError()));
        }
    }
    
}


Ejemplo 2:

Este ejemplo no es lo que quiero... He probado esta opción para que deje de modificar el envío en cada tick... sin embargo no se desplaza por las órdenes, y sólo modifica una de las entradas correctas en cada tick (modifica la primera orden, supongo que la última en la caché de órdenes de Index).

void IfGap_SELLLevel_00()
{
    if (OrderSelect(FirstRunSell_ticket_00,SELECT_BY_TICKET,MODE_TRADES)) 
    {
        if (OrderSymbol() == Symbol() && OrderMagicNumber() == SELL_Magic01)
        {
            if ((Gap_Level_00 < 0 && (OrderType() == OP_SELL && OrderOpenPrice() - Bid < Gap_Level_00*PipValue*Point))
             || (Gap_Level_00 > 0 && (OrderType() == OP_SELL && OrderOpenPrice() - Bid > Gap_Level_00*PipValue*Point)))
            {
                SellOrderModifyLevel_00();
            }
        }
    }
    
    
}

void SellOrderModifyLevel_00()
{
    bool IfGap_SELLLevel_00AlreadyExe = FALSE;
    for (int i=OrdersTotal()-1; i >= 0; i--)
    if (OrderSelect(i, SELECT_BY_POS, MODE_TRADES))
    {
        if (OrderType() == OP_SELL && OrderSymbol() == Symbol() && OrderMagicNumber() == SELL_Magic01 && !IfGap_SELLLevel_00AlreadyExe) 
        { 
            double Level_00_SL = Bid + Stoploss_Level_00*PipValue*Point;
            if (Stoploss_Level_00 == 0) Level_00_SL = 0;
            double Level_00_TP = Bid - Takeprofit_Level_00*PipValue*Point;
            if (Takeprofit_Level_00 == 0) Level_00_TP = 0;
            bool ret00 = OrderModify(OrderTicket(), OrderOpenPrice(), Level_00_SL, Level_00_TP, 0, Modify_Order_Colour);
            IfGap_SELLLevel_00AlreadyExe = TRUE;
            if (ret00 == false)
            Print("OrderModify() error - ", ErrorDescription(GetLastError()));
        }
    }
    
}


Tengo otros 50 intentos, probando primero una pequeña sección IF EXECUTED 00 para pasarlo a IFGAP si no se ejecuta antes... sin embargo no tuve mucha suerte insertando un switch antes de hand..... Puede que ponga este ejemplo para mostrar esa opción....

Ejemplo 3:

Con un swtich... sigue teniendo el mismo efecto que el ejemplo 1. Se desplaza a través de las órdenes correctamente, pero todavía se modifica en cada ticck...

Puedo ver que el interruptor sigue recibiendo las cuestiones de un falso de nuevo, por lo que sólo se ejecuta a través de nuevo ... sin embargo, otros intentos no dejar que pase en absoluto ... debo seguir con esta opción y tratar de declarar IfGap_SELLLevel_00AlreadyExe = true en otro lugar, si es así donde?

void IfGap_SELLLevel_00AlreadyBlock()
{
    if (OrderSelect(FirstRunSell_ticket_00,SELECT_BY_TICKET,MODE_TRADES))
    {
        IfGap_SELLLevel_00AlreadyExe = false;
    }
    if (IfGap_SELLLevel_00AlreadyExe == false)
    {
        IfGap_SELLLevel_00AlreadyExe = true;
        IfGap_SELLLevel_00();  
    }
}


void IfGap_SELLLevel_00()
{
    if (OrderSelect(FirstRunSell_ticket_00,SELECT_BY_TICKET,MODE_TRADES)) 
    {
        if (OrderSymbol() == Symbol() && OrderMagicNumber() == SELL_Magic01)
        {
            if ((Gap_Level_00 < 0 && (OrderType() == OP_SELL && OrderOpenPrice() - Bid < Gap_Level_00*PipValue*Point))
             || (Gap_Level_00 > 0 && (OrderType() == OP_SELL && OrderOpenPrice() - Bid > Gap_Level_00*PipValue*Point)))
            {
                SellOrderModifyLevel_00();
                
            }
        }
    }
    
    
}

void SellOrderModifyLevel_00()
{
    for (int i=OrdersTotal()-1; i >= 0; i--)
    if (OrderSelect(i, SELECT_BY_POS, MODE_TRADES))
    {
        if (OrderType() == OP_SELL && OrderSymbol() == Symbol() && OrderMagicNumber() == SELL_Magic01) 
        { 
            double Level_00_SL = Bid + Stoploss_Level_00*PipValue*Point;
            if (Stoploss_Level_00 == 0) Level_00_SL = 0;
            double Level_00_TP = Bid - Takeprofit_Level_00*PipValue*Point;
            if (Takeprofit_Level_00 == 0) Level_00_TP = 0;
            bool ret = OrderModify(OrderTicket(), OrderOpenPrice(), Level_00_SL, Level_00_TP, 0, Modify_Order_Colour);
            if (ret == false)
            Print("OrderModify() error - ", ErrorDescription(GetLastError()));
        }
    }
    
}


Así que sí, realmente he intentado chicos antes de molestar a todos ustedes de nuevo.... durante horas y horas ... Estoy perdido de nuevo...

Cualquier ayuda o indicación será apreciada ;)