Ti stai perdendo delle opportunità di trading:
- App di trading gratuite
- Oltre 8.000 segnali per il copy trading
- Notizie economiche per esplorare i mercati finanziari
Registrazione
Accedi
Accetti la politica del sito e le condizioni d’uso
Se non hai un account, registrati
Forse gli sviluppatori dovrebbero prestare attenzione al problema dell'inizializzazione dei buffer degli indicatori? Perché non c'è questo problema in MT4? Forse non è la piena comprensione? Il problema è che anche dopo l'inizializzazione obbligatoria dei buffer dopo aver tolto un indicatore da un grafico in CIASCUNO di essi, non tutti i buffer contengono spazzatura e non è possibile tirarla fuori da lì...
Personalmente non mi dispiacciono le stampelle, ma solo se queste stampelle non sono troppo complicate e con effetti positivi. Ma scrivere su un file e poi leggerlo è una stampella scadente.
Come ve lo immaginate: "...dopo aver rimosso l'indicatore dal grafico in alcuni buffer, non in tutti..."? In che modo, dopo la rimozione dell'indicatore dal grafico, avete accesso ai suoi buffer di indicatori?
Cerchiamo di trovare il problema nei dettagli. Hai bisogno di un set standard: codice + cosa hai fatto + cosa hai ottenuto...
Come ve lo immaginate: "...dopo aver rimosso l'indicatore dal grafico in alcuni buffer, non in tutti..."? In che modo, dopo la rimozione dell'indicatore dal grafico, avete accesso ai suoi buffer di indicatori?
Cerchiamo di trovare il problema nei dettagli. Hai bisogno di un set standard: codice + cosa hai fatto + cosa hai ottenuto...
Pura supposizione: potrebbe entrare nella stessa area di memoria durante l'accesso al buffer attuale, che era occupata dai buffer precedenti.
Non sono entrato nella conversazione, non calciare, Alexey vuole che i dati nei buffer rimangano al riavvio (interruttore on/off del terminale) o solo quando prev_calculato = 0 (nel caso in cui prev_calculato > 0 prima)?
Come ve lo immaginate: "...dopo aver rimosso l'indicatore dal grafico in alcuni buffer, non in tutti..."? In che modo, dopo la rimozione dell'indicatore dal grafico, avete accesso ai suoi buffer di indicatori?
Cerchiamo di trovare il problema nei dettagli. Hai bisogno di un set standard: codice + cosa hai fatto + cosa hai ottenuto...
Ecco il codice dell'indicatore
| 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);
}
//+------------------------------------------------------------------+
Posterò un video un po' più tardi, allora sarà chiaro. Non riesco a spiegarlo più chiaramente sulle mie dita di prima.
Spero che non vi dispiaccia scaricare e decomprimere il video.
Sfortunatamente, il fatto della sua rimozione dal grafico e l'attaccamento ad esso non è stato registrato, ma ha il fatto che l'indicatore è lì, poi è sparito e poi è di nuovo lì. Sta solo cancellando e riattaccando.
Fate attenzione alla finestra dei dati dopo aver reinstallato l'indicatore. Anche dopo l'inizializzazione forzata dei buffer, ci sono ancora detriti di spazio.
Ecco il codice dell'indicatore
Vorrei fare un esperimento: lasciare aperto un solo grafico e applicare o rimuovere l'indicatore su di esso. E avete bisogno di informazioni sul terminale e sul sistema operativo (scheda "Log" del terminale).
Cosa c'entra un grafico? Il fatto che l'indicatore sia solo su un grafico non è sufficiente?
aggiunto:
Anche se non credo che il sistema operativo possa influenzare il comportamento dell'indicatore, ecco le informazioni sul sistema e sul terminale
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.)
Cosa c'entra un grafico? Il fatto che l'indicatore sia solo su un grafico non è sufficiente?
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
Quindi... La situazione comincia a prendere forma. Aggiungere questo codice:
//---
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
Iniziato l'esecuzione, ma quando avvio l'indicatore ci sono numeri di peste in un buffer quasi in tutta la storia.
Dopo aver tolto l'indicatore e averlo rimesso dopo un po' i buffer sono vuoti.
Ripeterò la rimozione e la rimessa dentro più tardi.
Conclusioni preliminari:
Quindi... La situazione comincia a prendere forma. Aggiungete del codice come questo:
//---
if(prev_calculated==0)
{
Print("prev_calculated==0");
return(rates_total);
}
double bal=AccountInfoDouble(ACCOUNT_BALANCE);
Aggiunto come questo