Só as constantes podem ser especificadas em dimensões
As constantes também não funcionarão, haverá um erro:
constint AA =11;
ArrWe m[AA];
Especificadores de acesso
Os especificadores de acesso dizem ao compilador como aceder a variáveis, membros de estruturas ou classes.
O especificadorconst declara que uma variável é uma constante e não permite que o valor desta variável seja alterado no processo de execução do programa. É permitida a inicialização de uma variável uma vez ao declará-la.
papaklass: Não percebo. Coloco um EA no gráfico e esta mensagem aparece no separador "Especialistas". O Conselheiro Especialista continua o seu trabalho de qualquer maneira. Isto não é um erro, mas um aviso. Um aviso sobre o quê?
É um erro em tempo de execução - significa uma fuga de memória. Em algum lugar a memória ocupada por um cordel não está a ser libertada. Muito provavelmente, é uma estrutura ou classe que não é apagada depois de nova. É necessário consultar o código para ser mais específico.
as constantes também não funcionarão, haverá um erro:
Especificadores de acesso
Os especificadores de acesso dizem ao compilador como aceder a variáveis, membros de estruturas ou classes.
O especificadorconst declara que uma variável é uma constante, e não permite que o valor desta variável seja alterado no processo de execução do programa. É permitida a inicialização de uma variável uma vez ao declará-la.
Uma variável constante não é uma constante! É permitido inicializar uma vez, ou seja, é uma variável para a qual é atribuída memória.
A tarefa das constantes deve ser calculada e inserida no código sem ocupar a memória em tempo de execução.
A constante será constante AA=11.
Por conseguinte, o compilador será juramentado. Se const AA=11, não se queixará.
No último intervalo no ChannelPeriod = 100; há uma mudança acentuada para cima nas leituras do indicador, indo além das últimas 100 barras que tudo mostra normalmente.
Alguém sabe como consertá-lo?
//+------------------------------------------------------------------+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);
}
//-----------------------------------------------------------------------------------------
Porquê, quando carrego no botão "Start", o testador não testa a partir do nível de depósito inicial, mas a partir do nível onde terminou o último teste. Não existe tal problema em 4. Como começar a testar a partir do nível de depósito inicial?
Zeleniy: Por favor, dê-me um link directo onde possa descarregar livros de texto em formato PDF porque o meu navegador telefónico não consegue ver tudo no website.
Encontrei uma "confusão".
Porque é que o compilador não gosta da definição da segunda variável b?
E em geral, como é que lido com esta situação?
Não gosta da definição.
Escreve apenas outro erro - tipo de variável errado para a dimensão da matriz
Só se pode especificar constantes em dimensões
não é a definição de que ele não gosta.
Também escreve outro erro - tipo de variável errada para a dimensão da matriz
Só as constantes podem ser especificadas em dimensões
As constantes também não funcionarão, haverá um erro:
Especificadores de acesso
Os especificadores de acesso dizem ao compilador como aceder a variáveis, membros de estruturas ou classes.
O especificadorconst declara que uma variável é uma constante e não permite que o valor desta variável seja alterado no processo de execução do programa. É permitida a inicialização de uma variável uma vez ao declará-la.
Referia-me apenas a duas opções
int Arr[100]
ou
#define r 100
int Arr[r]
Para o resto ArrayResize
Não percebo. Coloco um EA no gráfico e esta mensagem aparece no separador "Especialistas". O Conselheiro Especialista continua o seu trabalho de qualquer maneira. Isto não é um erro, mas um aviso. Um aviso sobre o quê?
as constantes também não funcionarão, haverá um erro:
Especificadores de acesso
Os especificadores de acesso dizem ao compilador como aceder a variáveis, membros de estruturas ou classes.
O especificadorconst declara que uma variável é uma constante, e não permite que o valor desta variável seja alterado no processo de execução do programa. É permitida a inicialização de uma variável uma vez ao declará-la.
Uma variável constante não é uma constante! É permitido inicializar uma vez, ou seja, é uma variável para a qual é atribuída memória.
A tarefa das constantes deve ser calculada e inserida no código sem ocupar a memória em tempo de execução.
A constante será constante AA=11.
Por conseguinte, o compilador será juramentado. Se const AA=11, não se queixará.
Pode dizer-me qual é o problema?
No último intervalo no ChannelPeriod = 100; há uma mudança acentuada para cima nas leituras do indicador, indo além das últimas 100 barras que tudo mostra normalmente.
Alguém sabe como consertá-lo?
Por favor, dê-me um link directo onde possa descarregar livros de texto em formato PDF porque o meu navegador telefónico não consegue ver tudo no website.