Qualsiasi domanda da principiante, per non ingombrare il forum. Professionisti, non passate oltre. Da nessuna parte senza di te - 6. - pagina 545

 
GSB:

Che tipo di ripresa? Potete chiamare lo stesso indicatore con parametri completamente diversi



Se nell'indicatore stesso
extern int       periodAMA=10;
nell'EA
extern int periodAMA_1= 8; 
extern int periodAMA_2=13; 

come fa il codice indicatore a riconoscere i parametri trasmessi e i loro nomi sono diversi?

Ma tutto è come hai detto tu. Ho controllato di nuovo con lo script)

 
Forexman77:
Se nell'indicatore stesso in Expert Advisor

come fa il codice dell'indicatore a riconoscere i parametri trasmessi e i nomi sono diversi?

Ma tutto è come hai detto tu. Controllato di nuovo con lo script)


La variabile (o le variabili) nel programma chiamante può essere nominata come volete e il suo nome non è correlato al nome della variabile nell'indicatore, sono variabili diverse, e sono chiamate da diversi thread del terminale.

L'indicatore viene chiamato in base al suo nome, i parametri vengono passati per esso durante ogni chiamata dalla quarta posizione e poi i parametri iCustom().

Se la variabile per1=9; è dichiarata e iCustom() è sulla posizione 4, l'indicatore sarà calcolato con un periodo di 9, se impostate un'altra variabile, il suo valore sarà utilizzato durante il calcolo. La variabile che sarà passata (il suo riferimento) come primo parametro dell'indicatore - al quarto posto iCustom() del secondo e così via.



 
GSB:

La variabile (o le variabili) nel programma chiamante può essere nominata come volete, il suo nome non ha nulla a che fare con il nome della variabile nell'indicatore, sono variabili diverse, e in generale, sono chiamate da diversi thread del terminale.

L'indicatore viene chiamato con il suo nome, i parametri gli vengono passati durante ogni chiamata dalla quarta posizione, e poi i parametri iCustom().

Se si dichiara la variabile per1=9 e si posiziona iCustom() a 4, l'indicatore sarà calcolato con un periodo di 9; se si imposta un'altra variabile, il suo valore sarà utilizzato durante il calcolo e questo vale per tutti i parametri dell'indicatore, l'importante è impostarli nel giusto ordine, come nell'indicatore stesso. La variabile che sarà passata (il suo riferimento) come primo parametro dell'indicatore - il quarto iCustom() del secondo e così via.



Ho capito. Nel libro di testo, sembra che si chiami trasferimento dei valori citati.
 

Ho pensato che non dovrei sporcare il forum e avere un argomento separato, ma spero davvero in un feedback costruttivo sul mio problema, non sto andando avanti senza di esso :(.
Ho provato a scrivere vari indicatori, tutto sembra essere OK, ora ho importato tutto nel mio EA usando la funzione iCustom(). Il codice nell'Expert Advisor:

double ma=iCustom(NULL,0,"TestMA",0,1);

L'indicatore stesso (l'ho scritto per i test)

//+------------------------------------------------------------------+
//|                                                       TestMA.mq4 |
//|                                  Copyright 2014, Semyon Polyakov |
//|                                              https://www.mql5.com |
//+------------------------------------------------------------------+
#property copyright "Copyright 2014, Semyon Polyakov"
#property link      "https://www.mql5.com"
#property version   "1.00"
#property strict
#property indicator_chart_window

double ExtMapBuffer1[];
//+------------------------------------------------------------------+
//| Custom indicator initialization function                         |
//+------------------------------------------------------------------+
int OnInit()
  {
//--- indicator buffers mapping
   
 
   SetIndexStyle(0,DRAW_LINE,EMPTY,1,clrRed);
   SetIndexBuffer(0,ExtMapBuffer1);
//---
   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 counted_bars=IndicatorCounted(),
       limit;
 
   if(counted_bars>0)
      counted_bars--;
   
   limit=Bars-counted_bars;
     
   for(int i=0;i<limit;i++)
   {
      ExtMapBuffer1[i]=SimpleMA(i,20,close);
   }
//--- return value of prev_calculated for next call
   return(rates_total);
  }
  
  double SimpleMA(const int position,const int period,const double &price[])
  {
//---
   double result=0.0;
//--- check position
   if(position>=0 && period>0)
     {
      //--- calculate value
      for(int i=0;i<period;i++) result+=price[position+i];
      result/=period;
     }
//---
   return(result);
  }
//+------------------------------------------------------------------+

Poi, la cosa EMPTY_VALUE durante i test.

Cioè, quando iniziamo a testare, abbiamo la data di inizio dell'EA e tutto prima di quella data iCustom dà i valori corretti dell'indicatore, tutto ciò che viene dopo è direttamente testato - EMPTY_VALUE. :(
Sono già stanco di google e del forum, scrivono di "non guardare nel futuro", ma non lo vedo nel codice. Dove sono un pazzo?).

 
Semionn:

Ho pensato che non avrei dovuto sporcare il forum e avere un argomento separato, ma spero davvero in un feedback costruttivo sul mio problema, non sto andando avanti senza di esso :(.
Ho provato a scrivere vari indicatori, tutto sembra essere OK, ora ho importato tutto nel mio EA usando la funzione iCustom(). Il codice nell'Expert Advisor:

L'indicatore stesso (l'ho scritto per i test)

Poi, la cosa EMPTY_VALUE durante i test.

Cioè, quando iniziamo a testare, abbiamo la data di inizio dell'EA e tutto prima di quella data iCustom dà i valori corretti dell'indicatore, tutto ciò che viene dopo è direttamente testato - EMPTY_VALUE. :(
Sono già stanco di google e del forum, scrivono di "non guardare nel futuro", ma non lo vedo nel codice. Dove sono un pazzo?).

L'errore sembra essere nel codice dell'Expert Advisor, perché non usi un debugger? Impostare i punti di controllo, vedere i valori delle variabili, e vedere se l'indicatore è chiamato, cosa c'è prima e dopo la vostra data
 
GSB:
L'errore sembra essere nel codice dell'Expert Advisor, perché non usi un debugger? Impostare i punti di controllo, vedere i valori delle variabili, e vedere se l'indicatore è chiamato, cosa c'è prima e dopo la vostra data

Il debugger può essere utilizzato solo in modalità conto demo, non in test, inoltre ho scritto - l'indicatore viene chiamato, funziona e restituisce valori, anche corretti, ma solo prima della data specificata (data di inizio del test). Emetto i valori delle variabili nell'EA, per questo dico che tutto va bene all'inizio, e poi EMPTY_VALUE
 
Semionn:

Il debugger può essere utilizzato solo in modalità conto demo, non in test, inoltre ho scritto - l'indicatore viene chiamato, funziona e restituisce valori, anche corretti, ma solo fino alla data specificata (data di inizio test). Emetto i valori delle variabili nell'EA, per questo dico che tutto è buono all'inizio, e poi EMPTY_VALUE


Avete letto attentamente come tracciare le nuove barre negli indicatori personalizzati?

[QUOTE]Il primo parametro rates_total contiene il numero di barre disponibili all'indicatore per il calcolo e corrisponde al numero di barre disponibili nel grafico.

Notate la connessione tra il valore restituito da OnCalculate() e il secondo parametro di input prev_calculated. Il parametro prev_calculated nella chiamata di funzione contiene un valore restituito da OnCalculate() nella chiamata precedente. Questo permette algoritmi economici per il calcolo dell'indicatore personalizzato al fine di evitare calcoli ripetuti per quelle barre che non sono cambiate dalla precedente chiamata di questa funzione.

Per questo, di solito è sufficiente restituire il valore del parametro rates_total, che contiene il numero di barre nella chiamata di funzione corrente. Se dall'ultima chiamata di OnCalculate() i dati sui prezzi sono cambiati (è stata pompata una storia più profonda o sono stati riempiti gli spazi vuoti della storia), allora il valore del parametro di input prev_calculate sarà impostato a zero dal terminale. [/QUOTE]

 

Devi trovare la media dei momenti di un giorno su 20 giorni e poi trovare la media dei momenti di 20 giorni su cinque giorni.

Trovare la media a 20 giorni non è stato un problema. Ma non socome ottenerela media di cinque giornida questa media .

#property indicator_separate_window
#property indicator_buffers 1
#property  indicator_color1 Lime

//--- input parameters
extern int       Period_MA_1=1;
extern int       p          =20;
//--- buffers
double ExtMapBuffer1[];
double val20[];
//+------------------------------------------------------------------+
//| Custom indicator initialization function                         |
//+------------------------------------------------------------------+
int init()
  {
//---- indicators
   SetIndexStyle(0,DRAW_LINE);
   SetIndexBuffer(0,ExtMapBuffer1);
   IndicatorDigits(Digits+1);
//----
   return(0);
  }
//+------------------------------------------------------------------+
//| Custom indicator deinitialization function                       |
//+------------------------------------------------------------------+
int deinit()
  {
   return(0);
  }
//+------------------------------------------------------------------+
//| Custom indicator iteration function                              |
//+------------------------------------------------------------------+
int start()
  {
    int counted_bars=IndicatorCounted(),                      
    limit;
    double momentum20;
   if(counted_bars>0)
      counted_bars--;  
   limit=Bars-counted_bars;
    
   for(int i=0;i<limit;i++)
   {
      momentum20=0;
      ArrayInitialize(val20,0);      
      for(int k=p;k>=0;k--)
      {
      ArrayResize(val20,p);
      val20[k]=Close[i+k]-Close[i+k+Period_MA_1];
      momentum20=momentum20+val20[k];
      }
      momentum20=momentum20/p;
      ExtMapBuffer1[i]=momentum20;
   }
   return(0);
  }
 
Forexman77:

Devi trovare la media dei momenti di un giorno su 20 giorni e poi trovare la media dei momenti di 20 giorni su cinque giorni.

Trovare la media a 20 giorni non è stato un problema. Ma non socome ottenerela media di cinque giornida questa media .



//+------------------------------------------------------------------+
//|                                                   ForexMan77.mq4 |
//|                                            Copyright 2014, Vinin |
//|                                                    vinin@mail.ru |
//+------------------------------------------------------------------+
#property copyright "Copyright 2014, Vinin"
#property link      "vinin@mail.ru"
#property version   "1.00"
#property strict
#property indicator_separate_window
#property indicator_buffers 3
#property  indicator_color1 Lime
#property  indicator_color2 Yellow
#property  indicator_color3 Red

//--- input parameters
extern int       Period_MA_1=1;
extern int       p2          =20;
extern int       p3          =5;
//--- buffers
double ExtMapBuffer1[];
double ExtMapBuffer2[];
double ExtMapBuffer3[];
//+------------------------------------------------------------------+
//| Custom indicator initialization function                         |
//+------------------------------------------------------------------+
int init()
  {
//---- indicators
   SetIndexStyle(0,DRAW_LINE);
   SetIndexBuffer(0,ExtMapBuffer1);
   SetIndexStyle(1,DRAW_LINE);
   SetIndexBuffer(1,ExtMapBuffer2);
   SetIndexStyle(2,DRAW_LINE);
   SetIndexBuffer(2,ExtMapBuffer3);

//----
   return(0);
  }
//+------------------------------------------------------------------+
//| Custom indicator deinitialization function                       |
//+------------------------------------------------------------------+
int deinit()
  {
   return(0);
  }
//+------------------------------------------------------------------+
//| Custom indicator iteration function                              |
//+------------------------------------------------------------------+
int start()
  {
   int counted_bars=IndicatorCounted(),
   i,limit1,limit2,limit3;
   limit1=Bars-counted_bars-1;
   limit2=limit1;
   limit3=limit2;
   if(limit1>0) 
     {
      limit1=Bars-Period_MA_1-1;
      limit2=limit1-p2;
      limit3=limit2-p3;
     }

   for(i=limit1;i>=0;i--) ExtMapBuffer1[i]=iMomentum(NULL, 0, Period_MA_1, PRICE_CLOSE, i);
   for(i=limit2;i>=0;i--) ExtMapBuffer2[i]=iMAOnArray(ExtMapBuffer1, 0, p2, 0, MODE_SMA,i);
   for(i=limit3;i>=0;i--) ExtMapBuffer3[i]=iMAOnArray(ExtMapBuffer2, 0, p3, 0, MODE_SMA,i);

   return(0);
  }
//+------------------------------------------------------------------+
 

Aiuto

int OnInit()
{
   EventSetTimer(60);
   Print(GetLastError());

   return(INIT_SUCCEEDED);
}

Il timer non funziona, restituisce falli ed errore 4051

O non dovrebbe funzionare nel tester?

Motivazione: