Está perdiendo oportunidades comerciales:
- Aplicaciones de trading gratuitas
- 8 000+ señales para copiar
- Noticias económicas para analizar los mercados financieros
Registro
Entrada
Usted acepta la política del sitio web y las condiciones de uso
Si no tiene cuenta de usuario, regístrese
Bueno chicos, la primera parte está hecha ( lectura de todas las tarifas de los pares ).
Ahora necesito utilizar las tasas de todos los paris copiados con la función ArrayCopyRates para potenciar algunos indicadores gráficos como un RSI... como dibujo en la imagen de abajo:
En mi pregunta inicial pretendo saber como hacer esto... y no sobre la lectura de tasas. No creo que sea necesario copiar las tasas antes de dibujarlas, pero era bueno saber cómo hacerlo... ahora sólo necesito descubrir una manera de dividir el área del indicador para trazar todos los pares...
No hay manera de dividir el área del indicador. Todo debe dibujarse por separado, sin búferes, sin autoescalado. Ver
¿Has visto una imagen así? (MetaQuotes Software Corp.) - Foro MQL4 - Página 12
¿Has visto una imagen así? (MetaQuotes Software Corp.) - Foro MQL4 - Página 14
¿Has visto una foto así? (MetaQuotes Software Corp.) - MQL4 forum - Page 36
No hay manera de dividir el área del indicador. Todo debe dibujarse por separado, sin búferes, sin autoescalado. Ver
¿Has visto una imagen así? (MetaQuotes Software Corp.) - Foro MQL4 - Página 12
¿Has visto una imagen así? (MetaQuotes Software Corp.) - Foro MQL4 - Página 14
¿Has visto una foto así? (MetaQuotes Software Corp.) - MQL4 forum - Page 36
Este es un indicador que recogí en algún lugar, nunca traté de descifrarlo. Muestra una representación de 3 marcos de tiempo del gráfico actual. Lo loco es que las velas se dibujan con Histogramas. Bastante limpio, pero no es lo que estoy en este momento.
Saludos cordiales
¡Una actualización para aquellos que siguen este hilo!
He estado ayudando al OP vía PM a arreglar su código ya que tiene dificultades con el inglés y ambos hablamos portugués. En nuestras pruebas nos encontramos con otra "gracia" que está sucediendo con la función "ArrayCopyRates()". Cuando se utiliza un array de MqlRates con "ArrayCopyRates()" en un EA, el array de datos es uno virtual que siempre informa del estado actual de las cosas, por lo que los datos son siempre frescos.
Sin embargo, en un Indicador, este no parece ser el caso. El array no es una copia virtual sino una copia estática fijada en el tiempo en el momento en que se llamó a"ArrayCopyRates()". Los datos no se actualizan cuando el Símbolo es diferente al símbolo del gráfico. Cuando es el mismo símbolo del gráfico, entonces los datos del array están "vivos" y se actualizan como se espera, pero cuando es de otro símbolo, es una copia estática.
Por lo tanto, para que funcione en un indicador, uno debe llamar a la función "ArrayCopyRates()" en cada llamada al evento OnCalculate() si se necesitan datos frescos.
Sólo para ampliar tus conclusiones Fernando - incluso si el símbolo es el mismo que el del gráfico, si el marco temporal es diferente entonces el array es estático.
Así que para tener una copia virtual, en un indicador, debe ser el mismo símbolo Y el mismo marco temporal. Cualquier otra cosa es estática.
Asumiendo que es mitad de semana para encontrar el máximo y el mínimo del día anterior simplemente uso:
Lo = iLow(NULL, PERIOD_D1, 1);
Eso está bien, pero ahora necesito encontrar el día anterior a qué hora fue el máximo y el mínimo. Decidí aproximar el tiempo a la vela de 1h en el alto y el bajo usando iHighest y iLowest. Y ahí empezaron los problemas.
PrevDayEnd = iBarShift(NULL, PERIOD_H1, iTime(NULL, PERIOD_D1, 0)-1);
PrevDayBegin--;
MqlRates mqlrates_array_d1[];
MqlRates mqlrates_array_h1[];
MqlRates mqlrates_array[];
ArrayCopyRates(mqlrates_array_d1,NULL,PERIOD_D1);
ArrayCopyRates(mqlrates_array_h1,NULL,PERIOD_H1);
ArrayCopyRates(mqlrates_array,NULL,0);
OnInit();
:
isHistoryLoading = true;
:
OnCalculate( ... )
:
MqlRates mqlrates_array_d1[];
MqlRates mqlrates_array_h1[];
MqlRates mqlrates_array[];
if(isHistoryLoading)
{
ResetLastError();
if(ArrayCopyRates(mqlrates_array_d1,NULL,PERIOD_D1)>0)
{
if(GetLastError() == 0)
{
if((iTime(NULL,PERIOD_D1,0) > 0) && (iTime(NULL,PERIOD_D1,1) > 0))
{
ResetLastError();
if(ArrayCopyRates(mqlrates_array_h1,NULL,PERIOD_H1)>0)
{
if(GetLastError() == 0)
{
if((iTime(NULL,PERIOD_H1,0) > 0) && (iTime(NULL,PERIOD_H1,1) > 0))
{
ResetLastError();
if(ArrayCopyRates(mqlrates_array,NULL,0)>0)
{
if(GetLastError() == 0)
{
if((iTime(NULL,0,0) > 0) && (iTime(NULL,0,1) > 0))
{
isHistoryLoading = false;
if(DebugLog)
Print("Chart up-to-date!");
}
}
}
}
}
}
}
}
}
}
if(isHistoryLoading)
{
if(DebugLog)
Print("Waiting for chart to update!");
return(rates_total);
}
:
:
if(ObjectFind(Trend2Name) != -1) // Check whether mid range line exists
{
if((TimeDay(ObjectGetInteger(0,Trend2Name,OBJPROP_TIME,0))==TimeDay(TimeCurrent()))
&& (TimeMonth(ObjectGetInteger(0,Trend2Name,OBJPROP_TIME,0))==TimeMonth(TimeCurrent()))
&& (TimeYear(ObjectGetInteger(0,Trend2Name,OBJPROP_TIME,0))==TimeYear(TimeCurrent()))) // Indicator has already been ploted today
{
return(rates_total);
}
else // Indicator exists but in a past date, so delete it and plot it on current day
{
if(DebugLog)
Print("Indicator in a past date! Deleting it and creating it today!");
if(ObjectFind(FibName) != -1)
FiboLevelsDelete(0,FibName);
// Indicator will be created by the OnChartEvent() when it detects the fib was deleted.
}
}
else // Indicator doesn't exist, so create it
{
if(DebugLog)
Print("Indicator doesn't exist! Creating it.");
CreateIndicator();
}
:
Después de unos pocos ticks los datos se cargan parcialmente y el trozo de código anterior detectará que las líneas han sido trazadas en un día anterior, borrará el fib y activará un recálculo de los rangos y redibujará los objetos (es decir, fib, líneas de tendencia, etc).
CurrDayBegin = iTime(NULL, PERIOD_D1, 0);
while(TimeDayOfWeek(iTime(NULL, PERIOD_H1, iBarShift(NULL, PERIOD_H1, CurrDayBegin))) != TimeDayOfWeek(TimeCurrent()))
// If iBarShift can't find the 0am candle and returns the 11pm candle of prev day.
CurrDayBegin = CurrDayBegin + 3600; // Move 1h until you find the 1st candle of today.Estas son capturas de pantalla del indicador:
(1) Calculado usando un historial incompleto (por favor, fíjate en que las líneas horizontales no empiezan al principio del día)
(2) Recalculado usando el historial completo (las líneas horizontales comienzan al principio del día)