Domande dai principianti MQL5 MT5 MetaTrader 5 - pagina 1065

 
yiduwi:

Grazie, puoi dirmi perché la freccia è posizionata sulla seconda barra e non sulla prima.

Quindi hai messo la freccia sulla seconda barra e non sulla prima - non si disegna da sola, vero? )))

Devi averne aggiunto uno in più qui BufferDN[i+1]=high[i+1];

 
Igor Makanu:

quindi hai messo la freccia sulla seconda barra e non sulla prima - non si disegna da sola, vero? )))

Immagino che tu abbia aggiunto un extra qui BufferDN[i+1]=high[i+1];

Uh, senza quello, in generale la freccia è posta sulla terza barra, Codice piccolo, dove ho sbagliato?

#property indicator_chart_window
#property indicator_buffers 2
#property indicator_plots   2
//--- plot UP
#property indicator_label1  "UP"
#property indicator_type1   DRAW_ARROW
#property indicator_color1  clrLawnGreen
#property indicator_style1  STYLE_SOLID
#property indicator_width1  1
//--- plot DN
#property indicator_label2  "DN"
#property indicator_type2   DRAW_ARROW
#property indicator_color2  clrDeepPink
#property indicator_style2  STYLE_SOLID
#property indicator_width2  1

//--- indicator buffers
double         BufferUP[];
double         BufferDN[];

//+------------------------------------------------------------------+
//| Custom indicator initialization function                         |
//+------------------------------------------------------------------+
int OnInit()
  {
//--- indicator buffers mapping
   SetIndexBuffer(0,BufferUP);
   SetIndexBuffer(1,BufferDN);
   PlotIndexSetInteger(0,PLOT_ARROW,233);
   PlotIndexSetInteger(1,PLOT_ARROW,234);

//---

   return(INIT_SUCCEEDED);
  }
//+------------------------------------------------------------------+
//| Custom indicator iteration function                              |
//+------------------------------------------------------------------+
int OnCalculate(const int rates_total,
                const int prev_calculated,
                const datetime &time[],
                const double &open[],
                const double &high[],
                const double &low[],
                const double &close[],
                const long &tick_volume[],
                const long &volume[],
                const int &spread[])
  {
//---
   if(rates_total<3) return(0);
   int limit=rates_total-prev_calculated;
   if(limit>1)
     {
      limit=rates_total-3;
      ArrayInitialize(BufferUP,EMPTY_VALUE);
      ArrayInitialize(BufferDN,EMPTY_VALUE);
     }
   for(int i=limit; i>=0; i--)
     {
      if (fabs(high[i+1]-high[i+2]) <= 0.0*_Point)
        {
         BufferDN[i]=high[i];
        }
     }
//--- return value of prev_calculated for next call

   return(rates_total);
  }
Va alla prima barra, se è così.
BufferDN[i+2]=high[i+2];
Non capisco.
 
Igor Makanu:

Ecco la soluzione, ma non credo che ci sia qualcosa che ho considerato.

La logica dice che è giusto.

 
yiduwi:

Ugh, nessuna unità, in generale la freccia è messa sulla terza barra, Codice piccolo, dove ho sbagliato?

È messo nella prima barra, se è così non lo capisco.

Probabilmente sì, ma non lo scrivo bene sotto MT5, potrei sbagliarmi

//+------------------------------------------------------------------+
//|                                                          tst.mq5 |
//|                                                            IgorM |
//|                              https://www.mql5.com/ru/users/igorm |
//+------------------------------------------------------------------+
#property copyright "IgorM"
#property link      "https://www.mql5.com/ru/users/igorm"
#property version   "1.00"
#property indicator_chart_window
#property indicator_buffers 2
#property indicator_plots   2
//--- plot UP
#property indicator_label1  "UP"
#property indicator_type1   DRAW_ARROW
#property indicator_color1  clrLawnGreen
#property indicator_style1  STYLE_SOLID
#property indicator_width1  1
//--- plot DN
#property indicator_label2  "DN"
#property indicator_type2   DRAW_ARROW
#property indicator_color2  clrDeepPink
#property indicator_style2  STYLE_SOLID
#property indicator_width2  1

input int Pips=5;
//--- indicator buffers
double         BufferUP[];
double         BufferDN[];
//+------------------------------------------------------------------+
//| Custom indicator initialization function                         |
//+------------------------------------------------------------------+
int OnInit()
  {
//--- indicator buffers mapping
   SetIndexBuffer(0,BufferUP);
   SetIndexBuffer(1,BufferDN);
   PlotIndexSetInteger(0,PLOT_ARROW,233);
   PlotIndexSetInteger(1,PLOT_ARROW,234);
//---
   return(INIT_SUCCEEDED);
  }
//+------------------------------------------------------------------+
//| Custom indicator iteration function                              |
//+------------------------------------------------------------------+
int OnCalculate(const int rates_total,
                const int prev_calculated,
                const datetime &time[],
                const double &open[],
                const double &high[],
                const double &low[],
                const double &close[],
                const long &tick_volume[],
                const long &volume[],
                const int &spread[])
  {
//---
   int limit=rates_total-prev_calculated;
   if(limit>1 || prev_calculated==0)
     {
      limit=rates_total-2;
      ArrayInitialize(BufferUP,EMPTY_VALUE);
      ArrayInitialize(BufferDN,EMPTY_VALUE);
     }
   for(int i=limit; i>=0; i--)
     {
      if(fabs(high[i+1]-high[i])<=_Point*(double)Pips) BufferDN[i]=high[i];
     }
//--- return value of prev_calculated for next call
   return(rates_total);
  }
//+------------------------------------------------------------------+
 
Igor Makanu:

Probabilmente sì, ma non scrivo sotto MT5, potrei sbagliarmi

Inoltre, sulla seconda barra mi mette)

 
Igor Makanu:

Grazie, questo è uno dei bug, ma ancora non riesco a capire come passare da 159,002 secondi a 44 ore 10 minuti 2 secondi (calcolatrice online)) )


Ecco la soluzione, ma credo che mi manchi qualcosa

2019.06.18 11:46:22.691 tstss EURUSD,H1: h = 44 , m = 10 , s = 2

Mi sembra più semplice

 int timeinsec = 159002;
 int sec = timeinsec%60;
 int min = ((timeinsec-sec)%3600)/60;
 int hou = (timeinsec-sec-min)/3600;
 
yiduwi:

Inoltre, sulla seconda barra mi mette)

La freccia dovrebbe mettere solo dove la condizione è soddisfatta, sì, a proposito, ho ricordato che per MT5 è meglio avere una condizione di allentamento completo:

if(fabs(high[i+1]-high[i])<=_Point*(double)Pips) BufferDN[i]=high[i]; else BufferDN[i]=EMPTY_VALUE;
Alexey Viktorov:

Penso che sia più facile.

Capito, grazie, è esattamente quello che volevo!

 
C'è del codice con molte chiamate di stampa. C'è un modo per spegnerli rapidamente tutti senza rimuovere Print dal codice per riaccenderli? Questa è l'unica opzione che vedo finora:
bool L=true;
if(L)Print("123");

Cioè sostituire tutti i "Print(" con "if(L)Print(", forse qualche altra opzione?

 
pivomoe:
C'è del codice in cui vengono fatte molte chiamate di stampa. C'è un modo per disabilitarli rapidamente tutti senza rimuovere Print dal codice includendolo di nuovo? Finora vedo solo questa opzione:

Cioè sostituire tutti i "Print(" con "if(L)Print(", altre opzioni?

Nei parametri di input emette il flag "Print". Funzionerà come il tuo codice, ma la bandiera stessa (variabile bool) sarà nei parametri di input.

 

Ciao!

L'ottimizzazione di tutti i simboli nel tester MT5 si rifiuta di funzionare...

Puoi per favore illuminarmi su come farlo funzionare?

GRAZIE.