In OnCalculate() findet beim ersten Durchlauf eine Initialisierung statt (prev_calculated == 0). Glauben Sie, dass das Verschieben zu OnInit() etwas ändern wird? Nun, ich werde es natürlich versuchen, aber das ist etwas außerhalb des Bereichs der Fantasie...
Schnitt. Wie gesagt, in OnDeinit() werden Arrays initialisiert, die beim nächsten Start nicht mehr verwendet werden (Änderung der Eingabeparameter). Wenn dies (Initialisierung eines Arrays, das nicht als Puffer verwendet wird) hilft - es wäre auch ein MT-Fehler. Es würde sich herausstellen, dass nicht nur die Arrays nicht verwendet werden, aber sie (nicht zugewiesen) könnte noch initialisiert werden und es würde die Zuordnung beeinflussen...
Ohne Code ist das schwierig. Lassen Sie uns wissen, was der Service Desk danach sagt.
Anatoli Kazharski: Ohne Code ist das schwierig. Lassen Sie mich später hier wissen, was der Kundendienst sagt.
Hier ist der Testcode, falls Sie daran interessiert sind.
Zu Beginn ist der Indikatorparameter falsch.
Wir setzen den Indikator auf das Diagramm. Es wird ein Histogramm gezeichnet.
Wir setzen die Parameter auf true.
Es zeichnet das Histogramm und die Pfeile.
Machen Sie den Parameter falsch. Auf der aktuellen TF verschwinden die Pfeile (nicht immer). Wenn wir zu verschiedenen TFs wechseln, erscheinen die Pfeile in einigen von ihnen chaotisch, obwohl die Puffer bei der Deinitialisierung gelöscht werden.
#property indicator_separate_window#property indicator_plots3#property indicator_buffers4//+------------------------------------------------------------------+//| |//+------------------------------------------------------------------+inputbool inpUseArrows=false;
//+------------------------------------------------------------------+//| |//+------------------------------------------------------------------+double bufGisto[];
double bufGistoColor[];
double bufArrowUp[];
double bufArrowDn[];
//---constdoubleEMPTY=EMPTY_VALUE;
//+------------------------------------------------------------------+//| Custom indicator initialization function |//+------------------------------------------------------------------+intOnInit()
{
//--- Размечаем массив цветовcolor colors[2];
colors[ 0 ]= clrLime;
colors[ 1 ] = clrRed;
//--- Устанавливаем параметры графических серий
SetPlotParametersColorHistogram(0,0,bufGisto,bufGistoColor,false,"test gisto",colors,EMPTY,2);
//--- Проверяем, нужно ли отображать объемыif(inpUseArrows) // Если отображать нужно
{
SetPlotParametersArrow(1,2,bufArrowUp,false,"test up",EMPTY,clrLime,233,10);
SetPlotParametersArrow(2,3,bufArrowDn,false,"test dn",EMPTY,clrRed,234,-10);
}
//---IndicatorSetInteger(INDICATOR_DIGITS,0);
//---return(INIT_SUCCEEDED);
}
//+------------------------------------------------------------------+//| |//+------------------------------------------------------------------+voidOnDeinit(constint reason)
{
if(inpUseArrows)
{
ArrayInitialize(bufArrowUp,EMPTY);
ArrayInitialize(bufArrowDn,EMPTY);
}
}
//+------------------------------------------------------------------+//| Custom indicator iteration function |//+------------------------------------------------------------------+intOnCalculate(constint rates_total,
constint prev_calculated,
constdatetime &time[],
constdouble &open[],
constdouble &high[],
constdouble &low[],
constdouble &close[],
constlong &tick_volume[],
constlong &volume[],
constint &spread[])
{
//---if(prev_calculated==0)
{
ArrayInitialize(bufGisto,EMPTY);
//---if(inpUseArrows)
{
ArrayInitialize(bufArrowUp,EMPTY);
ArrayInitialize(bufArrowDn,EMPTY);
}
//---for(int i=0; i<rates_total; i++)
{
bufGisto[i]=(open[i]-close[i])/_Point;
bufGistoColor[i]=(bufGisto[i]<0) ? 1 : 0;
//---if(inpUseArrows)
{
if(bufGisto[i]>20)
bufArrowDn[i]=bufGisto[i];
elseif(bufGisto[i]<-20)
bufArrowUp[i]=bufGisto[i];
}
}
}
elseif(rates_total>prev_calculated)
{
bufGisto[rates_total-1]=EMPTY;
//---if(inpUseArrows)
{
bufArrowUp[ rates_total-1 ] = EMPTY;
bufArrowDn[ rates_total-1 ] = EMPTY;
}
}
//--- return value of prev_calculated for next callreturn(rates_total);
}
//+------------------------------------------------------------------+//| Параметры графического построения: цветная гист-а от 0 линии |//+------------------------------------------------------------------+void SetPlotParametersColorHistogram(constint plotIndex,// Индекс графической серииconstint bufferNum,// Номер первого буфера серииdouble& value[], // Буфер значенийdouble& clr[], // Буфер цветовconstbool asSeries, // Флаг нумерации как в таймсерииconststring label, // Имя серииconstcolor& colors[], // Цвета линииconstdouble emptyValue = EMPTY_VALUE, // Пустые значения серииconstint width = 0, // Толщина линииconstENUM_LINE_STYLE style = STYLE_SOLID, // Стиль линииconstint drawBegin = 0, // Количество баров без отрисовкиconstint shift=0// Сдвиг построения в барах
)
{
//--- Привязываем буферыSetIndexBuffer(bufferNum,value,INDICATOR_DATA);
SetIndexBuffer(bufferNum+1,clr,INDICATOR_COLOR_INDEX);
//--- Устанавливаем порядок нумерации в массивах-буферахArraySetAsSeries(value,asSeries);
ArraySetAsSeries(clr,asSeries);
//--- Устанавливаем тип графического построенияPlotIndexSetInteger(plotIndex,PLOT_DRAW_TYPE,DRAW_COLOR_HISTOGRAM);
//--- Устанавливаем имя графической серииPlotIndexSetString(plotIndex,PLOT_LABEL,label);
//--- Устанавливаем пустые значения в буферахPlotIndexSetDouble(plotIndex,PLOT_EMPTY_VALUE,emptyValue);
//--- Устанавливаем количество цветов индикатораconstint size=ArraySize(colors);
PlotIndexSetInteger(plotIndex,PLOT_COLOR_INDEXES,size);
//--- Устанавливаем цвета индикатораfor(int i=0; i<size; i++)
PlotIndexSetInteger(plotIndex,PLOT_LINE_COLOR,i,colors[i]);
//--- Устанавливаем толщину линииPlotIndexSetInteger(plotIndex,PLOT_LINE_WIDTH,width);
//--- Устанавливаем стиль линииPlotIndexSetInteger(plotIndex,PLOT_LINE_STYLE,style);
//--- Устанавливаем количество баров без отрисовки и значений в DataWindowPlotIndexSetInteger(plotIndex,PLOT_DRAW_BEGIN,drawBegin);
//--- Устанавливаем сдвиг графического построения по оси времени в барахPlotIndexSetInteger(plotIndex,PLOT_SHIFT,shift);
}
//+------------------------------------------------------------------+//| Параметры графического построения: стрелки |//+------------------------------------------------------------------+void SetPlotParametersArrow(constint plotIndex,// Индекс графической серииconstint bufferNum,// Номер первого буфера серииdouble &value[],// Буфер значенийconstbool asSeries,// Флаг нумерации как в таймсерииconststring label,// Имя серииconstdouble emptyValue=EMPTY_VALUE,// Пустые значения серииconstcolor clr=clrRed,// Цвет стрелокconstint arrowCode= 159,// Код стрелокconstint arrowShift = 0,// Сдвиг стрелок по вертикалиconstint width=0,// Толщина стрелокconstint drawBegin=0,// Количество баров без отрисовкиconstint shift=0// Сдвиг построения в барах
)
{
//--- Привязываем буферыSetIndexBuffer(bufferNum,value,INDICATOR_DATA);
//--- Устанавливаем порядок нумерации в массивах-буферахArraySetAsSeries(value,asSeries);
//--- Устанавливаем тип графического построенияPlotIndexSetInteger(plotIndex,PLOT_DRAW_TYPE,DRAW_ARROW);
//--- Устанавливаем имя графической серииPlotIndexSetString(plotIndex,PLOT_LABEL,label);
//--- Устанавливаем пустые значения в буферахPlotIndexSetDouble(plotIndex,PLOT_EMPTY_VALUE,emptyValue);
//--- Устанавливаем цвет индикатораPlotIndexSetInteger(plotIndex,PLOT_LINE_COLOR,0,clr);
//--- Устанавливаем код стрелокPlotIndexSetInteger(plotIndex,PLOT_ARROW,arrowCode);
//--- Устанавливаем смещение стрелок по вертикалиPlotIndexSetInteger(plotIndex,PLOT_ARROW_SHIFT,arrowShift);
//--- Устанавливаем толщину стрелокPlotIndexSetInteger(plotIndex,PLOT_LINE_WIDTH,width);
//--- Устанавливаем количество баров без отрисовки и значений в DataWindowPlotIndexSetInteger(plotIndex,PLOT_DRAW_BEGIN,drawBegin);
//--- Устанавливаем сдвиг графического построения по оси времени в барахPlotIndexSetInteger(plotIndex,PLOT_SHIFT,shift);
}
//+------------------------------------------------------------------+
Unabhängig davon, ob Sie Arrays für die Pfeile als Puffer angeben, sind sie immer noch fest verdrahtet:
//---
Wenn Pfeile nicht angezeigt werden müssen, können sie auch einfach durch DRAW_NONE von der Anzeige ausgeschlossen werden.
Versuchen Sie diese Variante:
Ich habe darüber nachgedacht, aber es gibt hier einen Nachteil. Arrays werden automatisch markiert und erweitert, wodurch Ressourcen verbraucht werden. Die Entwickler sollten den Fehler besser beheben lassen.
Und was ist mit der Hardcodierung... Wenn ich keine Puffer an grafische Reihen binde, warum sehe ich dann irgendeinen unbekannten Müll, den ich nicht loswerden kann?
Andernfalls können dynamische Indikatoren nicht normal erstellt werden.
Am besten ist es, die Puffer in Deinit zu reinigen und das war's. Aber Aufräumen hilft nicht...
Es wäre schön, eine Unterscheidung des Stringtyps, wie er in anderen Sprachen verwendet wird, in eine reguläre und eine "rohe" Zeichenkette einzuführen. Ich denke, sie werden sowieso dazu kommen, aber in der Anfangsphase würde dies viele Probleme in der Zukunft beseitigen.
Python verwendet zum Beispiel r "string", um eine "rohe" Zeichenkette zu erstellen
Was ist der Grund dafür, dass die Protokolle im Tester nicht vollständig ausgegeben werden? Alles, was Sie sich ansehen können, wurde geprüft und kontrolliert, das ist unschlagbar.
Was ist der Grund dafür, dass die Protokolle im Prüfprogramm nicht vollständig angezeigt werden? Alles, was man sich anschauen kann - anschauen und überprüfen, kann es nicht besiegen.
Wenn Sie kein Benutzerkonto haben, registrieren Sie sich
Erlauben Sie die Verwendung von Cookies, um sich auf der Website MQL5.com anzumelden.
Bitte aktivieren Sie die notwendige Einstellung in Ihrem Browser, da Sie sich sonst nicht einloggen können.
Sie sind angemeldet. Die Zwei-Faktor-Authentifizierung wurde deaktiviert. Richten Sie sie erneut ein und scannen Sie einen neuen QR-Code oder fahren Sie mit deaktivierter Zwei-Faktor-Authentifizierung fort.
In OnCalculate() findet beim ersten Durchlauf eine Initialisierung statt (prev_calculated == 0). Glauben Sie, dass das Verschieben zu OnInit() etwas ändern wird? Nun, ich werde es natürlich versuchen, aber das ist etwas außerhalb des Bereichs der Fantasie...
Schnitt. Wie gesagt, in OnDeinit() werden Arrays initialisiert, die beim nächsten Start nicht mehr verwendet werden (Änderung der Eingabeparameter). Wenn dies (Initialisierung eines Arrays, das nicht als Puffer verwendet wird) hilft - es wäre auch ein MT-Fehler. Es würde sich herausstellen, dass nicht nur die Arrays nicht verwendet werden, aber sie (nicht zugewiesen) könnte noch initialisiert werden und es würde die Zuordnung beeinflussen...
Ohne den Code ist das schwierig. Lassen Sie mich wissen, was der Kundendienst danach sagt.
Ohne Code ist das schwierig. Lassen Sie mich später hier wissen, was der Kundendienst sagt.
Hier ist der Testcode, falls Sie daran interessiert sind.
Zu Beginn ist der Indikatorparameter falsch.
Wir setzen den Indikator auf das Diagramm. Es wird ein Histogramm gezeichnet.
Wir setzen die Parameter auf true.
Es zeichnet das Histogramm und die Pfeile.
Machen Sie den Parameter falsch. Auf der aktuellen TF verschwinden die Pfeile (nicht immer). Wenn wir zu verschiedenen TFs wechseln, erscheinen die Pfeile in einigen von ihnen chaotisch, obwohl die Puffer bei der Deinitialisierung gelöscht werden.
Es geht nicht in irgendeine Richtung. Service Desk #1832411x64, 1643.
Unabhängig davon, ob Sie Arrays für die Pfeile als Puffer angeben, sind sie immer noch fest verdrahtet:
//---
Wenn Pfeile nicht angezeigt werden müssen, können sie auch einfach durch DRAW_NONE von der Anzeige ausgeschlossen werden.
Versuchen Sie es auf diese Weise:
Unabhängig davon, ob Sie Arrays für die Pfeile als Puffer angeben, sind sie immer noch fest verdrahtet:
//---
Wenn Pfeile nicht angezeigt werden müssen, können sie auch einfach durch DRAW_NONE von der Anzeige ausgeschlossen werden.
Versuchen Sie diese Variante:
Ich habe darüber nachgedacht, aber es gibt hier einen Nachteil. Arrays werden automatisch markiert und erweitert, wodurch Ressourcen verbraucht werden. Die Entwickler sollten den Fehler besser beheben lassen.
Und was ist mit der Hardcodierung... Wenn ich keine Puffer an grafische Reihen binde, warum sehe ich dann irgendeinen unbekannten Müll, den ich nicht loswerden kann?
Andernfalls können dynamische Indikatoren nicht normal erstellt werden.
Am besten ist es, die Puffer in Deinit zu reinigen und das war's. Aber Aufräumen hilft nicht...
In ME zeigen Sie bitte ALT+M in der Liste der Funktionen/Methoden den Typ des Rückgabewerts an.
Es wäre schön, eine Unterscheidung des Stringtyps, wie er in anderen Sprachen verwendet wird, in eine reguläre und eine "rohe" Zeichenkette einzuführen. Ich denke, sie werden sowieso dazu kommen, aber in der Anfangsphase würde dies viele Probleme in der Zukunft beseitigen.
Python verwendet zum Beispiel r "string", um eine "rohe" Zeichenkette zu erstellenWas ist der Grund dafür, dass die Protokolle im Tester nicht vollständig ausgegeben werden? Alles, was Sie sich ansehen können, wurde geprüft und kontrolliert, das ist unschlagbar.
Was ist der Grund dafür, dass die Protokolle im Prüfprogramm nicht vollständig angezeigt werden? Alles, was man sich anschauen kann - anschauen und überprüfen, kann es nicht besiegen.
Eine Menge Einträge. Siehe Protokolldatei.