Tutte le domande dei nuovi arrivati su MQL4 e MQL5, aiuto e discussione su algoritmi e codici - pagina 716

 
Alex Pirate:
Ciao a tutti, cosa bisogna controllare?? dà un avvertimento sulla modifica e sull'apertura .... (????) restituisce un valore e ho bisogno di controllarlo ... come??? EA apre gli ordini come meglio credo ... (((
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:

Grazie!!! Farò un tentativo.

 
gli errori sono spariti... Ma per qualche ragione, non tutti gli ordini si aprono e si aggiornano... sembra che dobbiamo controllare la modifica in qualche modo? Devo aver fatto un casino da qualche parte...
 
Alex Pirate:
gli errori sono spariti... Ma non tutti gli ordini si aprono e si aggiornano per qualche motivo... sembra che dobbiamo controllare il controllo delle modifiche in qualche modo? Devo aver fatto casino da qualche parte...

Non ho sbagliato il codice. Non lo capisco... Allora, sei tu l'esperto, lascio a te la scelta.

 
Konstantin Nikitin:

Non ho capito il codice. Quindi il tuo esperto, le tue carte sono nelle tue mani.

Capito, grazie comunque.

 
Maxim Kuznetsov:

questo può essere fatto tramite le variabili globali del terminale. A condizione di avere il codice sorgente dell'indicatore e di poterlo modificare.

Significa che l'indicatore calcolerà il parametro non attraverso extern, ma dalla chiamata di GlobalVariableGet(). E di conseguenza, l'Expert Advisor cambierà questa variabile attraverso GlobalVariableSet

Grazie, Maxim, almeno ora so da dove partire.
 
Come posso chiamare un metodo virtuale di una classe madre?
 
C'è un indicatore zigzag che mostra il valore del prezzo di un estremo, ho bisogno di disegnare una linea di tendenza dall'estremo al futuro (il giorno successivo), come posso farlo senza conoscere le coordinate del secondo punto e il valore temporale del primo punto?
 
Vladimir Pastushak:
Come chiamare un metodo virtuale della classe madre?

un metodo virtuale è un metodo virtuale perché ha solo una descrizione, e il corpo è scritto in ogni classe separatamente

anche se se il vostro compito è solo quello di chiamare un metodo da una classe padre (cioè il metodo ha già un corpo), esso (il metodo) sarà disponibile come un metodo regolare attraverso l'ereditarietà - vedere il codice sorgente

 
Igor Makanu:

un metodo virtuale è un metodo virtuale perché ha solo una descrizione, e il corpo è scritto in ogni classe separatamente

anche se se il vostro compito è solo quello di chiamare un metodo da una classe padre (cioè il metodo ha già un corpo), esso (il metodo) sarà disponibile come un metodo regolare attraverso l'ereditarietà - il codice sorgente dovrebbe essere visto

Grazie. Non riesco a far chiamare un metodo della classe padre.

Per quanto mi ricordo è fatto attraverso il metodo parent ::