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
¿Tal vez los desarrolladores deberían prestar atención al problema de la inicialización de los búferes de los indicadores? ¿Por qué no existe este problema en MT4? ¿Tal vez no es la comprensión completa? El problema es que incluso después de la inicialización obligatoria de los búferes tras sacar un indicador de un gráfico en CADA uno de ellos, no todos los búferes contienen basura y no puedes sacarla de ahí...
Personalmente no me importan las muletas, pero sólo si estas muletas no son demasiado complicadas y con efecto positivo. Pero escribir en un archivo y luego leerlo es una muletilla de mala muerte.
¿Cómo lo imaginas: "...después de quitar el indicador del gráfico en algunos, no en todos los buffers..."? ¿De qué manera, después de la eliminación del indicador del gráfico, tiene acceso a sus búferes de indicadores?
Intentemos encontrar el problema en detalle. Necesitas un conjunto estándar: código + lo que hiciste + lo que obtuviste...
¿Cómo lo imaginas: "...después de quitar el indicador del gráfico en algunos, no en todos los buffers..."? ¿De qué manera, después de la eliminación del indicador del gráfico, tiene acceso a sus búferes de indicadores?
Intentemos encontrar el problema en detalle. Necesitas un conjunto estándar: código + lo que hiciste + lo que obtuviste...
Pura suposición: puede estar entrando en la misma zona de memoria durante el acceso al búfer actual, que estaba ocupada por los búferes anteriores.
No me he metido en la conversación, no patees, ¿Alexey quiere que los datos en los buffers permanezcan al reiniciar (encendido/apagado de la terminal) o sólo cuando prev_calculado = 0 (en caso de que prev_calculado > 0 antes)?
¿Cómo lo imaginas: "...después de eliminar el indicador del gráfico en algunos, no en todos los buffers..."? ¿De qué manera, después de la eliminación del indicador del gráfico, tiene acceso a sus búferes de indicadores?
Intentemos encontrar el problema en detalle. Necesitas un conjunto estándar: código + lo que hiciste + lo que obtuviste...
Este es el código del indicador
| BalansEquityTest.mq5 |
| Viktorov |
| v4forex@yandex.ru |
\********************************************************************/
#property copyright "Viktorov"
#property link "v4forex@yandex.ru"
#property version "1.00"
#property indicator_separate_window
#property indicator_buffers 6
#property indicator_plots 3
#property indicator_type1 DRAW_COLOR_LINE
#property indicator_color1 clrGold, clrGreen, clrRed
#property indicator_width1 2
#property indicator_label1 "Balance"
#property indicator_type2 DRAW_HISTOGRAM2
#property indicator_color2 clrCrimson
#property indicator_width2 2
#property indicator_label2 "EquityMin"
#property indicator_type3 DRAW_HISTOGRAM2
#property indicator_color3 clrDarkViolet
#property indicator_width3 2
#property indicator_label3 "EquityMax"
double balance[];
double clrBalance[];
double equityMaxB[];
double equityMinB[];
double equityMax[];
double equityMin[];
double maxEquity, minEquity;
//+------------------------------------------------------------------+
//| Custom indicator initialization function |
//+------------------------------------------------------------------+
int OnInit()
{
//--- indicator buffers mapping
SetIndexBuffer(0, balance, INDICATOR_DATA);
SetIndexBuffer(1, clrBalance, INDICATOR_COLOR_INDEX);
SetIndexBuffer(2, equityMin, INDICATOR_DATA);
SetIndexBuffer(3, equityMinB, INDICATOR_DATA);
SetIndexBuffer(4, equityMax, INDICATOR_DATA);
SetIndexBuffer(5, equityMaxB, INDICATOR_DATA);
PlotIndexSetDouble(0, PLOT_EMPTY_VALUE, 0.0);
PlotIndexSetDouble(1, PLOT_EMPTY_VALUE, 0.0);
PlotIndexSetDouble(2, PLOT_EMPTY_VALUE, 0.0);
PlotIndexSetDouble(3, PLOT_EMPTY_VALUE, 0.0);
PlotIndexSetDouble(4, PLOT_EMPTY_VALUE, 0.0);
ArrayInitialize(balance, 0.0); // принудительная
ArrayInitialize(equityMax, 0.0); // инициализация
ArrayInitialize(equityMaxB, 0.0); // всех
ArrayInitialize(equityMin, 0.0); // буферов
ArrayInitialize(equityMinB, 0.0); // индикатора
ArraySetAsSeries(balance, true); // все
ArraySetAsSeries(clrBalance, true); // буферы
ArraySetAsSeries(equityMax, true); // индикатора
ArraySetAsSeries(equityMaxB, true); // имеют
ArraySetAsSeries(equityMin, true); // флаг
ArraySetAsSeries(equityMinB, true); // AS_SERIES
IndicatorSetInteger(INDICATOR_DIGITS, 2);
IndicatorSetString(INDICATOR_SHORTNAME, "Show Money");
//---
return(INIT_SUCCEEDED);
}
//+------------------------------------------------------------------+
//| Custom indicator iteration function |
//+------------------------------------------------------------------+
int OnCalculate(const int rates_total,
const int prev_calculated,
const datetime &time[],
const double &open[],
const double &high[],
const double &low[],
const double &close[],
const long &tick_volume[],
const long &volume[],
const int &spread[])
{
//---
if(prev_calculated == 0)
return(rates_total);
double bal = AccountInfoDouble(ACCOUNT_BALANCE);
double equity = AccountInfoDouble(ACCOUNT_EQUITY);
if(rates_total > prev_calculated)
{
minEquity = 0;
maxEquity = 0;
}
minEquity = fmin((minEquity == 0 ? AccountInfoDouble(ACCOUNT_BALANCE) : minEquity), equity);
maxEquity = fmax(maxEquity, equity);
balance[0] = AccountInfoDouble(ACCOUNT_BALANCE);
clrBalance[0] = 0.0;
equityMinB[0] = balance[0];
equityMin[0] = minEquity;
equityMaxB[0] = balance[0];
equityMax[0] = maxEquity;
if(balance[0] > balance[1])
clrBalance[0] = 1.0;
if(balance[0] < balance[1])
clrBalance[0] = 2.0;
Comment(PositionsTotal());
//--- return value of prev_calculated for next call
return(rates_total);
}
//+------------------------------------------------------------------+
Publicaré un vídeo un poco más tarde, entonces estará claro. No puedo explicarlo más claramente en mis dedos que antes.
Espero que no te importe descargar y descomprimir el vídeo.
Desgraciadamente, no se ha registrado el hecho de su retirada del gráfico y su fijación, pero sí el hecho de que el indicador está ahí, luego desaparece y luego vuelve a estar ahí. Sólo se trata de borrar y volver a adjuntarlo.
Preste atención a la ventana de datos después de reinstalar el indicador. Incluso después de la inicialización forzada de los búferes, todavía hay restos de espacio allí.
Este es el código del indicador
Me gustaría hacer un experimento: dejar sólo un gráfico abierto y aplicar o quitar el indicador en él. Y necesitas información sobre el terminal y el sistema operativo (pestaña "Log" del terminal).
¿Qué tiene que ver un gráfico con esto? ¿El hecho de que el indicador esté sólo en un gráfico no es suficiente?
añadido:
Aunque no creo que el sistema operativo pueda afectar al comportamiento del indicador, aquí hay información sobre el sistema y el terminal
2016.10.16 20:56:34.904 Terminal Windows 7 Home Premium (x64 based PC), IE 11.00, UAC, AMD FX-4170 Quad-Core Processor , RAM: 10531 / 12255 Mb, HDD: 55167 / 244198 Mb, GMT+03:00
2016.10.16 20:56:34.904 Terminal MetaTrader 5 build 1455 started (MetaQuotes Software Corp.)
¿Qué tiene que ver un gráfico con esto? ¿No es suficiente con que el indicador esté en un solo gráfico?
2016.10.18 19:09:34.266 Terminal Windows 10 Pro (x64 based PC), IE 11.00, UAC, Intel Core i3-3120 M @ 2.50 GHz, RAM: 3638 / 8077 Mb, HDD: 39824 / 233310 Mb, GMT+02:00
2016.10.18 19:09:34.266 Terminal C:\Users\KVN\AppData\Roaming\MetaQuotes\Terminal\038 C9E8FAFF9EA373522ECC6D5159962
Así que... La situación empieza a tomar forma. Añade este código:
//---
if(prev_calculated==0)
{
Print("prev_calculated==0");
return(rates_total);
}
double bal=AccountInfoDouble(ACCOUNT_BALANCE);
2016.10.18 19:09:34.266 Terminal Windows 10 Pro (x64 based PC), IE 11.00, UAC, Intel Core i3-3120 M @ 2.50 GHz, RAM: 3638 / 8077 Mb, HDD: 39824 / 233310 Mb, GMT+02:00
2016.10.18 19:09:34.266 Terminal C:\Users\KVN\AppData\Roaming\MetaQuotes\Terminal\038 C9E8FAFF9EA373522ECC6D5159962
Comenzó a ejecutarse, pero cuando inicio el indicador hay números de plaga en un buffer casi todo el historial.
Después de quitar el indicador y volver a ponerlo al cabo de un rato los tampones están vacíos.
Repetiré el desmontaje y la colocación más tarde.
Conclusiones preliminares:
Así que... La situación empieza a tomar forma. Añade un código como este:
//---
if(prev_calculated==0)
{
Print("prev_calculated==0");
return(rates_total);
}
double bal=AccountInfoDouble(ACCOUNT_BALANCE);
Añadido así