Prüfung von Echtzeit-Prognosesystemen - Seite 52

 
grasn >> :

immer noch weniger als 1,55 :o) Schauen wir mal

Sehr wahrscheinlich ^_^, zumindest wenn man sich die Optionen ansieht

Visuelle CME-Optionen

 
grasn писал(а) >>

(1) Wie wird ein mehrdimensionales Feld (mit allen Dimensionen) korrekt initialisiert? Dieser Code, so wie ich ihn verstehe, ist korrekt für ein eindimensionales Array und die erste gefundene Dimension in einem mehrdimensionalen Array:

double memRow[];

ArrayResize(memRow, N);
ArrayInitialize(memRow, 0.0);

Aber was macht man mit mehr Dimensionen?

(2) Wie lassen sich univariate und multivariate Arrays dynamisch erweitern?

In diesem Fall sollte sich das Array memRow[] bei jeder Iteration um einen bestimmten Wert erhöhen, der Einfachheit halber sei dies 1. Ähnlich sollte es bei einem 2D-Array in zwei Richtungen um i und j wachsen - memRow[i][j]

(1) Dies ist richtig und gilt auch für mehrere Dimensionen. Die Initialisierung setzt einen Wert in alle Elemente des Arrays, unabhängig von der Dimensionalität.

(2) Das wird leider nicht funktionieren. In MKL4 können Sie nur die Dimensionalität der ersten Dimension eines mehrdimensionalen Arrays ändern. Vielleicht wird dies in MKL5 korrigiert.

 
NEKSUS_ >> :

Sehr wahrscheinlich ^_^, zumindest wenn man sich die Optionen ansieht

Visuelle CME-Optionen

Woher kommen diese schönen Daten?

 
dentraf >> :

Woher haben Sie so schöne Daten?

Die Daten sind ganz gewöhnlich, und ob sie hübsch sind oder nicht, ist Sache des Autors ^_^

 

grasn, wenn die Programmierung in MQL4 kein Selbstzweck ist, wäre es dann nicht besser, die wichtigsten Teile des Projekts, vor allem, wenn sie mehrdimensionale Arrays für die normale Implementierung erfordern, in C zu schreiben und sie als DLL anzuhängen? Es wird schneller funktionieren und bequemer zu debuggen sein, und der Quellcode wird besser lesbar sein (ohne den Ärger mit vielen Arrays, indirekter Indizierung und anderen Dingen, die wir in MQL erfinden müssen, um seine Einschränkungen zu umgehen).

 
grasn >> :

Ich prognostiziere Realisierungen (Trajektorien), aber wenn ich Handelsentscheidungen treffe, konzentriere ich mich auf "Häufigkeits"-Merkmale, z.B. den Durchschnittswert von +/- den wahrscheinlichsten Trajektorien im Prognosehorizont. Diese sind zuverlässiger, was die Ziele betrifft, aber der Kursverlauf bis zu diesen Niveaus kann sehr verworren sein. Ich arbeite natürlich an dem zweiten Ansatz, um lokale Umkehrzonen abzuschätzen. Wie für MM als solche - es ist nicht so einfach, es muss eine separate ernsthafte Aufgabe sein.

Genau aus diesem Grund, um den es hier geht, bin ich dabei, den Code von MathCAD nach MT zu übersetzen. Es ist statistisch sinnvoll, einen Testzeitraum von mindestens 6 Monaten (nach Augenmaß) zu wählen. Ich werde den Status also etwas später bekannt geben.


Übrigens, ich habe eine Frage zur Programmierung, weil ich nicht weiterkomme (ich bin kein guter Programmierer):

(1) Wie wird ein mehrdimensionales Array (mit allen Dimensionen) richtig initialisiert? Dieser Code, so wie ich ihn verstehe, ist korrekt für ein eindimensionales Array und die erste gefundene Dimension in einem mehrdimensionalen Array:

double memRow[];

ArrayResize(memRow, N);
ArrayInitialize(memRow, 0.0);


Aber was macht man mit mehr Dimensionen?


(2) Wie lassen sich univariate und multivariate Arrays dynamisch erweitern?



for(i=0; i<=N-1; i++)

{

...

memRow[];

...

}


In diesem Fall sollte das Array memRow[] bei jeder Iteration um einen Wert wachsen, egal um welchen, der Einfachheit halber sei es 1. Ähnlich sollte es bei einem 2D-Array in zwei Richtungen um i und j wachsen - memRow[i][j].


Offenbar muss der Zugriff auf ein mehrdimensionales Array als Funktion implementiert werden.


Sie haben zum Beispiel ein eindimensionales Array a[n]


dann nehmen wir an, wir wollen es als dreidimensionales Feld i,k,j verwenden


dann wird das Element (i,k,j) im Array a adressiert, als a[i*3+k*2+j]


Und so weiter...

 

an Yurixx

(1) Все правильно и для нескольких измерений точно так же. Инициализация прописывает одно значение во все элементы массива независимо от размерности.

(2) Das wird leider nicht funktionieren. In MKL4 können Sie nur die Dimensionalität der ersten Dimension eines mehrdimensionalen Arrays ändern. Vielleicht wird das in MKL5 behoben.

Ich freue mich, Sie in unserem sicheren Hafen zu sehen :o). Und es ist gut, dass es im Gegensatz zu den benachbarten Branchen, in denen die menschlichen Leidenschaften toben, auf einem ebenen Platz ruhig ist. Eine kleine Zusammenfassung zum besseren Verständnis. Angenommen, es gibt ein solches Konstrukt:

double memRow[];

...

<какая то первая инициализация массива>

j=1

for(int i=0; i<=N-1; i++)

{

if(<какое то условие>)

{

ArrayResize(memRow, j+1);

<запись значений в расширенный массив>

...

}

}


Wie ich verstanden habe, wird es dynamisch Array memRow[] erhöhen, wenn einige Bedingung auslöst. D.h. ich kenne die Länge des Arrays nicht im Voraus. Habe ich es richtig verstanden?


an Marketeer

Wenn die Programmierung in MQL4 kein Selbstzweck ist, wäre es dannnicht besser, die wichtigsten Teile des Projekts, insbesondere wenn sie mehrdimensionale Arrays für die normale Implementierung erfordern, in C zu schreiben und sie als DLL anzuhängen? Es wird schneller funktionieren und bequemer zu debuggen sein, und der Quellcode wird besser lesbar sein (ohne kompliziertes Zeug mit einem Haufen von Arrays, indirekter Indizierung und anderem Zeug, das wir in MQL erfinden müssen, um seine Beschränkungen zu umgehen).

Meine Programmierung in C/C++ ist noch schlechter als in MQL. Und ich habe seit etwa 15 Jahren nicht mehr programmiert. Nun möchte ich ein erstes Ergebnis erhalten, auf dessen Grundlage ich einige Schlussfolgerungen ziehen werde. Natürlich werde ich keine Leistung erhalten, aber das System wird irgendwie im automatischen Modus arbeiten. Zumindest hoffe ich das. :о)


Aber Sie haben natürlich recht, in Zukunft werde ich einige Funktionen durch dll ersetzen, und vielleicht das ganze System.


zur Sol

Offenbar muss der Aufruf eines mehrdimensionalen Arrays als Funktion implementiert werden.

Sie haben zum Beispiel ein eindimensionales Array a[n]

Nehmen wir dann an, wir wollen es als dreidimensionales Array i,k,j verwenden

dann wird das Element (i,k,j) im Array a adressiert, als a[i*3+k*2+j]

Und so weiter...

Das ist eine interessante Idee, aber bei jeder Iteration, die zu einer Änderung der Matrixdimension führt, müsste das gesamte Array neu zusammengesetzt (oder neu aufgebaut) werden. Es ist aber wahrscheinlich machbar. Danke für diese Idee.

 
grasn писал(а) >>

Angenommen, es gibt ein solches Konstrukt:

double memRow[];

...

<какая то первая инициализация массива>

j=1

for(int i=0; i<=N-1; i++)

{

if(<какое то условие>)

{

ArrayResize(memRow, j+1);

<запись значений в расширенный массив>

...

}

}

Wie ich verstanden habe, wird es dynamisch Array memRow[] erhöhen, wenn einige Bedingung auslöst. D.h. ich kenne die Länge des Arrays nicht im Voraus. Habe ich es richtig verstanden?

Ein kleiner Ratschlag. Vergrößern Sie das Array nicht um 1 Element in der Schleife. Halten Sie die Anzahl der benutzten (gefüllten) Elemente in einer zusätzlichen Variablen fest und vergrößern Sie das Array um etwa ein Dutzend Elemente (Sie können das für Ihre Aufgabe leicht abschätzen), wenn Sie keinen Platz mehr haben. Auf diese Weise können Sie einen erheblichen Leistungsgewinn erzielen. // Allerdings bin ich nicht damit vertraut, wie Speicher für Arrays im Terminal zugewiesen wird. Wenn Speicher mit einer gewissen Reserve für den Fall einer Arrayvergrößerung zugewiesen wird, wird ArrayResize(memRow, j+1) sehr schnell ausgeführt.

 
lea >> :

Ein Ratschlag. Vergrößern Sie das Array in der Schleife nicht um 1 Element. Halten Sie die Anzahl der benutzten (gefüllten) Elemente in einer zusätzlichen Variablen fest und vergrößern Sie das Array um etwa ein Dutzend Elemente (Sie können dies für Ihre Aufgabe schätzen), wenn der Platz nicht ausreicht. Auf diese Weise können Sie einen erheblichen Leistungsgewinn erzielen. // Allerdings bin ich nicht damit vertraut, wie Speicher für Arrays im Terminal zugewiesen wird. Wenn Speicher mit einer gewissen Reserve für den Fall einer Arrayvergrößerung zugewiesen wird, wird ArrayResize(memRow, j+1) sehr schnell ausgeführt.

Danke, ich werde es ausprobieren, aber ich kann nicht einschätzen, was optimaler ist. Andererseits kenne ich bei einem kleinen Array auch nicht seine Dimensionalität, und außerdem muss ich bei dieser Implementierung das Array verdoppeln, zuerst das kleine und dann das große, in dem die berechneten Werte akkumuliert werden. Aber es ist Zeit zu experimentieren, danke für den Rat.

 

an Yurixx

Ich schlage vor, den guten alten Fingerhut zu spielen, man kann alle Strategien anwenden und überall suchen :o) Prognose für EURUSD M15 für 300 Stichproben (von Montag bis einschließlich Mittwoch):

Option 1:



Prozess-Entropie: 13,84



Variante 2:


Prozess-Entropie: 13,01



Option 3:


Prozess-Entropie: 14,36


Welchen Fingerhut nimmst du in die Hand? :о)

Dateien:
process_2.rar  5 kb