SOLO VELA / BAR - ¿Cómo catalogar o segregar la vela? - ¡POR FAVOR CORRÍJANME! - página 2

 
Wodzuuu:

Para los que aún no entienden mi EA escriban un cuento: D jejeje


El evento es velas - cuenta con varias opciones para comprar y vender o cerrar.

Entiendo más mirando tu código que leyendo lo que has escrito... ;-)
 

En lugar de ver programas de televisión como su segunda función se debe considerar para leer y entender el Libro. ;-)

Lo que usted está tratando de lograr es sencillo y se utiliza en muchas estrategias, pero su código - y sus historias - son confusas y parcialmente erróneas - al menos el código.... no estoy seguro de las historias.

//Pseudo code

if(NewBar) ResetSignals();                //Set all SignalxExecuted to false
if(SignalBuy1&&!SignalBuy1Executed&&OpenOrders()==1){
//do open buy position
  SignalBuy1Executed=true;                //Set Signal to exectued to prevent a reuse in the same bar
}

if(SignalBuy2&&!SignalBuy2Executed&&OpenOrders()==2){
//do open buy position
  SignalBuy2Executed=true;                //Set Signal to exectued to prevent a reuse in the same bar
}

SignalBuy1=CheckForOpenBull42();          //Check for Signal1 condition is true
SignalBuy2=CheckForOpenBull62();	  //Check for Signal2 condition is true	

if(OpenOrders()>0)CheckForClose();        //Check any order needs to be closed


//and so on.....

¿Por qué no intenta implementar una sola señal por el momento y concentrarse en la codificación de las funciones necesarias? Si tienes un buen código para una señal, probablemente sea fácil implementar las otras señales y muchas funciones ya están ahí.

Más adelante podrías utilizar Arrays y otras funciones para simplificarlo, pero la simplificación de tu código anterior no debería ser tu mayor problema en este momento.

 

Kronin ¡Sí! me entiendes :), muchas de las estrategias en un EA .
Tengo que escribir 150 políticas y deben caminar al mismo tiempo en el mismo gráfico, y ejecutar todas las estrategias a la vez. Cuando ejecute 150 EA al mismo tiempo mi PC va a explotar - creo que sí.

Después no tiene sentido porque solo puedes tener unEA de estrategia y muchos ya dentro.

Porsupuesto, la estrategia no puede interferir entre sí a cabo y cuando se ejecuta uno el segundo puede ejecutar también, y puedo haber ejecutado strategie 1, y 3 y 5. y strategie (1,3,5) que se ejecuta en el mismo momento.

No voy a escribir más historias :)


Mi código está mal - se sabe, traté de poner las dos estrategias en un solo EA, el código funciona bien , pero la totalidad no está funcionando bien

Tu códigoes muy interesante , lo estudiaré, por favor dame algo de tiempo

 

Hola amigos, después de un largo trabajo en el código y a través de la información de Kronin código está estructurado y opera.
Elcódigo presenta dos estrategias en un solo EA


1.Para un escenario de compra de velaspequeñas está marcado con una fl echa azul, son dos opciones de COMPRA
2. Para el escenario decompra de velas medias está marcado con una flecha roja, son tres opciones de COMPRA


Tengo una situación también donde 1 punto = 1 pip es conveniente (para resolver el problema es para más adelante)
No utilizar las opciones si (NewBar) ResetSignals () porque creo que no son la causa del error

Si eliminas la función PART 2 en start() azul una estrategia funcionará , y funciona bien
Siejecuta el código PART1 y PART2 que contiene dos estrategias de lanzamiento , pero se superponen. este es el error

¿Podría echar un vistazo Kronin

//+------------------------------------------------------------------+
//+------------------------------------------------------------------+
#define MAGICMA  20050610

//+------------------------------------------------------------------+
//| Check NEW BAR     WORK AT BARS  M15                                 |
//+------------------------------------------------------------------+
/*

bool New_Bar = false;

bool Fun_New_Bar()                

   {                                
   static datetime New_Time=0;      
   New_Bar=false;                   
   if(New_Time!=Time[0])           
      {
      New_Time=Time[0];                
      New_Bar=true;                    
      }
   }
*/

//+------------------------------------------------------------------+
//| Calculate open positions    HOW MEANY OF THIS                    |
//+------------------------------------------------------------------+

int OpenOrders(string symbol)
  {
   int buys=0,sells=0;
//----
   for(int i=0;i<OrdersTotal();i++)
     {
      if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES)==false) break; 
      if(OrderSymbol()==Symbol() && OrderMagicNumber()==MAGICMA)
        {
         if(OrderType()==OP_BUY) buys++;
        }
     }
//---- return orders volume
   return(buys);
  }

//+------------------------------------------------------------------+
//| Calculate candle      These is condidion                         |
//+------------------------------------------------------------------+

// scenario 1 / EA 1  /  startegy 1 / blue

bool BULL4()
   {
   if(Close[1]-Open[1]>=4*Point && Close[1]-Open[1]<=5*Point)
   return(true);
   } 

// scenario 2 / EA 2  /  startegy 2 / red

bool BULL6()
   {
   if(Close[1]-Open[1]>=6*Point && Close[1]-Open[1]<=7*Point)
   return(true);
   }
      
//+------------------------------------------------------------------+
//| Check for open order conditions                                  |
//+------------------------------------------------------------------+

// Check for open for scenario 1 / EA 1  /  startegy 1 
 
bool OpenBULL41()
  {
   int    res;
   if(Bid==Close[1]+3*Point)  
     {
      res=OrderSend(Symbol(),OP_BUY,0.41,Ask,0,Close[1]-25*Point,0,"",MAGICMA,0,Blue);
      return (true);
     }
   return (false);  
  }
  
//----------------------------------- 
bool OpenBULL42()
  {
   int    res;
   if(Ask>OrderOpenPrice()+4*Point)  
     {
      res=OrderSend(Symbol(),OP_BUY,0.42,Ask,0,Close[1]-25*Point,0,"",MAGICMA,0,Blue);
      return;
     }
  }  
  
// Check for open for scenario 2 / EA 2  /  startegy 2
  
void OpenBULL61()
  {
   int    res;
   if(Bid==Close[1]+4*Point)  
     {
      res=OrderSend(Symbol(),OP_BUY,0.61,Ask,0,Close[1]-25*Point,0,"",MAGICMA,0,Red);
      return;
     }
  }
//-----------------------------------  
 
void OpenBULL62()
  {
   int    res;
   if(Ask>OrderOpenPrice()+2*Point)  
     {
      res=OrderSend(Symbol(),OP_BUY,0.62,Ask,0,Close[1]-25*Point,0,"",MAGICMA,0,Red);
      return;
     }
  }
  
//----------------------------------- 
void OpenBULL63()
  {
   int    res;
   if(Ask>OrderOpenPrice()+2*Point)  
     {
      res=OrderSend(Symbol(),OP_BUY,0.63,Ask,0,Close[1]-25*Point,0,"",MAGICMA,0,Red);
      return;
     }
  }
//+------------------------------------------------------------------+
//| Check for close order conditions                                 |
//+------------------------------------------------------------------+

void CheckForClose()
{
   RefreshRates();
   if(OrderOpenPrice()+4*Point< Ask)
   for (int i = OrdersTotal()-1; i >= 0;i--)       // I Have do -1 in "OrdersTotal()-1"
   {
      OrderSelect(i,SELECT_BY_POS,MODE_TRADES);
      if (OrderSymbol() == Symbol()) 
      {
         bool ticket = true;
         if (OrderType() == OP_BUY) ticket = OrderClose(OrderTicket(),OrderLots(),Bid,1,Black);

      }
   }
} 
/*
void CheckForClose2()
{
   RefreshRates();
   if(OrderOpenPrice()+6*Point< Ask)
   for (int i = OrdersTotal(); i >= 0;i--)
   {
      OrderSelect(i,SELECT_BY_POS,MODE_TRADES);
      if (OrderSymbol() == Symbol()) 
      {
         bool ticket = true;
         if (OrderType() == OP_BUY) ticket = OrderClose(OrderTicket(),OrderLots(),Bid,1,Black);

      }
   }
} 
*/
                                       
//+------------------------------------------------------------------+
//| Start function                                 |
//+------------------------------------------------------------------+
void start()
  {
      
//------------------                                                          PART1      
           bool SignalBULL41Executed=false;
            if(BULL4() && !SignalBULL41Executed && OpenOrders(Symbol())==0)
               {
               OpenBULL41();//do open buy position
               SignalBULL41Executed=true;
               }
               
            bool SignalBULL42Executed=false;
            if(!SignalBULL42Executed && OpenOrders(Symbol())==1)
               {
               OpenBULL42();//do open buy position
               SignalBULL42Executed=true;
               }  
               
            if(OpenOrders(Symbol())>0)CheckForClose();  
            
//------------------                                                          PART 2
            
            bool SignalBULL61Executed=false;
            if(BULL6() && !SignalBULL61Executed && OpenOrders(Symbol())==0)
               {
               OpenBULL61();//do open buy position
               SignalBULL61Executed=true;
               }
               
            bool SignalBULL62Executed=false;
            if(!SignalBULL62Executed && OpenOrders(Symbol())==1)
               {
               OpenBULL62();//do open buy position
               SignalBULL62Executed=true;
               }  
               
           bool SignalBULL63Executed=false;
            if(!SignalBULL63Executed && OpenOrders(Symbol())==2)
               {
               OpenBULL63();//do open buy position
               SignalBULL63Executed=true;
               }                
               
//            if(SignalBULL61Executed && OpenOrders(Symbol())>0)CheckForClose2();                    
            
  }
//+------------------------------------------------------------------+
 
Wodzuuu:

No utilizar las opciones if (NewBar) ResetSignals () porque creo que no son la causa del error

La forma en que está codificada la función Fun_NewBar() no te permitirá hacer eso... tienes que hacerlo así para que sea de tipo bool y devuelva un valor bool....

bool Fun_New_Bar()                
   {                                
   static datetime New_Time=0;      
                     
   if(New_Time!=Time[0])           
      {
      New_Time=Time[0];                
      return(true);       // <---- we have a new bar so the function returns true
      }

   return(false);
   }
 

tienes razón devuelve bool y hay int (ya arreglado) que no veo antes. Gracias
Pero esta función no la uso, es como un texto

No creo que esto se aplique a las funciones que me separandos estrategias superpuestas . No veo la relación. ¿O tal vez estoy equivocado?

//Pseudo code

if(NewBar) ResetSignals();                //Set all SignalxExecuted to false
if(SignalBuy1&&!SignalBuy1Executed&&OpenOrders()==1){
//do open buy position
  SignalBuy1Executed=true;                //Set Signal to exectued to prevent a reuse in the same bar
}
 

Es bueno ver que has hecho algunos progresos, pero todavía queda un largo camino por recorrer :-)

Tienes que arreglar lo que RaptorUK dijo arriba. El restablecimiento de las señales es importante, de lo contrario el EA se detiene muy pronto con la apertura de nuevas operaciones.
Su implementación es incorrecta. Si usted restablece el SignalExecuted con cada tick, no tiene sentido. Tal vez no abre más operaciones, porque filtras también las OpenOrders. Pero, como tu estrategia permite tener múltiples órdenes abiertas, puedo imaginar que también quieres un algoritmo para cerrar órdenes, por lo que necesitas que la bandera SignalExecuted se restablezca en una nueva barra (con tu implementación es inútil y no la necesitas).

Si te entiendo bien, no ejecutarás BULL4 si BULL6 también es cierto. O en otras palabras, la estrategia azul sólo, si la estrategia roja no es válida, o la vela pequeña sólo si la vela media no es válida.

if(BULL4()&&!BULL6(){             // <--- only strategy BULL4 is valid, we are looking at a 'small' bar.
  if(!SignalBULL41Executed && OpenOrders(Symbol())==0){
    OpenBULL41();//do open buy position
    SignalBULL41Executed=true;
  }
  if(!SignalBULL42Executed && OpenOrders(Symbol())==1){
    OpenBULL42();//do open buy position
    SignalBULL42Executed=true;
}
 

Próximos pasos:

// Check for open for scenario 1 / EA 1  /  startegy 1 
 
bool OpenBULL41()
  {
   int    res;
   if(Bid==Close[1]+3*Point)  					                       // <--- equal makes no sense here and you should not compare doubles for equality. 
                                                                                                  Read (again): https://www.mql5.com/en/forum/136997 
     {
      res=OrderSend(Symbol(),OP_BUY,0.41,Ask,0,Close[1]-25*Point,0,"",MAGICMA,0,Blue); // <--- what is your plan with res? You are aware, it does include the ticket 
                                                                                                  number or -1, aren't you?

      return (true);                                                                   // <--- Even if OrderSend() fails you return true.
     }
   return (false);  
  }
  
//----------------------------------- 
bool OpenBULL42()
  {
   int    res;
   if(Ask>OrderOpenPrice()+4*Point) 							// <--- OrderOpenPrice() from a somewhere selected order may or may not work here 
                                                                                                  (may because only one order is open), but it is not nice coded. 
     {
      res=OrderSend(Symbol(),OP_BUY,0.42,Ask,0,Close[1]-25*Point,0,"",MAGICMA,0,Blue);
      return;
     }
  }  

La función CheckForClose() tiene más o menos los mismos problemas y además no hay filtro para el número mágico. También aquí, OrderOpenPrice() seleccionado de una orden en el recuento de compra podría terminar en el cierre de la orden equivocada (no estoy seguro de que funcione realmente).
Por favor, lea de nuevo lo que Raptor escribió en la primera página de este hilo.

Por tus mensajes y los comentarios en el código, tengo la sensación de que quieres saber qué orden pertenece a qué estrategia. Para conseguirlo, puedes definir un segundo número mágico para la segunda estrategia, así será más fácil cerrar las órdenes según la estrategia que tenían abierta

 
kronin:

Próximos pasos:

Por tus mensajes y los comentarios en el código, tengo la sensación de que quieres saber qué orden pertenece a qué estrategia. Para conseguirlo, puedes definir un segundo número mágico para la segunda estrategia. Así será más fácil cerrar las órdenes según la estrategia que tenían abierta

¿No sería más sencillo ejecutar 2 estrategias diferentes en 2 EAs distintos, cada uno en su propio gráfico?
 
RaptorUK:
¿No sería más sencillo ejecutar 2 estrategias diferentes en 2 EAs distintos, cada uno en su propio gráfico?

Sí, para 2, 3, 4, 5... de acuerdo. Pero según las historias y esta :"Tengo que escribir 150 políticas y deben caminar al mismo tiempo en el mismo gráfico, y ejecutar todas las estrategias a la vez . Cuando ejecute 150 EA al mismo tiempo mi PC va a explotar , creo que ."
Creo que planea ejecutar muchas estrategias más en un EA....