[ARCHIV]Alle Fragen von Anfängern, um das Forum nicht zu überladen. Fachleute, gehen Sie nicht daran vorbei. Ohne dich kann ich nirgendwo hingehen - 5. - Seite 323

 

Das passiert:

//+-------------------------------------------------------------------------------------+
//| Расчитываем количество идущих один за одним баров одного признака                   |
//+-------------------------------------------------------------------------------------+
int LastCandlesType(int directionMA)
{
   int cntUp,                                                                           // Счётчик идущих друг за другом свечей с..
       cntDn,                                                                           // .. требуемыми признаками
       t;                                                                               // Счётчик всех просчитанных баров
       
   for (int i=i_AnyBarsToHistory; i>=1; i--, t++)
   {
      if (directionMA == CROSS_UP)                                                      // Если машки направлены вверх
      {
         if ((Open[i] - Close[i]) >= i_sizeOfSequentialCorrectionBar * pt)              // Если бар соответствует требуемым признакам..
             cntDn++;                                                                   // .. прибавим 1 к счётчику
         if ((Close[i] - Open[i]) >= i_sizeOfTrandBar * pt)                             // Если бар, не соответствует основному признаку..
             cntDn = 0;                                                                 // .. счётчик обнуляем
                                                                                        
         if (i == 1)
            Print(" directionMA ", directionMA, "; i = ", i, "; Open[i] - Close[i] = ", Open[i] - Close[i], "; cntDn = ", cntDn);

         if (t == i_AnyBarsToHistory)
         {
             if (cntDn == i_sequentBarsСount)                                                // Если cnt баров в подряд медвежьи..
                 return (REQUIRED_SEQUENTIAL_BEARS_GOT);                                     // .. Выходим из функции
         }
      }

      if (directionMA == CROSS_DN)                                                      // Если машки направлены вниз
      {
         if ((Close[i] - Open[i]) >= i_sizeOfSequentialCorrectionBar * pt)              // Если бар соответствует требуемым признакам..
             cntUp++;                                                                   // .. прибавим 1 к счётчику
         if ((Open[i] - Close[i]) >= i_sizeOfTrandBar * pt)                             // Если бар, не соответствует основному признаку..
             cntUp = 0;                                                                 // .. счётчик обнуляем
         if (i == 1)
            Print(" directionMA ", directionMA, "; i = ", i, "; Close[i] - Open[i] = ", Close[i] - Open[i], "; cntUp = ", cntUp);

         if (t == i_AnyBarsToHistory)
         {
             if (cntUp == i_sequentBarsСount)                                                // Если cnt баров в подряд бычьи..
                 return (REQUIRED_SEQUENTIAL_BULLS_GOT);                                     // .. Выходим из функции
         }
      }
      return (REQUIRED_SEQUENTIAL_MISS);
   }
}

In Wirklichkeit wird nicht einmal eine Zeile gedruckt:

Print(" directionMA ", directionMA, "; i = ", i, "; Close[i] - Open[i] = ", Close[i] - Open[i], "; cntUp = ", cntUp);

Es gibt also wahrscheinlich eine Art Fehler in der obigen Darstellung.

Das Interessanteste daran ist, dass die Standardrückgabe, die ich hier hinzugefügt habe, irgendwie immer funktioniert. Ich meine die Schnur:

return (REQUIRED_SEQUENTIAL_MISS);

Obwohl es offensichtlich ist, dass der Code elementar ist und keine Fehler enthalten sein können.

 

Grüße an alle! Liebe Gurus, können Sie mir sagen, warum v_s steigt und sinkt, wenn der Gewinn in der Einzahlungswährung steigt und sinkt?

value_profit() ist eine Gewinnberechnung in der Einzahlungswährung.

double wert_stop,wert_schritt;
wert_stop=((Kontostand()/100)*1);
value_step=((AccountBalance()/100)*4);
double v_s;
wenn (wert_gewinn()>=(wert_schritt+wert_stop))
for (int v=1;v<=100;v++)
{
wenn (wert_gewinn()>=(wert_schritt+(wert_stop*v))
{
v_s=wert_stop*v;
}
sonst
{
wenn (wert_gewinn()<=v_s)
close_all();
}
}
 
hoz:

In Wirklichkeit wird nicht einmal eine Zeile gedruckt:

1. Warum die Modularität genau auf einmal? Natürlich hat jeder seinen eigenen Stil, aber ich würde zuerst an der kompakten Version feilen und dann, wenn sie wie am Schnürchen läuft, zur Modularität übergehen. Die kompakte Variante (ohne die eingefügten Funktionen Trade, LastCandlesType, GetStateOfMA, GetGeneralSignal) wurde auf der vorherigen Seite als Variante der start()-Interna gezeigt. Wie funktioniert das für Sie? Wenn es funktioniert, dann teilen Sie es in Module auf.

2. Der Code scheint mir absolut identisch mit dem vorherigen zu sein, da sich der t-Zähler absolut parallel zum i-Zähler ändert. Warum also mit t vergleichen, wenn man auch mit i vergleichen kann? Und wenn man die Logik weiterdenkt, warum sollten wir dann mit i vergleichen, wenn wir einen Code haben, der nicht funktioniert hat?

3. entschuldigen Sie die Störung, aber wie würde diese Variante mit dem Herausnehmen des Ausgangs aus der Schleife funktionieren?

int LastCandlesType(int directionMA){
        int cntUp, cntDn;
        for (int i=i_AnyBarsToHistory; i>=1; i--){
                if (directionMA == CROSS_UP){
                        if ((Open[i] - Close[i]) >= i_sizeOfSequentialCorrectionBar * pt) cntDn++; else cntDn=0;
                        if (i == 1) Print(" directionMA ", directionMA, "; i = ", i, "; Open[i] - Close[i] = ", Open[i] - Close[i], "; cntDn = ", cntDn);
                }
                if (directionMA == CROSS_DN){
                        if ((Close[i] - Open[i]) >= i_sizeOfSequentialCorrectionBar * pt) cntUp++; else cntUp=0;
                        if (i == 1) Print(" directionMA ", directionMA, "; i = ", i, "; Close[i] - Open[i] = ", Close[i] - Open[i], "; cntUp = ", cntUp);
                }
        }
        if ((directionMA==CROSS_UP)&&(cntUp>=i_sequentBarsСount)) return(REQUIRED_SEQUENTIAL_BEARS_GOT);
        if ((directionMA==CROSS_DN)&&(cntDn>=i_sequentBarsСount)) return(REQUIRED_SEQUENTIAL_BULLS_GOT);
        return(REQUIRED_SEQUENTIAL_MISS);
}

Ich verstehe, dass es vielleicht auch nicht funktioniert, was auch immer, aber ich muss mir sicher sein, um es weiter herauszufinden.

4. Nur meine persönliche Anpassung: Geben Sie den Code nicht im Meta-Editor ein, sondern in einem beliebigen anderen Editor mit nummerierten Zeilen, und drucken Sie bei jeder Änderung einer Variablen und bei jeder if- oder switch-Prüfung in derselben Zeile (nach dem letzten Semikolon). Zeilennummer ausdrucken - zu prüfende(r) Wert(e). Drucken Sie es nach if(tracing) {Drucken Sie(StringConcatenate("Zeilennummer: Variablenname=", Variablenname));} und deklarieren Sie eine Variable in der Kopfzeile, z.B.: bool tracing=false;//Aktivieren Sie Tracing. In diesem Fall haben Sie ein vollwertiges Tracing und damit ein vollwertiges Debugging. Aber man muss die Protokolle natürlich öfters aufräumen. Wenn Sie den Meta-Editor direkt verwenden wollen, können Sie zunächst eine leere Vorlage erstellen wie

/*001*/

...

/*999*/

am Anfang der Zeilen (und es funktioniert), und dann in einer Kopie dieser Vorlage, um Code eingeben. Aber das ist nur meine Meinung, in der Praxis habe ich es auf diese Weise versucht, aber ich habe es uneinheitlich versucht.

 
rajak:

Grüße an alle! Liebe Gurus, können Sie mir sagen, warum v_s steigt und sinkt, wenn der Gewinn in der Einzahlungswährung steigt und sinkt?

value_profit() ist eine Gewinnberechnung in Einzahlungswährung.

double wert_stop,wert_schritt;
wert_stop=((Kontostand()/100)*1);
value_step=((AccountBalance()/100)*4);
double v_s;
wenn (wert_gewinn()>=(wert_schritt+wert_stop))
for (int v=1;v<=100;v++)
{
wenn (wert_gewinn()>=(wert_schritt+(wert_stop*v))
{
v_s=wert_stop*v;
}
sonst
{
wenn (wert_gewinn()<=v_s)
close_all();
}
}
Nach einem kurzen Blick sah ich sofort einen Fehler mit Anführungszeichen. Lehren Sie, wie man die if-Anweisung verwendet.
 
gyfto:

3. entschuldigen Sie die Frage, aber wie würde es funktionieren, den Ausgang aus der Schleife zu nehmen?

int LastCandlesType(int directionMA){
        int cntUp, cntDn;
        for (int i=i_AnyBarsToHistory; i>=1; i--){
                if (directionMA == CROSS_UP){
                        if ((Open[i] - Close[i]) >= i_sizeOfSequentialCorrectionBar * pt) cntDn++; else cntDn=0;
                        if (i == 1) Print(" directionMA ", directionMA, "; i = ", i, "; Open[i] - Close[i] = ", Open[i] - Close[i], "; cntDn = ", cntDn);
                }
                if (directionMA == CROSS_DN){
                        if ((Close[i] - Open[i]) >= i_sizeOfSequentialCorrectionBar * pt) cntUp++; else cntUp=0;
                        if (i == 1) Print(" directionMA ", directionMA, "; i = ", i, "; Close[i] - Open[i] = ", Close[i] - Open[i], "; cntUp = ", cntUp);
                }
        }
        if ((directionMA==CROSS_UP)&&(cntUp>=i_sequentBarsСount)) return(REQUIRED_SEQUENTIAL_BEARS_GOT);
        if ((directionMA==CROSS_DN)&&(cntDn>=i_sequentBarsСount)) return(REQUIRED_SEQUENTIAL_BULLS_GOT);
        return(REQUIRED_SEQUENTIAL_MISS);
}

Hm. Es hat funktioniert. Ich habe mehrere "Bildschirme" in der Visualisierung laufen lassen, in diesem Intervall ist alles klar. Ich muss noch verstehen, warum es beim letzten Mal nicht geklappt hat. Es wird nützlich sein, um in Zukunft nicht darüber zu stolpern.
 
hoz:

Hmm, es klappt.


Glad))))

hoz:

Ich muss noch herausfinden, warum es beim letzten Mal nicht geklappt hat. Es wird nützlich sein, um in Zukunft nicht darüber zu stolpern.

Denn in Zukunft sollten Sie nicht aufhören, bevor Sie Close[0] oder die Fenstergrenze in einem anderen Algorithmus erreicht haben. Das ist nicht der Fall.

 
gyfto:

1. Warum die Modularität auf einmal? Natürlich hat jeder seinen eigenen Stil, aber ich würde zuerst an der kompakten Version feilen und dann, wenn sie wie geschmiert läuft, auf Modularität umstellen. Die kompakte Variante (ohne die eingefügten Funktionen Trade, LastCandlesType, GetStateOfMA, GetGeneralSignal) wurde auf der vorherigen Seite als Variante der start()-Interna gezeigt. Wie funktioniert das für Sie? Wenn es funktioniert, dann teilen Sie es in Module auf.

Eigentlich bin ich es gewohnt, das so zu schreiben. Und es ist einfacher, nach Fehlern zu suchen. Denn ich wusste sofort, dass der Fehler in der FunktionLastCandlesType() lag.Aber ich habe den Grund noch nicht herausgefunden, obwohl deine Methode funktioniert hat.

gyfto:

2. Der Code scheint mir absolut identisch mit dem vorherigen zu sein, da sich der t-Zähler absolut parallel zum i-Zähler ändert. Warum also mit t vergleichen, wenn man auch mit i vergleichen kann? Und wenn wir die Logik weiter verfolgen, warum sollten wir dann mit i vergleichen, wenn wir einen Code haben, der nicht funktioniert hat?

Zu spät zum Schreiben, ... moralische Überforderung, denke ich.

gyfto:

Ich verstehe, dass es vielleicht auch nicht funktioniert, was auch immer, aber ich muss sicher sein, dass es funktioniert, um es weiter zu verstehen.

Es funktioniert! Es bleibt zu klären, warum dieser Code nicht funktioniert hat. Das erste, was mir auffiel, war das Verlassen der Funktion, wenn der Zähler den Wert i_seqqtBarstCounter erreicht. Aber auch hier habe ich gedruckt und der Zählerwert zeigte immer nur 1 an, wenn ich die Funktionreturn(REQUIRED_SEQUENTIAL_MISS)mit einem Standard-Exit belegte;

Bevor ich sie platzierte, war alles korrekt berechnet, aber die Eule wurde nicht korrekt gehandelt. Es war überhaupt nichts los. Auch wenn theoretisch keine der Bedingungen über der Standardausgabe funktioniert, bedeutet dies, dass keine der Bedingungen ausgelöst wurde, und selbst wenn wir die Standardausgabe in die Bedingung aufnehmen, sollte sie nicht funktionieren. Umgekehrt gilt: Wenn die Bedingung erfüllt ist, sollte sie erfüllt sein.


gyfto:

4. Nur meine persönliche Anpassung: Geben Sie den Code nicht im Meta-Editor ein, sondern in einem beliebigen anderen Editor mit Zeilennummerierung, und drucken Sie jede Änderung einer Variablen und jede if- oder switch-Prüfung in derselben Zeile aus (nach dem letzten Semikolon). Zeilennummer ausdrucken - zu prüfende(r) Wert(e). Drucken Sie es nach if(tracing) {Drucken Sie(StringConcatenate("Zeilennummer: Variablenname=", Variablenname));} und deklarieren Sie eine Variable in der Kopfzeile, z.B.: bool tracing=false;//Aktivieren Sie Tracing. In diesem Fall haben Sie ein vollwertiges Tracing und damit ein vollwertiges Debugging. Aber man muss die Protokolle natürlich öfters aufräumen. Wenn Sie den Meta-Editor direkt verwenden wollen, können Sie zunächst eine leere Vorlage erstellen wie

/*001*/

...

/*999*/

am Anfang der Zeilen (und es funktioniert), und dann in einer Kopie dieser Vorlage, um Code eingeben. Aber das ist nur meine Meinung, in der Praxis habe ich es auf diese Weise versucht, aber nicht konsequent.


Nun, wir drucken auf der Grundlage von Expert Advisor-Daten, nicht von Zeilennummern. Warum brauchen Sie Zeilennummern? Ich persönlich benutze es für die Code-Analyse, da es dort wirklich praktische Momente gibt. Aber den Code auf der Grundlage von Zeilennummern zu schreiben und zu debuggen, halte ich für Unsinn.
 
hoz:

Es bleibt abzuwarten, warum dieser Code nicht funktioniert hat.


So habe ich es selbst herausgefunden. Wir lesen die Kreuzungen der Klappen. Genauer gesagt, drei bullische oder bearische Candlesticks, die sich zu einem beliebigen Zeitpunkt kreuzen. Wenn die Bedingung erfüllt ist, gehen wir auf den Markt. Nach der verbalen Beschreibung zu urteilen, gehören diese drei oder mehr Leuchter, die in einer Reihe stehen, zum rechten Rand des Fensters. Nach Ihrem Code können sie sich auf die Mitte des Fensters beziehen. Daher ist der Expert Advisor in den Markt eingetreten, wenn die Bedingung (drei Kerzen) erreicht wurde, während die letzte Kerze nicht die letzte sein kann.
 
gyfto:

Ich habe es selbst herausgefunden. Wir lesen die Kreuzung der Bären. Genauer gesagt, drei bullische oder bearische Candlesticks, die sich zu einem beliebigen Zeitpunkt kreuzen. Wenn die Bedingung erfüllt ist, treten wir in den Markt ein. Nach der verbalen Beschreibung zu urteilen, gehören diese drei oder mehr Leuchter, die in einer Reihe stehen, zum rechten Rand des Fensters. Nach Ihrem Code können sie sich auf die Mitte des Fensters beziehen. Daher wird der EA in den Markt einsteigen, wenn die Bedingung (drei Kerzen) erreicht ist, aber die letzte Kerze ist möglicherweise nicht die letzte.


Daraus ergibt sich folgende Schlussfolgerung: Wenn man die Syntax kennt, muss man auch die Logik beachten. Dies ist sehr wichtig. Ich hatte da nur einen logischen Fehler.

Es scheint ganz einfach zu sein, aber ich bin an etwas hängen geblieben und habe es nicht gleich verstanden. Igitt. Das kommt vor... :(

 

Guten Tag!

Meine Frage wird ein wenig vom Thema abweichen.

Können Sie mir bitte sagen, ob es möglich ist, irgendwo die Aufteilung von TA-Formen als CSV-Dateien zu finden? Ich kann txt, xls oder jedes andere Format verwenden, das sich programmatisch verarbeiten lässt.

Es gibt Beispiele von TA-Figuren in verschiedenen TA-Artikeln, Lehrbüchern, aber natürlich als gewöhnliche Bilder. Hat jemand mehr oder weniger große Sätze von TA-Symbolen als ein Stück der Geschichte eines Währungspaares in den Zeiträumen H1-H4 gespeichert, sagen wir?

Ich habe gegoogelt und nichts gefunden. Natürlich können wir den Verlauf manuell durchgehen, die Formen markieren, diesen Teil des Verlaufs als .csv exportieren, die erforderliche Anzahl von Malen wiederholen und am Ende die Formenbasis sammeln. Aber wenn das schon jemand gemacht hat, würde ich gerne Zeit sparen.

Vielen Dank im Voraus :)