......................funciones (buscar, calcular, etc.) generalmente devuelven longitud/tamaño, o -1 si no tienen éxito, lo que facilita el manejo de errores.
Saludos. ¿Algún consejo para los novatos sobre qué funciones utilizar para establecer una retirada común en una parrilla de órdenes en caso de señal inversa?
papaklass: ¿Qué problemas intenta resolver trabajando con archivos?
Es necesario escribir el estado de las posiciones en un archivo y utilizar MT4 para leer estos datos. Necesita una correlación de posiciones de un símbolo con otro(s) símbolo(s). Por ejemplo, si ya hay una cierta cantidad de posiciones en EURUSD, no se deben abrir más posiciones para GBPUSD. Sé cómo hacerlo sin operaciones de archivo, sólo quiero aprender a trabajar con operaciones de archivo, sólo para ampliar mis horizontes.
Por favor, dé un ejemplo de código de cómo llamar a un indicador de recursos vinculados desde un EA, que a su vez utiliza otro indicador de recursos vinculados en sí mismo. Por ejemplo, hay un indicador A, y desde él se llama a B. También hay un experto C que utiliza A. ¿Qué debe escribirse en #resource y al llamar a iCustom en todos los casos?
La ayuda no está claramente escrita en este sentido. La construcción habitual en el indicador A:#resource "\\Indicators\B.ex4" y luegoiCustom(::Indicators\B.ex4) funciona bien cuando A se lanza por sí mismo.Pero si A se inserta en el Asesor Experto#recurso "\\Indicators\A.ex4", un errorno puede cargar el recurso para el indicador adjunto apareceindicando alguna ruta sintetizada absoluta incorrecta que de alguna manera menciona el directorio de Bibliotecas, mientras que el indicador B se busca dentro de sí mismo (MQL4\Libraries\::Indicators\B.ex4::Indicators\B.ex4).
En cuanto a ArraySize, el otro día planteé un problema similar en MQL4: https://www.mql5.com/ru/forum/152471. Según tengo entendido, todo debería ser igual en MQL5.
Tal vez, mi mensaje ha sido considerado allí :) Con respecto a este problema, el Service Desk ha respondido que la razón era el funcionamiento incorrecto del optimizador y que van a cambiar el tipo a uint en las nuevas construcciones. De hecho ahora es uint, pero no está documentado :) Y por cierto, lo cambiarán a uint para ArrayResize también. Les aconsejé que lo cambiaran a ulong, de lo contrario tendrán que volver a este problema por la falta de valores de 32 bits al almacenar grandes volúmenes en un futuro próximo.
En cuanto al valor -1 en el error, no debería haber ningún problema con él porque: (int)-1 = (uint)-1 = 0xFFFFFFFF = UINT_MAX, es decir, la representación de los bits es la misma, aunque la operación de comparación dará un resultado diferente, es decir, si fuera así en el código
será incorrecto.
Gracias de nuevo por la petición, el tipo de retorno de las funciones ArraySize y ArrayRange no se cambiará, dejaremos el tipo int. Hemos corregido el optimizador de código, ahora el error descrito por usted no se producirá.
El número total de elementos en el array MQL no puede exceder INT_MAX y esto no cambiará. Si necesitas arrays de mayor tamaño en un programa MQL, debes crear una clase aparte (por ejemplo, CBigArray).
Tratando de dominar iCustom en mql5. Lo dominé en mql4 :)
El problema es dibujar algo similar al MACD, pero en lugar de una media móvil rápida se debe utilizar el indicador VIDYA, que está en la carpeta de Ejemplos.
Tomé un código MACD estándar y puse parámetros para VIDYA en lugar de la MA. El problema es que todo se compila pero no se dibuja nada.
He marcado dos lugares en el código de abajo donde he cambiado el código estándar del MACD. Por lo demás, todo es igual. Por favor, dígame qué más me falta. Supongo que está en alguna parte del código...
inputint InpSlowEMA=84; // Slow EMA periodinputint InpSignalSMA=9; // Signal SMA periodinputENUM_APPLIED_PRICE InpAppliedPrice=PRICE_CLOSE; // Applied price//--- indicator buffersdouble ExtMacdBuffer[];
double ExtSignalBuffer[];
double ExtFastMaBuffer[];
double ExtSlowMaBuffer[];
//--- MA handlesint ExtFastMaHandle;
int ExtSlowMaHandle;
//+------------------------------------------------------------------+//| Custom indicator initialization function |//+------------------------------------------------------------------+voidOnInit()
{
//--- indicator buffers mappingSetIndexBuffer(0,ExtMacdBuffer,INDICATOR_DATA);
SetIndexBuffer(1,ExtSignalBuffer,INDICATOR_DATA);
SetIndexBuffer(2,ExtFastMaBuffer,INDICATOR_CALCULATIONS);
SetIndexBuffer(3,ExtSlowMaBuffer,INDICATOR_CALCULATIONS);
//--- sets first bar from what index will be drawnPlotIndexSetInteger(1,PLOT_DRAW_BEGIN,InpSignalSMA-1);
//--- name for Dindicator subwindow labelIndicatorSetString(INDICATOR_SHORTNAME,"MACD("+string(InpSlowEMA)+","+string(InpSignalSMA)+")");
//--- get MA handles
ExtSlowMaHandle=iMA(NULL,0,InpSlowEMA,0,MODE_SMA,InpAppliedPrice);
//--- initialization done
}
//+------------------------------------------------------------------+//| Moving Averages Convergence/Divergence |//+------------------------------------------------------------------+intOnCalculate(constint rates_total,constint prev_calculated,
constdatetime &Time[],
constdouble &Open[],
constdouble &High[],
constdouble &Low[],
constdouble &Close[],
constlong &TickVolume[],
constlong &Volume[],
constint &Spread[])
{
//--- check for dataif(rates_total<InpSignalSMA)
return(0);
//--- not all data may be calculatedint calculated=BarsCalculated(ExtFastMaHandle);
if(calculated<rates_total)
{
Print("Not all data of ExtFastMaHandle is calculated (",calculated,"bars ). Error",GetLastError());
return(0);
}
calculated=BarsCalculated(ExtSlowMaHandle);
if(calculated<rates_total)
{
Print("Not all data of ExtSlowMaHandle is calculated (",calculated,"bars ). Error",GetLastError());
return(0);
}
//--- we can copy not all dataint to_copy;
if(prev_calculated>rates_total || prev_calculated<0) to_copy=rates_total;
else
{
to_copy=rates_total-prev_calculated;
if(prev_calculated>0) to_copy++;
}
//--- get Fast EMA bufferif(IsStopped()) return(0); //Checking for stop flagif(CopyBuffer(ExtFastMaHandle,0,0,to_copy,ExtFastMaBuffer)<=0)
{
Print("Getting fast EMA is failed! Error",GetLastError());
return(0);
}
//--- get SlowSMA bufferif(IsStopped()) return(0); //Checking for stop flagif(CopyBuffer(ExtSlowMaHandle,0,0,to_copy,ExtSlowMaBuffer)<=0)
{
Print("Getting slow SMA is failed! Error",GetLastError());
return(0);
}
//---int limit;
if(prev_calculated==0)
limit=0;
else limit=prev_calculated-1;
//--- calculate MACDfor(int i=limit;i<rates_total && !IsStopped();i++)
ExtMacdBuffer[i]=ExtFastMaBuffer[i]-ExtSlowMaBuffer[i];
//--- calculate Signal
SimpleMAOnBuffer(rates_total,prev_calculated,0,InpSignalSMA,ExtMacdBuffer,ExtSignalBuffer);
//--- OnCalculate done. Return new prev_calculated.return(rates_total);
}
//+------------------------------------------------------------------+
Tratando de dominar iCustom en mql5. En mql4 pude dominarlo virtuosamente :)
¿Qué escribe en el registro? No se comprueban los errores (por ejemplo, al recibir un asa). ¿Coincide el número del buffer en el nuevo indicador con el antiguo?
No sé si esto ya ha sucedido, pero la cuestión es, nueva barra, el valor PLOT_EMPTY_VALUE para el buffer se establece en 0,0, pero en realidad a veces hay valores completamente diferentes
......................funciones (buscar, calcular, etc.) generalmente devuelven longitud/tamaño, o -1 si no tienen éxito, lo que facilita el manejo de errores.
Saludos. ¿Algún consejo para los novatos sobre qué funciones utilizar para establecer una retirada común en una parrilla de órdenes en caso de señal inversa?
Estoy aprendiendo las operaciones de archivo. ¿Alguien sabe si MQL4/5 es más rápido con archivos csv o txt?
¿Qué problemas intenta resolver trabajando con archivos?
Por favor, dé un ejemplo de código de cómo llamar a un indicador de recursos vinculados desde un EA, que a su vez utiliza otro indicador de recursos vinculados en sí mismo. Por ejemplo, hay un indicador A, y desde él se llama a B. También hay un experto C que utiliza A. ¿Qué debe escribirse en #resource y al llamar a iCustom en todos los casos?
La ayuda no está claramente escrita en este sentido. La construcción habitual en el indicador A:#resource "\\Indicators\B.ex4" y luegoiCustom(::Indicators\B.ex4) funciona bien cuando A se lanza por sí mismo.Pero si A se inserta en el Asesor Experto#recurso "\\Indicators\A.ex4", un errorno puede cargar el recurso para el indicador adjunto apareceindicando alguna ruta sintetizada absoluta incorrecta que de alguna manera menciona el directorio de Bibliotecas, mientras que el indicador B se busca dentro de sí mismo (MQL4\Libraries\::Indicators\B.ex4::Indicators\B.ex4).
En cuanto a ArraySize, el otro día planteé un problema similar en MQL4: https://www.mql5.com/ru/forum/152471. Según tengo entendido, todo debería ser igual en MQL5.
Tal vez, mi mensaje ha sido considerado allí :) Con respecto a este problema, el Service Desk ha respondido que la razón era el funcionamiento incorrecto del optimizador y que van a cambiar el tipo a uint en las nuevas construcciones. De hecho ahora es uint, pero no está documentado :) Y por cierto, lo cambiarán a uint para ArrayResize también. Les aconsejé que lo cambiaran a ulong, de lo contrario tendrán que volver a este problema por la falta de valores de 32 bits al almacenar grandes volúmenes en un futuro próximo.
En cuanto al valor -1 en el error, no debería haber ningún problema con él porque: (int)-1 = (uint)-1 = 0xFFFFFFFF = UINT_MAX, es decir, la representación de los bits es la misma, aunque la operación de comparación dará un resultado diferente, es decir, si fuera así en el código
será incorrecto.
El número total de elementos en el array MQL no puede exceder INT_MAX y esto no cambiará.
Si necesitas arrays de mayor tamaño en un programa MQL, debes crear una clase aparte (por ejemplo, CBigArray).
Tratando de dominar iCustom en mql5. Lo dominé en mql4 :)
El problema es dibujar algo similar al MACD, pero en lugar de una media móvil rápida se debe utilizar el indicador VIDYA, que está en la carpeta de Ejemplos.
Tomé un código MACD estándar y puse parámetros para VIDYA en lugar de la MA. El problema es que todo se compila pero no se dibuja nada.
He marcado dos lugares en el código de abajo donde he cambiado el código estándar del MACD. Por lo demás, todo es igual. Por favor, dígame qué más me falta. Supongo que está en alguna parte del código...
Первый вставленный кусок:input int Per=7; // Per input int Per1=21; // Per1 input int Shift=0; // ShiftКонецВторой вставленный кусокКонецTratando de dominar iCustom en mql5. En mql4 pude dominarlo virtuosamente :)
No sé si esto ya ha sucedido, pero la cuestión es, nueva barra, el valor PLOT_EMPTY_VALUE para el buffer se establece en 0,0, pero en realidad a veces hay valores completamente diferentes