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

 

Este enlace de aquí está 'muy' por encima de mí en esta etapa, sin embargo puedo ver cómo podría hacer un archivo de biblioteca fresco para hacer frente a mis problemas ... https://www.mql5.com/en/articles/1390. Estoy un poco nervioso construcción de matrices de entradas atm y estoy esperando que puedo conseguir alrededor de él por ahora .. ya que cuando modifico, es sólo todo lo que Par y Magia etc..

He hecho todo correctamente antes de llegar a la sección de Modificación. Selecciona por ticket correctamente, y luego pasa por el bloque Modificar... esa parte es genial.

Sólo que no puedo ver "si las cosas se atascan en esta sección de modificación" o estoy en problemas porque "necesita pasar por estas secciones para agarrar la siguiente orden".

Tenía la esperanza de poder enviarlo al bloque de modificación y conseguir que modificara todos los pedidos de ese Número Mágico y del Símbolo. Por eso probé con un pequeño interruptor true o false.

Si necesita pasar a través de estas secciones cada garrapata 'para seleccionar el siguiente orden', yo podría estar en problemas.

Quizás podría nombrar manualmente las entradas que hay que modificar, pero no creo que sea el problema, ya que las coge correctamente, simplemente hace un ciclo cada tick, y soy un noob para saber por qué...

¿Sería esta otra opción?

 for(int i=1; i<=OrdersTotal(); i++)
     { 
      if (OrderSelect(i-1,SELECT_BY_POS)
       executedpreviously = true;
       while(true)
         {
         modify section is ok...   
          }
        executedpreviously = false;
      }
//or would I declare this back to false elsewhere... 
//I am just not sure if it needs to run here each tick to grab the next order

¿Sería útil un continue;, return(), o break; en alguna parte?

 

Ah, he visto un error en uno de mis ejemplos anteriores...

if (OrderType() == OP_SELL && OrderSymbol() == Symbol() && OrderMagicNumber() == SELL_Magic01 && !IfGap_SELLLevel_00AlreadyExe) 

Creo que debe ser:

bool IfGap_SELLLevel_00AlreadyExe = FALSE; //(this time up in declared varibales before program start)


    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 == FALSE)
        { 
            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()));
            break;  (EDIT: going to try this break in the morning, pls let me know if I am off track totally anyway)
         }
    }

Eso debería aislarlo en esa sección... son las 5 de la mañana así que aún por probar... (perdido una hora, maldito ahorro de luz del día jaja)

Si lo dejo pasar a esta sección de una forma, hace un spam de modificaciones de órdenes en cada tick con la última orden... y si lo dejo pasar de la otra forma hace un scroll de órdenes correcto, pero sigue modificando la caché de órdenes en cada tick...

Puedo conseguir que las órdenes se desplacen hacia atrás 5,4,3,2,1 o hacia delante 1,2,3,4,5, pero no se me ocurre una forma de dejarlo pasar para que modifique todas las órdenes sin hacer spam.

Me pregunto: 1) ¿tengo que dejarlo pasar una vez para modificar todas las órdenes que pasen..., o 2) tiene que pasar cada vez que tenga que seleccionar una nueva orden?

Todavía estoy aprendiendo eso es todo.. Si nadie me puede orientar en la dirección correcta, voy a probar esta línea de arriba, con una pausa y el final y ver si eso termina.... tiene que ser algo simple ..

 
IfGap_SELLLevel_00AlreadyExe == FALSE)  this may still compile, but truly speaking, this a "mis-spelt" boolean syntax.

No has cometido ningún error. El primero es BUENO para ir...

if (OrderType() == OP_SELL && OrderSymbol() == Symbol() && OrderMagicNumber() == SELL_Magic01 && !IfGap_SELLLevel_00AlreadyExe) <--- this is GOOD to go..


Puede que haya tenido un prb bastante similar antes, si leo todo esto correctamente. Intentaba crear mi propio "modificar las órdenes de stop/límite por el nivel mínimo de MODE_STOP, si Bid/Ask se aleja x Pips..."

¿Es tu caso similar?

 
diostar:

No has cometido ningún error. El primero es BUENO para ir...


Puede que haya tenido un prb bastante similar antes, si leo todo esto correctamente. Intentaba crear mi propio "modificar órdenes de stop/límite por el nivel mínimo de MODE_STOP, si Bid/Ask se aleja x Pips..."

¿Es tu caso similar?



Gracias Diostar, estoy tratando de hacer una especie de montón de con órdenes pendientes, a continuación, ya que llega a la siguiente orden pendiente con éxito, llevar a cabo las paradas de edad.

Intentaré con el ! de nuevo entonces... tantas combinaciones para probar... y veo, debería haber usado "false" para el valor booleano en lugar de FALSE... sí compiló y funciona bien todavía, pero el mismo problema. Puede que vuelva a buscar ese borrador y lo intente con "false".. En ese ejemplo 2, no se desplazaba por las órdenes, y modificaba cada tick, así que lo intentaré de nuevo con esta variable cambiada.

Consigo que pase al bloque de modificación y gire las órdenes hacia delante o hacia atrás, pero modifica cada tick, y si pongo un filtro true o false después de modificar, sólo modifica la primera orden en la caché....

para mi esto sugiere que el EA necesita llegar a este bloque cada tick para obtener la siguiente orden (no estaba seguro de si cuando llega a este bloque, si puedo simplemente sellarlo aquí, y conseguir que rote a través de las órdenes una vez)...

esto me plantea un problema, ya que cualquier pregunta verdadera o falsa no lo deja pasar...

Creo que si aprendiera a hacer un caché de órdenes y a seleccionar a través de ellas seguiría teniendo el mismo problema... Me han pasado todas las combinaciones, pero no todas a la vez. He conseguido que modifique una vez y siga adelante, pero sólo ha conseguido el primer pedido y se ha detenido... así que me estoy preguntando si debería usar eso con un interruptor con cada orderticket realmente especificado... No estaba seguro de si mi bool OrderTicket() para informar de mi mensaje de error, estropeó la declaración de un Pending_OrderTicket_XX también... Tiene que ser algo simple..

¿como resolviste este problema en el tuyo?

 
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 && !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;
            OrderModify(OrderTicket(), OrderOpenPrice(), Level_00_SL, Level_00_TP, 0, Modify_Order_Colour);
            IfGap_SELLLevel_00AlreadyExe = true;
            
        }
    }
    
}


Independientemente de cómo declare en las variables globales...

bool IfGap_SELLLevel_00AlreadyExe;

..parece modificar una vez, PERO sólo una de las órdenes, supongo que la última orden con la forma en que me desplazo órdenes.

He sacado la entrada ret00 antes de la orden por si acaso también...

Al menos no es cada tick, podría usar este ejemplo SI todavía se desplazara a través de mis órdenes cuando las condiciones para la primera fórula son verdaderas (pero en no cada tick 'spam modifica' después de desplazarse bien, como mi intento más exitoso hace...)

Este intento tampoco funcionó:

**sent here first from that other decision, but for Pending Order 5 instead of FirstSell 00 etc...

void SellOrderModifyLevel_05()
{
    for (int i=OrdersTotal()-1; i >= 0; i--)
    if (OrderSelect(i, SELECT_BY_TICKET))
    {
        if (OrderType() == OP_SELL && OrderSymbol() == Symbol() && OrderMagicNumber() == SELL_Magic01 && !IfGap_SELLLevel_00AlreadyExe) 
        { 
            double Level_05_SL = Bid + Stoploss_Level_05*PipValue*Point;
            if (Stoploss_Level_05 == 0) Level_05_SL = 0;
            double Level_05_TP = Bid - Takeprofit_Level_05*PipValue*Point;
            if (Takeprofit_Level_05 == 0) Level_05_TP = 0;
            OrderModify(FirstRunSell_ticket_00, OrderOpenPrice(), Level_05_SL, Level_05_TP, 0, Modify_Order_Colour);
            OrderModify(SellPendingOrderTicket_01, OrderOpenPrice(), Level_05_SL, Level_05_TP, 0, Modify_Order_Colour);
            OrderModify(SellPendingOrderTicket_02, OrderOpenPrice(), Level_05_SL, Level_05_TP, 0, Modify_Order_Colour);
            OrderModify(SellPendingOrderTicket_03, OrderOpenPrice(), Level_05_SL, Level_05_TP, 0, Modify_Order_Colour);
            OrderModify(SellPendingOrderTicket_04, OrderOpenPrice(), Level_05_SL, Level_05_TP, 0, Modify_Order_Colour);
            OrderModify(SellPendingOrderTicket_05, OrderOpenPrice(), Level_05_SL, Level_05_TP, 0, Modify_Order_Colour);
            IfGap_SELLLevel_00AlreadyExe = true;
            
        }
    }
    
}

Me muestra más claro lo que estoy tratando de hacer de todos modos, me gustaría que esto por encima de trabajo, yo habría hecho si es así ...

Espero que estoy en el camino correcto de todos modos .. Sigo sin entender porque mi ejemplo 1 anterior estaba mal, a lo tonto hace exactamente lo que quiero, pero cada tick... Ni siquiera puedo conseguir que funcione cuando programo en las órdenes, así que estoy totalmente perdido de nuevo..

¿Algún consejo?


EDIT: Me estoy agotando, pero acabo de pensar en esto, sin embargo tendrá que probar más tarde como se quedó sin tiempo ...

void IfGap_SELLLevel_05()
{
    if (OrderSelect(SellPendingOrderTicket_05,SELECT_BY_TICKET,MODE_TRADES)) 
    {
        if (OrderSymbol() == Symbol() && OrderMagicNumber() == SELL_Magic01 && !IfGap_SELLLevel_00AlreadyExe)
        {
            if ((Gap_Level_05 < 0 && (OrderType() == OP_SELL && OrderOpenPrice() - Bid < Gap_Level_05*PipValue*Point))
             || (Gap_Level_05 > 0 && (OrderType() == OP_SELL && OrderOpenPrice() - Bid > Gap_Level_05*PipValue*Point)))
            
             {
              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_05_SL = Bid + Stoploss_Level_05*PipValue*Point;
                       if (Stoploss_Level_05 == 0) Level_05_SL = 0;
                       double Level_05_TP = Bid - Takeprofit_Level_05*PipValue*Point;
                       if (Takeprofit_Level_05 == 0) Level_05_TP = 0;
                       OrderModify(FirstRunSell_ticket_00, OrderOpenPrice(), Level_05_SL, Level_05_TP, 0, Modify_Order_Colour);
                       OrderModify(SellPendingOrderTicket_01, OrderOpenPrice(), Level_05_SL, Level_05_TP, 0, Modify_Order_Colour);
                       OrderModify(SellPendingOrderTicket_02, OrderOpenPrice(), Level_05_SL, Level_05_TP, 0, Modify_Order_Colour);
                       OrderModify(SellPendingOrderTicket_03, OrderOpenPrice(), Level_05_SL, Level_05_TP, 0, Modify_Order_Colour);
                       OrderModify(SellPendingOrderTicket_04, OrderOpenPrice(), Level_05_SL, Level_05_TP, 0, Modify_Order_Colour);
                       OrderModify(SellPendingOrderTicket_05, OrderOpenPrice(), Level_05_SL, Level_05_TP, 0, Modify_Order_Colour);
                       IfGap_SELLLevel_00AlreadyExe = true;
            
                      }
                }
           }
       }
    
    
}
 

¿se trata de un punto fraccionario?

 
diostar:

¿se trata de un punto fraccionario?


Creo que he duplicado el valor del SL y TP si es lo que quieres decir, para que se asigne el precio para establecer el SL y TP. Espero no haberme equivocado al hacer esto.

Sólo necesito MT4 para llegar a ese bloque, y luego olvidarse de él.... Tengo la sensación de que la expresión va a ser demasiado complicada para MT4, pero seguiré intentándolo...

 
Funky:


Creo que he duplicado el valor del SL y del TP, si es a lo que te refieres, para que se asigne el precio para fijar el SL y el TP. Espero no haberme equivocado al hacer esto.

Sólo necesito MT4 para llegar a ese bloque, y luego olvidarse de él.... Tengo la sensación de que la expresión va a ser demasiado complicada para MT4, pero seguiré intentándolo...

No lo que quiero decir es, ¿se trata de 4/5 dígitos - 0,0001, o 0,00001 Punto?
 
diostar:
No, lo que quiero decir es, ¿se trata de 4/5 dígitos - 0,0001, o 0,00001 Punto?


Ah 5 dígitos... Yo uso esto antes...

extern bool IsFiveDigitBroker = true;
extern bool DoDetectBrokerDigits = true;
double PipValue=1;
int NDigits = 4; 
// ----

int init()
{
    NDigits = Digits;
}

// ----
init start()

int start()
{
   OnEveryTick();
}
void OnEveryTick()
{
    if (DoDetectBrokerDigits == false && IsFiveDigitBroker) PipValue = 10;
    if (DoDetectBrokerDigits && (NDigits == 3 || NDigits == 5)) PipValue = 10;



    //then I go on to check the IfGaps on every tick...

    IfGap_SELLLevel_00();
    IfGap_SELLLevel_01();
    IfGap_SELLLevel_02();
    IfGap_SELLLevel_03();
    IfGap_SELLLevel_04();
    IfGap_SELLLevel_05();

 }



Y yo estaba pensando antes, podría tratar de convertir este Detectar dígitos como mi primera inserción de la biblioteca, jeje, pero un paso a la vez, tengo que aprender a gatear primero, jeje.

No me sale ningún mensaje de error 130 precio a cerrar ni nada.... Ojalá fuera algo sencillo como eso..

La última página que tenía el ejemplo 1 de trabajo, y un montón de otros ejemplos similares, sólo me gustaría poder dejar que se modifica una vez por garrapata ...

En lugar de intentar obtener todas mis órdenes de VENTA anteriores a la vez, me pregunto si debería hacer una nueva caja para cada una de ellas... sí, estoy realmente perdido en cómo recorrer todas mis antiguas órdenes de VENTA en cualquiera de mis intentos, y modificarlas una vez.


&& (OrderStopLoss() < Stoploss_Level_00)

en lugar de

!IfGap_SELLLevel_00AlreadyExe

Usted sabe que usted sugiere algo antes Diostart que me ha hecho pensar ...

Me pregunto si la idea de !IfGap_SELLLevel_00AlreadyExe no funcionará (si no va a agarrar todas las órdenes y modificarlas en el mismo paso a través antes de que yo bloquee ese bloque), me pregunto si uso tu idea antes, y pongo una pregunta como esta... Si funciona, ya lo comentaré.

Si estoy en el camino equivocado sin embargo, por favor hágamelo saber, saludos ;)

 
Funky:


Ah 5 dígitos... Yo uso esto antes...



Y estaba pensando antes, que podría intentar convertir este Detect Digits como mi primera inserción en la biblioteca, jeje, pero un paso a la vez, tengo que aprender a gatear primero, jeje. <... sabio movimiento. Estás gateando. Con las bibliotecas, acabarás caminando.

No estoy recibiendo ningún mensaje de error 130 precio para cerrar o cualquier cosa.... Me gustaría que fuera algo simple como eso..

La última página tenía el ejemplo 1 funcionando, y muchos otros ejemplos similares, sólo me gustaría poder dejar que se modifique una vez por tick... <--- ver más abajo

En lugar de intentar obtener todas mis órdenes de VENTA anteriores a la vez, me pregunto si debería hacer una nueva caja para cada una de ellas... sí, estoy realmente perdido en cómo recorrer todas mis antiguas VENTAS en cualquiera de mis intentos, y modificarlas una vez.<--- ver abajo


Es posible que esto pueda ofrecer alguna ayuda, espero.

Inicialmente, mis símbolos era de 4 dígitos, todos los trailing stops, órdenes de parada / límite modificar, fue como se esperaba. Entonces mi corredor decidió ir fraccional. Hice los cambios necesarios y vi que mis pips fueron como -3.4, -4.5, 0.1, 4.6, 7.3, etc, etc. Pensé que esto estaba bien, pero en realidad no: Supongamos que establezco mi límite=7, y digamos que los nuevos tick 1,tick 2,tick 3 suceden secuencialmente:

1) 7.3>límite, entonces la orden se modifica... el corredor llena 1 deslizamiento fuera...

2) 7.5>límite, entonces la orden es modificada....el corredor llena 0 deslizamiento...

3) 7.1>límite, luego se modifica la orden...broker llena 2 deslizamientos fuera...

Así que, en total, mis órdenes se modifican 3 veces para los 3 ticks. Habiéndome dado cuenta de esto, decidí usar MathRound() para redondearlas al entero más cercano, así que 1,2,3 se convierte en

1) mathround(7.3) =7 >limit, NOT TRUE, no modificado

2) mathround(7.5)=8 >limit, TRUE, se modifica el orden

3) mathround(7.1)=7>limit, NOT TRUE, no se modifica

En realidad, todavía estoy trabajando en la forma de mejorar lo anterior ... hasta ahora están trabajando bien, pero creo que debe haber mejores maneras, que la mía.

Razón de la queja: