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

 
psyman:

Per qualche motivo non riesco a prendere una barra nel loop, che inizia a ore 15.

Se scrivo if(i<24) come condizione, il log mostra il tempo di ogni barra per il giorno, ma la condizione richiesta non è soddisfatta:


E su che timeframe fai girare l'indicatore?

 
psyman:

Sentinel in entrambi i casi.

Funziona:

//+------------------------------------------------------------------+
//|                                                     TestHour.mq5 |
//|                        Copyright 2018, MetaQuotes Software Corp. |
//|                             https://mql5.com/ru/users/artmedia70 |
//+------------------------------------------------------------------+
#property copyright "Copyright 2018, MetaQuotes Software Corp."
#property link      "https://mql5.com/ru/users/artmedia70"
#property version   "1.00"
#property indicator_separate_window
#property indicator_buffers 1
#property indicator_plots   1
#property strict
//--- plot Hour
#property indicator_label1  "Hour"
#property indicator_type1   DRAW_HISTOGRAM
#property indicator_color1  clrRed
#property indicator_style1  STYLE_SOLID
#property indicator_width1  #ifdef __MQL4__ 2 #else 6 #endif 
//--- input parameters
input uchar    InpHour  =  15;   // The required hour
//--- indicator buffers
double         BufferHour[];
//--- global variables
int            hour_req;
//+------------------------------------------------------------------+
//| Custom indicator initialization function                         |
//+------------------------------------------------------------------+
int OnInit()
  {
//--- set global variables
   hour_req=int(InpHour>23 ? 23 : InpHour);
//--- indicator buffers mapping
   SetIndexBuffer(0,BufferHour,INDICATOR_DATA);
//--- setting indicator parameters
   IndicatorSetString(INDICATOR_SHORTNAME,"Hour("+(string)hour_req+")");
#ifdef __MQL4__
   SetIndexLabel(0,"Hour("+(string)hour_req+")");
#else 
   PlotIndexSetString(0,PLOT_LABEL,"Hour("+(string)hour_req+")");
   ArraySetAsSeries(BufferHour,true);
#endif 
   IndicatorSetInteger(INDICATOR_DIGITS,0);
//---
   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[])
  {
//--- Установка массивов буферов как таймсерий
#ifdef __MQL5__
   ArraySetAsSeries(time,true);
#endif 
//--- Проверка количества доступных баров
   if(rates_total<1) return 0;
//--- Проверка и расчёт количества просчитываемых баров
   int limit=rates_total-prev_calculated;
   if(limit>1)
     {
      limit=rates_total-1;
      ArrayInitialize(BufferHour,0);
     }
//--- Подготовка данных

//--- Расчёт индикатора
   for(int i=limit; i>=0 && !IsStopped(); i--)
     {
      int hour=GetTimeHour(time[i]);
      BufferHour[i]=(hour==hour_req ? (hour>0 ? hour : 0.1) : 0);
     }

//--- return value of prev_calculated for next call
   return(rates_total);
  }
//+------------------------------------------------------------------+
//| Возвращает час указанного времени                                |
//+------------------------------------------------------------------+
int GetTimeHour(const datetime time)
  {
   #ifdef __MQL4__
   return TimeHour(time);
   #endif 
   MqlDateTime tm;
   if(!TimeToStruct(time,tm)) return WRONG_VALUE;
   return tm.hour;
  }
//+------------------------------------------------------------------+
 

Grazie, ma è così complicato per qualcuno che non è gravato da esperienza e conoscenza, è un casino :-)


BufferHour[i]=(hour==hour_req ? (hour>0 ? hour : 0.1) : 0);

Perché fare un controlloora>0 quando si trasferiscono i dati nel buffer? E se non lo fa, perché assegnare 0,1?



Volevo fare l'evidenziazione sul grafico principale, ma non per una linea, ma per il giorno ordinale della settimana Mon, Wed, Wed... via SetIndexArrow(0, 140); (forse c'è un modo più semplice, ma finora non è venuto fuori nient'altro), ma per qualche motivo non riesco a far funzionare il tuo codice nella finestra principale in quattro, e in cinque non c'è già questa proprietà.

 
psyman:

Grazie, ma è così complicato per qualcuno che non è gravato da esperienza e conoscenza, è un casino :-)


Perché fare un controlloora>0quando si trasferiscono i dati nel buffer? E se non lo fa, perché assegnare 0,1?



Volevo fare l'evidenziazione sul grafico principale, ma non per una linea, ma per il giorno ordinale della settimana Mon, Wed, Wed... via SetIndexArrow(0, 140); (forse c'è un modo più semplice, ma finora non è venuto fuori nient'altro), ma per qualche motivo non riesco a far funzionare il tuo codice nella finestra principale in quattro, e in cinque non c'è già questa proprietà.

Il buffer viene riempito con il valore dell'ora. E se l'ora è zero, l'istogramma non sarà disegnato. Quindi, dobbiamo controllare se l'ora è zero (abbiamo impostato la ricerca dell'ora zero nelle impostazioni), e se è zero, dobbiamo inserire 0,1 nel buffer, non il valore dell'ora (zero), per visualizzare la colonna dell'istogramma. Questo mostrerà un valore di 0 invece di 0,1 nella finestra dei dati, poiché l'indicatore Digits è impostato su zero.

 
psyman:

Grazie, ma è così complicato per qualcuno che non è gravato da esperienza e conoscenza, è un casino :-)


Perché fare un controlloora>0 quando si trasferiscono i dati nel buffer? E se non lo fa, perché assegnare 0,1?



Volevo fare l'evidenziazione sul grafico principale, ma non per una linea, ma per il giorno ordinale della settimana Mon, Wed, Wed... via SetIndexArrow(0, 140); (forse c'è un modo più semplice, ma finora non è venuto fuori nient'altro), ma per qualche motivo non riesco a far funzionare il tuo codice nella finestra principale in quattro, e in cinque non c'è già questa proprietà.

PlotIndexSetInteger(0,PLOT_ARROW,140);

Ma è necessario creare un numero di buffer pari al numero di settimane. E ad ogni buffer viene dato un codice freccia da 140 a 149 - 1,2,3,4,5,6,7,8,9,10 - dieci settimane sono sufficienti per un anno? Sono solo 70 giorni. O come lo volevi tu?

 
Buona giornata a tutti voi!
Per favore, aiutatemi!
Questo BB MACD - indicatore per MetaTrader 4 è stato scaricato da me da quihttps://www.mql5.com/en/code/9325
Questo indicatore è calcolato in due cicli.
Utilizzando i dati del precedente buffer MACD vengono calcolate le Bande di Bollinger.

Un tentativo di cambiare la direzione di conteggio del ciclo principale e calcolare tutto in una volta in un ciclo e allo stesso tempo di sbarazzarsi di
Allo stesso tempo per sbarazzarsi del ciclo aggiuntivo quando il calcolo delle Bande di Bollinger è finito in un fiasco.
L'indicatore produce gli stessi risultati della sua controparte intatta, ma frena il terminale selvaggiamente quando calcola la storia.
Se lo lasciate su un arco di tempo mensile non lo noterete, ma se lo lasciate su 15 minuti

Devo riavviarlo.

Non posso essere sicuro di cosa farne.

Posso chiedere a chi può suggerire come calcolare le posizioni più lente nei programmi?

Grazie in anticipo per i consigli!


Questo è l'originale e sotto è lo stesso con le mie modifiche.

//+------------------------------------------------------------------+
//|                                               Custom BB_MACD.mq4 |
//|                                     Copyright © 2005, adoleh2000 |
//|                                       http://www.metaquotes.net/ |
//+------------------------------------------------------------------+

#property  copyright "Copyright © 2005, adoleh2000"
#property  link      "http://www.metaquotes.net/"
//---- indicator settings
#property  indicator_separate_window
#property  indicator_buffers 4
#property  indicator_color1  Lime    //bbMacd up
#property  indicator_color2  Magenta //bbMacd up
#property  indicator_color3  Blue    //Upperband
#property  indicator_color4  Red     //Lowerband
//---- indicator parameters
extern int FastLen = 12;
extern int SlowLen = 26;
extern int Length = 10;
extern double StDv = 2.5;
//----
int loopbegin;
int shift;
double zeroline;
//---- indicator buffers
double ExtMapBuffer1[];  // bbMacd
double ExtMapBuffer2[];  // bbMacd
double ExtMapBuffer3[];  // Upperband Line
double ExtMapBuffer4[];  // Lowerband Line
//---- buffers
double bbMacd[];
double Upperband[];
double Lowerband[];
double avg[];
double bbMacdline;
double sDev;
double mean;
double sumSqr;
//+------------------------------------------------------------------+
//| Custom indicator initialization function                         |
//+------------------------------------------------------------------+
int init()
  {
//---- 6 additional buffers are used for counting.
   IndicatorBuffers(8);   
//---- drawing settings     
   SetIndexBuffer(0, ExtMapBuffer1); // bbMacd line
   SetIndexStyle(0, DRAW_ARROW);
   SetIndexArrow(0, 108);
   IndicatorDigits(Digits + 1);
//----
   SetIndexBuffer(1, ExtMapBuffer2); // bbMacd line
   SetIndexStyle(1, DRAW_ARROW);
   SetIndexArrow(1, 108);
   IndicatorDigits(Digits + 1);
//----   
   SetIndexBuffer(2, ExtMapBuffer3); // Upperband line
   SetIndexStyle(2, DRAW_LINE, STYLE_SOLID, 1);
   IndicatorDigits(Digits + 1);
//----   
   SetIndexBuffer(3, ExtMapBuffer4); // Lowerband line
   SetIndexStyle(3, DRAW_LINE, STYLE_SOLID, 1);
   IndicatorDigits(Digits + 1);
//----
   SetIndexBuffer(4, bbMacd);
   SetIndexBuffer(5, Upperband);        
   SetIndexBuffer(6, Lowerband);
   SetIndexBuffer(7, avg);    
//---- name for DataWindow and indicator subwindow label
   IndicatorShortName("BB MACD(" + FastLen + "," + SlowLen + "," + Length+")");
   SetIndexLabel(0, "bbMacd");
   SetIndexLabel(1, "Upperband");
   SetIndexLabel(2, "Lowerband");  
//---- initialization done
   return(0);
  }
//+------------------------------------------------------------------+
//| Custor indicator deinitialization function                       |
//+------------------------------------------------------------------+
int deinit()
  {
//----
   return(0);
  }
//+------------------------------------------------------------------+
//| Custom BB_MACD                                                   |
//+------------------------------------------------------------------+
int start()
  {
   int limit;
   int counted_bars = IndicatorCounted();
//---- check for possible errors
   if(counted_bars < 0) 
       return(-1);
//---- last counted bar will be recounted
   if(counted_bars > 0) 
       counted_bars--;
   limit = Bars - counted_bars;
//----
   for(int i = 0; i < limit; i++)
       bbMacd[i] = iMA(NULL, 0, FastLen, 0, MODE_EMA, PRICE_CLOSE, i) - 
                   iMA(NULL, 0, SlowLen, 0, MODE_EMA, PRICE_CLOSE, i);
//----
   for(i = 0; i < limit; i++)
     {
       avg[i] = iMAOnArray(bbMacd, 0, Length, 0, MODE_EMA, i);
       sDev = iStdDevOnArray(bbMacd, 0, Length, MODE_EMA, 0, i);  
       Upperband[i] = avg[i] + (StDv * sDev);
       Lowerband[i] = avg[i] - (StDv * sDev);
       ExtMapBuffer1[i]=bbMacd[i];     // Uptrend bbMacd
       ExtMapBuffer2[i]=bbMacd[i];     // downtrend bbMacd
       ExtMapBuffer3[i]=Upperband[i];  // Upperband
       ExtMapBuffer4[i]=Lowerband[i];  // Lowerband
       //----
       if(bbMacd[i] > bbMacd[i+1])
           ExtMapBuffer2[i] = EMPTY_VALUE;
       //----
       if(bbMacd[i] < bbMacd[i+1])
           ExtMapBuffer1[i] = EMPTY_VALUE;
     }
//---- done
   return(0);
  }
//+------------------------------------------------------------------+


//================


//+------------------------------------------------------------------+
//|                                               Custom BB_MACD.mq4 |
//|                                     Copyright © 2005, adoleh2000 |
//|                                       http://www.metaquotes.net/ |
//+------------------------------------------------------------------+

/*
Осторожно!!!
В том коде мной изменено направление расчёта главного цикла. Осторожно!!! Этот индикатор очень медленно выполняется!!! Его можно бросить только на недельный или месячный таймфрейм где в истории мало баров, если ниже 4х часов то терминал вешается!!! */
#property  copyright "Copyright © 2005, adoleh2000" #property  link      "http://www.metaquotes.net/" //---- indicator settings #property  indicator_separate_window #property  indicator_buffers 4 #property  indicator_color1  Lime    //bbMacd up #property  indicator_color2  Magenta //bbMacd up #property  indicator_color3  Blue    //Upperband #property  indicator_color4  Red     //Lowerband //---- indicator parameters extern int FastLen = 12; extern int SlowLen = 26; extern int Length = 10; extern double StDv = 2.5; //---- int loopbegin; int shift; double zeroline; //---- indicator buffers double ExtMapBuffer1[];  // bbMacd double ExtMapBuffer2[];  // bbMacd double ExtMapBuffer3[];  // Upperband Line double ExtMapBuffer4[];  // Lowerband Line //---- buffers double bbMacd[]; double Upperband[]; double Lowerband[]; double avg[]; double bbMacdline; double sDev; double mean; double sumSqr; //+------------------------------------------------------------------+ //| Custom indicator initialization function                         | //+------------------------------------------------------------------+ int init()   { //---- 6 additional buffers are used for counting.    IndicatorBuffers(8);   //---- drawing settings        SetIndexBuffer(0, ExtMapBuffer1); // bbMacd line    SetIndexStyle(0, DRAW_ARROW);    SetIndexArrow(0, 108);    IndicatorDigits(Digits + 1); //----    SetIndexBuffer(1, ExtMapBuffer2); // bbMacd line    SetIndexStyle(1, DRAW_ARROW);    SetIndexArrow(1, 108);    IndicatorDigits(Digits + 1); //----      SetIndexBuffer(2, ExtMapBuffer3); // Upperband line    SetIndexStyle(2, DRAW_LINE, STYLE_SOLID, 1);    IndicatorDigits(Digits + 1); //----      SetIndexBuffer(3, ExtMapBuffer4); // Lowerband line    SetIndexStyle(3, DRAW_LINE, STYLE_SOLID, 1);    IndicatorDigits(Digits + 1); //----    SetIndexBuffer(4, bbMacd);    SetIndexBuffer(5, Upperband);            SetIndexBuffer(6, Lowerband);    SetIndexBuffer(7, avg);     //---- name for DataWindow and indicator subwindow label    IndicatorShortName("BB MACD-2(" + FastLen + "," + SlowLen + "," + Length+")");    SetIndexLabel(0, "bbMacd");    SetIndexLabel(1, "Upperband");    SetIndexLabel(2, "Lowerband");            //---- initialization done    return(0);   } //+------------------------------------------------------------------+ //| Custor indicator deinitialization function                       | //+------------------------------------------------------------------+ int deinit()   { //----    return(0);   } //+------------------------------------------------------------------+ //| Custom BB_MACD                                                   | //+------------------------------------------------------------------+ int start()   {    int limit, i,MaxPeriod;    int counted_bars = IndicatorCounted(); //---- check for possible errors    if(counted_bars < 0)        return(-1); //---- last counted bar will be recounted    if(counted_bars > 0)        counted_bars--;    limit = Bars - counted_bars;             if(counted_bars==0){              for(i=Bars-1; i>=1; i--) bbMacd[i]=0.0;//обнулим первый рассчитываемый массив              MaxPeriod= MathMax(MathMax(FastLen,SlowLen), Length);//это самые старые бары в истории которые не будем рассчитывать       limit=limit-MaxPeriod;    }    //      //---- основной цикл   for(i=limit; i>=1; i--){//ЦЦЦЦЦЦЦЦЦЦЦЦЦЦЦЦЦЦЦЦЦЦЦЦЦЦЦЦЦЦЦЦЦЦЦЦЦЦЦЦЦЦЦЦЦЦЦЦЦЦЦЦЦЦЦЦЦЦЦЦЦЦЦЦЦЦ //В этом месте изменено направление пересчёта в основном цикле. //И все расчёты зависимых друг от друга буферов производятся последовательно  в одном цикле. //Дополнительный цикл расчета удалён.        bbMacd[i] = iMA(NULL, 0, FastLen, 0, MODE_EMA, PRICE_CLOSE, i) -                    iMA(NULL, 0, SlowLen, 0, MODE_EMA, PRICE_CLOSE, i);                           avg[i] = iMAOnArray(bbMacd, 0, Length, 0, MODE_EMA, i);        sDev = iStdDevOnArray(bbMacd, 0, Length, MODE_EMA, 0, i);          Upperband[i] = avg[i] + (StDv * sDev);        Lowerband[i] = avg[i] - (StDv * sDev);        ExtMapBuffer1[i]=bbMacd[i];     // Uptrend bbMacd        ExtMapBuffer2[i]=bbMacd[i];     // downtrend bbMacd        ExtMapBuffer3[i]=Upperband[i];  // Upperband        ExtMapBuffer4[i]=Lowerband[i];  // Lowerband        //----        if(bbMacd[i] > bbMacd[i+1])            ExtMapBuffer2[i] = EMPTY_VALUE;        //----        if(bbMacd[i] < bbMacd[i+1])            ExtMapBuffer1[i] = EMPTY_VALUE;      }//ЦЦЦЦЦЦЦЦЦЦЦЦЦЦЦЦЦЦЦЦЦЦЦЦЦЦЦЦЦЦЦЦЦЦЦЦЦЦЦЦЦЦЦЦЦЦЦЦЦЦЦЦЦЦЦЦЦЦЦЦЦЦЦЦЦЦЦЦЦЦЦЦЦЦЦЦЦЦЦЦЦЦЦЦЦЦЦЦ //---- done    return(0);   } //+------------------------------------------------------------------+
BB MACD
BB MACD
  • www.mql5.com
BB_MACD Indicator.
 
Northwest:
Buona giornata a tutti voi!
Per favore, aiutatemi!
Questo BB MACD - indicatore per MetaTrader 4 è stato scaricato da me da quihttps://www.mql5.com/en/code/9325
Questo indicatore è calcolato in due cicli.
Utilizzando i dati del precedente buffer MACD vengono calcolate le Bande di Bollinger.

Un tentativo di cambiare la direzione di conteggio del ciclo principale e calcolare tutto in una volta in un ciclo e allo stesso tempo di sbarazzarsi di
Allo stesso tempo per sbarazzarsi del ciclo aggiuntivo quando il calcolo delle Bande di Bollinger è finito in un fiasco.
L'indicatore produce gli stessi risultati della sua controparte intatta, ma frena il terminale selvaggiamente quando calcola la storia.
Se lo lasciate su un arco di tempo mensile non lo noterete, ma se lo lasciate su 15 minuti

Devo riavviarlo.

Non posso essere sicuro di cosa farne.

Posso chiedere a chi può suggerire come calcolare le posizioni più lente nei programmi?

Grazie in anticipo per i consigli!


Questo è l'originale e sotto è lo stesso con le mie modifiche.


//================


Restituisci tutto, non torturare il computer

iBandsOnArray, iStdDevOnArray calcolati per i dati memorizzati in un array

L'array, d'altra parte, è riempito in 1 ciclo

 
Alekseu Fedotov:

Rimetti tutto a posto, non torturare il computer

iBandsOnArray, iStdDevOnArray calcolati per i dati memorizzati in un array

Un array, d'altra parte, è riempito in 1 ciclo

1. Rimettete tutto a posto, non torturate il vostro computer .

Spiacente, ma non lo riavrai, devi far contare l'indicatore da sinistra a destra.

Non lo sto infastidendo, lo sto usando per il suo scopo.

2.iBandsOnArray, iStdDevOnArray calcolati utilizzando i dati memorizzati nell'array

Sì, sono calcolati usando i dati dell'array bbMacd[], e poi?

3. L'array viene riempito in un ciclo.

In uno o nel primo?

Stai dicendo che per riempire un array, hai bisogno di un ciclo personale, in cui questo array viene riempito

è riempito e non possono essere eseguite altre operazioni?


È importante per me scoprire perché l'indicatore rallenta e come calcolare i punti in cui ciò accade.

Ho altre domande ma nessuna risposta.

Sfortunatamente, non hai offerto alcun indizio.

 

Come faccio a disabilitare la reinizializzazione quando cambia l'orario EA?


Qui ci sono alcune informazioni:

EAEseguendo OnDeinit e OnInit, l'oggetto globale della classe non cambia.

https://www.mql5.com/ru/forum/170952/page61#comment_6132824


È corretto anche per mql4?

Motivazione: