Qualquer variável pode ser rubricada quando definida. Se a variável não for explicitamente inicializada, o valor armazenado na variável pode ser o que quiser. A inicialização implícita não é realizada.
Especialmente para este fim, dei um código simples.
Tenho duas construções de 687 (em corretores diferentes), tentei compilar ambas com o mesmo resultado (mas às vezes recebo 30 correctamente), não consigo perceber se sou burro ou se o esqui não está em movimento!
Estou a tentar usar a MQL5.Desmontei exp_tema.mq5 e modifiquei o código. Agora devo imprimir em log MA de cada vela (últimos 20). Mas não percebo porque faltam algumas entradas no diário de bordo. Notei que se falta ma[3] no registo, então não há ma[13]. Porque é que isto está a acontecer? Onde está o erro?
inputstring Symb0 = "EURUSD";
inputbool Trade0 = true;
int MA_Shift0=1;
inputint MA_Per0 = 100;
//+-----------------------------------+inputstring Symb1 = "USDCHF";
inputbool Trade1 = true;
int MA_Shift1=1;
inputint MA_Per1 = 100;
bool MA (int Number,
string Symbol_, // имя символаbool Trade,
int MA_Per, // период для расчета средней линииint MA_Shift // смещение индикатора по горизонтали
)
{
//---- проверка запрета на торговлюif(!Trade)return(true);
//---- объявление переменной для хранения итогового размера массивов переменныхstaticint Size_=0;
//---- объявление массива для хранения хэндлов индикаторов как статической переменнойstaticint Handle[];
staticint Recount[],MinBars[];
double ma[20];
if(Number+1>Size_) // вход в блок инициализации только на первом старте
{
Size_=Number+1; // для этого номера вход в блок закрыт//---- изменение размеров массивов переменныхArrayResize(Handle,Size_);
ArrayResize(Recount,Size_);
ArrayResize(MinBars,Size_);
//---- определение минимально количества баров, достаточного для расчета
MinBars[Number]=3*MA_Per;
//---- предварительное обнуление ячеек массивов//---- используем массив как таймсериюArraySetAsSeries(ma,true);
//---- получение хендла индикатора
Handle[Number]=iMA(Symbol_,0,MA_Per,MA_Shift,MODE_SMA,PRICE_CLOSE);
Print("+++++++++Handle[Number]= ",Handle[Number]);
}
//---- проверка количества баров на достаточность для расчета if(Bars(Symbol_,0)<MinBars[Number])return(true);
//---- Получение торговых сигналов if(IsNewBar(Number,Symbol_,0) || Recount[Number]) // вход в блок на смене бара или при неудачном копировании данных
{
//---- используя хэндлы индикатора, копируем значения индикаторного буфера//---- в специально подготовленный для этого статический массивif(CopyBuffer(Handle[Number],0,0,20,ma)<0)
{
Recount[Number]=true; // так как данные не получены, то следует вернуться // в этот блок получения торговых сигналов на следующем тике!return(false); // выходим из функции TradeSignalCounter() без получения торговых сигналов
}
//---- все операции копирования из индикаторного буфера завершены успешно
Recount[Number]=false; // можно не возвращаться в этот блок до очередной смены бараPrint("+++++++++ma[0]= ",ma[0]);
Print("+++++++++ma[1]= ",ma[1]);
Print("+++++++++ma[2]= ",ma[2]);
Print("+++++++++ma[3]= ",ma[3]);
Print("+++++++++ma[4]= ",ma[4]);
Print("+++++++++ma[5]= ",ma[5]);
Print("+++++++++ma[6]= ",ma[6]);
Print("+++++++++ma[7]= ",ma[7]);
Print("+++++++++ma[8]= ",ma[8]);
Print("+++++++++ma[9]= ",ma[9]);
Print("+++++++++ma[10]= ",ma[10]);
Print("+++++++++ma[11]= ",ma[11]);
Print("+++++++++ma[12]= ",ma[12]);
Print("+++++++++ma[13]= ",ma[13]);
Print("+++++++++ma[14]= ",ma[14]);
Print("+++++++++ma[15]= ",ma[15]);
Print("+++++++++ma[16]= ",ma[16]);
Print("+++++++++ma[17]= ",ma[17]);
Print("+++++++++ma[18]= ",ma[18]);
Print("+++++++++ma[19]= ",ma[19]);
}
return(true);
}
//+------------------------------------------------------------------+//| Expert initialization function |//+------------------------------------------------------------------+intOnInit()
{
//---//---return(0);
}
//+------------------------------------------------------------------+//| Expert deinitialization function |//+------------------------------------------------------------------+voidOnDeinit(constint reason)
{
//---
}
//+------------------------------------------------------------------+//| Expert tick function |//+------------------------------------------------------------------+voidOnTick()
{
//---
MA(0,Symb0,Trade0,MA_Per0,MA_Shift0);
MA(1,Symb1,Trade1,MA_Per1,MA_Shift1);
}
//+------------------------------------------------------------------+//+------------------------------------------------------------------+//| IsNewBar() function |//+------------------------------------------------------------------+bool IsNewBar(int Number,string symbol,ENUM_TIMEFRAMES timeframe)
{
//----staticdatetime Told[];
datetime Tnew[1];
//---- объвление переменной для хранения размеров массивов переменныхstaticint Size_=0;
//---- изменение размеров массивов переменныхif(Number+1>Size_)
{
uint size=Number+1;
//----if(ArrayResize(Told,size)==-1)
{
string word="";
StringConcatenate(word,"IsNewBar( ",Number,
" ): Ошибка!!! Не удалось изменить размеры массивов переменных!!!");
Print(word);
//---- int error=GetLastError();
ResetLastError();
if(error>4000)
{
StringConcatenate(word,"IsNewBar( ",Number," ): Код ошибки ",error);
Print(word);
}
//----
Size_=-2;
return(false);
}
}
CopyTime(symbol,timeframe,0,1,Tnew);
if(Tnew[0]!=Told[Number])
{
Told[Number]=Tnew[0];
return(true);
}
//----return(false);
}
Tenho uma sugestão para os criadores - fazer valores por defeito para todos os tipos incorporados. C++ não é um modelo neste sentido.
Poupará realmente muito tempo e nervosismo para si e para aqueles que respondem às perguntas como acima.
while((a/b)<1 && !IsStopped())//---------
o que é igual a a?
Por defeito (no exemplo acima) a=2,652664430987377e-314 , mas neste caso o laço funciona para a+b=30.
É claro que pode atribuir imediatamente o dobro a=1;
Mas a situação não se altera.
A saída é sempre a+b=30
E devoluções 0 , o depurador mostra tudo.
O que são estas falhas ou estou a perder alguma coisa?
Inicialização das variáveis:
Qualquer variável pode ser rubricada quando definida. Se a variável não for explicitamente inicializada, o valor armazenado na variável pode ser o que quiser. A inicialização implícita não é realizada.
Fia:
A saída é sempre a+b=30
E devoluções 0 , o depurador mostra tudo.
Mal posso acreditar.
O que o impede de o verificar?
Especialmente para este fim, dei um código simples.
Tenho duas construções de 687 (em corretores diferentes), tentei compilar ambas com o mesmo resultado (mas às vezes recebo 30 correctamente), não consigo perceber se sou burro ou se o esqui não está em movimento!
Verifique, não sei o que pensar.
Até agora, ainda não foi possível reproduzir. Comecemos, portanto, pelo princípio.
Que taxa de bits, OS?
Ainda não teve sorte com a reprodução.
Que taxa de bits, OS?
Win7 64 bit
Nem sequer sei, apenas descarreguei o MT5 compilado agora mesmo carregado, a mesma coisa.
Posso tirar o vídeo (vou pensar que estou a gozar com ele).
P.S. Agora só o toquei, mais uma vez funcionou 30, compilei-o e agora funciona mais algumas vezes nulo (magia)
Boa tarde.
Estou a tentar usar a MQL5.Desmontei exp_tema.mq5 e modifiquei o código. Agora devo imprimir em log MA de cada vela (últimos 20). Mas não percebo porque faltam algumas entradas no diário de bordo. Notei que se falta ma[3] no registo, então não há ma[13]. Porque é que isto está a acontecer? Onde está o erro?
Win7 64 bit
Não sei, agora só descarreguei o MT5, fiz uma cópia e é a mesma coisa.
Posso tirar um vídeo ou algo assim (acho que estou apenas a brincar contigo).
Não é necessária uma captura de ecrã.
Fazer uma impressão detalhada no código para que possamos ver no registo a que variáveis intermédias são iguais.