EA para cada par de divisas - ¿qué código para abrir sólo una vez por par de divisas? - página 3

 

He cambiado el mecanismo de cierre de

for (int j = 0; j < OrdersTotal(); j ++) 
   {
      if (OrderSelect(j, SELECT_BY_POS, MODE_TRADES)) // If there is the next one        
          {                                          // Analyzing orders:        
              if (OrderSymbol()==Symbol())continue;       // Another security    

//--------------Exit criteria (Exit Buy)    

                    
                if (CloseBuy1_1 >= CloseBuy1_2) Order = SIGNAL_CLOSEBUY;      // Trigger for CloseBuy (more can be added)
                if (CloseSell1_1 <= CloseSell1_2) Order = SIGNAL_CLOSESELL;   // Trigger for Closesell (more can be added)
                         
                        if (Order == SIGNAL_CLOSEBUY) 
                         {
                         OrderClose()

a

for (int k = 0; k < OrdersTotal(); k ++) 
   {
      OrderSelect(k, SELECT_BY_POS, MODE_TRADES);
      if(OrderType() <= OP_SELL &&  OrderSymbol() == Symbol()) 
      {
        if(OrderType() == OP_BUY) 
         {   

//--------------Exit criteria (Exit Buy)    

                    
                if (CloseBuy1_1 >= CloseBuy1_2) Order = SIGNAL_CLOSEBUY;      // Trigger for CloseBuy (more can be added)
                if (CloseSell1_1 <= CloseSell1_2) Order = SIGNAL_CLOSESELL;   // Trigger for Closesell (more can be added)
                         
                        if (Order == SIGNAL_CLOSEBUY) 
                         {
                         OrderClose(....)

y ahora todo funciona como se espera. Aunque no entiendo por qué es eso. Porque realmente no entiendo las líneas adicionales en el segundo código. ¡Pero gracias chicos!

 
grey.unit:

Cambio el mecanismo de cierre de:

a

y ahora todo funciona como se esperaba. ¡Gracias chicos!

Probablemente no siempre funcione... cuando se cierran órdenes abiertas o se borran órdenes pendientes dentro de un bucle DEBE contar hacia abajo y no hacia arriba... tiene que cambiar su bucle. Y usted necesita poner el chack de nuevo en para Symbol() . . de lo contrario el EA para EURUSD terminará potencialmente cerrando órdenes para GBPUSD . . lo que tenía que hacer era deshacerse de la continuación . . o hacer el == en !=
 
grey.unit:

He cambiado el mecanismo de cierre de

a

y ahora todo funciona como se espera. Aunque no entiendo por qué es eso. Porque realmente no entiendo las líneas adicionales en el segundo código. ¡Pero gracias chicos!

Su segundo código es correcto, pero un poco raro. Abre el MetaEditor, la ventana del navegador (Ctrl + D), la pestaña de diccionario, y seleccione MQL4 Reference > Standard constants > Trade operations.

 
RaptorUK:
Probablemente no funcione siempre... cuando se cierran órdenes abiertas o se borran órdenes pendientes dentro de un bucle DEBE contar hacia abajo no hacia arriba... necesita cambiar su bucle. Y necesitas poner el chack de nuevo en Symbol() . . . de otra manera el EA para EURUSD terminará potencialmente cerrando órdenes para GBPUSD . . lo que necesitabas hacer era deshacerte del continue . . . o hacer el == en !=

Sólo para que lo entiendas bien. Lo que dices es que si modifico el primer código a:

for (int j = 0; j < OrdersTotal(); j --) 
   {
      if (OrderSelect(j, SELECT_BY_POS, MODE_TRADES)) // If there is the next one        
          {                                          // Analyzing orders:        
              if (OrderSymbol()==Symbol())       // Another security    
                 {

//--------------Exit criteria (Exit Buy)    

                    
                if (CloseBuy1_1 >= CloseBuy1_2) Order = SIGNAL_CLOSEBUY;      // Trigger for CloseBuy (more can be added)
                if (CloseSell1_1 <= CloseSell1_2) Order = SIGNAL_CLOSESELL;   // Trigger for Closesell (more can be added)
                         
                        if (Order == SIGNAL_CLOSEBUY) 
                         {
                         OrderClose(....)

¿también debería funcionar? Porque he probado esto y vuelve a abrir una sola orden por par de divisas.

O si cambio el segundo código a (k++ a k--) también abre una sola operación por par de divisas.

for (int k = 0; k < OrdersTotal(); k --) 
   {
      OrderSelect(k, SELECT_BY_POS, MODE_TRADES);
      if(OrderType() <= OP_SELL &&  OrderSymbol() == Symbol()) 
      {
        if(OrderType() == OP_BUY) 
         {   
 
grey.unit:

Sólo para que lo entiendas bien. Lo que dices es que si modifico el primer código a:

¿también debería funcionar? Porque he probado esto y vuelve a abrir una sola orden por par de divisas.

O si cambio el segundo código a (k++ a k--) también abre una sola operación por par de divisas.

Me refiero al primer código, el bucle que estás usando donde cierras las órdenes... debe decrementar... . de lo contrario se perderán las órdenes. Veo que has quitado el continue y has añadido llaves { }, muy bien :-)

¿Abrir una orden por par de divisas o una orden en total?

 
RaptorUK:

¿Abrir una orden por par de divisas o una orden en total?

Sí, en total por supuesto. Bien el segundo código:


for (int j = 0; j < OrdersTotal(); j ++) 
   {
      if (OrderSelect(j, SELECT_BY_POS, MODE_TRADES)) // If there is the next one        
          {                                          // Analyzing orders:        
              if (OrderSymbol()==Symbol())continue;       // Another security    

Cuando hablamos del bucle creo que te refieres a esto:

for (int j = 0; j < OrdersTotal(); j ++)

En realidad yo lo cambiaría por algo así:

for (int j = OrdersTotal()+1 ; j > OrdersTotal(); j --) 
   {

Esta línea abre sólo una orden por par de divisas (como se desea)

¿Es correcto el bucle en cuanto a este problema ahora? :

RaptorUK:

Probablemente no siempre funcione... cuando se cierran órdenes abiertas o se borran órdenes pendientes dentro de un bucle DEBE contar hacia abajo y no hacia arriba... tiene que cambiar su bucle. Y necesita poner el chack de nuevo en Symbol() . . de otra manera el EA para EURUSD terminará potencialmente cerrando órdenes para GBPUSD . . lo que necesitaba hacer era deshacerse del continue . . o hacer el == en !=
 
grey.unit:

Sí, en total, por supuesto. Bien, segundo código:


Cuando hablamos del bucle creo que te refieres a esto:

En realidad yo lo cambiaría por algo así:

Esta línea abre sólo una orden por par de divisas (como se desea)

¿Es el bucle correcto en relación con este problema ahora?

No, haga esto...

for (int j = OrdersTotal()-1 ; j >= 0 ; j --)   // start at OrdersTotal() -1 ,  finish when j = 0

La primera posición de la orden es 0, así que si tienes 5 órdenes las posiciones son 0, 1, 2, 3, 4... así que la última es OrdersTotal() - 1... así que para contar hacia abajo empiezas en OrdersTotal()-1 y terminas en 0

 
Bien, ¡muchas gracias por su ayuda!
 
RaptorUK:

No, haz esto. . .

La primera posición de la orden es 0, así que si tienes 5 órdenes las posiciones son 0, 1, 2, 3, 4... así que la última es OrdersTotal() - 1... así que para contar hacia abajo empiezas en OrdersTotal()-1 y terminas en 0

Así que debería verse así:

for (int j = OrdersTotal()-1 ; j = 0 ; j --) 

porque tu escribiste esto:

for (int j = OrdersTotal()-1 ; j >= 0 ; j --) 

¿o me equivoco?

 
grey.unit:

Así que debería ser así:

porque tú escribiste esto:

¿o me equivoco?

Estás muy equivocado. Tu código nunca se ejecuta. Usa el de RaptorUK.
Razón de la queja: