Qualsiasi variabile può essere inizializzata quando viene definita. Se la variabile non è esplicitamente inizializzata, il valore memorizzato nella variabile può essere quello che volete. L'inizializzazione implicita non viene eseguita.
Specialmente per questo scopo ho dato un semplice codice.
Ho due build di 687 (su diversi broker), provato a compilare entrambi con lo stesso risultato (ma a volte ottengo 30 correttamente), non riesco a capire se sono scemo io o lo sci non si muove!
Sto cercando di usare MQL5. Hosmontato exp_tema.mq5 e ho modificato il codice. Ora dovrei stampare in log MA di ogni candela (ultime 20). Ma non capisco perché mancano alcune voci nel registro. Ho notato che se ma[3] manca nel registro, allora non c'è ma[13]. Perché succede questo? Dov'è l'errore?
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);
}
Ho un suggerimento per gli sviluppatori: fate dei valori predefiniti per tutti i tipi incorporati. C++ non è un modello in questo senso.
Risparmierete davvero molto tempo e nervi per voi stessi e per chi risponde alle domande come sopra.
while((a/b)<1 && !IsStopped())//---------
cosa equivale a un?
Per default (nell'esempio sopra) a=2.652664430987377e-314 , ma in questo caso il ciclo while lavora fino a a+b=30.
Naturalmente, potete assegnare immediatamente il doppio a=1;
Ma la situazione non cambia.
L'output è sempre a+b=30
E return restituisce 0, il debugger mostra tutto.
Cosa sono questi glitch o mi manca qualcosa?
Inizializzazione delle variabili:
Qualsiasi variabile può essere inizializzata quando viene definita. Se la variabile non è esplicitamente inizializzata, il valore memorizzato nella variabile può essere quello che volete. L'inizializzazione implicita non viene eseguita.
Fia:
L'output è sempre a+b=30
E return restituisce 0, il debugger mostra tutto.
Stento a crederci.
Cosa ti impedisce di controllare?
Specialmente per questo scopo ho dato un semplice codice.
Ho due build di 687 (su diversi broker), provato a compilare entrambi con lo stesso risultato (ma a volte ottengo 30 correttamente), non riesco a capire se sono scemo io o lo sci non si muove!
Controllare non so cosa pensare.
Finora non è stato possibile riprodurlo. Quindi cominciamo dall'inizio.
Quale bit rate, OS?
Ancora nessuna fortuna con la riproduzione.
Quale bit rate, OS?
Win7 64 bit
Non lo so nemmeno, appena scaricato appena caricato MT5 compilato, stessa cosa.
Posso fare una foto (potrebbe pensare che ti sto prendendo in giro).
P.S. Ora l'ho appena toccato, ancora una volta ha funzionato 30, l'ho compilato e ora funziona a vuoto ancora qualche volta (magia)
Buon pomeriggio.
Sto cercando di usare MQL5. Hosmontato exp_tema.mq5 e ho modificato il codice. Ora dovrei stampare in log MA di ogni candela (ultime 20). Ma non capisco perché mancano alcune voci nel registro. Ho notato che se ma[3] manca nel registro, allora non c'è ma[13]. Perché succede questo? Dov'è l'errore?
Win7 64 bit
Non lo so, ho appena scaricato MT5 ora, ho eseguito un commento, stessa cosa.
Posso togliere un video o qualcosa del genere (penso che ti sto solo prendendo in giro).
Non è necessario uno screenshot.
Fate una stampa dettagliata nel codice in modo da poter vedere nel log a cosa sono uguali le variabili intermedie.