Cualquier variable puede ser inicializada cuando se define. Si la variable no se inicializa explícitamente, el valor almacenado en la variable puede ser el que se desee. No se realiza la inicialización implícita.
Especialmente para este propósito he dado un código simple.
¡Tengo dos builds del 687 (en diferentes brokers), he intentado compilar ambos con el mismo resultado (pero a veces me sale el 30 correctamente), no puedo entender si soy tonto o el esquí no se mueve!
Estoy tratando de usar MQL5.He desmontado exp_tema.mq5 y he modificado el código. Ahora debería imprimir en log MA de cada vela (últimas 20). Pero no entiendo por qué faltan algunas entradas en el registro. Me he dado cuenta de que si falta ma[3] en el registro, entonces no hay ma[13]. ¿Por qué ocurre esto? ¿Dónde está el error?
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);
}
Tengo una sugerencia para los desarrolladores - hacer valores por defecto para todos los tipos incorporados. C++ no es un modelo en este sentido.
Realmente te ahorrarás mucho tiempo y nervios para ti y para los que respondan a las preguntas como las anteriores.
while((a/b)<1 && !IsStopped())//---------
¿a qué equivale una?
Por defecto (en el ejemplo anterior) a=2,652664430987377e-314 , pero en este caso el bucle while llega a a+b=30.
Por supuesto, puedes asignar inmediatamente el doble a=1;
Pero la situación no cambia.
La salida es siempre a+b=30
Y el retorno devuelve 0 , el depurador lo muestra todo.
¿Qué son estos fallos o me estoy perdiendo algo?
Inicialización de variables:
Cualquier variable puede ser inicializada cuando se define. Si la variable no se inicializa explícitamente, el valor almacenado en la variable puede ser el que se desee. No se realiza la inicialización implícita.
Fia:
La salida es siempre a+b=30
Y el retorno devuelve 0 , el depurador lo muestra todo.
Apenas puedo creerlo.
¿Qué le impide comprobarlo?
Especialmente para este propósito he dado un código simple.
¡Tengo dos builds del 687 (en diferentes brokers), he intentado compilar ambos con el mismo resultado (pero a veces me sale el 30 correctamente), no puedo entender si soy tonto o el esquí no se mueve!
Comprueba que no sé qué pensar.
Hasta ahora, no ha sido posible reproducirlo. Así que empecemos por el principio.
¿Qué tasa de bits, OS?
Todavía no ha habido suerte con la reproducción.
¿Qué tasa de bits, OS?
Win7 64 bits
Ni siquiera sé, acaba de descargar ahora cargado MT5 compilado, lo mismo.
Puedo hacerle una foto (puede pensar que le estoy tomando el pelo).
P.D. Ahora acabo de tocarlo, una vez más funcionó 30, lo compilé y ahora funciona nulo unas cuantas veces más (magia)
Buenas tardes.
Estoy tratando de usar MQL5.He desmontado exp_tema.mq5 y he modificado el código. Ahora debería imprimir en log MA de cada vela (últimas 20). Pero no entiendo por qué faltan algunas entradas en el registro. Me he dado cuenta de que si falta ma[3] en el registro, entonces no hay ma[13]. ¿Por qué ocurre esto? ¿Dónde está el error?
Win7 64 bits
No sé, acaba de descargar MT5 ahora, corrió una copia, lo mismo.
Puedo sacar un video o algo así (creo que me estoy metiendo contigo).
No es necesario hacer una captura de pantalla.
Haz una impresión detallada en el código para que podamos ver en el registro a qué son iguales las variables intermedias.