Wer will eine Strategie? Lose und kostenlos) - Seite 61

 
Stellarator >> :

Meine Freunde riefen mich an, um das Auto zu betrügen...

>> nun ja...

Und sie sagen Krise ;)

 

Es sieht so aus, als müssten wir einen Vergleich nach dem anderen anstellen, bis alle Probleme gelöst sind.

Hier habe ich FSB Accelerator Oscillator mit MT iAC(...) verglichen:



Wie man das macht:

1. die Devisenkurse von FSB mit den aktuellen Kursen von MT aktualisieren (in MT Strg+S drücken und die Datei xxxxxx.csv im Verzeichnis FSB./Data speichern) Wenn sich Ihre Daten in einem anderen Ordner befinden, verwenden Sie Markt -> Datenverzeichnis von FSB, um dorthin zu gelangen).

2. erstellen Sie das Skript Indicator_Values.mq4, das den gewünschten Indikator druckt. (Das Skript befindet sich auf der Seite des vorherigen Forums).

3. setzen Sie dieses Kennzeichen in FSB. (Stellen Sie sicher, dass Sie die gleichen Parameter verwenden.) Exportieren Sie den FSB-Indikator mit der Funktion Export -> Indikatoren.

4 Wenn Sie einen Unterschied feststellen, melden Sie ihn bitte.


Wir wünschen Ihnen viel Glück!


------------

Bearbeiten:

Bitte verwenden Sie die aktuelle FSB v2.8.3.5 Beta

 
Miroslav_Popov >> :

Die klassische Formel lautet: Momentum(n) = Close - Close(n)

Dies ist die Formel, die die FSB verwendet.

MT verwendet: Momentum(n) = 100 * Close / Close(n)

Das weiß ich. Ich habe mich auf die Indikatorparameter bezogen. Glättungszeitraum. Glättungsmethode. Wir legen sie nicht fest. Welche Parameter werden standardmäßig übernommen: 0,0?

 

Hallo zfs,


Sie können die Standardparameter im Dialogfenster Indikatorparameter sehen. ( Pressevorgabe)



Beachten Sie, dass der Zeitraum "Zusätzliche Glättung" = 0 ist. Das bedeutet, dass keine Glättung vorgenommen wird.


Der zweite Ort, an dem Sie die Standardwerte sehen können, ist der Quellcode:


        /// <summary>
        /// Sets the default parameters for the designated slot type
        /// </summary>
        public Momentum( SlotTypes slotType)
        {
            sIndicatorName  = "Momentum";
            parameters      = new IndicatorParam();
            component       = new IndicatorComp[] { };
            bSeparatedChart = true;
            bIsCalculated   = false;

            // The indicator name
            parameters. IndicatorName = sIndicatorName;

            // The slot type
            parameters. SlotType = slotType;

            // The ComboBox parameters
            parameters. ListParam[0]. Caption  = "Logic";
            parameters. ListParam[0]. ItemList = new string[]
            {
                "The Momentum rises",
                "The Momentum falls",
                "The Momentum is higher than the Level line",
                "The Momentum is lower than the Level line",
                "The Momentum crosses the Level line upward",
                "The Momentum crosses the Level line downward",
                "The Momentum changes its direction upward",
                "The Momentum changes its direction downward"
            };
            parameters. ListParam[0]. Index    = 0;
            parameters. ListParam[0]. Text     = parameters. ListParam[0]. ItemList[ parameters. ListParam[0]. Index];
            parameters. ListParam[0]. Enabled  = true;
            parameters. ListParam[0]. ToolTip  = "Logic of application of the indicator.";

            parameters. ListParam[1]. Caption  = "Smoothing method";
            parameters. ListParam[1]. ItemList = Enum. GetNames( typeof( MAMethod));
            parameters. ListParam[1]. Index    = 0;
            parameters. ListParam[1]. Text     = parameters. ListParam[1]. ItemList[ parameters. ListParam[1]. Index];
            parameters. ListParam[1]. Enabled  = true;
            parameters. ListParam[1]. ToolTip  = "The Moving Average method used for smoothing the Momentum value.";

            parameters. ListParam[2]. Caption  = "Base price";
            parameters. ListParam[2]. ItemList = Enum. GetNames( typeof( BasePrice));
            parameters. ListParam[2]. Index    = 3;
            parameters. ListParam[2]. Text     = parameters. ListParam[2]. ItemList[ parameters. ListParam[2]. Index];
            parameters. ListParam[2]. Enabled  = true;
            parameters. ListParam[2]. ToolTip  = "The price the Momentum is based on.";

            // The NumericUpDown parameters
            parameters. NumParam[0]. Caption = "Period";  <----- Parameter Name
            parameters. NumParam[0]. Value   = 10;        <----- Default Value
            parameters. NumParam[0]. Min     = 1;
            parameters. NumParam[0]. Max     = 200;
            parameters. NumParam[0]. Enabled = true;
            parameters. NumParam[0]. ToolTip = "The period of Momentum.";
 
            parameters. NumParam[1]. Caption = "Additional smoothing"; <----- Parameter Name 
            parameters. NumParam[1]. Value   = 0;        <----- Default Value
            parameters. NumParam[1]. Min     = 0;
            parameters. NumParam[1]. Max     = 200;
            parameters. NumParam[1]. Enabled = true;
            parameters. NumParam[1]. ToolTip = "The period of additional smoothing.";

            parameters. NumParam[2]. Caption = "Level";  <----- Parameter Name
            parameters. NumParam[2]. Value   = 0;        <----- Default Value
            parameters. NumParam[2]. Min     = -100;
            parameters. NumParam[2]. Max     = 100;
            parameters. NumParam[2].Point   = 4;
            parameters. NumParam[2]. Enabled = true;
            parameters. NumParam[2]. ToolTip = "A critical level (for the appropriate logic).";

            // The CheckBox parameters
            parameters. CheckParam[0]. Caption = "Use previous bar value";
            parameters. CheckParam[0]. Checked = Data. Strategy. PrepareUsePrevBarValueCheckBox( slotType);
            parameters. CheckParam[0]. Enabled = true;
            parameters. CheckParam[0]. ToolTip = "Use the indicator value from the previous bar.";
        }
 
Miroslav_Popov >> :

Hallo zfs,

Ich habe nicht an Ihrer prinzipiellen Makellosigkeit gezweifelt. Das Problem ist, dass die Endwerte der Indikatoren für mich trotzdem nicht übereinstimmen. Oder haben sie das nicht? Ich habe jetzt leider keine Zeit, das zu überprüfen.

 

Zfs,

Mit Hilfe von Stellarator habe ich viele Probleme in FSB behoben. Ich habe auch die Standardparameter von FSB so geändert, dass sie in MT wie folgt aussehen. Ich hoffe, dass die meisten Unterschiede bereits behoben sind.


Bitte zögern Sie nicht, etwaige Fehler zu melden. Alle Rückmeldungen und Kritiken sind sehr willkommen.

 
Stellarator >> :

Ich muss Sie davon abbringen! Die entscheidende Nuance ist der "Grenzwert für eine Iteration des EA". Innerhalb dieser Grenzen wird der Indikator also EINMAL (bei seinem ersten Aufruf) berechnet! Ich erkläre dies mit 100%igem Vertrauen. Alle nachfolgenden Aufrufe starten() es überhaupt nicht, sondern entnehmen nur die notwendigen Werte aus den notwendigen Puffern. Die Bedingung ist 100%, wenn die Eingabeparameter unverändert bleiben (mit Ausnahme des Puffers und des Offsets). Die Regel funktioniert, wenn die Berechnungen innerhalb eines einzigen Instruments durchgeführt werden. Aber ich denke, das Prinzip gilt auch dann, wenn sich iCustom auf andere TFs und Tools bezieht.


Ich bin daran interessiert, einen Expert Advisor zu schreiben, der für den Indikator für den Wert des Indikators in der aktuellen Minute auf der 0th bar 240 mal gilt. D.h. es stellt sich heraus, dass die Ausgabe immer den ersten Wert hat? Bitte bestätigen Sie das, denn das ist mir neu.

 
zfs >> :

Off-Topic-Frage, ich habe gerade in das Schreiben eines Expert Advisor, die auf der 0th bar 240 mal den Indikator für den Wert des Indikators in der aktuellen Minute zugreift beteiligt. D.h. es stellt sich heraus, dass die Ausgabe immer der erste Wert ist? Bitte bestätigen Sie das, denn das ist mir neu.

>> Der Expert Advisor beginnt bei jedem neuen Tick neu, und dies ist eine andere Iteration, und daher werden die Indikatorwerte anders sein.

 
rider >> :

Der EA wird bei jedem neuen Tick neu gestartet, und dies ist eine andere Iteration, und daher werden die Indikatorwerte anders sein.

Wenn Sie den Parameter "Use previous bar value" korrekt verwenden, benötigen Sie den aktuellen Barwert des Indikators nicht.

Nehmen wir an, Sie verwenden MA(simple, 12, close) in einem Tagesdiagramm. Um diesen MA korrekt zu berechnen, benötigen Sie die Schlusskurse von 12 Bars.

Wenn es jetzt 15 Uhr ist, ist der aktuelle "Schlusskurs" nicht der tatsächliche Schlusskurs des Balkens. Sie wird bis 12 Uhr geändert. Die Verwendung des MA für den aktuellen Balken beinhaltet also nicht den tatsächlichen Schlusskurs, sondern einen vorläufigen. Gleichzeitig verwendet der Backtest den realen (bereits festgelegten) Schlusskurs der historischen Balken. Diese Praxis wird Unterschiede zwischen dem Backtest und dem realen Handel mit sich bringen.


Noch schlimmer:

Sehen wir uns die logische Regel "Ein FastMA geht über einen SlowMA" an, wobei beide MAs auf dem Schlusskurs basieren.

Wenn der Markt im Laufe des Tages schnell ansteigt, kann der FastMA über den SlowMA kreuzen, was ein Kaufsignal auslöst. Sie werden auf das Signal hin kaufen. Wenn der Markt nach dem Abschluss nach unten geht und so niedriger schließt, wird sich der FastMA unter den Slow bewegen. Verstehen Sie das Problem? Sie haben bereits vor der Schließung der Bar gekauft. Wenn Sie diese Strategie später backtesten, werden Sie sehen, dass es kein solches Kaufsignal für diesen Balken gibt. Sie werden dem Backtester die Schuld geben, aber das Problem liegt in der falschen Strategielogik.


Der Forex Strategy Builder schützt Sie vor solchen logischen Fehlern durch die automatische Einstellung des Parameters "Use previous bar value". FSB verwendet niemals wechselnde (noch nicht festgelegte) Indikatoren für das Backtesting. Und in dieser Logik, warum ein EA einen Indikator für jeden Tick berechnen muss, wenn die Strategie ihn nicht verwendet. Eine Berechnung pro Bar ist ausreichend:

- Wenn der Indikator den Eröffnungskurs verwendet, muss die Berechnung zum Zeitpunkt der Bar-Eröffnung erfolgen;

- Wenn der Indikator Close, High, Low oder eine beliebige Kombination der Preise verwendet, muss die Berechnung zum Zeitpunkt des Balkenschlusses erfolgen.






 

Guten Abend zusammen!


Ich bin das Wochenende über ohne Computer :(. Und heute hatte ich wegen der Arbeit einfach nichts zu tun, also... irgendwie...

Aber ich hatte Zeit zum Nachdenken. Und (hoffentlich) strategisch entschieden (in Bezug auf den Indikatorrahmen).

Im Allgemeinen wird die interne Struktur der Indikatoren von nun an ähnlich sein (ich werde sie später beschreiben, vielleicht morgen). Was nach außen hin "heraussticht" (Parameter) - so nah wie möglich an FSB. D.h. ihre Anzahl, ihre Werte (und deren Grenzen) und die durch sie definierte Funktionalität - nun ja... fast eins zu eins :). Es bleiben kleine Nuancen, aber das werden wir im Laufe der Zeit entscheiden.


Ganz kurz (ich gehe jetzt ins Bett, ich werde morgen oder übermorgen wahrscheinlich nicht mehr hier sein, ich habe auf der Arbeit viel zu tun) (nach dem Beispiel von "unserem lieben" RSI :D):

1. Parameter:

// -------- Indicator parameters
extern int     slotType = SLOT_TYPE_OPENFILTER; // SLOT_TYPE_LC
extern int     indLogic = INDICATOR_RISES;      // INDICATOR_RISES <= indLogic <= INDICATOR_CHANGES_DIR_DOWNWARD
extern int     maMethod = MA_METHOD_SMOOTHED;   // MA_METHOD_SIMPLE <= maMethod <= MA_METHOD_SMOOTHED
extern int     basePrice= BASE_PRICE_CLOSE;     // BASE_PRICE_OPEN <= basePrice <= BASE_PRICE_WEIGHTED
extern int     iPeriod  = 14;                   // 1 <= iPeriod <= 200
extern int     dLevel   = 30;                   // 0 <= dLevel <= 100
extern bool    iPrvs    = True;                 // True / False




Ich denke, das ist auf dem Bild schon mehr oder weniger deutlich zu erkennen. Das Einzige, was Schwierigkeiten bereiten kann: slotType und die entsprechenden Werte (die sich vielleicht von FSB unterscheiden, aber in diesem Fall ist das kein entscheidender Punkt):

// Slot Types
#define  SLOT_TYPE_OPEN                   0  // Point of the Position
#define  SLOT_TYPE_CLOSE                  1  // Point of the Position
#define  SLOT_TYPE_OPENFILTER             2  // Logic Condition
#define  SLOT_TYPE_CLOSEFILTER            3  // Logic Condition

Der Rest ist einfach. Die numerischen Werte werden unverändert beibehalten. Werte in ComboBoxen werden von 0 beginnend nummeriert (wie Arrays).

Dienumerischen Werte der Glättungsmethoden und Preiskonstanten unterscheiden sich von denen in MT (ich habe lange darüber nachgedacht, aber beschlossen, aus Gründen der FSB-Kompatibilität aus dem Klischee herauszukommen :) ). All dies, in der Tat, ist getan, damit in der Zukunft die Expert Advisors (oder was die Benutzer selbst schreiben) können "zucken" die Indikatoren leicht und ungezwungen :) (was sie in FSB sahen, ist das, was sie festlegten ("what I see is what I sing")). Grob gesagt:

double dRSI = iCustom(NULL, 0, "-FSB- RSI", 2, 0, 3, 3, 3, 14, 30, 1, 0, 0);

für obiges Beispiel.


2. Zurückgegebene Werte:

Die ersten beiden Indikatorpuffer in jedem Indikator sind für offene Positionen (long bzw. short) oder für logische Bedingungen (1,0 - ja / jeder andere Wert - nein) reserviert. Außerdem haben wir die Indikatorwerte selbst (falls sie für jemanden interessant sein sollten):


Der Inhalt der ersten beiden Puffer werden durch die Logik des Indikators(slotType und indLogic) bestimmt (d.h. noch einmal - es gibt entweder Preise oder 1 / 0 (ich empfehle, es mit "1" zu überprüfen, weil andere Werte nicht nur Null sein können (im Allgemeinen - da der Indikator keinen Wert hat, kann EMPTY_VALUE sein)).


Alle Indikatoren wurden unter Berücksichtigung von IndicatorCounted() optimiert (dies ist im Großen und Ganzen die wichtigste Änderung des ursprünglichen Codes) (Miroslav hat Recht, im allgemeinen Fall - Sie sollten die Indikatorwerte einmal pro Bar neu berechnen (wieder - im allgemeinen Fall... ;)). Aber für eine korrekte visuelle Darstellung und im Allgemeinen (guter Ton)... Im Allgemeinen sollte es nicht viel langsamer werden.


Zum Rendern von farbigen und ähnlichen ("besonders begabten" :)) Indikatoren werden grafische Objekte verwendet (um keine zusätzlichen Puffer zu belegen). Ich habe es selbst getestet und es funktioniert einwandfrei (bei der visuellen Anzeige ist es langsamer als Indikatorpuffer, aber nicht zu kritisch, und wenn iCustom aufgerufen wird, werden die Grafikfunktionen überhaupt nicht aufgerufen, so dass "Überschreitungen" die Geschwindigkeit nicht beeinträchtigen).


Das ist alles für jetzt, ich habe ein paar Fragen an Miroslav, aber ich bin schon erschöpft :), ich werde versuchen, sie morgen zu stellen (aber ich werde, wie ich schon sagte - mit Eile)...


p.s. Bevor Sie die Dateien aus dem Archiv verschieben - löschen Sie die Dateien fsb*.mq4 im Ordner Experts\Indicators\. Der Rest muss nur mit dem alten überschrieben werden. Von nun an werden sich die Konventionen für die Benennung der Dateien nicht mehr ändern (alle Indikatoren werden mit dem Präfix "-FSB-" versehen).

Dateien:
experts_1.rar  148 kb
Grund der Beschwerde: