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

 

Tengo la sensación de que perdemos un poco el control sobre el código....

        if ( SignalBULL62Executed) CheckForClose_BULL6();       // I don't know it is the right place to close

No, seguro que este no es el lugar adecuado.

   int    result;
   if(Bid==Close[1]+3*Point)  
     {
      result=OrderSend(Symbol(),OP_BUY,0.61,Ask,0,Close[1]-25*Point,0,"",MAGICMA2,0,Red);
      return;
     }
   if (result == -1)
      {
      int e = GetLastError();
      Print(e);
      }   
  } 

Este 'manejo de errores' no mejora nada. Compruébalo de nuevo.

bool Fun_New_Bar()                              // bool             

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

Esto no ha sido creado por diversión. Se debe utilizar para restablecer las banderas ejecutadas en una nueva barra.

if(Bid==Close[1]+3*Point)  

¿Qué hemos aprendido sobre la comparación de dobles y si esto tiene algún sentido aquí?

 

Así que has decidido borrar tu post al que me refiero... ¡Bien hecho, eso es muy útil!

 

Lo siento pero ayer hubo problemas en internet (mql4.com dejó de funcionar). Estaba tratando de corregir algo y ... colapso

//+------------------------------------------------------------------+
//+------------------------------------------------------------------+
#define MAGICMA1  2000        // blue starategy
#define MAGICMA2  2001        // red strategy

//+------------------------------------------------------------------+
//| Check NEW BAR                                |
//+------------------------------------------------------------------+
bool New_Bar = false;

bool Fun_New_Bar()                              // bool             

   {                                
   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 is open   |
//+------------------------------------------------------------------+

//--- FOR BLUE---------------------------------------------------------
int OpenOrders_BULL4(string symbol)
  {
   int buys=0;

   for(int i=0;i<OrdersTotal();i++)
     {
      if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES)==false) break; 
      if(OrderSymbol()==Symbol() && OrderMagicNumber()==MAGICMA1)    // magic ma 1 ( is ==)
        {
         if(OrderType()==OP_BUY) buys++;
        }
     }
   return(buys);
  }
  
//--- FOR RED--------------------------------------------------------------
int OpenOrders_BULL6(string symbol)
  {
   int buys=0;

   for(int i=0;i<OrdersTotal();i++)
     {
      if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES)==false) break; 
      if(OrderSymbol()==Symbol() && OrderMagicNumber()==MAGICMA2)    // magic ma 2 ( is ==)
        {
         if(OrderType()==OP_BUY) buys++;
        }
     }
   return(buys);
  }



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

bool BULL6()
   {
   if(Close[1]-Open[1]>=6*Point && Close[1]-Open[1]<=7*Point)
   return(true);
   }
      
//+------------------------------------------------------------------+
//| Check for open order conditions                                  |
//+------------------------------------------------------------------+
//--------------------------- blue bull4 magicma1 
void OpenBULL41()
  {
   int    result;
   if(Bid==Close[1]+3*Point)  
     {
      result=OrderSend(Symbol(),OP_BUY,0.41,Ask,0,Close[1]-25*Point,0,"",MAGICMA1,0,Blue);
      return(true);
     }
    if (result == -1)
      {
      int e = GetLastError();
      Print(e);
      }      
  }
  
void OpenBULL42()
  {
   int    result;
   
   for(int i=1;i<=OrdersTotal();i++)
   {
      if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES)==false) break; 
      if(OrderSymbol()==Symbol() && OrderMagicNumber()==MAGICMA1)    // magic ma 1 ( is ==)
        {
         if(Ask>OrderOpenPrice()+2*Point)  
            {
             result=OrderSend(Symbol(),OP_BUY,0.42,Ask,0,Close[1]-25*Point,0,"",MAGICMA1,0,Blue);
             return;
            }
          if (result == -1)
             {
             int e = GetLastError();
             Print(e);
             }    
        }
     }
  }  
//--------------------------- red bull6 magicma2 
void OpenBULL61()
  {
   int    result;
   if(Bid==Close[1]+3*Point)  
     {
      result=OrderSend(Symbol(),OP_BUY,0.61,Ask,0,Close[1]-25*Point,0,"",MAGICMA2,0,Red);
      return;
     }
   if (result == -1)
      {
      int e = GetLastError();
      Print(e);
      }   
  }
  
void OpenBULL62()
  {
   int    result;
   if(Ask>OrderOpenPrice()+2*Point)  
     {
      result=OrderSend(Symbol(),OP_BUY,0.62,Ask,0,Close[1]-25*Point,0,"",MAGICMA2,0,Red);
      return;
     }
    if (result == -1)
      {
      int e = GetLastError();
      Print(e);
      }     
  }

void OpenBULL63()
  {
   int    result;
   if(Ask>OrderOpenPrice()+2*Point)  
     {
      result=OrderSend(Symbol(),OP_BUY,0.63,Ask,0,Close[1]-25*Point,0,"",MAGICMA2,0,Red);
      return;
     }
    if (result == -1)
      {
      int e = GetLastError();
      Print(e);
      }    
  }
//+------------------------------------------------------------------+
//| Check for close order conditions                                 |
//+------------------------------------------------------------------+

void CheckForClose_BULL4()
{

   if(OrderOpenPrice()+4*Point< Ask)
   for (int i = OrdersTotal()-1; i >= 0;i--)          // add: -1
   {
      OrderSelect(i,SELECT_BY_POS,MODE_TRADES);
      if (OrderSymbol() == Symbol()&& OrderMagicNumber()==MAGICMA1) 
      {
         bool ticket = true;
         if (OrderType() == OP_BUY) ticket = OrderClose(OrderTicket(),OrderLots(),Bid,1,Blue);

      }
   }
} 

void CheckForClose_BULL6()
{

   if(OrderOpenPrice()+8*Point< Ask)
   for (int i = OrdersTotal()-1; i >= 0;i--)
   {
      OrderSelect(i,SELECT_BY_POS,MODE_TRADES);
      if (OrderSymbol() == Symbol()&& OrderMagicNumber()==MAGICMA2) 
      {
         bool ticket = true;
         if (OrderType() == OP_BUY) ticket = OrderClose(OrderTicket(),OrderLots(),Bid,1,Red);

      }
   }
}  
  
//+------------------------------------------------------------------+
//| flag                               |
//+------------------------------------------------------------------+ 
Fun_New_Bar();
if (New_Bar==false);
bool SignalBULL41Executed=false;
bool SignalBULL42Executed=false;
bool SignalBULL61Executed=false;
bool SignalBULL62Executed=false;
bool SignalBULL63Executed=false;

if(Fun_New_Bar())
{
   SignalBULL41Executed=true;
   return(SignalBULL41Executed);
}


  
  
//+------------------------------------------------------------------+
//| Start function                                 |
//+------------------------------------------------------------------+
void start()
  {
// ----------------bull4
if(BULL4())             
  if(!SignalBULL41Executed && OpenOrders_BULL4(Symbol())==0)
  {
    OpenBULL41();//do open buy position
    SignalBULL41Executed=true;
    if ( SignalBULL41Executed) CheckForClose_BULL4();       // I don't know it is the right place to close
  }
  
  
  if(!SignalBULL42Executed && OpenOrders_BULL4(Symbol())==1)
  {
    OpenBULL42();//do open buy position
    SignalBULL42Executed=true;
        if ( SignalBULL42Executed) CheckForClose_BULL4();       // I don't know it is the right place to close
  }
  
// ----------------bull6  
if(BULL6())             
  if(!SignalBULL61Executed && OpenOrders_BULL6(Symbol())==0)
  {
    OpenBULL61();//do open buy position
    SignalBULL61Executed=true;
        if ( SignalBULL61Executed) CheckForClose_BULL6();       // I don't know it is the right place to close
  }
  
  
  if(!SignalBULL62Executed && OpenOrders_BULL6(Symbol())==1)
  {
    OpenBULL62();//do open buy position
    SignalBULL62Executed=true;
        if ( SignalBULL62Executed) CheckForClose_BULL6();       // I don't know it is the right place to close
  }
  
  
  if(!SignalBULL63Executed && OpenOrders_BULL6(Symbol())==2)
  {
    OpenBULL63();//do open buy position
    SignalBULL42Executed=true;
        if ( SignalBULL62Executed) CheckForClose_BULL6();       // I don't know it is the right place to close
  }   

  }
//+------------------------------------------------------------------+
 

No es fácil ayudarte. Por qué no tratas de implementar sólo una estrategia por ahora, pero con unafunción adecuada, Open(), Close(), Count(), NewBar(), Signal().

El bloque de abajo está fuera de la función de inicio. No estoy seguro de que esto es buscado.

Fun_New_Bar();
if (New_Bar==false);               // <-- ???
bool SignalBULL41Executed=false;   // <-- This could be correct, but I am not sure you know why and
bool SignalBULL42Executed=false;   //     its not more an accident that you initalize it here.
bool SignalBULL61Executed=false;
bool SignalBULL62Executed=false;
bool SignalBULL63Executed=false;

if(Fun_New_Bar())                  // <-- Your Fun_New_Bar() function doesn't return anything,
{                                  //     you set the global New_Bar variable with the function. 
   SignalBULL41Executed=true;      // <-- You should set it to false on a new bar.    
   return(SignalBULL41Executed);   // <-- ???
}
 

Pienso lo mismo que tú, pequeños pasos. Vamos a tomar sólo una opción BULL4
A veces se parece a Ea a mi en codebase

https://www.mql5.com/en/code/9156 - interesante

Entiendo esto (pero no siento), es una bandera yentiendo su propósito

¿Qué piensas? sobre los pequeños pasos

//+------------------------------------------------------------------+
//+------------------------------------------------------------------+
#define MAGICMA1  2000        // blue starategy


//+------------------------------------------------------------------+
//| Check NEW BAR                                |
//+------------------------------------------------------------------+


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

int OpenOrders_BULL4(string symbol)
  {
   int buys=0;

   for(int i=0;i<OrdersTotal();i++)
     {
      if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES)==false) break; 
      if(OrderSymbol()==Symbol() && OrderMagicNumber()==MAGICMA1)   
        {
         if(OrderType()==OP_BUY) buys++;
        }
     }
   return(buys);
  }
  
//+------------------------------------------------------------------+
//| Condition candle                                                 |
//+------------------------------------------------------------------+
bool BULL4()
   {
   if(Close[1]-Open[1]>=4*Point && Close[1]-Open[1]<=5*Point)
      {
         return(true);
      } 
   else
      {
         return(false);
      } 
   }
//+------------------------------------------------------------------+
//| Condition send buy                                                 |
//+------------------------------------------------------------------+
 
bool BULL4send()
   {
   if( Bid==Close[1]+3*Point)
      {
         return(true);
      } 
    else
      {
        return(false);
      }
   }
 
//+------------------------------------------------------------------+
//| Check for open order conditions                                  |
//+------------------------------------------------------------------+

bool OpenBULL41()
  {
      int    result;

      result=OrderSend(Symbol(),OP_BUY,0.41,Ask,0,Close[1]-25*Point,0,"",MAGICMA1,0,Blue);
      if(result>0)
           {
            if(OrderSelect(result,SELECT_BY_TICKET,MODE_TRADES)) Print("BUY order opened : ",OrderOpenPrice());
           }
      else
         {
            Print("Error opening BUY order : ",GetLastError()); 
            return(false);
         }
      return(true);       
   }
   
//+------------------------------------------------------------------+
//| Check for close order conditions                                 |
//+------------------------------------------------------------------+

  
//+------------------------------------------------------------------+
//| Start function                                 |
//+------------------------------------------------------------------+
void start()
  {
// ----------------bull4
   if(BULL4() && BULL4send() && OpenOrders_BULL4(Symbol())==0)             

     {
       OpenBULL41();//do open buy position
     }
  }
//+------------------------------------------------------------------+
 

Sí, pequeños pasos, por lo que los errores son manejables...
¿Quieres destacar algo en concreto del código base del EA?

No volveré a ver esto - no te ayudaré más si sigues ignorando los pasos de corrección, que yo - u otra persona - ha aconsejado hacer:

if( Bid==Close[1]+3*Point)

¿El deslizamiento es 0? Seguramente te dará un error, pero el manejo de errores arreglado lo detectará :-)

result=OrderSend(Symbol(),OP_BUY,0.41,Ask,0,Close[1]-25*Point,0,"",MAGICMA1,0,Blue);

Esto no está mal, pero no es lo ideal y en el peor de los casos no hace lo que quieres dentro del bucle. Lo mejor es que ni siquiera empieces a usar bucles de 0 a OrdersTotal. Lee esto: Bucles y Cierre o Eliminación de Pedidos

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

¿Cuál es el spread de tu broker y cuántos dígitos tienes para el símbolo que quieres operar? No estoy seguro de que utilices el Punto correctamente (Lee en la primera página de tu hilo).

 
kronin:

Sí, pequeños pasos, por lo que los errores son manejables ...
¿Quieres destacar algo específico de la base de código EA?

Creo que no, nada de luz, entiendo lo que escribí.

No volveré a ver esto - no te ayudaré más si sigues ignorando los pasos de corrección, que yo - o alguien más - ha aconsejado hacer:

Sí. Sé lo que hacer NormalizeDouble, creo que entiendo ( si tengo: euro / usd = 1.2390022129.....09.... Y necesitamos: 1,29893 fin! no infinito ) pero no puedo escribir esto, ¿podría ser esto?

if ( NormalizeDouble ( abc(),0 ) )

bool abc()

{

bool z,y,z;

x=Bid;

y=Cerrar[1]

z=x-y+3*Punto

return(z);

}

o ?

If ( NormalizeDouble ((Close[1]-Bid) +3*punto),0 ) ;

¿El deslizamiento es 0? Probablemente obtendrá un error, pero el manejo de errores fijo lo atrapará :-)

Puedo tener +1 sin problema result=OrderSend(Symbol(),OP_BUY,0.41,Ask, 1 ,Close[ 1]-25*Point,0,"",MAGICMA1,0,Blue);

el error se maneja, bueno, vemos lo que será después

Esto no está mal, pero no es lo ideal y en el peor de los casos no hace lo que quieres dentro del bucle. Lo mejor es que ni siquiera empieces a usar bucles de 0 a OrdersTotal. Lea esto: Bucles y Cierre o Eliminación de Pedidos

MUY BUEN ARTICULO! Debería leer esto al principio :)

¿Cuál es el spread de tu broker y cuántos dígitos tienes para el símbolo que quieres operar? No estoy seguro de que utilices correctamente el punto (leído en la primera página de tu hilo).

Me acuerdo de estos. Tengo Admiral Market Bid=1,29000 Ask = 1,29001. Estos es un problema que sé,, pero no tengo la resolución en estos momentos no he encontrado el buen ejemplo.

Estoy escribiendo código...

 
Wodzuuu:

Sí. Sé lo que hace NormalizeDouble, creo que lo entiendo ( si tengo: euro/usd = 1.2390022129.....09.... Y necesitamos 1,29893 fin! no infinito ) pero no puedo escribir estos, podría ser estos?


if (NormalizeDouble( abc(),0 ) )

bool abc()

{


No se puede NormalizarDoble() un bool, la pista está en el nombre de la función y en la documentación también....

doubleNormalizeDouble(valordoble,dígitosint)

 
RaptorUK:

No puedes NormalizeDouble() un bool, la pista está en el nombre de la función y en la documentación también....

Es una pena que no podamos normalizar la verdad para que sea muy cierta :-(

Wodzuuu:
Sí. Sé que hacer NormalizeDouble, cosa que entiendo ( si tengo: euro/usd = 1.2390022129.....09.... Y necesitamos: 1,29893 fin! no infinito ) pero no puedo escribir estos, podrían ser estos?

No, no tienes que normalizar Bid o Close[1]. Lo que quise decir es que no debes comparar por igualdad.

Imagínate:
Close[1] = 1,31933
Nueva_barra
Tick1, Bid = 1.31935
Tick2, Oferta = 1.31934
Tick3, Oferta = 1.31937
Tick4, Oferta = 1.31937
Tick5, Oferta = 1.31942


Su código busca un Tick donde Bid es 1.31936

if( Bid==Close[1]+3*Point)

Esto no sucedería, si usted usa > .

Wodzuuu:
Puedo tener +1 sin problema result=OrderSend(Symbol(),OP_BUY,0.41,Ask, 1 ,Close[1]-25*Point,0,"",MAGICMA1,0,Blue);

Esto no lo hace mucho mejor. Todo su cálculo en Puntos debe ser Pips de mi entendimiento. Sin embargo, no tengo experiencia con los corredores ECN, por lo que podría funcionar.

Wodzuuu:

Esto no está mal, pero no es ideal y en el peor de los casos no hace lo que quieres dentro del bucle. Lo mejor es no empezar a utilizar los bucles de 0 a OrdersTotal. Lea esto: Bucles y Cierre o Eliminación de Pedidos

¡MUY BUEN ARTÍCULO! Debería leer esto al principio :)

De acuerdo y hay muchos artículos muy buenos más, escritos por el mismo autor. También el libro no es un mal lugar para empezar.

Wodzuuu:

Tengo Admiral Market Bid=1,29000 Ask = 1,29001. Esto es un problema que sé,, pero no tengo la resolución en estos momentos no he encontrado el buen ejemplo.

En el sitio web de su corredor se indica, que para el EURUSD, el spread mínimo es de 0,1. El spread medio es de 0,5. <-- ¡Esto se entiende en pips! Así que 0,1 es 1 Punto. 0,5 es 5 Puntos.
Así que en su caso, un Pip es 10*Punto. El spread confundirá todos tus mini cálculos en los que se suman sólo 3 puntos a un precio.
Busque "ajustar para el corredor de 5 dígitos" y usted debe encontrar un montón de ejemplos.

 

HI :)

Si este código era maloporque pasaba señales, ha mejorado.He pensado que el problema está totalmente en otro sitio, no en el signo de igualdad '=='......... el '>=' es mejor idea por supuesto

if( Bid==Close[1]+3*Point)
if( Bid>=Close[1]+MyPips*3)

Pregunta 1. ¿Tengo que usar MyPips en la vela, en esta función? bool BULL4()

Problema con los dígitos.

He encontrado estos

https://www.mql5.com/en/forum/140097 por WHRoeder

https://www.mql5.com/en/forum/123736 por WHRoeder

¿Qué es Digit ? en https://docs.mql4.com/predefined/variables/digits y https://docs.mql4.com/convert/doubletostr

Como tú eres el experto debería haber dicho algo, podría ser importante.
Ahora uso laplataforma MT4 y
veo 4 dígitos después del punto decimal (Bid-Ask= 0.0001 usualy). Por el momento programamosen MQL4 que sea.
En MT5, veo 5dígitos después del punto decimal. haydiferencias entre MQL4 yMQL5. Por el momento este spreed no me importa. Importantepara nuestro EA funcionó bien.
No quiero en este momento para hablar de ello (a menos que sea necesario)

Y yo escribí el programa para mí es bueno :) ¿qué pasa con usted?

//+------------------------------------------------------------------+
//+------------------------------------------------------------------+
#define MAGICMA1  2000        // blue starategy

//+------------------------------------------------------------------+
//| Check NEW BAR                                |
//+------------------------------------------------------------------+

// nothing yet, one moment

//+------------------------------------------------------------------+
//| These are adjusted for 5/4 digit brokers                           |
//+------------------------------------------------------------------+

double  MyPips;        // slippage and others

int init()
  {
    if (Digits == 5)    // Adjust for five (5) 
    {                
         MyPips=Point*10; 
    } 
    else                // Adjust for four (4, and ..)
    {
         MyPips=Point*1;  
    }
  }
 
//+------------------------------------------------------------------+
//| Calculate open positions    HOW MEANY OF THIS is open   |
//+------------------------------------------------------------------+

int OpenOrders_BULL4(string symbol)
  {
   int buys=0;

   for(int i=0;i<OrdersTotal();i++)
     {
      if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES)==false) break; 
      if(OrderSymbol()==Symbol() && OrderMagicNumber()==MAGICMA1)   
        {
         if(OrderType()==OP_BUY) buys++;
        }
     }
   return(buys);
  }
  
//+------------------------------------------------------------------+
//| Condition candle                                                 |
//+------------------------------------------------------------------+
bool BULL4()
   {
   if(Close[1]-Open[1]>=4*Point && Close[1]-Open[1]<=5*Point)
      {
         return(true);
      } 
   else
      {
         return(false);
      } 
   }

//+------------------------------------------------------------------+
//| Condition send buy                                                 |
//+------------------------------------------------------------------+
 
bool BULL4send()
   {
   if( Bid>=Close[1]+MyPips*3)
      {
         return(true);
      } 
    else
      {
        return(false);
      }
   }
 
//+------------------------------------------------------------------+
//| Check for open order conditions                                  |
//+------------------------------------------------------------------+

bool OpenBULL41()
  {
      int    result;

      result=OrderSend(Symbol(),OP_BUY,0.41,Ask,MyPips,Close[1]-25*MyPips,0,"",MAGICMA1,0,Blue);
      if(result>0)
           {
            if(OrderSelect(result,SELECT_BY_TICKET,MODE_TRADES)) Print("BUY order opened : ",OrderOpenPrice());
           }
      else
         {
            Print("Error opening BUY order : ",GetLastError()); 
            return(false);
         }
      return(true);       
   }
   
//+------------------------------------------------------------------+
//| Check for close order conditions                                 |
//+------------------------------------------------------------------+

bool CheckForCloseBULL4()
{
   int i;
   for(i=OrdersTotal()-1;i>=0;i--)
      if( ! OrderSelect(i, SELECT_BY_POS, MODE_TRADES) ) continue;
         if( OrderMagicNumber() == MAGICMA1 && OrderSymbol() == Symbol()  && OrderType() == OP_BUY )
            if(OrderOpenPrice()+8*MyPips < Ask) return(true);
            
   else return(false);
}

//+------------------------------------------------------------------+
//|  close                               |
//+------------------------------------------------------------------+

void CloseBULL4()
{
   int i;   
   for(i=OrdersTotal()-1;i>=0;i--)
      {
      if( ! OrderSelect(i, SELECT_BY_POS, MODE_TRADES) ) continue;  
   
      if( OrderMagicNumber() == MAGICMA1 && OrderSymbol() == Symbol()  && OrderType() == OP_BUY )  
   
         if ( ! OrderClose( OrderTicket(), OrderLots(), OrderClosePrice(), MyPips*1,Black ) )               
            Print("Order Close failed, order number: ", OrderTicket(), " Error: ", GetLastError() );  
      } 
}

//+------------------------------------------------------------------+
//| Start function                                 |
//+------------------------------------------------------------------+
void start()
  {
// ----------------bull4
   if(BULL4() && BULL4send() && OpenOrders_BULL4(Symbol())==0)             

     {
       OpenBULL41();//do open buy position
     }
     
   if(CheckForCloseBULL4()==true && OpenOrders_BULL4(Symbol())==1) CloseBULL4();   
  }
//+------------------------------------------------------------------+