Scrive anche un altro errore - tipo di variabile sbagliato per la dimensione dell'array
Solo le costanti possono essere specificate nelle dimensioni
Anche le costanti non funzionano, ci sarà un errore:
constint AA =11;
ArrWe m[AA];
Specificatori di accesso
Gli specificatori di accesso dicono al compilatore come accedere a variabili, membri di strutture o classi.
Lo specificatoreconst dichiara una variabile come una costante e non permette che il valore di questa variabile sia cambiato durante l'esecuzione del programma. È permesso inizializzare una variabile una volta sola quando la si dichiara.
papaklass: Non capisco. Ho messo un EA sul grafico e questo messaggio appare nella scheda "Experts". L'Expert Advisor continua comunque il suo lavoro. Questo non è un errore, ma un avvertimento. Un avvertimento su cosa?
È un errore in fase di esecuzione - significa una perdita di memoria. Da qualche parte la memoria occupata da una stringa non viene liberata. Molto probabilmente, è una struttura o una classe che non viene cancellata dopo il nuovo. Devi guardare il codice per essere più specifico.
Gli specificatori di accesso dicono al compilatore come accedere a variabili, membri di strutture o classi.
Lo specificatoreconst dichiara una variabile come una costante e non permette che il valore di questa variabile sia cambiato durante l'esecuzione del programma. È permesso inizializzare una variabile una volta sola quando la si dichiara.
Una variabile costante non è una costante! Può essere inizializzata una volta sola, cioè è una variabile per la quale viene allocata la memoria.
Il compito delle costanti è di essere calcolate e inserite nel codice senza occupare la memoria a runtime.
La costante sarà const AA=11.
Di conseguenza, il compilatore sbaglierà. Se const AA=11, non si lamenterà.
Sull'ultimo intervallo in ChannelPeriod = 100; c'è un forte spostamento verso l'alto nelle letture dell'indicatore, andando oltre le ultime 100 barre tutto si mostra normalmente.
Qualcuno sa come risolvere il problema?
//+------------------------------------------------------------------+intOnCalculate(constint rates_total,
constint prev_calculated,
constdatetime& time[],
constdouble& open[],
constdouble& high[],
constdouble& low[],
constdouble& close[],
constlong& tick_volume[],
constlong& volume[],
constint& spread[])
{
//--- variables of indicatorint i;
CopyClose(Symbol1_Name,PERIOD_M30,0,rates_total,close_1);
CopyClose(Symbol2_Name,PERIOD_M30,0,rates_total,close_2);
//--- main cyclefor(i=prev_calculated; i<rates_total; i++)
{
Last[i] = (Symbol1_Vol*Symbol1_K*close_1[i] - Symbol2_Vol*Symbol2_K*close_2[i]);
}
// Считаем положение эквити относительно канала удвоенного среднеквадратичного отклоненияdouble StdDev;
for(i=prev_calculated; i<rates_total; i++)
{
StdDev=MyStdDev(Last,ChannelPeriod,i);
if(StdDev>0.00001) // Защита от отсутствия данных
ExtStdDevBuffer[i]=(Last[i]+2*StdDev-iMAOnArrayMQL4(Last,0,ChannelPeriod,0,MODE_SMA,i))/(4*StdDev);
}
return(rates_total);
}
//-----------------------------------------------------------------------------------------//-----------------------------------------------------------------------------------------// Calculation StdDev -----------------------------------------------| // StdDev = SQRT (SUM [(S(i) - SMA(i))^2, N] / N) | double MyStdDev(double &array[], int BandsPeriod, int Index)
{
double ds, sum, center;
sum = 0;
center = iMAOnArrayMQL4(array,0,BandsPeriod,0,MODE_SMA,Index);
for(int i = 0; i < BandsPeriod; i++)
{
ds = array[Index+i] - center;
sum += ds * ds;
}
sum = MathSqrt (sum / BandsPeriod);
return (sum);
}
//-----------------------------------------------------------------------------------------//-----------------------------------------------------------------------------------------double iMAOnArrayMQL4(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)
{
caseMODE_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]);
}
caseMODE_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]);
}
caseMODE_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]);
}
caseMODE_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);
}
//-----------------------------------------------------------------------------------------
Perché, quando premo il pulsante "Start", il tester non fa il test dal livello di deposito iniziale, ma dal livello in cui è finito l'ultimo test. Non c'è questo problema nel 4. Come iniziare i test dal livello di deposito iniziale?
Zeleniy: Per favore, datemi un link diretto dove si possono scaricare i libri di testo in formato PDF, perché il browser del mio telefono non può vedere tutto sul sito.
Ho trovato una "confusione".
Perché al compilatore non piace la definizione della seconda variabile b?
E in generale, come gestire questa situazione?
Non gli piace la definizione.
Scrive solo un altro errore - tipo di variabile sbagliato per la dimensione dell'array
Si possono specificare solo costanti in dimensioni
Non è la definizione che non gli piace.
Scrive anche un altro errore - tipo di variabile sbagliato per la dimensione dell'array
Solo le costanti possono essere specificate nelle dimensioni
Anche le costanti non funzionano, ci sarà un errore:
Specificatori di accesso
Gli specificatori di accesso dicono al compilatore come accedere a variabili, membri di strutture o classi.
Lo specificatoreconst dichiara una variabile come una costante e non permette che il valore di questa variabile sia cambiato durante l'esecuzione del programma. È permesso inizializzare una variabile una volta sola quando la si dichiara.
Intendevo solo due opzioni
int Arr[100]
o
#define r 100
int Arr[r]
Per il resto ArrayResize
Non capisco. Ho messo un EA sul grafico e questo messaggio appare nella scheda "Experts". L'Expert Advisor continua comunque il suo lavoro. Questo non è un errore, ma un avvertimento. Un avvertimento su cosa?
non funzionerà, ci sarà un errore:
Specificatori di accesso
Gli specificatori di accesso dicono al compilatore come accedere a variabili, membri di strutture o classi.
Lo specificatoreconst dichiara una variabile come una costante e non permette che il valore di questa variabile sia cambiato durante l'esecuzione del programma. È permesso inizializzare una variabile una volta sola quando la si dichiara.
Una variabile costante non è una costante! Può essere inizializzata una volta sola, cioè è una variabile per la quale viene allocata la memoria.
Il compito delle costanti è di essere calcolate e inserite nel codice senza occupare la memoria a runtime.
La costante sarà const AA=11.
Di conseguenza, il compilatore sbaglierà. Se const AA=11, non si lamenterà.
Puoi dirmi qual è il problema?
Sull'ultimo intervallo in ChannelPeriod = 100; c'è un forte spostamento verso l'alto nelle letture dell'indicatore, andando oltre le ultime 100 barre tutto si mostra normalmente.
Qualcuno sa come risolvere il problema?
Per favore, datemi un link diretto dove si possono scaricare i libri di testo in formato PDF, perché il browser del mio telefono non può vedere tutto sul sito.