Vous manquez des opportunités de trading :
- Applications de trading gratuites
- Plus de 8 000 signaux à copier
- Actualités économiques pour explorer les marchés financiers
Inscription
Se connecter
Vous acceptez la politique du site Web et les conditions d'utilisation
Si vous n'avez pas de compte, veuillez vous inscrire
Oui, la boucle est probablement trop grande. Mais si à prev_calculated = 0 (lorsque le tampon est précédemment plein) certaines valeurs de ce tampon sont réinitialisées, il s'agit peut-être d'un bogue. Vérifions maintenant...
Ce n'est pas qu'ils sont remis à zéro, mais tout l'indicateur, toute la profondeur de l'histoire est recalculée. Par conséquent, si je dois remplir uniquement l'index le plus à droite du tampon, mais que ces valeurs doivent rester lorsque je le déplace vers la gauche, j'ai deux possibilités :
1. Lors de l'initialisation du tampon de l'indicateur, il est plein de déchets et il doit être nettoyé.
2. Je l'ai nettoyé, mais lorsque prev_calculated = 0, le tampon est à nouveau nettoyé et supprime toutes les valeurs accumulées.
Et en général, la solution est incroyablement simple. prev_calculated = 0 associé à un drapeau résout ce problème.
...
Et en général, la solution est incroyablement simple. prev_calculated = 0 associé à un drapeau résout ce problème.
Ne fais pas semblant... Tout est clair, mais il y a une image juste pour vous.
L'ordinateur fonctionnait sans s'éteindre, le graphique n'était pas fermé, l'indicateur n'était pas remis à zéro...
Question : Où ont disparu les barres de 2 minutes ?
Vous avez probablement une erreur dans votre code. J'ai maintenant écrit un indicateur de test, lorsque je réinitialise par le bouton de rafraîchissement la taille du tampon ne change pas, les données dans le tampon ne changent pas....
#property indicator_plots 1
#property indicator_chart_window
#property indicator_type1 DRAW_NONE
//+------------------------------------------------------------------+
//| |
//+------------------------------------------------------------------+
double buf[];
const double _price=98000;
bool _firstLaunch=true;
//+------------------------------------------------------------------+
//| Custom indicator initialization function |
//+------------------------------------------------------------------+
int OnInit()
{
SetIndexBuffer(0,buf);
//---
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)
{
if(_firstLaunch)
{
Print(__FUNCTION__,": Первый запуск! Размер буфера = ",ArraySize(buf));
ArrayInitialize(buf,_price);
_firstLaunch=false;
}
else
{
Print(__FUNCTION__,": prev_calculated после обновления = ",prev_calculated,". Размер буфера = ",ArraySize(buf));
//--- Проверяем отличие значений от эталонного
for(int i=rates_total-1; i>=0; i--)
if(buf[i]!=_price)
Print(__FUNCTION__,": Значение #",i," '"+DoubleToString(buf[i],_Digits)+
"' отличается от эталонного '"+DoubleToString(_price,_Digits));
}
}
else
{
if(rates_total>prev_calculated)
buf[rates_total-1]=_price;
}
return(rates_total);
}
Deprev_calculated à rates_total le tampon doit être nettoyé.
Montrez-moi le code. Rions et expliquons.
Je suis déjà en train de rire.
| 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;
bool flag = true;
//+------------------------------------------------------------------+
//| 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);
ArraySetAsSeries(balance, true);
ArraySetAsSeries(clrBalance, true);
ArraySetAsSeries(equityMax, true);
ArraySetAsSeries(equityMaxB, true);
ArraySetAsSeries(equityMin, true);
ArraySetAsSeries(equityMinB, true);
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)
{
Print("prev_calculated = ", prev_calculated);
if(flag)
{
ArrayInitialize(balance, 0.0);
ArrayInitialize(equityMax, 0.0);
ArrayInitialize(equityMaxB, 0.0);
ArrayInitialize(equityMin, 0.0);
ArrayInitialize(equityMinB, 0.0);
flag = false;
}
return(rates_total);
}
double bal = NormalizeDouble(AccountInfoDouble(ACCOUNT_BALANCE), 2);
double equity = NormalizeDouble(AccountInfoDouble(ACCOUNT_EQUITY), 2);
if(rates_total > prev_calculated)
{
minEquity = 0;
maxEquity = 0;
}
minEquity = NormalizeDouble(fmin((minEquity == 0 ? bal : minEquity), equity), 2);
maxEquity = NormalizeDouble(fmax(maxEquity, equity), 2);
balance[0] = bal;
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);
}
//+------------------------------------------------------------------+
Du jour au lendemain, il y a eu autant de mises à zéro de prev_calculate.
2016.10.19 05:47:04.915 BalansEquityTest (EURUSD,M1) prev_calculated = 0
2016.10.19 05:47:04.075 BalansEquityTest (EURUSD,M1) prev_calculated = 0
2016.10.19 04:46:15.300 BalansEquityTest (EURUSD,M1) prev_calculated = 0
2016.10.19 04:46:15.030 BalansEquityTest (EURUSD,M1) prev_calculated = 0
2016.10.19 04:45:37.590 BalansEquityTest (EURUSD,M1) prev_calculated = 0
2016.10.19 04:45:37.100 BalansEquityTest (EURUSD,M1) prev_calculated = 0
2016.10.19 01:40:31.224 BalansEquityTest (EURUSD,M1) prev_calculated = 0
2016.10.19 00:00:32.196 BalansEquityTest (EURUSD,M1) prev_calculated = 0
2016.10.19 00:00:31.806 BalansEquityTest (EURUSD,M1) prev_calculated = 0
2016.10.18 20:33:02.954 BalansEquityTest (EURUSD,M1) prev_calculated = 0 // Это время последнего запуска индикатора.
Deprev_calculated à rates_total le tampon doit être nettoyé.
Ou, comme Dmitriy l'a dit plus haut, la connexion a été interrompue dans plusieurs mesures... Au fait, prev_calculated renverra-t-il également 0 en cas d'échec de la connexion ?
Puis il y a eu une discussion dans le forum sur le fait qu'il serait possible de ne pas toujours réinitialiser à 0, mais dans certains cas vous pourriez réinitialiser à la dernière valeur comptée, dans le fil de discussion Slava a participé et a promis d'examiner la question.
Après un certain temps, j'ai remarqué que prev_calculated avait parfois des valeurs intermédiaires. Maintenant, je n'en sais rien, je ne regarde pas tous les jours ce que rapporte prev_calculé.
Si c'est ma réponse, la première fois que l'indicateur est lancé, le tampon est entièrement initialisé avec la valeur définie. Lorsqu'une nouvelle barre se forme, les nouvelles valeurs sont écrasées.
Je suis déjà en train de rire.
| 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;
bool flag = true;
//+------------------------------------------------------------------+
//| 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);
ArraySetAsSeries(balance, true);
ArraySetAsSeries(clrBalance, true);
ArraySetAsSeries(equityMax, true);
ArraySetAsSeries(equityMaxB, true);
ArraySetAsSeries(equityMin, true);
ArraySetAsSeries(equityMinB, true);
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)
{
Print("prev_calculated = ", prev_calculated);
if(flag)
{
ArrayInitialize(balance, 0.0);
ArrayInitialize(equityMax, 0.0);
ArrayInitialize(equityMaxB, 0.0);
ArrayInitialize(equityMin, 0.0);
ArrayInitialize(equityMinB, 0.0);
flag = false;
}
return(rates_total);
}
double bal = NormalizeDouble(AccountInfoDouble(ACCOUNT_BALANCE), 2);
double equity = NormalizeDouble(AccountInfoDouble(ACCOUNT_EQUITY), 2);
if(rates_total > prev_calculated)
{
minEquity = 0;
maxEquity = 0;
}
minEquity = NormalizeDouble(fmin((minEquity == 0 ? bal : minEquity), equity), 2);
maxEquity = NormalizeDouble(fmax(maxEquity, equity), 2);
balance[0] = bal;
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);
}
//+------------------------------------------------------------------+
Potentiellement, la faute pourrait être ici :
{
minEquity = 0;
maxEquity = 0;
}
minEquity = NormalizeDouble(fmin((minEquity == 0 ? bal : minEquity), equity), 2);
maxEquity = NormalizeDouble(fmax(maxEquity, equity), 2);
Lorsqu'une nouvelle barre arrive, vous remettez les valeurs à 0 - très bien. Mais vous vérifiez alors l'égalité entre minEquity et 0, d'une manière qui n'est pas recommandée.
En confirmation de mes paroles - votre photo. Vous pouvez voir que les valeurs "poubelle", comme vous l'avez dit, sont autour de zéro.
Et il est préférable, bien sûr, d'ajouter à la figure la fenêtre de données avec la valeur "poubelle".