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

 
PolarSeaman:

Sta ancora scalciando.

hai[i+1], devi controllare +2 più

In generale, si dovrebbe fare qualcosa del genere

limit=(rates_total<cb || cb<=0) ? rates_total-1 : cb;
if (limit<=0) return(0);
 
Ihor Herasko:

Perché il controllo è fondamentalmente sbagliato. Diciamo che Bars restituisce 1000 e anche cb restituisce 1000. Poi nel ciclo sulla prima iterazione i ottiene il valore 1000. Nella prima condizione del corpo del ciclo:

Due uscite contemporaneamente fuori dall'array: l' accesso a una barra con indice 1000 e una con indice 1001. Se il grafico ha 1000 barre, la prima barra ha indice 0 e l'ultima ha indice 999.

Più avanti nel corpo dell'anello c'è un riferimento alle barre ancora più lontane della storia:

Tutto questo deve essere preso in considerazione nel controllo iniziale.

Per un controllo corretto, vedere l'esempio della funzione IndicatorCounted() in MQL4 Reference. Solo ora, IndicatorCounted() dovrebbe essere sostituito dalla condivisione di rates_total (questo è Bars) e prev_calculated (questo è IndicatorCounted()).

Grazie, l'ho trovato,

 int counted_bars=IndicatorCounted(); 
     if(counted_bars>0) counted_bars--;

Con che cosa devo confrontarlo? nell'esempio inizia conlimite

 limit=Bars-counted_bars;

Con cosa dovrei confrontare questo "cb"?

 
PolarSeaman:

Grazie, l'ho trovato,

Nell'esempio, inizia con "limite".

con cosa devo confrontare questo "cb"?

Se volete limitare il numero di barre su cui vengono visualizzati i dati dell'indicatore, è meglio farlo in questo modo:

int GetRecalcIndex(int& total, const int ratesTotal, const int prevCalculated)
{
   total = ratesTotal - 2 - barsig;                                                                         
                                                   
   if (cb > 0 && cb < total)
      total = MathMin(cb, total);                      
                                                   
   if (prevCalculated < ratesTotal - 1)                     
   {       
      InitializeBuffers();    // Это функция, которая должна заново инициализировать все индикаторные буфера, т. к. имеем дело с первой загрузкой индикатора или подкачкой истории
      return (total);
   }
   
   return (MathMin(ratesTotal - prevCalculated, total));                            
}

Utilizzare come segue:

int total;   
int limit = GetRecalcIndex(total, rates_total, prev_calculated);                                

for (int i = limit; i >= 0; --i)
{
  ...
}
Il valore totale è l'indice della barra più profonda della storia, a cui si può accedere in base ai valori delle impostazioni dell'indicatore.
 
Taras Slobodyanik:

hai[i+1], devi controllare +2 più

In generale, si dovrebbe fare qualcosa del genere

L'ho fatto in questo modo, ma dice ...array out of range in 'HiLo.mq4' (122,15)

cosa dovrei controllare con +2 in più?


 
Ihor Herasko:

Se volete limitare il numero di barre su cui vengono visualizzati i dati dell'indicatore, è meglio farlo:

Utilizzare come segue:

Il valore di total è l'indice della barra più profonda nella storia, che può essere chiamato in base ai valori delle impostazioni dell'indicatore.

Il compilatore giura.

'InitializeBuffers' - funzione non definita HiLo.mq4 161 7

e non c'è nulla su questa funzione nell'aiuto
 
PolarSeaman:

Il compilatore si lamenta di

'InitializeBuffers' - funzione non definita HiLo.mq4 161 7

E non c'è niente su questa funzione nell'aiuto

Ho scritto nel commento che questa è una funzione che dovrebbe inizializzare tutti i buffer degli indicatori. È una funzione personalizzata. Io ce l'ho così:

void InitializeBuffers()
{
   ArrayInitialize(g_indValues, EMPTY_VALUE);
   ArrayInitialize(g_tempBuffer, EMPTY_VALUE);
}

Ne avrete uno diverso perché i buffer sono diversi. Se l'indicatore lavora con oggetti grafici, è necessario rimuoverli tutti qui, perché il disegno iniziale delle letture deve essere fatto.

 
Ihor Herasko:

Ho scritto nel commento che questa è una funzione per inizializzare tutti i buffer degli indicatori. È una funzione personalizzata. Io ce l'ho così:

Ne avrete uno diverso, poiché i buffer sono diversi. Se l'indicatorelavora con oggetti grafici, dovete cancellarli tutti qui, dato che il disegno iniziale delle letture deve essere fatto.

Grazie, ma niente è cambiato ...array fuori range in 'HiLo.mq4' (130,15)

. Cosa c'è che non va?

#property copyright "Copyright ©  november 2015"
#property strict 

#property indicator_chart_window
#property indicator_buffers 6

#property indicator_color1 RoyalBlue       //DodgerBlue
#property indicator_color2 Crimson         //OrangeRed
#property indicator_color3 Black  //White
#property indicator_color4 Black  //White
#property indicator_color5 Black            //White
#property indicator_color6 Black         //Red

#property indicator_width1 2
#property indicator_width2 2

#property indicator_style3 STYLE_DOT
#property indicator_style4 STYLE_DOT

input int    p        = 10;    // Период
input int    s        = 5;     // Угол наклона
input double distance = 2.0;   // Ширина канала
input bool   showBb   = false;  // Границы канала
input bool   showCl   = true;  // Центральная линия
input int    barsig   = 1;     // Сигнальная свеча (номер)
input int    arrots   = 0;    // Стрелка (отступ)
input int    arrsz    = 0;     // Стрелка (размер)
input int    ATR      = 1000;  // Период ATR
input int    cb       = 1000;  // Сколько свечей в истории

double fx1[],fx2[],hp[];
double z1,z2,ki;
int fs;

double upper[],lower[];
double upar[],dnar[];

//+------------------------------------------------------------------+
//| Custom indicator initialization function                         |
//+------------------------------------------------------------------+
int OnInit(void)
  {
//--- indicator buffers mapping
IndicatorBuffers(7);
SetIndexBuffer(0,fx1);
SetIndexBuffer(1,fx2);
SetIndexBuffer(2,lower);
SetIndexBuffer(3,upper);
SetIndexBuffer(4,upar);
SetIndexBuffer(5,dnar);
SetIndexBuffer(6,hp);


SetIndexStyle (4,DRAW_ARROW,0,arrsz);
SetIndexArrow (4,233);
SetIndexStyle (5,DRAW_ARROW,0,arrsz);
SetIndexArrow (5,234);

   if(showBb)
   {SetIndexStyle(2,DRAW_LINE);
    SetIndexStyle(3,DRAW_LINE);
   }
   else
   {SetIndexStyle(2,DRAW_NONE);
    SetIndexStyle(3,DRAW_NONE);
   }
   
    if(showCl)
   {SetIndexStyle(0,DRAW_LINE);
    SetIndexStyle(1,DRAW_LINE);
   }
   else
   {SetIndexStyle(0,DRAW_NONE);
    SetIndexStyle(1,DRAW_NONE);
   }

SetIndexEmptyValue(0,0.0);
SetIndexEmptyValue(1,0.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[])
  {
//---
   int i,limit;
//   limit=(rates_total<cb || cb<=0) ? rates_total-2 : cb;
//if (limit<=0) return(0);
 int total;   
 limit = GetRecalcIndex(total, rates_total, prev_calculated);                                

for (int i = limit; i >= 0; --i)
{ 
  
  
   SetIndexDrawBegin(0,Bars-cb);
   SetIndexDrawBegin(1,Bars-cb);

double avg;

ki=2.0/(p+1);

for (i=cb; i>=0; i--) {fx1[i]=Close[i];}

for (int m=0; m<=s; m++)
{
z1=fx1[0];
for (i=0; i<=cb; i++) {z1=z1+(fx1[i]-z1)*ki; hp[i]=z1;}

z2=fx1[cb];
for (i=cb; i>=0; i--) {z2=z2+(fx1[i]-z2)*ki; fx1[i]=(hp[i]+z2)/2;}
}

fs=0;
for (i=cb; i>=0; i--)
{
if (fx1[i]>fx1[i+1]) fs=1;
if (fx1[i]<fx1[i+1]) {if (fs==1) fx2[i+1]=fx1[i+1]; fs=2;}
if (fs==2) fx2[i]=fx1[i]; else fx2[i]=0.0;

avg = iATR(NULL,0,ATR, i+10);
upper[i] = hp[i] + distance*avg;
lower[i] = hp[i] - distance*avg;

if(Close[i+1+barsig]<upper[i+1+barsig] && Close[i+barsig]>upper[i+barsig])
 dnar[i] = High[i]+arrots*Point; else dnar[i] = EMPTY_VALUE;
 
if(Close[i+1+barsig]>lower[i+1+barsig] && Close[i+barsig]<lower[i+barsig])
 upar[i] = Low[i]-arrots*Point; else upar[i] = EMPTY_VALUE; 
}
}
//--- return value of prev_calculated for next call
   return(rates_total);
  }
  

int GetRecalcIndex(int& total, const int ratesTotal, const int prevCalculated)
{
   total = ratesTotal - 2 - barsig;                                                                         
                                                   
   if (cb > 0 && cb < total)
      total = MathMin(cb, total);                      
                                                   
   if (prevCalculated < ratesTotal - 1)                     
   {       
      InitializeBuffers();    // Это функция, которая должна заново инициализировать все индикаторные буфера, т. к. имеем дело с первой загрузкой индикатора или подкачкой истории
      return (total);
   }
   
   return (MathMin(ratesTotal - prevCalculated, total));                            
}

void InitializeBuffers()
{
   ArrayInitialize(fx1, EMPTY_VALUE);
   ArrayInitialize(fx2, EMPTY_VALUE);
   ArrayInitialize(lower, EMPTY_VALUE);
   ArrayInitialize(upper, EMPTY_VALUE);
   ArrayInitialize(upar, EMPTY_VALUE);
   ArrayInitialize(dnar, EMPTY_VALUE);
   ArrayInitialize(hp, EMPTY_VALUE);
}
 
PolarSeaman:

Grazie, ma non è cambiato nulla. Cosa c'è che non va?

Naturalmente, il risultato non cambierà. Dopotutto, non hai rimosso la ragione principale (il ciclo cb). Questo ciclo è organizzato in modo scorretto:

for (i=cb; i>=0; i--)

Dovrebbe essere rimosso e sostituito con il loop di limite. In entrambi i luoghi.

 
Ihor Herasko:

Naturalmente, il risultato non cambierà. Dopotutto, non hai rimosso la ragione principale (il ciclo cb). Questo ciclo è organizzato in modo scorretto:

Dovrebbe essere rimosso e sostituito con il loop di limite. In entrambi i luoghi.

Ci sono 3 cicli di questo tipo. Li ho sostituiti e il terminale è rimasto appeso.

 

L'ho fatto, non si blocca o si blocca, ma ci sono 3 valori nel primo buffer (fx2): prezzo, 0.0 e 164874239.218492.

sell_1_B=NormalizeDouble(iCustom(Symbol(),0,"HiLo",1,1),Digits);

Se il valore sell_1_B!=EMPTY_VALUE e sell_1_B!=0 non significa che ci sia un prezzo.

Come posso ottenere un segnale?