Francuz: Leute, könnt ihr mir ein paar Informationen geben? Wofür verwenden Sie Alignment?
Das alles ist in einer Multi-Thread-Umgebung sehr nützlich, wie ich sehe. Was hat das MKL damit zu tun? Ich weiß nicht, die Frage wurde gestellt, also bin ich hängen geblieben.
Und im Allgemeinen - das sind die Grundlagen, ein Grundverständnis ist für jeden anständigen Programmierer notwendig.
ZS: Nun, es gibt hier eine Menge Geschwindigkeitsfanatiker, wenn sie anfangen, alles intelligent auszurichten, sollten sie noch schneller fliegen, zumindest theoretisch.
ZS: Nun, es gibt hier eine Menge Geschwindigkeitsfans, wenn sie anfangen, es richtig zu machen, sollte es noch schneller gehen, zumindest theoretisch.
Im Allgemeinen habe ich nicht einmal das erwartet:
#define WRONG_ALIGNED
#define CACHE_LINE_SIZE 64struct Data {
#ifdef WRONG_ALIGNED
short bad_pad;
#endif
uint ar[CACHE_LINE_SIZE/sizeof(int)];
};
#import "msvcrt.dll"long memcpy(Data &, Data &, long);
#import
#define getaddr(x) memcpy(x, x, 0)
voidOnStart()
{
Data data[32768];
if (getaddr(data[0])%4 != 0) {
Alert("error");
return;
}
ZeroMemory(data);
int index = int(CACHE_LINE_SIZE - getaddr(data[0]) % CACHE_LINE_SIZE) / sizeof(int) - 1;
srand(GetTickCount());
ulong start_time = GetMicrosecondCount();
for(unsigned i = 0; i < 10000; ++ i) {
int rndnum = rand();
while (++rndnum < 32768)
for (int j = ArraySize(data[rndnum].ar)-1; j >= 0; -- j)
++ data[rndnum].ar[j];
}
Alert(GetMicrosecondCount() - start_time);
for (int j = ArraySize(data[100].ar)-1; j >= 0; -- j)
Print(data[100].ar[j]);
}
/*
WRONG_ALIGNED:
6117940
6104068
6047416
RIGHT_ALIGNED
3341823
2565150
2565150
*/
Der Code ist etwas zu kompliziert - ich habe versucht, das Element zu treffen, das nicht in die Cache-Zeile passt, und direkt darauf zu hämmern, aber es ist fehlgeschlagen (es wäre wahrscheinlich machbar, wenn ich wollte, aber mir wurde langweilig), und ich habe den Code nicht viel geändert. Aber das ist noch beeindruckender - nur einer von 16 Zusammenbrüchen erfolgt über ein Element, das nicht in die Cache-Zeile fällt, trotzdem ergibt es ein vernünftiges Ergebnis.
SZY: In diesem Fall ist es objektiver, RIGHT_ALIGNED zu machen, indem man zwei kurze Zeilen einfügt, anstatt eine einzige zu entfernen (so erreichen wir zwei Aktualisierungen der Cache-Zeile für beide Fälle). Der Geschwindigkeitszuwachs ist bescheidener, aber immer noch etwa 1,5-mal so groß.
Ich habe das Zickzack aus der Metatrader-Lieferung genommen, um den Fehler zu demonstrieren. Dem Code wurden zusätzliche Puffer hinzugefügt, die aus meinem Programm stammen. In diesem Code sind keine Manipulationen mit zusätzlichen Puffern vorgesehen. Sie dienen nur dazu, den Fehler zu demonstrieren.
Dieser Zickzackkurs wurde auf dem H1-Zeitrahmen des EURUSD aufgezeichnet. Schließen Sie das Terminal. Alle generierten Zeitreihen für EURUSD wurden aus der Historie gelöscht. D.h. ich habe alle *.hcc und *.hc Dateien des Währungspaares EURUSD gelöscht. Dies wurde getan, um das Laden von .hcc-Dateien und die Erzeugung von .hc-Dateien aus einem sauberen Blatt sicherzustellen.
Nach dem Start des Terminals sehen Sie auf dem EURUSD-Chart eine Reihe von Artefakten. Mit diesen Artefakten kann nicht umgegangen werden.
Ich füge den geänderten Code des Zickzacks in Form von Text und in Form einer Datei bei.
Ich möchte Sie darauf hinweisen, dass die Parameter des Zickzacks über #propert angegeben werden.
Alle anderen Puffer werden nicht durch #propert gesetzt, da alles, einschließlich der Zickzack-Puffer, dynamisch geändert wird.
//+------------------------------------------------------------------+//| ZigZag.mq5 |//| Copyright 2009-2017, MetaQuotes Software Corp. |//| http://www.mql5.com |//+------------------------------------------------------------------+#property copyright"2009-2017, MetaQuotes Software Corp."#property link"http://www.mql5.com"#property version"1.00"#property indicator_chart_window#property indicator_buffers29#property indicator_plots17//---- plot Zigzag#property indicator_label17 "Zigzag"#property indicator_type17 DRAW_SECTION#property indicator_color17 Red
#property indicator_style17 STYLE_SOLID#property indicator_width17 1//--- input parametersinputint ExtDepth=12;
inputint ExtDeviation=5;
inputint ExtBackstep=3;
//--- indicator buffersdouble ZigzagBuffer[]; // main bufferdouble HighMapBuffer[]; // highsdouble LowMapBuffer[]; // lowsint level=3; // recounting depthdouble deviation; // deviation in pointsdouble Hmzz1[], Hmzz2[], Hmzz3[], Hmzz4[], Hmzz5[], Hmzz6[], Hmzz7[], Hmzz8[], Hmzz9[], Hmzz10[];
double Lmzz1[], Lmzz2[], Lmzz3[], Lmzz4[], Lmzz5[], Lmzz6[], Lmzz7[], Lmzz8[], Lmzz9[], Lmzz10[];
double nen_ZigZagL[], nen_ZigZagH[];
double ha[], la[], ham[], lam[];
//+------------------------------------------------------------------+//| Custom indicator initialization function |//+------------------------------------------------------------------+intOnInit()
{
//--- indicator buffers mappingSetIndexBuffer(0,Lmzz1,INDICATOR_DATA); // Plot = 0SetIndexBuffer(1,Hmzz1,INDICATOR_DATA);
SetIndexBuffer(2,Lmzz2,INDICATOR_DATA); // Plot = 1SetIndexBuffer(3,Hmzz2,INDICATOR_DATA);
SetIndexBuffer(4,Lmzz3,INDICATOR_DATA); // Plot = 2SetIndexBuffer(5,Hmzz3,INDICATOR_DATA);
SetIndexBuffer(6,Lmzz4,INDICATOR_DATA); // Plot = 3SetIndexBuffer(7,Hmzz4,INDICATOR_DATA);
SetIndexBuffer(8,Lmzz5,INDICATOR_DATA); // Plot = 4SetIndexBuffer(9,Hmzz5,INDICATOR_DATA);
SetIndexBuffer(10,Lmzz6,INDICATOR_DATA); // Plot = 5SetIndexBuffer(11,Hmzz6,INDICATOR_DATA);
SetIndexBuffer(12,Lmzz7,INDICATOR_DATA); // Plot = 6SetIndexBuffer(13,Hmzz7,INDICATOR_DATA);
SetIndexBuffer(14,Lmzz8,INDICATOR_DATA); // Plot = 7SetIndexBuffer(15,Hmzz8,INDICATOR_DATA);
SetIndexBuffer(16,Lmzz9,INDICATOR_DATA); // Plot = 8SetIndexBuffer(17,Hmzz9,INDICATOR_DATA);
SetIndexBuffer(18,Lmzz10,INDICATOR_DATA); // Plot = 9SetIndexBuffer(19,Hmzz10,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);
PlotIndexSetDouble(5,PLOT_EMPTY_VALUE,0.0);
PlotIndexSetDouble(6,PLOT_EMPTY_VALUE,0.0);
PlotIndexSetDouble(7,PLOT_EMPTY_VALUE,0.0);
PlotIndexSetDouble(8,PLOT_EMPTY_VALUE,0.0);
PlotIndexSetDouble(9,PLOT_EMPTY_VALUE,0.0);
ArraySetAsSeries(Lmzz1,true);
ArraySetAsSeries(Hmzz1,true);
ArraySetAsSeries(Lmzz2,true);
ArraySetAsSeries(Hmzz2,true);
ArraySetAsSeries(Lmzz3,true);
ArraySetAsSeries(Hmzz3,true);
ArraySetAsSeries(Lmzz4,true);
ArraySetAsSeries(Hmzz4,true);
ArraySetAsSeries(Lmzz5,true);
ArraySetAsSeries(Hmzz5,true);
ArraySetAsSeries(Lmzz6,true);
ArraySetAsSeries(Hmzz6,true);
ArraySetAsSeries(Lmzz7,true);
ArraySetAsSeries(Hmzz7,true);
ArraySetAsSeries(Lmzz8,true);
ArraySetAsSeries(Hmzz8,true);
ArraySetAsSeries(Lmzz9,true);
ArraySetAsSeries(Hmzz9,true);
ArraySetAsSeries(Lmzz10,true);
ArraySetAsSeries(Hmzz10,true);
ArraySetAsSeries(nen_ZigZagH,true);
ArraySetAsSeries(nen_ZigZagL,true);
ArraySetAsSeries(ham,true);
ArraySetAsSeries(lam,true);
ArraySetAsSeries(ha,true);
ArraySetAsSeries(la,true);
PlotIndexSetInteger(0,PLOT_DRAW_TYPE,DRAW_ZIGZAG);
PlotIndexSetInteger(1,PLOT_DRAW_TYPE,DRAW_ZIGZAG);
PlotIndexSetInteger(2,PLOT_DRAW_TYPE,DRAW_ZIGZAG);
PlotIndexSetInteger(3,PLOT_DRAW_TYPE,DRAW_ZIGZAG);
PlotIndexSetInteger(4,PLOT_DRAW_TYPE,DRAW_ZIGZAG);
PlotIndexSetInteger(5,PLOT_DRAW_TYPE,DRAW_ZIGZAG);
PlotIndexSetInteger(6,PLOT_DRAW_TYPE,DRAW_ZIGZAG);
PlotIndexSetInteger(7,PLOT_DRAW_TYPE,DRAW_ZIGZAG);
PlotIndexSetInteger(8,PLOT_DRAW_TYPE,DRAW_ZIGZAG);
PlotIndexSetInteger(9,PLOT_DRAW_TYPE,DRAW_ZIGZAG);
PlotIndexSetInteger(0,PLOT_LINE_STYLE,STYLE_SOLID);
PlotIndexSetInteger(1,PLOT_LINE_STYLE,STYLE_SOLID);
PlotIndexSetInteger(2,PLOT_LINE_STYLE,STYLE_SOLID);
PlotIndexSetInteger(3,PLOT_LINE_STYLE,STYLE_SOLID);
PlotIndexSetInteger(4,PLOT_LINE_STYLE,STYLE_SOLID);
PlotIndexSetInteger(5,PLOT_LINE_STYLE,STYLE_SOLID);
PlotIndexSetInteger(6,PLOT_LINE_STYLE,STYLE_SOLID);
PlotIndexSetInteger(7,PLOT_LINE_STYLE,STYLE_SOLID);
PlotIndexSetInteger(8,PLOT_LINE_STYLE,STYLE_SOLID);
PlotIndexSetInteger(9,PLOT_LINE_STYLE,STYLE_SOLID);
PlotIndexSetInteger(0,PLOT_LINE_COLOR, clrDarkOrange);
PlotIndexSetInteger(1,PLOT_LINE_COLOR, clrRoyalBlue);
PlotIndexSetInteger(2,PLOT_LINE_COLOR, clrForestGreen);
PlotIndexSetInteger(3,PLOT_LINE_COLOR, clrSienna);
PlotIndexSetInteger(4,PLOT_LINE_COLOR, clrDodgerBlue);
PlotIndexSetInteger(5,PLOT_LINE_COLOR, clrGreen);
PlotIndexSetInteger(6,PLOT_LINE_COLOR, clrBrown);
PlotIndexSetInteger(7,PLOT_LINE_COLOR, clrMediumBlue);
PlotIndexSetInteger(8,PLOT_LINE_COLOR, clrTeal);
PlotIndexSetInteger(9,PLOT_LINE_COLOR, clrMaroon);
PlotIndexSetInteger(0,PLOT_LINE_WIDTH, 0);
PlotIndexSetInteger(1,PLOT_LINE_WIDTH, 0);
PlotIndexSetInteger(2,PLOT_LINE_WIDTH, 0);
PlotIndexSetInteger(3,PLOT_LINE_WIDTH, 0);
PlotIndexSetInteger(4,PLOT_LINE_WIDTH, 0);
PlotIndexSetInteger(5,PLOT_LINE_WIDTH, 0);
PlotIndexSetInteger(6,PLOT_LINE_WIDTH, 0);
PlotIndexSetInteger(7,PLOT_LINE_WIDTH, 0);
PlotIndexSetInteger(8,PLOT_LINE_WIDTH, 0);
PlotIndexSetInteger(9,PLOT_LINE_WIDTH, 0);
SetIndexBuffer(20,nen_ZigZagH,INDICATOR_DATA); // Plot = 10SetIndexBuffer(21,nen_ZigZagL,INDICATOR_DATA); // Plot = 11PlotIndexSetInteger(10,PLOT_DRAW_TYPE,DRAW_ARROW);
PlotIndexSetInteger(10, PLOT_ARROW, 159);
PlotIndexSetInteger(10,PLOT_LINE_STYLE, STYLE_SOLID);
PlotIndexSetInteger(10,PLOT_LINE_WIDTH, 0);
PlotIndexSetInteger(10,PLOT_LINE_COLOR, clrMagenta);
PlotIndexSetInteger(11,PLOT_DRAW_TYPE,DRAW_ARROW);
PlotIndexSetInteger(11, PLOT_ARROW, 159);
PlotIndexSetInteger(11,PLOT_LINE_STYLE, STYLE_SOLID);
PlotIndexSetInteger(11,PLOT_LINE_WIDTH, 0);
PlotIndexSetInteger(11,PLOT_LINE_COLOR, clrMagenta);
SetIndexBuffer(22,ham,INDICATOR_DATA); // Plot = 12SetIndexBuffer(23,lam,INDICATOR_DATA); // Plot = 13PlotIndexSetInteger(12,PLOT_DRAW_TYPE,DRAW_LINE);
PlotIndexSetInteger(12,PLOT_LINE_STYLE, STYLE_DOT);
PlotIndexSetInteger(12,PLOT_LINE_WIDTH, 0);
PlotIndexSetInteger(12,PLOT_LINE_COLOR, clrGreen);
PlotIndexSetInteger(13,PLOT_DRAW_TYPE,DRAW_LINE);
PlotIndexSetInteger(13,PLOT_LINE_STYLE, STYLE_DOT);
PlotIndexSetInteger(13,PLOT_LINE_WIDTH, 0);
PlotIndexSetInteger(13,PLOT_LINE_COLOR, clrOrange);
SetIndexBuffer(24,ha,INDICATOR_DATA); // Plot = 14SetIndexBuffer(25,la,INDICATOR_DATA); // Plot = 15PlotIndexSetInteger(14,PLOT_DRAW_TYPE,DRAW_LINE);
PlotIndexSetInteger(14,PLOT_LINE_STYLE, STYLE_DOT);
PlotIndexSetInteger(14,PLOT_LINE_WIDTH, 0);
PlotIndexSetInteger(14,PLOT_LINE_COLOR, clrGreen);
PlotIndexSetInteger(15,PLOT_DRAW_TYPE,DRAW_LINE);
PlotIndexSetInteger(15,PLOT_LINE_STYLE, STYLE_DOT);
PlotIndexSetInteger(15,PLOT_LINE_WIDTH, 0);
PlotIndexSetInteger(15,PLOT_LINE_COLOR, clrRed);
SetIndexBuffer(26,ZigzagBuffer,INDICATOR_DATA);
SetIndexBuffer(27,HighMapBuffer,INDICATOR_CALCULATIONS);
SetIndexBuffer(28,LowMapBuffer,INDICATOR_CALCULATIONS);
PlotIndexSetInteger(16,PLOT_DRAW_TYPE,DRAW_SECTION);
PlotIndexSetInteger(16,PLOT_LINE_STYLE, STYLE_SOLID);
PlotIndexSetInteger(16,PLOT_LINE_WIDTH, 1);
PlotIndexSetInteger(16,PLOT_LINE_COLOR, clrRed);
//--- set short name and digits PlotIndexSetString(16,PLOT_LABEL,"ZigZag("+(string)ExtDepth+","+(string)ExtDeviation+","+(string)ExtBackstep+")");
IndicatorSetInteger(INDICATOR_DIGITS,_Digits);
//--- set empty valuePlotIndexSetDouble(16,PLOT_EMPTY_VALUE,0.0);
//--- to use in cycle
deviation=ExtDeviation*_Point;
//---return(0);
}
//+------------------------------------------------------------------+//| searching index of the highest bar |//+------------------------------------------------------------------+intiHighest(constdouble &array[],
int depth,
int startPos)
{
int index=startPos;
//--- start index validationif(startPos<0)
{
Print("Invalid parameter in the function iHighest, startPos =",startPos);
return0;
}
int size=ArraySize(array);
//--- depth correction if needif(startPos-depth<0) depth=startPos;
double max=array[startPos];
//--- start searchingfor(int i=startPos;i>startPos-depth;i--)
{
if(array[i]>max)
{
index=i;
max=array[i];
}
}
//--- return index of the highest barreturn(index);
}
//+------------------------------------------------------------------+//| searching index of the lowest bar |//+------------------------------------------------------------------+intiLowest(constdouble &array[],
int depth,
int startPos)
{
int index=startPos;
//--- start index validationif(startPos<0)
{
Print("Invalid parameter in the function iLowest, startPos =",startPos);
return0;
}
int size=ArraySize(array);
//--- depth correction if needif(startPos-depth<0) depth=startPos;
double min=array[startPos];
//--- start searchingfor(int i=startPos;i>startPos-depth;i--)
{
if(array[i]<min)
{
index=i;
min=array[i];
}
}
//--- return index of the lowest barreturn(index);
}
//+------------------------------------------------------------------+//| 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[])
{
int i=0;
int limit=0,counterZ=0,whatlookfor=0;
int shift=0,back=0,lasthighpos=0,lastlowpos=0;
double val=0,res=0;
double curlow=0,curhigh=0,lasthigh=0,lastlow=0;
//--- auxiliary enumerationenum looling_for
{
Pike=1, // searching for next high
Sill=-1// searching for next low
};
//--- initializingif(prev_calculated==0)
{
ArrayInitialize(ZigzagBuffer,0.0);
ArrayInitialize(HighMapBuffer,0.0);
ArrayInitialize(LowMapBuffer,0.0);
}
//--- if(rates_total<100) return(0);
//--- set start position for calculationsif(prev_calculated==0) limit=ExtDepth;
//--- ZigZag was already counted beforeif(prev_calculated>0)
{
i=rates_total-1;
//--- searching third extremum from the last uncompleted barwhile(counterZ<level && i>rates_total-100)
{
res=ZigzagBuffer[i];
if(res!=0) counterZ++;
i--;
}
i++;
limit=i;
//--- what type of exremum we are going to findif(LowMapBuffer[i]!=0)
{
curlow=LowMapBuffer[i];
whatlookfor=Pike;
}
else
{
curhigh=HighMapBuffer[i];
whatlookfor=Sill;
}
//--- chippingfor(i=limit+1;i<rates_total && !IsStopped();i++)
{
ZigzagBuffer[i]=0.0;
LowMapBuffer[i]=0.0;
HighMapBuffer[i]=0.0;
}
}
//--- searching High and Lowfor(shift=limit;shift<rates_total && !IsStopped();shift++)
{
val=low[iLowest(low,ExtDepth,shift)];
if(val==lastlow) val=0.0;
else
{
lastlow=val;
if((low[shift]-val)>deviation) val=0.0;
else
{
for(back=1;back<=ExtBackstep;back++)
{
res=LowMapBuffer[shift-back];
if((res!=0) && (res>val)) LowMapBuffer[shift-back]=0.0;
}
}
}
if(low[shift]==val) LowMapBuffer[shift]=val; else LowMapBuffer[shift]=0.0;
//--- high
val=high[iHighest(high,ExtDepth,shift)];
if(val==lasthigh) val=0.0;
else
{
lasthigh=val;
if((val-high[shift])>deviation) val=0.0;
else
{
for(back=1;back<=ExtBackstep;back++)
{
res=HighMapBuffer[shift-back];
if((res!=0) && (res<val)) HighMapBuffer[shift-back]=0.0;
}
}
}
if(high[shift]==val) HighMapBuffer[shift]=val; else HighMapBuffer[shift]=0.0;
}
//--- last preparationif(whatlookfor==0)// uncertain quantity
{
lastlow=0;
lasthigh=0;
}
else
{
lastlow=curlow;
lasthigh=curhigh;
}
//--- final rejectionfor(shift=limit;shift<rates_total && !IsStopped();shift++)
{
res=0.0;
switch(whatlookfor)
{
case0: // search for peak or lawnif(lastlow==0 && lasthigh==0)
{
if(HighMapBuffer[shift]!=0)
{
lasthigh=high[shift];
lasthighpos=shift;
whatlookfor=Sill;
ZigzagBuffer[shift]=lasthigh;
res=1;
}
if(LowMapBuffer[shift]!=0)
{
lastlow=low[shift];
lastlowpos=shift;
whatlookfor=Pike;
ZigzagBuffer[shift]=lastlow;
res=1;
}
}
break;
case Pike: // search for peakif(LowMapBuffer[shift]!=0.0 && LowMapBuffer[shift]<lastlow && HighMapBuffer[shift]==0.0)
{
ZigzagBuffer[lastlowpos]=0.0;
lastlowpos=shift;
lastlow=LowMapBuffer[shift];
ZigzagBuffer[shift]=lastlow;
res=1;
}
if(HighMapBuffer[shift]!=0.0 && LowMapBuffer[shift]==0.0)
{
lasthigh=HighMapBuffer[shift];
lasthighpos=shift;
ZigzagBuffer[shift]=lasthigh;
whatlookfor=Sill;
res=1;
}
break;
case Sill: // search for lawnif(HighMapBuffer[shift]!=0.0 && HighMapBuffer[shift]>lasthigh && LowMapBuffer[shift]==0.0)
{
ZigzagBuffer[lasthighpos]=0.0;
lasthighpos=shift;
lasthigh=HighMapBuffer[shift];
ZigzagBuffer[shift]=lasthigh;
}
if(LowMapBuffer[shift]!=0.0 && HighMapBuffer[shift]==0.0)
{
lastlow=LowMapBuffer[shift];
lastlowpos=shift;
ZigzagBuffer[shift]=lastlow;
whatlookfor=Pike;
}
break;
default: return(rates_total);
}
}
//--- return value of prev_calculated for next callreturn(rates_total);
}
//+------------------------------------------------------------------+
Bitte helfen Sie den Terminalentwicklern, diesen Fehler zu beheben.
По завершении установки в меню "Пуск" создается группа программ торговой платформы, а на рабочем столе дополнительно помещается ярлык программы. Используйте их для запуска. Нельзя запускать одновременно две копии платформы из одной директории. Чтобы одновременно запустить несколько копий, установите соответствующее количество программ в разные...
Ich habe das Zickzack aus der Metatrader-Lieferung genommen, um den Fehler zu demonstrieren. Dem Code wurden zusätzliche Puffer hinzugefügt, die aus meinem Programm stammen. In diesem Code sind keine Manipulationen mit zusätzlichen Puffern vorgesehen. Sie dienen nur dazu, den Fehler zu demonstrieren.
Dieser Zickzackkurs wurde auf dem H1-Zeitrahmen des EURUSD aufgezeichnet. Schließen Sie das Terminal. Alle generierten Zeitreihen für EURUSD wurden aus der Historie gelöscht. D.h. ich habe alle *.hcc und *.hc Dateien des Währungspaares EURUSD gelöscht. Dies wurde getan, um das Laden von .hcc-Dateien und die Erzeugung von .hc-Dateien aus einem sauberen Blatt sicherzustellen.
Nach dem Start des Terminals sehen Sie auf dem EURUSD-Chart eine Reihe von Artefakten. Mit diesen Artefakten kann nicht umgegangen werden.
Ich füge den geänderten Code des Zickzacks in Form von Text und in Form einer Datei bei.
Ich möchte Sie darauf hinweisen, dass die Parameter des Zickzacks über #propert angegeben werden.
Alle anderen Puffer werden nicht durch #propert gesetzt, da alles, einschließlich der Zickzack-Puffer, dynamisch geändert wird.
Bitte helfen Sie den Terminalentwicklern, diesen Fehler zu beheben.
Bild mit Artefakten:
Alle Puffer müssen initialisiert werden.
Befindet sich auf dem Balken kein Wert im Puffer, muss er explizit in den Puffer geschrieben werden. Mit anderen Worten: Wenn der berechnete Wert in den Puffer ausgegeben werden soll, schreiben Sie ihn in den Puffer, andernfalls schreiben Sie einen leeren Wert.
Befindet sich auf dem Balken kein Wert im Puffer, muss er explizit in den Puffer geschrieben werden. D.h., wenn der berechnete Wert in den Puffer ausgegeben werden soll, schreiben wir ihn in den Puffer, ansonsten schreiben wir einen leeren Wert.
Entschuldigung, ich habe die Initialisierung übersehen. Ich habe es in meinem Programm, habe es aber in dem Beispiel übersehen.
Im Anhang finden Sie eine Datei mit der Initialisierung. Die Wirkung ist dieselbe.
Die Frage an die Entwickler bleibt bestehen. Bitte beheben Sie diesen Fehler.
-------------
Meiner Meinung nach geschieht Folgendes. Wenn das Programm zusammen mit dem Terminal gestartet wird, ist die Größe der Zeitreihe entweder gleich Null oder hat einen Mindestwert.
Das Programm wird auf dem vorhandenen Stück der Geschichte initialisiert. Aber wenn die Größe der Zeitreihe erhöht wird, werden Speicherfragmente, die die Initialisierung nicht durchlaufen haben, für Pufferarrays verwendet. Infolgedessen haben wir diesen Effekt.
Ich habe versucht, diesen Effekt mit Ereignissen des Terminals zu behandeln. Trotzdem erscheinen die Artefakte nur für den Bruchteil einer Sekunde. Und das ist nicht gut. Ein solches Programm darf nicht freigegeben werden.
Hier ist die Lösung für dieses Problem. Nach der Speicherzuweisung für Puffer sollten Sie diesen Speicher sofort löschen. Aber wie können wir das tun? Ich habe eine solche Funktion auf der Seite der Entwickler von Terminalanwendungen nicht gefunden.
Leute, gebt uns ein paar Informationen. Wofür verwenden Sie Alignment?
Das ist Waschbär-orientierte Programmierung!
Leider kann man nicht darauf verzichten ;)
Das ist Waschbär-orientierte Programmierung!
Leider kann man nicht darauf verzichten ;)
Dessen bin ich mir bewusst. Ich bitte Sie nicht, mich über OOP zu belehren. Ich habe gefragt, wer die Anpassung zu welchem Zweck nutzt.
Leute, könnt ihr mir ein paar Informationen geben? Wofür verwenden Sie Alignment?
Das alles ist in einer Multi-Thread-Umgebung sehr nützlich, wie ich sehe. Was hat das MKL damit zu tun? Ich weiß nicht, die Frage wurde gestellt, also bin ich hängen geblieben.
Und im Allgemeinen - das sind die Grundlagen, ein Grundverständnis ist für jeden anständigen Programmierer notwendig.
ZS: Nun, es gibt hier eine Menge Geschwindigkeitsfanatiker, wenn sie anfangen, alles intelligent auszurichten, sollten sie noch schneller fliegen, zumindest theoretisch.Leute, gebt uns ein paar Informationen. Wofür verwenden Sie Alignment?
Vict:
ZS: Nun, es gibt hier eine Menge Geschwindigkeitsfans, wenn sie anfangen, es richtig zu machen, sollte es noch schneller gehen, zumindest theoretisch.
Im Allgemeinen habe ich nicht einmal das erwartet:
Der Code ist etwas zu kompliziert - ich habe versucht, das Element zu treffen, das nicht in die Cache-Zeile passt, und direkt darauf zu hämmern, aber es ist fehlgeschlagen (es wäre wahrscheinlich machbar, wenn ich wollte, aber mir wurde langweilig), und ich habe den Code nicht viel geändert. Aber das ist noch beeindruckender - nur einer von 16 Zusammenbrüchen erfolgt über ein Element, das nicht in die Cache-Zeile fällt, trotzdem ergibt es ein vernünftiges Ergebnis.
SZY: In diesem Fall ist es objektiver, RIGHT_ALIGNED zu machen, indem man zwei kurze Zeilen einfügt, anstatt eine einzige zu entfernen (so erreichen wir zwei Aktualisierungen der Cache-Zeile für beide Fälle). Der Geschwindigkeitszuwachs ist bescheidener, aber immer noch etwa 1,5-mal so groß.
Übrigens, in mql ist der Standardwert für pack 1, sozusagen.
Nach dem vorherigen Beitrag zu urteilen, ist es vielleicht sinnvoll, 8 ausdrücklich für alle Strukturen und Klassen vorzuschreiben.
Ich kann den Fehler nicht beheben.
Ich habe das Zickzack aus der Metatrader-Lieferung genommen, um den Fehler zu demonstrieren. Dem Code wurden zusätzliche Puffer hinzugefügt, die aus meinem Programm stammen. In diesem Code sind keine Manipulationen mit zusätzlichen Puffern vorgesehen. Sie dienen nur dazu, den Fehler zu demonstrieren.
Dieser Zickzackkurs wurde auf dem H1-Zeitrahmen des EURUSD aufgezeichnet. Schließen Sie das Terminal. Alle generierten Zeitreihen für EURUSD wurden aus der Historie gelöscht. D.h. ich habe alle *.hcc und *.hc Dateien des Währungspaares EURUSD gelöscht. Dies wurde getan, um das Laden von .hcc-Dateien und die Erzeugung von .hc-Dateien aus einem sauberen Blatt sicherzustellen.
Nach dem Start des Terminals sehen Sie auf dem EURUSD-Chart eine Reihe von Artefakten. Mit diesen Artefakten kann nicht umgegangen werden.
Ich füge den geänderten Code des Zickzacks in Form von Text und in Form einer Datei bei.
Ich möchte Sie darauf hinweisen, dass die Parameter des Zickzacks über #propert angegeben werden.
Alle anderen Puffer werden nicht durch #propert gesetzt, da alles, einschließlich der Zickzack-Puffer, dynamisch geändert wird.
Bitte helfen Sie den Terminalentwicklern, diesen Fehler zu beheben.
Bild mit Artefakten:
Ich kann den Fehler nicht beheben.
Ich habe das Zickzack aus der Metatrader-Lieferung genommen, um den Fehler zu demonstrieren. Dem Code wurden zusätzliche Puffer hinzugefügt, die aus meinem Programm stammen. In diesem Code sind keine Manipulationen mit zusätzlichen Puffern vorgesehen. Sie dienen nur dazu, den Fehler zu demonstrieren.
Dieser Zickzackkurs wurde auf dem H1-Zeitrahmen des EURUSD aufgezeichnet. Schließen Sie das Terminal. Alle generierten Zeitreihen für EURUSD wurden aus der Historie gelöscht. D.h. ich habe alle *.hcc und *.hc Dateien des Währungspaares EURUSD gelöscht. Dies wurde getan, um das Laden von .hcc-Dateien und die Erzeugung von .hc-Dateien aus einem sauberen Blatt sicherzustellen.
Nach dem Start des Terminals sehen Sie auf dem EURUSD-Chart eine Reihe von Artefakten. Mit diesen Artefakten kann nicht umgegangen werden.
Ich füge den geänderten Code des Zickzacks in Form von Text und in Form einer Datei bei.
Ich möchte Sie darauf hinweisen, dass die Parameter des Zickzacks über #propert angegeben werden.
Alle anderen Puffer werden nicht durch #propert gesetzt, da alles, einschließlich der Zickzack-Puffer, dynamisch geändert wird.
Bitte helfen Sie den Terminalentwicklern, diesen Fehler zu beheben.
Bild mit Artefakten:
Alle Puffer müssen initialisiert werden.
Befindet sich auf dem Balken kein Wert im Puffer, muss er explizit in den Puffer geschrieben werden. Mit anderen Worten: Wenn der berechnete Wert in den Puffer ausgegeben werden soll, schreiben Sie ihn in den Puffer, andernfalls schreiben Sie einen leeren Wert.
Im Allgemeinen habe ich das gar nicht erwartet:
Bei meinen eigenen Versuchen habe ich keinen merklichen Unterschied festgestellt.
Wenn anstelle von
Forum zum Thema Handel, automatisierte Handelssysteme und Strategietests
Wanzen, Wanzen, Fragen
Vict, 2019.07.09 07:17
Data data[32768];machen.
Es gibt eine 6-fache Verlangsamung!
Alle Puffer müssen initialisiert werden.
Befindet sich auf dem Balken kein Wert im Puffer, muss er explizit in den Puffer geschrieben werden. D.h., wenn der berechnete Wert in den Puffer ausgegeben werden soll, schreiben wir ihn in den Puffer, ansonsten schreiben wir einen leeren Wert.
Entschuldigung, ich habe die Initialisierung übersehen. Ich habe es in meinem Programm, habe es aber in dem Beispiel übersehen.
Im Anhang finden Sie eine Datei mit der Initialisierung. Die Wirkung ist dieselbe.
Die Frage an die Entwickler bleibt bestehen. Bitte beheben Sie diesen Fehler.
-------------
Meiner Meinung nach geschieht Folgendes. Wenn das Programm zusammen mit dem Terminal gestartet wird, ist die Größe der Zeitreihe entweder gleich Null oder hat einen Mindestwert.
Das Programm wird auf dem vorhandenen Stück der Geschichte initialisiert. Aber wenn die Größe der Zeitreihe erhöht wird, werden Speicherfragmente, die die Initialisierung nicht durchlaufen haben, für Pufferarrays verwendet. Infolgedessen haben wir diesen Effekt.
Ich habe versucht, diesen Effekt mit Ereignissen des Terminals zu behandeln. Trotzdem erscheinen die Artefakte nur für den Bruchteil einer Sekunde. Und das ist nicht gut. Ein solches Programm darf nicht freigegeben werden.
Hier ist die Lösung für dieses Problem. Nach der Speicherzuweisung für Puffer sollten Sie diesen Speicher sofort löschen. Aber wie können wir das tun? Ich habe eine solche Funktion auf der Seite der Entwickler von Terminalanwendungen nicht gefunden.