Fehler, Irrtümer, Fragen - Seite 1871

 
Slava:
Und es sollte nicht möglich sein


1. wann ist die Einführung der Gewerkschaft geplant?

2. Werden auch Typendefinitionen eingegeben?

3. Ist die Einführung von Zeigern auf Grundtypen geplant?
 
Konstantin:


1. Wann ist die Einführung der Gewerkschaft geplant?

2. Wird typedef auch mit union eingeführt werden?

3. ist die Einführung von Zeigern auf Grundtypen geplant?

1. Bald. Im Compiler ist alles fertig, wir testen es jetzt. Wir werden sie nach den Tests veröffentlichen.

2. Es ist noch nicht bekannt, wann

3. nein, nicht geplant.

 

Aus irgendeinem GrundändertCopyTime (oder ein ähnliches Programm)die Größe des Empfangsarrays, selbstwenn dieGröße des Empfangsarrays größer ist als die zu kopierende Größe.

Meine Herren, ist das normal? War das schon immer so? Oder ein Fehler?

Zum Beispiel:

static datetime TimeBuf[]; 

if (ArraySize(TimeBuf) == 0) ArrayResize(TimeBuf, 10);

CopyTime(_Symbol, _Period, 0, 1, TimeBuf);

Die Funktion CopyTime ändert die Größe des TimeBuf-Arrays auf 1.

Dies ist prinzipiell falsch.

Das wäre kein Problem, wenn es nicht eine wichtige Nuance gäbe: Die Daten werden an den Anfang des Arrays kopiert, und folglich geht der ganze Sinn der Optimierung an der Wurzel verloren.

 
Marat Sultanov:

Aus irgendeinem GrundändertCopyTime (oder ein ähnliches Programm)die Größe des Empfangsarrays, selbstwenn dieGröße des Empfangsarrays größer ist als die zu kopierende Größe.

Meine Herren, ist das normal? War das schon immer so? Oder ein Fehler?

Zum Beispiel:

Die Funktion CopyTime ändert die Größe des TimeBuf-Arrays auf 1.

Dies ist prinzipiell falsch.

Das wäre nicht so schlimm, gäbe es da nicht eine wichtige Nuance: Die Daten werden am Anfang des Arrays kopiert, und folglich geht der ganze Sinn der Optimierung an der Wurzel verloren.

Ihr Angebot ist dynamisch! Das heißt, mit einer variablen Größe. Da Sie die Dimension nicht in eckigen Klammern angegeben haben.

Das Wort statisch bedeutet, dass das Objekt dieses Arrays beim Laden des Expert Advisors erstellt und beim Entladen wieder zerstört wird.

 
Slava:

Ihr Angebot ist dynamisch! Das heißt, mit einer variablen Größe. Da Sie die Abmessungen nicht in eckigen Klammern angegeben haben.

Das Wort statisch bedeutet, dass das Objekt dieses Arrays beim Laden von EA erstellt und beim Entladen zerstört wird

Es tut mir leid, aber Sie haben das Thema verfehlt.

Das Array soll im globalen Bereich deklariert werden

datetime _TimeBuf[]; 

void OnTick()
{}

Dann:

1) Beim ersten Mal kopieren wir (CopyTime) in das Array, wie viele Balken es gibt.

datetime _TimeBuf[];
int      _BarsCountReserveSize;

void OnTick()
{
   int BarsCount = Bars(_Symbol, _Period);
   
   if (ArraySize(_TimeBuf) == 0)
   { 
      if (_BarsCountReserveSize <= BarsCount) _BarsCountReserveSize = (int)ceil(BarsCount*1.3);

      ArrayResize(_TimeBuf, BarsCount, _BarsCountReserveSize);

      CopyTime(_Symbol, _Period, 0, BarsCount, _TimeBuf);
   }
}

2) Wenn ein neuer Balken erscheint, wollen wir doch nicht alle Balken kopieren, oder? Daher beschließen wir, nur die letzten 2 geänderten Takte zu kopieren.

datetime _TimeBuf[];
int      _BarsCountReserveSize;

void OnTick()
{
   int BarsCount = Bars(_Symbol, _Period);
   
   if (ArraySize(_TimeBuf) == 0)
   { 
      _BarsCountReserveSize = (int)ceil(BarsCount*1.3);

      ArrayResize(_TimeBuf, BarsCount, _BarsCountReserveSize);

      CopyTime(_Symbol, _Period, 0, BarsCount, _TimeBuf);
   }
   else
   {
      int RequiredCount = BarsCount - ArraySize(_TimeBuf) + 1;
      
      ArrayResize(_TimeBuf, RequiredCount, _BarsCountReserveSize);

      CopyTime(_Symbol, _Period, 0, RequiredCount, _TimeBuf);
   }
}

3) Am Ende funktioniert unsere Optimierung nicht, weilCopyTime die Größe des Arrays ändert und die Größe =RequiredCount setzt, und wir die Reservegröße verlieren(CopyTime ist sich dessen nicht bewusst).

 

Diese Situation würde nicht auftreten, wenn CopyTime direkt vom Ende des Arrays zum Startpunkt kopieren würde:

am Standort:

_TimeBuf[0] = D'2017.01.01';
_TimeBuf[1] = D'2017.01.02';
_TimeBuf[2] = D'2017.01.03';

es:

const int ArrSize = ArraySize(_TimeBuf);

_TimeBuf[ArrSize-3] = D'2017.01.01';
_TimeBuf[ArrSize-2] = D'2017.01.02';
_TimeBuf[ArrSize-1] = D'2017.01.03';
 

Kopierfunktionen haben schon immer die Größe eines dynamischen Arrays verändert. Auf eine größere oder kleinere Größe. Aber es gab immer eine klare Übereinstimmung mit der Anzahl der Datensätze, die als Ergebnis der Abfrage angegeben wurden.

In Ihrem Fall die ursprüngliche Abfrage an ein Array mit dynamisch anpassbarer Größe. Alle anderen Anfragen, die jeweils ein Element anfordern, erfolgen in einem Array mit einer vordefinierten Größe (datetime _TimeBuf1[1]), so dass es keine Umverteilung gibt. Selbständige Neuzuweisung des empfangenen Elements an ein großes dynamisches Array

 

Das war also schon immer so, und das ist normal. Ich verstehe. Vielen Dank für Ihre Antwort!

Ich war mir der Vergrößerung bewusst, aber nicht der Verkleinerung auf die Größe der angeforderten Daten. Jetzt weiß ich Bescheid, danke!

 

MT4 Build 1065

Test auf USDJPY TF M15

aus dem Ergebnisprotokoll:

406 2014.11.28 20:30 sell 18 5.50 118.641 0.000 117.015 0.00
521 2014.12.09 17:15 t/p 18 5.50 118.386 0.000 118.386-148.95

Wie kommt der Verlust zustande?
 
-Aleks-:

Wie kommt der Verlust zustande?

Tauschen.
Grund der Beschwerde: