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

 
Vladimir Pastushak:

Come faccio a sapere il tipo di parametro di ingresso?

il compilatore stesso sostituisce i tipi al momento della chiamata della funzione template, se tale chiamata non era ancora nel codice, allora il compilatore creerà un'altra copia della funzione e imposterà i tipi stessi - bene, come se fosse logico - un template


se la domanda è su come definire il tipo in una tale funzione, usate

typename

UPD: aggiunto all'esempio sopra il parametro tipo stampanti:

#define  PRINT(VAL) Print(#VAL," = ",VAL, ", typename = ", typename(VAL))
template<typename T1, typename T2>
int myfunc(T1 val1=0, T2 val2=0)
{
   Print(__FUNCSIG__);
   PRINT(val1);
   PRINT(val2);
   return((int) (val1 + val2));
}

//+------------------------------------------------------------------+
void OnStart()
{
   int i1 = 2, i2 = 3;
   Print(myfunc(i1, i2));
   double d1 = 10.0, d2 = 30.0;
   Print(myfunc(d1, d2));
}
//+------------------------------------------------------------------+

2020.09.16 18:58:21.679 tst (EURUSD,M5) int myfunc<int,int>(int,int)

2020.09.16 18:58:21.680 tst (EURUSD,M5) val1 = 2, typename = int

2020.09.16 18:58:21.681 tst (EURUSD,M5) val2 = 3, typename = int

2020.09.16 18:58:21.681 tst (EURUSD,M5) 5

2020.09.16 18:58:21.681 tst (EURUSD,M5) int myfunc<double,double>(double,double)

2020.09.16 18:58:21.681 tst (EURUSD,M5) val1 = 10.0, typename = double

2020.09.16 18:58:21.681 tst (EURUSD,M5) val2 = 30.0, typename = double

2020.09.16 18:58:21.681 tst (EURUSD,M5) 40


UPD: aggiunto__FUNCSIG__ a questo esempio

 

Pomeriggio.
Sto affrontando una cosa strana quando scrivo un indicatore in MQL5 (indicatore in una sottofinestra separata, 4 righe).

Le descrizioni iniziali del buffer sono le seguenti:

//------------------------------------------------------------------
#property indicator_buffers   6
#property indicator_plots     4
//-------------------------------------------------------------------
// == RSI ==
#property indicator_type1   DRAW_LINE
#property indicator_color1  clrMagenta
#property indicator_style1  STYLE_SOLID
#property indicator_width1  2
//------------------------------------------------------------------
// == MA_fast ==
#property indicator_type2   DRAW_LINE
#property indicator_color2  clrBlue
#property indicator_style2  STYLE_SOLID
#property indicator_width2  2
//------------------------------------------------------------------
// == MA_slow ==
#property indicator_type3   DRAW_COLOR_LINE
#property indicator_color3  clrWhite, clrBlack
#property indicator_style3  STYLE_SOLID
#property indicator_width3  3
//------------------------------------------------------------------
// == MA_slow_glob ==
#property indicator_type4   DRAW_COLOR_LINE
#property indicator_color4  clrYellow, clrRed
#property indicator_style4  STYLE_SOLID
#property indicator_width4  2
//------------------------------------------------------------------
//--- buffers (массивы под буферы индикатора)
//--------------------------------------------------------------------
double      RSI[];                                                         // буфер под RSI
//--------------------------------------------------------------------
double      MAr1_fast[];                                                   // буфер под быструю МА
double      MAr2_slow[];                                                   // буфер под медленную МА
double      MAr2_slowColor[];                                              // буфер под цвета медленной МА
//--------------------------------------------------------------------
double      MAr3_slow_glob[];                                              // буфер под глобальную медленную МА
double      MAr3_slow_globColor[];                                         // буфер под цвета глобальной медленной МА
//--------------------------------------------------------------------

Il prossimo in OnInit:

   //--------------------------------------------------------------------
   SetIndexBuffer       (0,   RSI,                 INDICATOR_DATA);
   ArraySetAsSeries     (     RSI,                 true);
   PlotIndexSetString   (0,   PLOT_LABEL,          "RSI(" + IntegerToString(RSI_per) + ")");
   PlotIndexSetInteger  (0,   PLOT_SHOW_DATA,      true);
   PlotIndexSetInteger  (0,   PLOT_DRAW_BEGIN,     RSI_per);
   PlotIndexSetDouble   (0,   PLOT_EMPTY_VALUE,    EMPTY_VALUE);
   //--------------------------------------------------------------------
   SetIndexBuffer       (1,   MAr1_fast,           INDICATOR_DATA);
   ArraySetAsSeries     (     MAr1_fast,           true);
   PlotIndexSetString   (1,   PLOT_LABEL,          "MA (" + IntegerToString(MA_fast_period) + "), EMA");
   PlotIndexSetInteger  (1,   PLOT_SHOW_DATA,      true);
   PlotIndexSetInteger  (1,   PLOT_DRAW_BEGIN,     MA_fast_period);
   PlotIndexSetDouble   (1,   PLOT_EMPTY_VALUE,    EMPTY_VALUE);
   //--------------------------------------------------------------------
   SetIndexBuffer       (2,   MAr2_slow,           INDICATOR_DATA);
   ArraySetAsSeries     (     MAr2_slow,           true);
   PlotIndexSetString   (2,   PLOT_LABEL,          "MA (" + IntegerToString(MA_slow_period) + "), SMA");
   PlotIndexSetInteger  (2,   PLOT_SHOW_DATA,      true);
   PlotIndexSetInteger  (2,   PLOT_DRAW_BEGIN,     MA_slow_period);
   PlotIndexSetDouble   (2,   PLOT_EMPTY_VALUE,    EMPTY_VALUE);
   //--------------------------------------------------------------------
   SetIndexBuffer       (3,   MAr2_slowColor,      INDICATOR_COLOR_INDEX);
   ArraySetAsSeries     (     MAr2_slowColor,      true);
   PlotIndexSetDouble   (3,   PLOT_EMPTY_VALUE,    EMPTY_VALUE);
   //--------------------------------------------------------------------
   SetIndexBuffer       (4,   MAr3_slow_glob,      INDICATOR_DATA);
   ArraySetAsSeries     (     MAr3_slow_glob,      true);
   PlotIndexSetString   (4,   PLOT_LABEL,          "MA (" + IntegerToString(MA_slow_glob_period) + "), SMA");
   PlotIndexSetInteger  (4,   PLOT_SHOW_DATA,      true);
   PlotIndexSetInteger  (4,   PLOT_DRAW_BEGIN,     MA_slow_glob_period);
   PlotIndexSetDouble   (4,   PLOT_EMPTY_VALUE,    EMPTY_VALUE);
   //--------------------------------------------------------------------
   SetIndexBuffer       (5,   MAr3_slow_globColor, INDICATOR_COLOR_INDEX);
   ArraySetAsSeries     (     MAr3_slow_globColor, true);
   PlotIndexSetDouble   (5,   PLOT_EMPTY_VALUE,    EMPTY_VALUE);
   //--------------------------------------------------------------------

Essenzialmente: l'indicatore disegna 4 linee: le prime due sono solo monocolore, le due successive sono bicolori (cambiano colore sulle pieghe).

Il bicolore è dovuto al modo di disegnare DRAW_COLOR_LINE.

Domanda: la prima linea (buffer 2 e 3 nel codice sopra) è perfettamente disegnata e tutto il codice scritto per essa in OnInit funziona;
seconda linea si presenta per qualche motivo, per esempio la linea non funziona:

PlotIndexSetString   (4,   PLOT_LABEL,          "MA (" + IntegerToString(MA_slow_glob_period) + "), SMA");
Cioè, invece del testo che ho impostato nella finestra dei dati, viene visualizzato solo il nome dell'indicatore al posto del buffer. Anche se la linea stessa è tracciata, ed è, come dovrebbe essere, multicolore.
Penso che il trucco sia nel cambio di numerazione? Per esempio, non sono sicuro del perché nella parte superiore del codice, quando dichiaro l'ultima linea con la direttiva #property, l'indice dovrebbe essere 4 e non 5, dato che 4 buffer sono già stati usati prima. C'è qualche relazione tra la numerazione delle linee quando si dichiara con #property e la numerazione del buffer quando si collega con gli array in OnInit?

Per favore consigliatemi cosa c'è di sbagliato nel codice qui sopra. Forse qualcuno può trovare un esempio di indicatore dove almeno due linee sono disegnate usando il metodo di disegno DRAW_COLOR_LINE....

Un'altra domanda correlata: come si legano i buffer delle linee colorate? Voglio dire, come fa il codice compilato a sapere che se metto un valore in un buffer di colore, questo colore dovrebbe essere usato per colorare una linea da qualche altro buffer?

 
satorifx:

Pomeriggio.
Sto affrontando una cosa strana quando scrivo un indicatore in MQL5 (indicatore in una sottofinestra separata, 4 righe).

Le descrizioni iniziali del buffer sono le seguenti:

Il prossimo in OnInit:

Essenzialmente: l'indicatore disegna 4 linee: le prime due sono solo monocolore, le due successive sono bicolori (cambiano colore sulle pieghe).

Il bicolore è dovuto al modo di disegnare DRAW_COLOR_LINE.

Domanda: la prima linea (buffer 2 e 3 nel codice sopra) è perfettamente disegnata e tutto il codice scritto per essa in OnInit funziona;
seconda linea si presenta per qualche motivo, per esempio la linea non funziona:

Cioè, invece del testo che ho impostato nella finestra dei dati, viene visualizzato solo il nome dell'indicatore al posto del buffer. Anche se la linea stessa è tracciata, ed è, come dovrebbe essere, multicolore.
Penso che il trucco sia nel cambio di numerazione? Per esempio, non sono sicuro del perché nella parte superiore del codice, quando dichiaro l'ultima linea con la direttiva #property, l'indice dovrebbe essere 4 e non 5, dato che 4 buffer sono già stati usati prima. C'è qualche relazione tra la numerazione delle linee quando si dichiara con #property e la numerazione del buffer quando si collega con gli array in OnInit?

Per favore consigliatemi cosa c'è di sbagliato nel codice qui sopra. Forse qualcuno può trovare un esempio di indicatore dove almeno due linee sono disegnate usando il metodo di disegno DRAW_COLOR_LINE....

Un'altra domanda correlata: come si legano i buffer delle linee colorate? Voglio dire, come fa il codice compilato a sapere che se metto un valore in un buffer di colore, questo colore dovrebbe essere usato per colorare una linea da qualche altro buffer?

Le mappature sono numerate diversamente dai buffer.

PlotIndexSetString   (3,   PLOT_LABEL,          "MA (" + IntegerToString(MA_slow_glob_period) + "), SMA");

Questo dovrebbe funzionare.

 

Buon pomeriggio a tutti!

Ho creato una funzione per modificare lo stoploss. Ma quando funziona dà EURUSD,H1: OrderModify error 130.

E il prezzo è lontano dal luogo in cui lo stoploss dovrebbe essere impostato.

Ecco la funzione:

void open_bu(string walpa, int op)
{
bool err;
int spred=(int)MarketInfo(walpa,MODE_SPREAD);
double point=MarketInfo(walpa,MODE_POINT);
int digits=(int)MarketInfo(walpa,MODE_DIGITS);
for(int is=OrdersTotal()-1; is>=0; is--)
 {
  if(OrderSelect(is, SELECT_BY_POS, MODE_TRADES) && OrderSymbol()==walpa)
   {
    if(OrderType()==op && NormalizeDouble(OrderStopLoss(),digits) < NormalizeDouble(OrderOpenPrice()+spred*point, digits) )
     {
      err=OrderModify(OrderTicket(), OrderOpenPrice(), NormalizeDouble(OrderOpenPrice()+spred*point, digits), OrderProfit(), 0, clrNONE);
      if(!err) error(GetLastError());
     }
    if(OrderType()==op && (NormalizeDouble(OrderStopLoss(),digits) > NormalizeDouble(OrderOpenPrice()-spred*point, digits) || OrderStopLoss()==0))
     {
      Print(walpa,"  ",spred,"   ",point,"   ",digits,"     ",NormalizeDouble(OrderOpenPrice()-spred*point, digits));
      err=OrderModify(OrderTicket(), OrderOpenPrice(), NormalizeDouble(OrderOpenPrice()-spred*point, digits), OrderProfit(), 0, clrNONE);
      if(!err) error(GetLastError());
     }
   }
 }
return;
}
 
Buona giornata. Voglio scrivere un EA basato sulla misurazione dell'angolo di pendenza di una media mobile (o meglio un insieme di esse, cioè l'Alligator), in modo che l'EA dia un allarme su un forte impulso di prezzo, preferibilmente con un piccolo ritardo. Per favore consigliate come misurare l'angolo della MA o "dire all'EA" che l'impulso è avvenuto. Forse ci sono già modi noti per farlo. O per esempio un indicatore libero basato sul calcolo degli impulsi?
 

Ha scritto una funzione per trovare il numero di barra di un frattale su 3 barre. Sul grafico online sembra trovarlo correttamente. Ma durante il test visivo nel tester si trova. Qualcuno dei professionisti può dare un'occhiata al codice e trovare qualche errore?

Te ne sarei molto grato.

//+----------------------------------------------------------------------------+
//|  Описание : Возвращает номер бара трёхбарного фарактала по его номеру.     |
//+----------------------------------------------------------------------------+
//|  Параметры:                                                                |
//|    sy - наименование инструмента        ("" или NULL - текущий символ)     |
//|    tf - таймфрейм                       (    0       - текущий ТФ)         |
//|    nf - номер экстремума                (    0       - последний)          |
//+----------------------------------------------------------------------------+
int BarLocExtr(string sy="0", int tf=0, int ne=0, int mode=MODE_UPPER)
{
 if(sy=="" || sy=="0") sy=Symbol();
 int nlext=0,k=iBars(sy,tf);
 nlext=0;
 if(mode==MODE_UPPER)
   {
    for (int i=2; i<=k; i++)
     {
      if(High[i]>High[i+1] && High[i]>High[i-1])
        {
         nlext++;
         
         if(nlext>ne) return(i);
        }
     }    
   }        
 if(mode==MODE_LOWER)
   {
    for (i=2; i<=k; i++)
     {
      if(Low[i+1]>Low[i] && Low[i-1]>Low[i])
        {
         nlext++;
         if(nlext>ne) 
           {
            //Print("i=",i," Low[i+1]=",Low[i+1]," Low[i]=",Low[i]," Low[i-1]=",Low[i-1]);
            return(i); 
           }
        }
     }    
   }       
    Print("Бар локального экстремума не найден");
    return(-1);     
  }
Как в MetaTrader 5 быстро разработать и отладить торговую стратегию
Как в MetaTrader 5 быстро разработать и отладить торговую стратегию
  • www.mql5.com
Скальперские автоматические системы по праву считаются вершиной алгоритмического трейдинга, но при этом они же являются и самыми сложными для написания кода. В этой статье мы покажем, как с помощью встроенных средств отладки и визуального тестирования строить стратегии, основанные на анализе поступающих тиков. Для выработки правил входа и...
 

Buon pomeriggio. QUALE CODICE DOVREI AGGIUNGERE IN MODO CHE L'INDICATORE SMETTA DI FUNZIONARE NEL TESTER DOPO UN MESE? CIOÈ HO SCRITTO TUTTO OK! MA QUANDO FACCIO UN BACKTEST FUNZIONA DI NUOVO. (mgl4)

//+------------------------------------------------------------------+
//| Custom indicator initialization function                         |
//+------------------------------------------------------------------+
int OnInit()
  {
  datetime data=D'2020.09.16 20:07';  // Time Block
    if(TimeCurrent()>data)  
      {
       Print("Демонстрационный период закончился, покупайте индикатор :)");
       Alert("Демонстрационный период закончился, покупайте индикатор :)");
       return(INIT_FAILED);
     } 
  
  
  if(IsTesting() && TimeCurrent() >= D'2020.09.16 20:07')// для тестировщиков, ограничение работы по времени
{
    Comment("Демонстрационный период закончился, покупайте индикатор :)  Демонстрационный период закончился, покупайте индикатор :)   Демонстрационный период закончился, покупайте индикатор :)");
    return(0);
}    
     
File:
 

Ciao!

Volevo mettere una condizione nel ciclo di chiusura degli ordini nelgiorno di apertura degli stessi, in modo che quelli aperti il venerdì non venissero chiusi.

while (OrdersTotal()>0)
    { 
      if(OrderSelect(0,SELECT_BY_POS,MODE_TRADES))  
        {   
            if ((OrderMagicNumber()==Magic) && (TimeDayOfWeek(OrderOpenTime())<5)) 
            {    
               if (OrderType()==OP_BUY)          result=OrderClose(OrderTicket(),OrderLots(),NormalizeDouble(MarketInfo(nameSym,MODE_BID),MarketInfo(nameSym,MODE_DIGITS)),3,CLR_NONE); 
               if (OrderType()==OP_SELL)  result=OrderClose(OrderTicket(),OrderLots(),NormalizeDouble(MarketInfo(nameSym,MODE_ASK),MarketInfo(nameSym,MODE_DIGITS)),3,CLR_NONE); 
            
                 if(result!=TRUE) { error=GetLastError();
                    Print("LastError = ",error, " ",Symbol()); }
                 else error=0; 
            }
            else  Print("NoMagic ", OrderMagicNumber());  // for Debug
         }
        else Print( "Error when order select ", GetLastError());
   
     } 
 
Tabazhan_Dajhiov:

Buon pomeriggio. QUALE CODICE DOVREI AGGIUNGERE IN MODO CHE L'INDICATORE SMETTA DI FUNZIONARE NEL TESTER DOPO UN MESE? CIOÈ HO SCRITTO TUTTO OK! MA QUANDO FACCIO UN BACKTEST FUNZIONA DI NUOVO. (mgl4)

Dovete scrivere questo codice non in OnInit, ma in OnTick().

 
Yerkin Sagandykov:

Ciao!

Volevo mettere una condizione nel ciclo di chiusura dell'ordine nelgiorno di apertura dell'ordine, in modo che quelli aperti il venerdì non fossero chiusi.

Provate in questo modo:

for(int is=OrdersTotal()-1; is>=0; is--)
    { 
      if(OrderSelect(is,SELECT_BY_POS,MODE_TRADES))  
        {   
            if ((OrderMagicNumber()==Magic) && (TimeDayOfWeek(OrderOpenTime())<5)) 
            {    
               if (OrderType()==OP_BUY)   result=OrderClose(OrderTicket(),OrderLots(),NormalizeDouble(MarketInfo(nameSym,MODE_BID),MarketInfo(nameSym,MODE_DIGITS)),3,CLR_NONE); 
               if (OrderType()==OP_SELL)  result=OrderClose(OrderTicket(),OrderLots(),NormalizeDouble(MarketInfo(nameSym,MODE_ASK),MarketInfo(nameSym,MODE_DIGITS)),3,CLR_NONE); 
            
                 if(result!=TRUE) { error=GetLastError();
                    Print("LastError = ",error, " ",Symbol()); }
                 else error=0; 
            }
            else  Print("NoMagic ", OrderMagicNumber());  // for Debug
         }
        else Print( "Error when order select ", GetLastError());
   
     }