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

 
Stellarator >> :

Gab es jemals Diskrepanzen zwischen den ursprünglichen Werten und den "nachträglich eingeführten" Werten? immer noch doppelt...)

noch nicht.... alle Probleme entstehen durch Schlamperei :)

Zwangsweise abschrecken! Die entscheidende Nuance - "die Grenze einer Iteration des EA". Nun, innerhalb dieser Grenzen wird der Indikator nur EINMAL (beim 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 (außer Puffer und Offset). Die Regel gilt für Berechnungen innerhalb der Grenzen eines Werkzeugs. Aber ich denke, das Prinzip gilt auch dann, wenn sich iCustom auf andere TFs und Tools bezieht.

Man müsste "gezwungen" werden ..... , alles auf einmal. Danke für eine weitere undokumentierte Funktion :)


 

FSB__Bar_Opening_Bar_Closing.mql4 v0 .0.2 Beta


Markteintritt bei Bar Opening;

Beenden bei Bar Closing (10 Sek. bis Close oder bei der nächsten Öffnung)


** Dies ist nur eine Demo zum Testen von Ein- und Ausstiegspunkten. **


Code-Fragmente:


bool bIsFirstTick;// It is used to catch the Bar Opening.
datetime dtCurrentBarOpeningTime;

int init()
{
   bIsFirstTick = false;
   dtCurrentBarOpeningTime = Time[0];
   return(0);
}

int start()
{
   // Is this the first tick for the bar
   bIsFirstTick = ( dtCurrentBarOpeningTime != Time[0]);
   if( bIsFirstTick)
   {
      dtCurrentBarOpeningTime = Time[0];
   }

...
...



///
/// Exit at a Bar Closing price (almost).
///
/// MetaTrader does not provide an onBarClose event so we are not able to close a position
/// exactly at Bar Closing. We workaround the problem by closing the position within a time span
/// near to the bar closing time. In the cases when there is no any ticks within this period,
/// we close the position att he next bar opening price.
///
int ClosePositionsAtBarClosing(bool bCloseLong, bool bCloseShort, datetime dtClosingTimeSpan)
{
   int  iOrders = OrdersTotal();
   bool bIsOpen = false;

   for(int iOrder = 0; iOrder < iOrders; iOrder++)
   {
      OrderSelect( iOrder, SELECT_BY_POS, MODE_TRADES);
      
      if((OrderType() == OP_BUY || OrderType() == OP_SELL) && OrderSymbol() == Symbol())
      {  // There is an open position for this symbol.

         datetime dtOpeningTime     = Time[0] - TimeSeconds(Time[0]); // The opening time of current bar
         datetime dtClosingTime     = dtOpeningTime + Period() * 60;  // The closing time of current bars
         datetime dtCurrentTickTime = TimeCurrent() ;                 // The time of current tick
         
         if( dtCurrentTickTime > dtClosingTime - dtClosingTimeSpan ||  bIsFirstTick)
         {  // The current tick is within the closing time span or this is the first tick of the bar.

            // Code

         }
       }
    }
}
 

1. in Bezug auf die Leistung:

Meistens müssen wir einen Indikator nicht für jeden Tick neu berechnen. (Ein Indikator muss entweder bei "Bar Opening" oder bei "Bar Closing" berechnet werden.


2. fMicron:

Ich verwende fMicron = Point/2, wenn ich Preise für Handelsentscheidungen vergleiche. Dies gilt jedoch nicht für die Indikatoren. Beispiel. für USDJPY Punkt = 0,01; fMicron = 0,005.

0,000075 ist das Ergebnis zahlreicher Tests im Laufe der Jahre. Ich habe 2001 mit der Arbeit an FSB begonnen :) Das hat natürlich nichts zu bedeuten. Ich habe meine Meinung darüber oft geändert.

**Bearbeitung: MT gibt dies in die Hände der Nutzer. Wahrscheinlich können die EA-Gurus sagen, was sie in ihren EAs verwenden.

**edit2: Ich werde diesen Parameter für Experimente in die Konfigurationsdatei aufnehmen.


3. ich werde anfangen, den Original-Quellcode für jede FSB-Version zum Download bereitzustellen. In einem solchen Fall muss ich die Website nicht für jede kleine Änderung aktualisieren.


Ich habe angefangen, float in double zu ändern. Ich werde diese Version bald heute Abend oder morgen veröffentlichen. Danach müssen wir es gründlich testen. Wir müssen für jeden Indikator passieren, um einige Probleme / Funktionen zu beheben, bevor wir sie in MQL schreiben.

 

1. Ja, in den meisten Fällen (angesichts des allgemeinen Ansatzes von FSB bei der Eröffnung/Schließung von Positionen (bei Bar Opening/bei Bar Closing)) - Dies ist nicht erforderlich. Aber, sagen wir mal, die Regeln des guten Benehmens sind obligatorisch. Berechnung des Indikators "von Null" jedes Mal (auch einmal bei Bar) - im Allgemeinen (ich stimme zu) nicht kritisch innerhalb der Grenzen der großen Perioden... Aber was ist, wenn die Zeitspanne Minuten beträgt? Und was ist, wenn der Indikator immer noch jeden Balken berechnet werden muss (oder will)? (Irgendein ausgeklügelter Punkt der Position, der nicht (oder nicht mehr, weil der Eröffnungskurs unter dem Niveau der Stops liegt) von einer Order aufgefangen werden kann)?

Die Umwandlung ist in der Tat nicht sehr kompliziert - ja, es gibt etwas Code "im Wrapper" und das Prinzip des Balkenlaufens wird umgekehrt. Das ist im Großen und Ganzen auch schon alles. Das Wichtigste ist, den Algorithmus beizubehalten (damit er im Quellcode leicht gelesen und identifiziert werden kann) und die parametrische Kompatibilität mit FSB zu wahren. Schaffen Sie einen praktischen Mechanismus für die Signalextraktion. Und um es für reine Grafikdesigner (die sich nicht für EA interessieren) nutzbar zu machen. Meiner Meinung nach.


2. Nun, ich habe nicht vorgeschlagen, die Point/2-Variante zu verwenden, um (gleiche) Indikatorwerte zu vergleichen :). - Ich habe nur eine Konstante vorgeschlagen. Die Frage ist in seinem Wert und Dimension (0,000075 - nicht schlecht, ich habe nicht gesagt, dass - ich verstehe nicht, warum genau 75 und nicht "normalerweise" 50:)? Die Erfahrung "seit 2001" ist recht aufschlussreich (Argument!) und ich bin durchaus bereit, diesen Wert zu akzeptieren. Aber als letzte Bemerkung - für Anführungszeichen mit einer Dimension von 0,12345 wird dies nicht ausreichen (ich meine - sehr viel :))). Die Zahl sollte um mindestens ein Bild nach rechts verschoben werden (0,0000075). In meinem Maklerunternehmen beispielsweise sind solche Angebote bereits gängige Praxis... Ich würde vorschlagen, sie an das Instrument anzupassen und "10" und nicht "75" zu verwenden :):

fMicron = Punkt * 0,1f

Kurz gesagt, ja - ich schlage vor, es parametrisch zu machen - gesetzt (ich denke, nach einigen freundlichen Experimentieren alles an seinen Platz fallen wird (obwohl ... wenn der Punkt hat viele Male geändert ;)...). Und warten Sie auf weitere Meinungen...


3. Ich habe es geschafft, die geposteten Quellen herunterzuladen :-P. Es wird also "etwas zum Vergleichen" geben (in Bezug auf den resultierenden Code). Und so sehr ich Sie auch nicht weiter belästigen möchte - viel Glück bei der Umwandlung von Float in Double!


(wie ist der Test mit RSI? ;), wenn Sie ihn machen können?)

 

Ich habe herausgefunden, dass die beste Lösung 100 > Micron > 50 ist. Deshalb habe ich 75 genommen. Für meinen Broker war es: Punkt = 0,0001.

Aber Sie haben Recht, dass die Makler mit der Notierung bei 0,00001 begonnen haben.

Wir machen es so: Micron = Math.Min(Punkt * 0,75, 0,000075)

Ich hoffe, dass ich in 3 Stunden mit der Umstellung fertig bin. Ich werde hier das Programm zum Testen einstellen.

Ich werde auch die Quellcodes der konvertierten Indikatoren hochladen.

 

Alle Indikatoren und Parameter sind doppelte Zahlen.

Mikron = 0,000075


Legen Sie die Exe in den Ordner zusammen mit der letzten FSB v2.8.3.3 Beta. Beide Programme werden dieselben Daten und Strategien verwenden. Es ist praktisch, um zu vergleichen. Achten Sie auf die Werte der Indikatoren. Praktisch alle Indikatoren und die Hälfte der anderen Dateien wurden geändert.

Um die volle Genauigkeit zu sehen, drücken Sie F12 im Diagramm oder verwenden Sie die Befehlskonsole (####).


Bitte melden Sie alle Probleme. Jetzt ist der richtige Zeitpunkt, um Änderungen an den Indikatoren zu beantragen. Wir müssen sie beheben, bevor wir die Arbeit an der MT-Integration fortsetzen können.



 

Guten Morgen!

Miroslav, die Zeit ist jetzt sehr knapp... Es geht also schnell:

1. Vielen Dank für die schnelle Übersetzung (float to double)! Großartig!

2. Bis jetzt scheint alles zu funktionieren (soweit ich es geschafft habe, es zu überprüfen), Sie können die Unterschiede (on the fly) sehen, sowohl bei den Indikatorwerten als auch bei den Strategieergebnissen :)

3) ABER - die Unterschiede waren nicht das, was wir vorher erwartet hatten! (Ich habe gestern Abend ein internes Experiment durchgeführt, und meine "Befürchtungen" haben sich bestätigt - die Umrechnung wird die Rechengenauigkeit erhöhen, aber das Ergebnis nicht katastrophal verändern! Etwas aus dem Bereich der Unterschiede in der vierten und fünften Stelle... aber wir haben Abweichungen schon in der zweiten Stelle! (z. B. derselbe RSI))


DER GRUND IST EIN ANDERER!!!


Was ich überprüfen konnte:

1. Zuerst habe ich mir überlegt, ob es irgendwelche harten Links zum Thema Ziffern gibt (ich habe Instrumente mit 5 Ziffern, wohlgemerkt)... Erzwungene Angabe von 4 Ziffern in den Werkzeugeigenschaften - hat nicht geholfen (übrigens - aber es funktioniert!)

2. Der Code der Indikatoren selbst ... Hmm ... ... nun, es gibt nichts zu beanstanden! Er ist jetzt überall doppelt vorhanden, der Code selbst (so wie ich ihn sehe) hat sich nicht geändert... Der Code ist einfach genug (sehr oft nur mit Addition und Subtraktion arbeitend) - ein solcher Fehler darf sich dort NICHT angesammelt haben!!! (Ich bin mir da nicht so sicher ... aber ... ;))

3. Mein letzter Gedanke (den ich nicht überprüfen kann) - DAS IST WAS :)!:



Bar Closing/Opening Values (???) (und andere, möglicherweise?)


Woher stammen diese Zahlen??? :))) (was sind das für "Zusatzstoffe" :D?)

Ich habe es irgendwo hier entnommen (Bar Closing.cs):

            // Saving the components
            component = new IndicatorComp[1];

            component[0] = new IndicatorComp();
            component[0]. CompName  = "Closing price of the bar";
            component[0]. DataType  = ( parameters. SlotType == SlotTypes.Open) ? IndComponentType. OpenPrice : IndComponentType. ClosePrice;
            component[0]. ChartType = IndChartType. NoChart;
            component[0]. FirstBar  = 2;
            component[0].Value     = Data.Close;

Daher ist meine erste Vermutung, dass es (vielleicht) darum geht? ("falsch" (oder "richtig", aber warum genau so?), wenn man die Anführungszeichen in der Funktion verrät?)

Teilweise offenbar zur Frage der Werte, die (zum Füllen der betriebenen Puffer bei der Berechnung des Indikators) aus der gesuchten Funktion protected static float[] Price(BasePrice price)


Im Allgemeinen, Miroslav, ist der Ball in deinem Spielfeld" :). Im Moment habe ich den neuen Code IHRER Indikatoren bemerkt, der perfekt mit den MT-Indikatoren kompatibel ist (ich bin hartnäckig :D, und ich werde das Thema RSI "abschließen"):



Derselbe Balken, erster Indikator - Umwandlung, zweiter - einheimisch aus MT.


Irgendwelche Gedanken, Vorschläge? (Ich werde in 6 Stunden dort sein)

 

Частично, видимо, заодно к вопросу получаемых значений (для заполнения оперируемых буферов при расчете индикатора) из искомой функции protected static float[] Price(BasePrice price)

Alle Basisklassen, Methoden und Eigenschaften geben jetzt doppelte Werte zurück, ebenso wie alle Handelsfunktionen (die letzten habe ich vor 6 Monaten geändert).

Es scheint, dass es einen Unterschied in der Formel des RSI gibt. Es kann nicht im zweiten Zeichen sein, "aber wir haben bereits einen Unterschied im zweiten Zeichen! :) Ich werde versuchen, die bestehende MT RSI-Formel in FSB zu übernehmen.



**Edit:

Bereits behoben:

Standard-Parameter: RSI(close, 14, smoothed) == MT RSI

            for (int iBar = 1; iBar < Bars; iBar++)
            {
                if ( adBasePrice[ iBar] > adBasePrice[ iBar - 1]) adPos[ iBar] = adBasePrice[ iBar] - adBasePrice[ iBar - 1];
                if ( adBasePrice[ iBar] < adBasePrice[ iBar - 1]) adNeg[ iBar] = adBasePrice[ iBar - 1] - adBasePrice[ iBar];
            }

            double[] adPosMA = MovingAverage( iPeriod, 0, maMethod, adPos);
            double[] adNegMA = MovingAverage( iPeriod, 0, maMethod, adNeg);

            for (int iBar = iFirstBar; iBar < Bars; iBar++)
            {
                if ( adNegMA[ iBar] == 0)
                    adRSI[ iBar] = 100;
                else
                    adRSI[ iBar] = 100 - (100 / (1 + adPosMA[ iBar] / adNegMA[ iBar]));
            }


Programm zum Herunterladen in Kürze.


 

Miroslav - es gibt keine Unterschiede in den Formeln. Wie ich zu Beginn der RSI-Diskussion sagte - Sie haben einfach eine ANDERE Mittelungsschleife (die zwangsweise aus jedem Ergebnis der korrekt arbeitenden MovingAverage-Funktionen geglättet wird) :), AUSSER dem ersten Wert (der von der MovingAverage-Ausführung übrig bleibt :).

Wie dem auch sei, nach dem zuletzt zitierten Code zu urteilen, hat sich alles eingespielt (und RSI liest jetzt auch andere Mittelungsmodi normal) :)! Yahoo!


(Der Indikatorcode, den ich vorher gespeichert habe, enthält diese Änderung bereits ;) - rufen Sie einfach fsbRSI mit folgenden Parametern auf, um sich davon zu überzeugen:

indLogic = nicht wichtig

maMethod = 2 (! wichtiger MODE_SMMA im Sinne von MT)

basePrice = 0 (PRICE_CLOSE im Sinne von MT)

iPeriode = 14

fLevel = nicht wichtig

iPrvs = nicht wichtig

Und erhalten Sie eine exakte Übereinstimmung der Ergebnisse mit dem nativen Relative Strength Index (der in MT enthalten ist)

Außer, dass sowohl fsbRSI als auch iRSI NICHT dasselbe wie FSB sind :(


Kehrenwir also zum Hauptproblem zurück:


"Alle Basisklassen, Methoden und Eigenschaften geben jetzt doppelte Werte zurück, ebenso wie alle Handelsfunktionen (die letzten habe ich vor 6 Monaten geändert)".


Na, das ist ja toll! Ich verstehe nur nicht, wie sich diese These auf die

Eröffnungskurs und Schlusskursdes Barrens? Im obigen Beispiel.


Um die Frage zu wiederholen: Warum sind die gesuchten Preise UNTERSCHIEDLICH von den Angeboten? (Ich meine 6,7,8, ... Ziffern)


DasDoppelte hat absolut nichts damit zu tun! Werte in Anführungszeichen sind normalisiert und sollten erhalten bleiben (völlig identisch sein), wenn sie einfach zwischen Variablen kopiert werden.

Wenn ähnliche Werte beginnen, in der Berechnung von Indikatoren erscheinen (wenn die Puffer für die Berechnung auf der Grundlage der Kurswerte, die geschützte statische float[] Price(BasePrice Preis)) gefüllt werden, dann sind wir BESSER (seltsam wie es scheinen mag), dh es ist wie eine weitere Quelle (neben dem ehemaligen float) von "leicht" denormalisierten Daten :)

 

Ich habe einige der Indikatoren leicht verändert, damit sie wie die Standardindikatoren von MT aussehen.


Geänderte FSB-Indikatoren:

RSI

Oszillator des RSI

RSI MA Oszillator

Bollinger-Bänder

Standardabweichung

Stochastik


Bei den folgenden Indikatoren gibt es Unterschiede:

Momentum

Index für Markterleichterung


Sonstiges:

MT Gleitender Durchschnittsoszillator == FSB MACD Histogramm

MT Momentum == FSB Rate of Change

Relative Vigor Index - nicht im FSB enthalten


Jetzt sollten FSB- und MT-Indikatoren mehr oder weniger gleich sein.


TODO:

Stochastik - Überprüfung der Signale;

Markterleichterungsindex - Überarbeitung der Formel;

Ein Momentum wie das des MT soll in FSB aufgenommen werden - mit dem Namen "Momentum MT".

Aufnahme des "Relative Vigor Index" in die FSB.