Auf der Suche nach dem heiligen "Gral"... - Seite 9

 
Hoper23 >> :
Das Problem ist, das Ziel der Aufgabe ist klar, aber die Möglichkeit der Umsetzung in MQL scheint unklar, da ich noch nicht mit der eingebauten Array-Funktion des Tester-Optimierers vertraut bin. Ich versuche, das MQL-Handbuch erneut zu lesen, aber ich habe diesen Block noch nicht gefunden. Und der selbst erstellte Optimierer von thecore ist nicht so sehr unzuverlässig als vielmehr nicht ganz verständlich. Die Variablen sind dort recht eigenwillig geschrieben, es gibt keine Anmerkungen und sie unterscheiden sich grundlegend von der im obigen Link genannten Arbeitsversion. Wenn es nicht schwierig ist, liebe thecore, erklären Sie Ihren Standpunkt des Optimierers, so dass Sie alle 19 Parameter und Auto-Ersatz das Ergebnis passen kann.

Es kommt mir seltsam vor, dies von einem Programmierer zu hören, aber ich werde versuchen, es aufzuschlüsseln (nicht zu buchstabieren):

1. Angenommen, Sie haben eine Funktion mit einer Anzahl von N Eingabeparametern

Funktion(n1,n2,...,n19);

2.Parameter

n1 variiert von n1Min bis n1Max mit dem Schritt n1Step

....

n19 ändert sich von n19Min zu n19Max mit n19Step


Das müssen Sie:

- Gehen Sie alle (bei der linearen Methode) oder nicht alle (bei der Methode der schnellen Konvergenz) Eingangsparameter durch.

Es gibt eine Vielzahl von Methoden zur schnellen Konvergenz, eine davon ist der genetische Algorithmus.

- Jedes Mal, wenn Sie einen neuen Satz von Parametern eingeben, erhalten Sie das Ergebnis der Funktion am Ausgang.

- Sie müssen einen Block schreiben, um diese Ergebnisse zu analysieren und zu entscheiden, ob das Ergebnis

gut.

Ich verstehe, dass Sie Probleme mit der Analyseeinheit haben. Denn wenn Sie nicht wissen, wie man eine Funktion schreibt oder wie man

oder wie man die Eingabeparameter durchschaut, das ist nichts für mich, das ist für Programmierkurse oder Leute, die gerne buchstabieren

die Grundlagen der Programmierung.

Was macht die Analyseeinheit?

1. nimmt den ältesten BAR_Y-Balken, den Sie analysieren möchten, und fügt die aktuellen Daten zum Zeitpunkt Y in Ihre

Funktion. Das heißt, Ihre Funktion denkt, dass BAR_Y TimeCurrent ist.

Nehmen Sie nun so viele Takte in der Tiefe der Historie, wie Ihre Funktion(n1,n2,...,n19) benötigen würde, wenn sie bei Takt 0 wäre.

und erhalten ein Ergebnis.

Zum Beispiel sucht Ihre Strategie nach einem Extremum bei iMA3,iMA2,iMA1. Dann haben wir iMA_Y+2,iMA_Y+1,iMA_Y

Wenn es ein Extrempunkt ist, hören wir auf, wenn nicht, machen wir Y++;

GUT. Wir finden den Punkt des Extremums an der Position t, d.h. iMAt+2,iMAt+1,iMAt

Jetzt müssen wir berechnen, ob TP oder SL ausgelöst wird

D.h. vom Punkt t gehen wir die Balken t-1 hinunter und analysieren den Abstand von Open[t] zu High[t] und zu Low[t],

und dann von Open[t] zu High[t-1] und zu Low[t-1], wenn wir TP oder SL nicht erreichen, gehen wir weiter - nehmen t-2 und so weiter, bis es klappt

TP oder SL oder beides.

Wir haben die ERSTE Bedingung für Funktion(n1,n2,...,n19) gefunden.

Speichern wir das Ergebnis,

Als nächstes machen wir t-- und fahren mit der Analyse bis zum Takt 0 fort.

4. wir verschieben Y-- und wiederholen den Vorgang.

So finden wir alle Vorkommen unserer Funktion Function(n1,n2,...,n19) bis zum aktuellen Zeitpunkt.

Analysieren Sie die aktuelle Situation und stellen Sie fest, ob es in der Vergangenheit ähnliche Situationen gab und wie sie endeten.

6. speichern Sie das Ergebnis.

Nehmen Sie den nächsten Satz von Parametern n1,,n19 für Function(n1,n2,...,n19) und überprüfen Sie ihn

8. wiederholen Sie den Vorgang, bis Sie keine Parameter mehr haben.

9. Wir wählen den besten Satz von Parametern oder mehrere Sätze aus und setzen entsprechend ihrer Empfehlungen KAUFEN, VERKAUFEN oder

nichts tun.

Das ist alles.

Ich hoffe, dass es schwierig ist, denn es ist wirklich schwierig.


 
Hoper23 >> :
Das Problem ist, dass der Zweck der Aufgabe klar ist, aber die Möglichkeit der Umsetzung in MQL-Sprache scheint unklar, da ich noch nicht mit der Funktion des eingebauten Arrays der Tester-Optimierer vertraut bin. Ich versuche, das MQL-Handbuch erneut zu lesen, aber ich habe diesen Block noch nicht gefunden. Und der selbst erstellte Optimierer von thecore ist nicht so sehr unzuverlässig als vielmehr nicht ganz verständlich. Die Variablen sind dort recht eigenwillig geschrieben, es gibt keine Anmerkungen und sie unterscheiden sich grundlegend von der im obigen Link genannten Arbeitsversion. Wenn nicht schwierig, liebe thecore, erklären Sie Ihren Standpunkt des Optimierers, so dass ich alle 19 Parameter und autocomplete Ergebnis pferchen könnte.

Übrigens, fangen Sie nicht mit einem Aufzählungsblock an - er ist viel einfacher zu schreiben als ein Parser.

Und wenn Ihnen das alles zu kompliziert ist, suchen Sie nach dem Auto-Optimierer von xeon.

Es verwendet den MetaTrader-Optimierer. Suchen Sie nicht nach der eingebauten automatischen Optimierungsfunktion. Es gibt keine.

 
Figar0 >> :

Hier ist der klot-Indikator mit dem in den Indikator eingebetteten GA-Optimierer.

Ich denke, Hoper23 wird es nicht genetisch analysieren, egal ob dieser Link kaputt ist oder nicht.

Umso mehr, als sie nicht kaputt ist.

 

thecore==> Nach deiner und meiner Argumentation erhält man for(S = Sstart; S <= Send; S += Sstep), nun ja, allgemein gesprochen. Hier ist, was ich bekommen habe

void Optimization()
{
 int StartBar = iBarShift(Symbol(), 0, TimeCurrent()-60*( EndDate+ OptimDuration));
 int EndBar = iBarShift(Symbol(), 0, TimeCurrent()-60* EndDate);
 int Count = 0;
 double CurRF = -999999;
 ArrayInitialize( EqualProfit, 0);
 ArrayInitialize( TransCount, 0);
 ArrayInitialize( MaxDrowDown, 0);
 for( S = Sstart; S <= Send; S += Sstep)
 for( O = Ostart; O <= Oend; O += Ostep)
 for( I = Istart; I <= Iend; I += Istep)
 for( G = Gstart; G <= Gend; G += Gstep)
 for( M = Mstart; M <= Mend; M += Mstep)
 for( CC = CCstart; CC <= CCend; CC += CCstep)
 for( CCI = CCIstart; CCI <= CCIend; CCI += CCIstep)
 for( F_EMA = F_EMAstart; F_EMA <= F_EMAend; F_EMA += F_EMAstep)
 for( S_EMA = S_EMAstart; S_EMA <= S_EMAend; S_EMA += S_EMAstep)
 for( SMA = SMAstart; SMA <= SMAend; SMA += SMAstep)
 for( stK = stKstart; stK <= stKend; stK += stKstep)
 for( stP = stPstart; stP <= stPend; stP += stPstep)
 for( stD = stDstart; stD <= stDend; stD += stDstep)
 for( W = Wstart; W <= Wend; W += Wstep)
 for( H = Hstart; H <= Hend; H += Hstep)
 for( C = Cstart; C <= Cend; C += Cstep)
 for( Skill = Skillstart; Skill <= Skillend; Skill += Skillstep)
 for( SkillMAX = SkillMAXstart; SkillMAX <= SkillMAXend; SkillMAX += SkillMAXstep)
 for( shirina = shirinastart; shirina <= shirinaend; shirina += shirinastep)
   {
    int CurTrans =0;
    double CurOpenPrice = 0;
    int EqualMax = 0;
    int EqualMin = 0;
     for(int i = StartBar; i >= EndBar; i--)
      {
       EqualMin = MathMin( EqualProfit[ Count], EqualMin);
       if( EqualProfit[ Count] > EqualMax)
        {
         MaxDrowDown[ Count] = MathMax( MaxDrowDown[ Count], EqualMax- EqualMin);
         EqualMax = EqualProfit[ Count];
         EqualMin = EqualMax;
        }
        MaxDrowDown[ Count] = MathMax( MaxDrowDown[ Count], EqualMax- EqualMin);
    if( EqualProfit[ Count] != 0)
     if( CurRF < MaxDrowDown[ Count]/ EqualProfit[ Count])
      {
       CurRF = MaxDrowDown[ Count]/ EqualProfit[ Count];
       int Num = Count;
       int BestS = S;
       int BestO = O;
       int BestI = I;
       int BestG = G;
       int BestM = M;
       int BestCC = CC;
       int BestCCI = CCI;
       int BestF_EMA = F_EMA;
       int BestS_EMA = S_EMA;
       int BestSMA = SMA;
       int BeststK = stK;
       int BeststP = stP;
       int BeststD = stD;
       int BestW = W;
       int BestH = H;
       int BestC = C;
       int BestSkill = Skill;
       int BestSkillMAX = SkillMAX;
       int Bestshirina = shirina;

        }
     
    Count++;
   } // Цикл переменных 
 
   
 Alert("Оптимизация завершена. Прибыль max ", EqualProfit[ Num]," пунктов. Сделок ", TransCount[ Num], ". Просадка ", MaxDrowDown[ Num]);
 Alert("Параметры: S = ", BestS, ", O = ", BestO, ", I = ", BestI, ", G = ", BestG, ", M = ", BestM, ", CC = ", BestCC, ", CCI = ", BestCCI,
  ", F_EMA = ", BestF_EMA, ", S_EMA = ", BestS_EMA, ", SMA = ", BestSMA, ", stK = ", BeststK, ", stP = ", BeststP, ", stD = ", BeststD,
   ", W = ", BestW, ", H = ", BestH, ", C = ", BestC, ", Skill = ", BestSkill, ", SkillMAX = ", BestSkillMAX, ", shirina = ", Bestshirina);
 LastOptim = TimeCurrent();
 GlobalVariableSet("LastOptimization", LastOptim);
 if( CurRF < 0)
  if(MessageBox("Фактор восстановления меньше нуля./nПринимать данные оптимизированные параметры?", "Вопрос", MB_YESNO) == IDNO) 
    return;    
        BestS = S;
        BestO = O;
        BestI = I;
        BestG = G;
        BestM = M;
        BestCC = CC;
        BestCCI = CCI;
        BestF_EMA = F_EMA;
        BestS_EMA = S_EMA;
        BestSMA = SMA;
        BeststK = stK;
        BeststP = stP;
        BeststD = stD;
        BestW = W;
        BestH = H;
        BestC = C;
        BestSkill = Skill;
        BestSkillMAX = SkillMAX;
        Bestshirina = shirina;

 GlobalVariableSet("AutoS", S);
 GlobalVariableSet("AutoO", O);
 GlobalVariableSet("AutoI", I);
 GlobalVariableSet("AutoG", G);
 GlobalVariableSet("AutoM", M);
 GlobalVariableSet("AutoCC", CC);
 GlobalVariableSet("AutoCCI", CCI);
 GlobalVariableSet("AutoF_EMA", F_EMA);
 GlobalVariableSet("AutoS_EMA", S_EMA);
 GlobalVariableSet("AutoSMA", SMA);
 GlobalVariableSet("AutostK", stK);
 GlobalVariableSet("AutostP", stP);
 GlobalVariableSet("AutostD", stD);
 GlobalVariableSet("AutoW", W);
 GlobalVariableSet("AutoH", H);
 GlobalVariableSet("AutoC", C);
 GlobalVariableSet("AutoSkill", Skill);
 GlobalVariableSet("AutoSkillMAX", SkillMAX);
 GlobalVariableSet("Autoshirina", shirina);
Weiteres Problem: Ich weiß nicht, wie ich ein positives Ergebnis fixieren und die Variable automatisch ersetzen kann.
 
Hoper23 писал(а) >>

yyyyy ..... "Der Link, der Sie zu dieser Seite geführt hat, ist 'tot' oder gelöscht." Nette Empfehlung! Ähnlich wie die Anweisung, sich selbst zu ficken. (nichts für ungut, nur zum Spaß).

Hier ist ein Dankeschön), an mich für den Link, klot'y für tatsächlich fertige Lösung auf einem Teller), dort haben Sie sowohl Tester und Optimierer, nur zwicken es ein wenig auf Ihre Bedürfnisse anzupassen ... Und alles öffnet sich.

 

Antwort nicht offen!!!


 
Hoper23 >> :

thecore==> Nach deiner und meiner Argumentation erhält man for(S = Sstart; S <= Send; S += Sstep), nun ja, allgemein gesprochen. Hier ist, was ich bekommen habe

1. versuchen Sie nicht, das Problem frontal zu lösen.

Warum sollten Sie alle Varianten aller möglichen Lösungen speichern?

Sie lösen kein mathematisches Problem. Sie suchen in der Geschichte nach einer ähnlichen Situation wie der, die Sie haben

heute und jetzt zu entscheiden, was zu tun ist.

Beschreiben Sie also zunächst die aktuelle Situation und suchen Sie gezielt nach ihr.

Dies wird die Anzahl der Durchläufe, Variablen und Ergebnisse um ein Vielfaches reduzieren.

Nächster Punkt: Ich weiß nicht, wie man ein positives Ergebnis fixiert und automatisch in eine Variable einfügt.

In der ersten Phase habe ich sie in einer Datei gespeichert. Erhalten auf die Geschichte von etwa 10.000-50.000 Gewinnoptionen.

Anschließend werden sie in Excel analysiert.

2. suchen Sie nicht nach einer genauen Übereinstimmung. Es ist ja nicht so, dass wir eine Sinuskurve beschreiben.

Schreiben Sie zunächst einen Datenerfassungsblock für EINE Variable, debuggen Sie ihn, und fügen Sie dann weitere 18 oder so viele Variablen hinzu, wie Sie haben.

 

Gut. Die Idee ist logisch. Wie löst man dann die Formel für die Optimierung über Kombinationen mit einem einzigen Parameter? Der springende Punkt ist, dass sie in diesem Beispiel miteinander verbunden sind. Ein anderes Beispiel kenne ich aufgrund meiner begrenzten Kenntnisse von MQL noch nicht.

Combination = MathFloor((L1End-L1Start)/L1Step)*MathFloor((L2End-L2Start)/L2Step);
 

Dieser Unsinn dient der Optimierung der Offline

extern int setWeek   = 0;          //День недели старта оптимизации
extern int setHour   = 02;         //Час старта оптимизации
extern int setMinute = 25;         //Минута старта оптимизации
extern int ProgNumber= 2;          //номер программы оптимизации
extern bool OptimStart=false;
extern bool report=false;
#include <MacroAutoOptimization.mqh> 


int init() {


 if(IsOptimization()){
    string Str;
    int Cmd, Step, HandleStep;    
    HandleStep=FileOpen("ExpertMessage.csv", FILE_CSV| FILE_READ| FILE_WRITE,0x7F);
    if( HandleStep>0){
       Str  = FileReadString( HandleStep);
       Cmd  = StrToInteger(StringSubstr( Str,0,StringFind( Str,";",0)));
       Step = StrToInteger(StringSubstr( Str,StringFind( Str,";",0)+1,StringLen( Str)-StringFind( Str,";",0)-1))+1;
       FileSeek( HandleStep,0, SEEK_SET);
       FileWrite( HandleStep, Cmd+";"+ Step);
       FileClose( HandleStep);
  }} 

  
   return(0);
  }


int deinit()
  {
   Comment("Привет!");
   return(0);
  }

int start()
{

 if(IsOptimization()==false && IsTesting()==false){
        double Itog[][17];
        int TecWeek=TimeDayOfWeek(TimeLocal());
        int TecHour=TimeHour(TimeLocal());
        int TecMinute=TimeMinute(TimeLocal());
        if(! OptimStart){  
           if( TecWeek== setWeek){  
              if( TecHour== setHour){ 
                 if( TecMinute>= setMinute && TecMinute< setMinute+4){ 
                    if( AutoStart( ProgNumber, Itog)<0){Print("Оптимизация завершилась неудачей!");}
                    deinitialization();
                    OptimStart=true;
                    report=true;
        }}}}
        if( TecHour!= setHour){ OptimStart=false;}              //Обнуление флага старта оптимизации
        if(ArrayRange( Itog,0)>0){
//         Переменные для оптимизации
           stK     = Itog[0][7];
           stP   = Itog[0][8];
           stD  = Itog[0][9];
           W = Itog[0][10];
           H  = Itog[0][11];
           C  = Itog[0][12];
           CCI  = Itog[0][13];
           F_EMA  = Itog[0][14];
           S_EMA  = Itog[0][15];
           SMA  = Itog[0][16];
           shirina  = Itog[0][17];
           S  = Itog[0][18];
           O  = Itog[0][19];
           I  = Itog[0][20];
           M  = Itog[0][21];
           G  = Itog[0][22];
           CC  = Itog[0][23];
           if( report){
              Print("Новые параметры ", stK," | ", stP," | ", stD," | ", W," | ", H," | ", C," | ", CCI," | ", F_EMA," | ", S_EMA," | ", SMA," | ", shirina," | ", S," | ", O," | ", I," | ", M," | ", G," | ", CC);
              report=false;
     }}}   

Es wird mit einer Bibel geliefert.

бла-бла-бла

Und es gibt eine Biblah dazu.

бла-бла-бла

Und NICHTS FUNKTIONIERT... oder besser gesagt, es bringt sich selbst durcheinander, es belastet die CPU, aber keine Änderungen in den Variablen und macht alles schnell - ein paar Sekunden und das war's. Das verstehe ich nicht.
 
Hoper23 >> :

Dieser Unsinn dient der Optimierung der Offline

Es wird mit einer Bibel geliefert.

Und dann ist da noch die Biblah.

Und es funktioniert nicht... oder besser gesagt, es macht irgendein Durcheinander von sich selbst, belastet die CPU, aber keine Änderungen in Variablen und macht alles schnell - ein paar Sekunden und das war's. Das verstehe ich nicht.



Sie haben begonnen, mit dem Auto-Optimierer von Xeon zu arbeiten

TestCommander (Auto-Optimierung) Händler-Tool

Fragen Sie ihn also.

Übrigens ist dieses Produkt bereits bezahlt, wenn ich mich richtig erinnere.

Darin gibt es eine Hilfe, dort ist alles klar erklärt.

Grund der Beschwerde: