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

 
Alexey Viktorov:
Imposta il colore del display su clrNONE.

Quindi si può emettere solo il buffer, ma non la variabile separatamente?

 
psyman:

Quindi si può emettere solo il buffer, ma non la variabile separatamente?

Sì, è l'unico modo. E un altro trucco che può tornare utile, se si imposta SetIndexLabel(0, ""); allora questi valori non saranno visualizzati nella finestra dei dati. E anche la funzione iCustom() non sarà disponibile.
 
Igor Makanu:

Grazie per aver risposto.

Quindi quello che ho capito è di creare un buffer, poi riempirlo con

con i valori RSI e poi alimentare questo buffer coniMAOnArray().

Qualcuno ha fatto questo per EA e sarà visualizzato quando si prova EA nella sottofinestra?

Di solito i test EA attraverso iCustom sono lenti.

 

Ho preso il codice dall'esempio in https://www.mql5.com/ru/docs/strings/stringadd e l'ho incollato nello script. Il risultato è lo stesso in MQL4 e MQL5:


HE      0       22:42:49.015    Test Script (EURUSD,H1) time for 'c = a + b' = 235 milliseconds, i = 1000000
OH      0       22:42:50.187    Test Script (EURUSD,H1) time for 'StringAdd(a,b)' = 1156 milliseconds, i = 1000000
EP      0       22:42:50.781    Test Script (EURUSD,H1) time for 'StringConcatenate(c,a,b)' = 594 milliseconds, i = 1000000


Ho pensato che StringAdd() e StringConcatenate() dovrebbero essere più veloci di "+". Perché non è così?

 
Northwest:

iCustom di solito rallenta i test dell'Expert Advisor.

non è vero, di solito è il contrario, perché l'allocazione della memoria per i buffer dell'indicatore è fatta dal terminale, non dallo script MQL, di solito questi problemi sono il problema del calcolo non ottimale nell'indicatore, molti neofiti su una chiamata indicatore - tick, calcolano l'intera lunghezza dei dati storici

Se avete capito le basi del MQL, leggete gli articoli, è tutto scritto.

https://www.mql5.com/ru/articles/4602


Nord-ovest:

Chi ha fatto questo per un EA e sarà visualizzato quando si testa l'EA in una sottofinestra?

nessuno l'ha fatto, leggi qual è la differenza tra un EA e un indicatore, chi ha buffer di indicatori e chi no, chi ha funzioni di trading e chi no....

ZZY: una sottofinestra può solo creare un indicatore. Se create una sottofinestra, allora potete aggiungere oggetti grafici a questa sottofinestra usando l'Expert Advisorhttps://www.mql5.com/ru/docs/constants/objectconstants/enum_object

ZSYZZ: la sottofinestra può essere ottenuta applicando un modello, c'era un topic un paio di mesi fa, ma penso che tu abbia un problema con altre cose finora

Как перенести расчетную часть любого индикатора в код эксперта
Как перенести расчетную часть любого индикатора в код эксперта
  • www.mql5.com
Когда программист создает советник, который получает сигналы от индикаторов, он всякий раз сталкивается с вопросом: использовать обращение к индикатору или перенести код индикатора в советник? Причины этому могут быть различные: желание сохранить в тайне используемые индикаторы и стратегию в целом, необходимость распространения советника единым...
 
Igor Makanu:

non è vero, di solito è il contrario, perché l'allocazione della memoria per i buffer degli indicatori è fatta dal terminale, non dallo script MQL, di solito questi problemi sono il problema del calcolo non ottimale nell'indicatore, molti neofiti su una chiamata indicatore - tick, calcolano l'intera lunghezza dei dati storici

Se avete capito le basi del MQL, leggete gli articoli, è stato scritto da molto tempo.

https://www.mql5.com/ru/articles/4602


nessuno l'ha fatto, leggi qual è la differenza tra un Expert Advisor e un indicatore, chi ha buffer di indicatori e chi no, chi ha funzioni di trading e chi ....

ZZY: una sottofinestra può solo creare un indicatore, se si crea una sottofinestra, allora si possono aggiungere oggetti grafici a questa sottofinestra utilizzando l'Expert Advisorhttps://www.mql5.com/ru/docs/constants/objectconstants/enum_object

ZSYZZ: la sottofinestra può essere ottenuta applicando un modello, era un argomento di un paio di mesi fa, ma penso che tu abbia un problema con qualcos'altro finora

Mi dispiace. Forse non mi sono espresso bene, ma

Non ho intenzione di usarlo per i test, ma non ho intenzione di eseguirlo.

Per quanto riguarda la visualizzazione sul grafico dell'indicatore durante i test, se usate

Quando usate funzioni di indicatori in linea, esse vengono disegnate sul grafico durante il processo di test

Questo è esattamente quello che voglio dire.

Ma se usate un qualche tipo di codice di calcolo dell'indicatore personalizzato che è integrato nel codice dell'EA, allora questo indicatore

non sarà visualizzato durante il processo di test dell'EA.

Per quanto riguarda iCustom, quando lo usi nel processo di test l'EA sarà visualizzato sul grafico

qualsiasi indicatore e il codice dell'indicatore può essere compilato con l'EA in un ex4 ma non ne ho bisogno.

Volevo solo sapere se c'è un modo per bypassare iCustom in questa materia, ma se non c'è, non è nemmeno un problema.

Grazie mille per la risposta esauriente.

 

Artem ha postato un modello di indicatore qui, ecco la parte diOnCalculate

//--- Проверка количества доступных баров (1 - минимально, 4 - оптимально для большинства расчётов. Но всё "по месту"...)
   if(rates_total<4) return 0;
//--- Проверка и расчёт количества просчитываемых баров
   int limit=rates_total-prev_calculated; // 0 - пришел новый тик, новый бар формироваться не начал. 1 - пришел новый тик и начал формироваться новый бар.
   if(limit>1) 
               // если вписать "limit>0", то на нулевом баре будет расчёт только нулевого бара, на каждом новом баре будет полный перерасчёт всей истории
               // если вписать "limit>1", то на нулевом баре будет расчёт только нулевого бара, на открытии нового бара - пересчёт первого и нулевого,
               // при подгрузке истории и на первом запуске - перерасчёт всей истории
     {
      limit=rates_total-1;
      // здесь должна быть инициализация всех используемых буферов индикатора необходимыми значениями (обычно EMPTY_VALUE и 0)
     }

Lo sto usando ma ho una domanda)

Perché usolimit=rates_total-1 per il calcolo della storia completa enonlimit=rates_total?

 
psyman:

Perchélimit=rates_total-1 è usato per il calcolo della storia completa enonlimit=rates_total?

Provate a controllarlo, sarete immediatamente "fuori portata " - numerazione delle barre da zero a ... Totale -1 , una situazione comune nella programmazione - la numerazione inizia con 0. Come esempio ovvio, dichiarate l'array double x[5] e provate a scrivere qualcosa nell'ultimo elemento x[5] = 100;

ZS: rispondere alla domanda che non hai ancora fatto.... Anche OrderTotal() numera da zero a OrderTotal()-1 ;)

 
Igor Makanu:

ZS: rispondere a una domanda che non è ancora stata fatta.... OrderTotal() numera troppo da zero a OrderTotal()-1 ;)

La questione è sorta a proposito, ora non posso vincere una media sulla matrice, anche se faccio in cinque, ma in quale tema scrivere, non so, lasciate che sia qui.

L'indicatore calcola la differenza aperto-chiuso e costruisce МА su di essa. Ho scelto MA=2 per il debug ma usando SimpleMAOnBuffer e iMAOnArray ottengo degli spostamenti di linea inspiegabili e iMAOnArray mostra un valore zero sull'ultima barra.


//+------------------------------------------------------------------+
//|                                                        _null.mq4 |
//|                        Copyright 2014, MetaQuotes Software Corp. |
//|                                              http://www.mql5.com |
//+------------------------------------------------------------------+
#property copyright "Copyright 2014, MetaQuotes Software Corp."
#property link      "http://www.mql5.com"
#property version   "1.00"
#property strict
#property indicator_separate_window
#include <MovingAverages.mqh>

#property indicator_buffers 4
#property indicator_plots   2
//--- plot OC
#property indicator_label1  "OC"
#property indicator_type1   DRAW_COLOR_HISTOGRAM
#property indicator_color1  clrSteelBlue, clrRed,clrGreen
#property indicator_style1  STYLE_SOLID
#property indicator_width1  1

#property indicator_label2  "MA1"
#property indicator_type2   DRAW_LINE
#property indicator_color2  clrBrown
#property indicator_style2  STYLE_SOLID
#property indicator_width2  1


//--- indicator buffers
double   OC[], OC_color[], MA1_buf[];
input int MA1=2;

int OnInit()
  {
  
   IndicatorSetString(INDICATOR_SHORTNAME,"t1");
   
   SetIndexBuffer(0,OC,INDICATOR_DATA);
   SetIndexBuffer(1,OC_color,INDICATOR_COLOR_INDEX);
   
   SetIndexBuffer(2, MA1_buf,INDICATOR_DATA); 
   //PlotIndexSetInteger(2,PLOT_DRAW_BEGIN,50);

     
//--- indicator buffers mapping

   
//---
   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[])
{

//--- Проверка количества доступных баров (1 - минимально, 4 - оптимально для большинства расчётов. Но всё "по месту"...)
   if(rates_total<4) return 0;
//--- Проверка и расчёт количества просчитываемых баров
   int limit=rates_total-prev_calculated; // 0 - пришел новый тик, новый бар формироваться не начал. 1 - пришел новый тик и начал формироваться новый бар.
   //if(limit>1) 
   
               // если вписать "limit>0", то на нулевом баре будет расчёт только нулевого бара, на каждом новом баре будет полный перерасчёт всей истории
               // если вписать "limit>1", то на нулевом баре будет расчёт только нулевого бара, на открытии нового бара - пересчёт первого и нулевого,
               // при подгрузке истории и на первом запуске - перерасчёт всей истории
     {
     limit=rates_total-1;
           // здесь должна быть инициализация всех используемых буферов индикатора необходимыми значениями (обычно EMPTY_VALUE и 0)
     }
   for(int i=limit; i>=0 && !IsStopped(); i--)
     {
      // необходимые действия по расчёту индикатора
     
     OC[i]=fmax(open[i],close[i])-fmin(open[i],close[i]);
     if(OC[i]>0.001)
      {   OC_color[i]=1;
      }
      }  
   
 /*  for(int k=limit; k>=0 && !IsStopped(); k--)
     {
   
     MA1_buf[k]=iMAOnArray(OC,0,MA1,k,MODE_SMA,0);
     }
*/
      SimpleMAOnBuffer(rates_total,prev_calculated,0,MA1,OC,MA1_buf);

//--- return value of prev_calculated for next call
   return(rates_total);
  }




double iMAOnArray(double &array[],
                      int total,
                      int period,
                      int ma_shift,
                      int ma_method,
                      int shift)
  {
   double buf[],arr[];
   if(total==0) total=ArraySize(array);
   if(total>0 && total<=period) return(0);
   if(shift>total-period-ma_shift) return(0);
   switch(ma_method)
     {
      case MODE_SMA :
        {
         total=ArrayCopy(arr,array,0,shift+ma_shift,period);
         if(ArrayResize(buf,total)<0) return(0);
         double sum=0;
         int    i,pos=total-1;
         for(i=1;i<period;i++,pos--)
            sum+=arr[pos];
         while(pos>=0)
           {
            sum+=arr[pos];
            buf[pos]=sum/period;
            sum-=arr[pos+period-1];
            pos--;
           }
         return(buf[0]);
        }
      case MODE_EMA :
        {
         if(ArrayResize(buf,total)<0) return(0);
         double pr=2.0/(period+1);
         int    pos=total-2;
         while(pos>=0)
           {
            if(pos==total-2) buf[pos+1]=array[pos+1];
            buf[pos]=array[pos]*pr+buf[pos+1]*(1-pr);
            pos--;
           }
         return(buf[shift+ma_shift]);
        }
      case MODE_SMMA :
        {
         if(ArrayResize(buf,total)<0) return(0);
         double sum=0;
         int    i,k,pos;
         pos=total-period;
         while(pos>=0)
           {
            if(pos==total-period)
              {
               for(i=0,k=pos;i<period;i++,k++)
                 {
                  sum+=array[k];
                  buf[k]=0;
                 }
              }
            else sum=buf[pos+1]*(period-1)+array[pos];
            buf[pos]=sum/period;
            pos--;
           }
         return(buf[shift+ma_shift]);
        }
      case MODE_LWMA :
        {
         if(ArrayResize(buf,total)<0) return(0);
         double sum=0.0,lsum=0.0;
         double price;
         int    i,weight=0,pos=total-1;
         for(i=1;i<=period;i++,pos--)
           {
            price=array[pos];
            sum+=price*i;
            lsum+=price;
            weight+=i;
           }
         pos++;
         i=pos+period;
         while(pos>=0)
           {
            buf[pos]=sum/weight;
            if(pos==0) break;
            pos--;
            i--;
            price=array[pos];
            sum=sum-lsum+price*period;
            lsum-=array[i];
            lsum+=price;
           }
         return(buf[shift+ma_shift]);
        }
      default: return(0);
     }
   return(0);
  }
 
psyman:

Ho una domanda correlata, sto ancora lottando con la media delle matrici, anche se la sto facendo in 5, ma non so in quale soggetto scriverla, sia qui.

Ho la sensazione che in MQL5 i buffer degli indicatori e le serie temporali siano "dispiegati" in modo opposto, di default la barra più a sinistra in MT5 è la barra 0 e in MT4 la barra più a destra è la barra 0 e i buffer degli indicatori hanno la stessa numerazione

ZS: ahimè, non voglio essere coinvolto con MT5, MT4 è sufficiente per me per verificare le mie idee, guardo solo le preparazioni in MT5, se scrivo qualcosa usando MT5 non lo mostro mai a nessuno )))