Cualquier pregunta de los recién llegados sobre MQL4 y MQL5, ayuda y discusión sobre algoritmos y códigos - página 716

 
Alex Pirate:
Hola a todos, ¿qué hay que comprobar? da un aviso al modificar y al abrir .... (???) devuelve un valor y tengo que comprobarlo ... ¿cómo?? EA abre las órdenes a mi antojo ... (((
extern string MMM          = "MMM";
extern double Lot          = 0.1;
extern int    TakeProfit   = 50;
extern int    StopLoss     = 20;
extern int    Slippage     = 3;
extern int    Magic        = 888;
// Moving Average 1
extern string Indi_MA1        = "MA1";
extern int    MA1_Period   = 22;
extern int    MA1_Shift    = 0;
extern int    MA1_Method   = 0;
extern int    MA1_Price    = 0;
// Moving Average 2
extern string Indi_MA2        = "MA2";
extern int    MA2_Period   = 55;
extern int    MA2_Shift    = 0;
extern int    MA2_Method   = 0;
extern int    MA2_Price    = 0;
//+------------------------------------------------------------------+
double MA1,MA2,SL,TP;
int ticket;
//+------------------------------------------------------------------+
//| Expert initialization function                                   |
//+------------------------------------------------------------------+
int init()
  {
    if (Digits == 3 || Digits == 5)
    {
      TakeProfit = TakeProfit * 10;
      StopLoss = StopLoss     * 10;
      Slippage = Slippage     * 10;
    }
   return(0);
  }
//+------------------------------------------------------------------+
//| Expert deinitialization function                                 |
//+------------------------------------------------------------------+
int deinit()
{
 return(0);
}
//+------------------------------------------------------------------+
//| Expert tick function                                             |
//+------------------------------------------------------------------+
void OnTick() 
 {           
    MA1 = iMA(Symbol(),0,MA1_Period,MA1_Shift,MA1_Method,MA1_Price,0);
    MA2 = iMA(Symbol(),0,MA2_Period,MA2_Shift,MA2_Method,MA2_Price,0);
    
    if (Ask >= MA1 && MA1 >= MA2 && CountBuy() == 0)
    {
       SL = NormalizeDouble(Ask - StopLoss   * Point,Digits);
       TP = NormalizeDouble(Ask + TakeProfit * Point,Digits);
       ticket = OrderSend(Symbol(),OP_BUY ,Lot,Ask,Slippage,0,0,"",Magic,0,Green);
       if (ticket > 0)
       { 
         if(OrderSelect(ticket,SELECT_BY_TICKET,MODE_TRADES) == true)
            if( !OrderModify(ticket,OrderOpenPrice(),SL,TP,0) )  return;

       }      
        
    if (Bid <= MA1 && MA1 <= MA2 && CountSell() == 0) 
    
       SL = NormalizeDouble(Bid + StopLoss   * Point, Digits);
       TP = NormalizeDouble(Bid - TakeProfit * Point, Digits);
       ticket = OrderSend(Symbol(),OP_SELL,Lot,Bid,Slippage,0,0,"",Magic,0,Red);
       if (ticket > 0)
       { 
         if(OrderSelect(ticket,SELECT_BY_TICKET,MODE_TRADES) == true)
            if( !OrderModify(ticket,OrderOpenPrice(),SL,TP,0) ) return;

       }                
    }
 }
//+------------------------------------------------------------------+
int CountBuy()
{
   int count = 0; 
   for (int trade = OrdersTotal() - 1; trade >= 0; trade--)
   {
      if( !OrderSelect(trade,SELECT_BY_POS, MODE_TRADES) ) continue;
      if (OrderSymbol() == Symbol() && OrderMagicNumber() ==  Magic)
      {
        if (OrderType() == OP_BUY)
        count++; 
      } 
   }
   return(count);
}
//+------------------------------------------------------------------+
int CountSell()
{
   int count = 0;
   for (int trade = OrdersTotal() - 1; trade >= 0; trade--)
   {
      if( !OrderSelect(trade,SELECT_BY_POS, MODE_TRADES) ) continue;
      if (OrderSymbol() == Symbol() && OrderMagicNumber() ==  Magic) 
      {
        if (OrderType() == OP_SELL)
        count++; 
      }
   }
   return(count);
}
//+------------------------------------------------------------------+
 
Konstantin Nikitin:

¡¡¡Gracias!!! Lo intentaré.

 
los errores han desaparecido... Pero por alguna razón, no todos los pedidos se abren y se actualizan... parece que hay que comprobar la modificación de alguna manera... debo haberme equivocado en alguna parte...
 
Alex Pirate:
los errores han desaparecido... Pero no todos los pedidos se abren y se actualizan por alguna razón... parece que hay que revisar la comprobación de la modificación de alguna manera... debo haber metido la pata en alguna parte...

No he estropeado el código. No lo entiendo... Así que, tú eres el experto, te lo dejo a ti.

 
Konstantin Nikitin:

No he resuelto el código. Así que tu experto, tus cartas están en tus manos.

Lo tengo. Gracias de todos modos.

 
Maxim Kuznetsov:

esto puede hacerse a través de las variables globales del terminal. Siempre que tengas el código fuente del indicador y puedas editarlo.

Es decir, el indicador calculará el parámetro no a través de extern, sino desde la llamada de GlobalVariableGet(). Y en consecuencia, el Asesor Experto cambiará esta variable a través de GlobalVariableSet

Gracias, Maxim, al menos ahora sé por dónde empezar.
 
¿Cómo puedo llamar a un método virtual de una clase padre?
 
Hay un indicador de zigzag que muestra el valor del precio de un extremo, necesito dibujar una línea de tendencia desde el extremo hasta el futuro (el día siguiente), ¿cómo puedo hacerlo sin conocer las coordenadas del segundo punto y el valor del tiempo del primer punto?
 
Vladimir Pastushak:
¿Cómo llamar a un método virtual de la clase padre?

un método virtual es un método virtual porque sólo tiene una descripción, y el cuerpo se escribe en cada clase por separado

aunque si su tarea es sólo llamar a un método de una clase padre (es decir, el método ya tiene un cuerpo), éste (el método) estará disponible como un método regular a través de la herencia - vea el código fuente

 
Igor Makanu:

un método virtual es un método virtual porque sólo tiene una descripción, y el cuerpo se escribe en cada clase por separado

aunque si su tarea es sólo llamar a un método de una clase padre (es decir, el método ya tiene un cuerpo), éste (el método) estará disponible como un método regular a través de la herencia - el código fuente debe ser visto

Gracias. No consigo llamar a un método de la clase padre.

Que yo recuerde se hace a través del método parent ::