À la recherche du "Graal" sacré... - page 9

 
Hoper23 >> :
Le problème est que l'objectif de la tâche est clair, mais la possibilité de sa mise en œuvre dans MQL ne semble pas claire, car je ne suis pas encore familier avec la fonction tableau intégrée du testeur-optimiseur. J'essaie de relire le manuel MQL mais je n'ai pas encore trouvé ce bloc. Et l'optimiseur créé par thecore n'est pas tant peu fiable que peu compréhensible. Les variables y sont écrites de manière assez bizarre, il n'y a pas d'annotation et elles sont fondamentalement différentes de la version de travail mentionnée dans le lien ci-dessus. Si ce n'est pas difficile, chère lecore, expliquez votre point de vue à l'optimiseur, afin qu'il puisse adapter les 19 paramètres et remplacer automatiquement le résultat.

Il me semble étrange d'entendre cela de la part d'un programmeur, mais je vais essayer de le décomposer (sans l'épeler) :

1. Supposons que vous avez une fonction avec un nombre N de paramètres d'entrée

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

2.Paramètres

n1 varie de n1Min à n1Max avec le pas n1Step

....

n19 passe de n19Min à n19Max avec n19Step


Vous en avez besoin :

- Passez par tous (pour la méthode linéaire) les paramètres entrants ou pas tous (pour la méthode de convergence rapide) les paramètres entrants.

Il existe un grand nombre de méthodes de convergence rapide, l'une d'entre elles étant l'algorithme génétique.

- Chaque fois que vous entrez un nouveau lot de paramètres, vous obtenez le résultat de la fonction à la sortie.

- Vous devez écrire un bloc pour analyser ces résultats et décider si le résultat est

bon.

Je comprends que vous ayez des problèmes avec l'unité d'analyse. Parce que si vous ne savez pas comment écrire une fonction ou comment

ou comment regarder les paramètres d'entrée, ce n'est pas pour moi, c'est pour les cours de programmation ou les gens qui aiment épeler

les bases de la programmation.

Ce que fait l'unité d'analyse :

Il prend la barre BAR_Y la plus ancienne que vous voulez analyser, et glisse les données actuelles au temps Y dans votre tableau de bord.

fonction. C'est-à-dire que votre fonction pense que BAR_Y est TimeCurrent.

Maintenant, prenez autant de barres dans la profondeur de l'historique que votre fonction (n1, n2,..., n19) prendrait si elle était à la barre 0.

et obtenir un résultat.

Par exemple, votre stratégie recherche un extremum le long de iMA3,iMA2,iMA1. Alors nous avons iMA_Y+2,iMA_Y+1,iMA_Y

Si c'est un point extrême, on s'arrête, sinon on fait Y++ ;

OK. Nous trouvons le point d'extremum à la position t, c'est-à-dire iMAt+2,iMAt+1,iMAt

Maintenant, nous devons calculer si le TP ou le SL sera déclenché.

C'est-à-dire qu'à partir du point t, nous descendons les barres t-1 et analysons la distance de l'Open[t] au High[t] et au Low[t],

et ensuite de l'Open [t] au High [t-1] et au Low [t-1], si nous n'atteignons pas le TP ou le SL nous allons plus loin - prendre t-2 et ainsi de suite jusqu'à ce que ça marche.

TP ou SL ou les deux.

Nous avons trouvé la PREMIÈRE condition pour Function(n1,n2,...,n19).

Sauvegardons le résultat,

Ensuite, nous faisons t-- et poursuivons l'analyse jusqu'à la mesure 0.

4. on déplace Y-- et on répète le processus.

Ainsi, nous trouvons toutes les occurrences de notre fonction Function(n1,n2,...,n19) jusqu'au moment actuel.

Analyser le moment présent et voir s'il y a eu des situations similaires dans le passé et comment elles se sont terminées.

6. sauvegarder le résultat.

7. prendre le jeu de paramètres suivant n1,,n19 pour Function(n1,n2,...,n19) et le vérifier

8. répéter jusqu'à ce que nous n'ayons plus de paramètres.

9. nous choisissons le meilleur ensemble de paramètres ou plusieurs ensembles, et en fonction de leurs recommandations, nous définissons BUY, SELL ou

ne rien faire.

C'est tout.

J'espère que c'est difficile, car c'est vraiment difficile.


 
Hoper23 >> :
Le problème est que l'objectif de la tâche est clair, mais la possibilité de sa mise en œuvre dans MQL ne semble pas claire, car je ne suis pas encore familier avec la fonction du tableau intégré du testeur-optimiseur. J'essaie de relire le manuel MQL mais je n'ai pas encore trouvé ce bloc. Et l'optimiseur créé par thecore n'est pas tant peu fiable que peu compréhensible. Les variables y sont écrites de manière assez bizarre, il n'y a pas d'annotation et elles sont fondamentalement différentes de la version de travail mentionnée dans le lien ci-dessus. Si ce n'est pas difficile, cher thecore, expliquez votre point de vue sur l'optimiseur, afin que je puisse fourrer les 19 paramètres et le résultat de l'autocomplétion.

D'ailleurs, ne commencez pas par le bloc d'énumération - il est beaucoup plus facile à écrire que le parseur.

Et si vous trouvez tout ce que j'ai dit trop compliqué, cherchez l'auto-optimiseur de xeon.

Il utilise l'optimiseur MetaTrader. Ne cherchez pas la fonction d'auto-optimisation intégrée. Il n'y en a pas.

 
Figar0 >> :

Voici l'indicateur de klot avec l'optimiseur GA intégré à l'indicateur.

Je pense que Hoper23 ne parviendra pas à l'analyse génétique, que ce lien soit rompu ou non.

D'autant plus qu'il n'est pas cassé.

 

thecore==> selon votre raisonnement, ainsi que le mien, vous obtenez for(S = Sstart ; S <= Send ; S += Sstep), bien, en termes généraux. Voici ce que j'ai obtenu

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);
Autre décrochage - Je ne sais pas comment fixer le résultat positif et substituer la variable automatiquement.
 
Hoper23 писал(а) >>

yyyyy ..... "Le lien qui vous a conduit à cette page est "mort" ou supprimé." Belle référence ! !! Un peu comme le fait de dire d'aller se faire foutre. (sans vouloir vous offenser, juste pour le plaisir).

Voici un merci), à moi pour le lien, à klot'y pour la solution réellement prête sur une assiette), vous avez là à la fois le testeur et l'optimiseur, il suffit de le modifier un peu pour qu'il convienne à vos besoins ... Et tout s'ouvre.

 

Réponse non ouverte ! !!


 
Hoper23 >> :

thecore==> selon votre raisonnement, ainsi que le mien, vous obtenez for(S = Sstart ; S <= Send ; S += Sstep), bien, en termes généraux. Voici ce que j'ai obtenu

1. n'essayez pas de résoudre le problème de front.

Pourquoi avez-vous besoin de sauvegarder TOUTES les variantes de toutes les solutions possibles.

Tu ne résous pas un problème de maths. Vous regardez l'histoire pour une situation similaire à celle que vous avez

aujourd'hui et maintenant pour décider de ce qu'il faut faire.

Il faut donc d'abord décrire la situation actuelle et la rechercher spécifiquement.

Cela réduira considérablement le nombre de passages, de variables et de résultats.

Ensuite, stop - Je ne sais pas comment fixer un résultat positif et le mettre dans une variable automatiquement.

Dans un premier temps, je l'ai enregistré dans un fichier. Reçu sur l'historique d'environ 10.000-50.000 options gagnantes.

Puis analysé dans Excel.

Ne cherchez pas une correspondance exacte. Ce n'est pas comme si nous décrivions une onde sinusoïdale.

Écrivez d'abord une unité de collecte de données pour UNE variable, déboguez-la, puis ajoutez-en 18 autres ou le nombre de variables dont vous disposez.

 

Bien. L'idée est logique. Dans ce cas, comment résoudre la formule d'optimisation des combinaisons avec un seul paramètre ? Le fait est que, dans cet exemple, ils sont liés entre eux. Je ne connais pas encore d'autre exemple en raison de ma connaissance limitée du langage MQL.

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

Ce non-sens est conçu pour optimiser hors ligne

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;
     }}}   

Il est livré avec une bible.

бла-бла-бла

Et il y a un biblah pour aller avec.

бла-бла-бла

Et RIEN NE FONCTIONNE... ou plutôt il s'embrouille tout seul, il sollicite le CPU, mais pas de changement dans les variables et fait tout rapidement - quelques secondes et c'est tout. Je ne comprends pas.
 
Hoper23 >> :

Ce non-sens est conçu pour optimiser hors ligne

Il est livré avec une bible.

Et puis il y a la biblah.

Et ça ne marche pas... ou plutôt, ça fait un peu n'importe quoi, ça stresse le CPU, mais pas de changement dans les variables et ça rend tout rapide - quelques secondes et c'est tout. Je ne comprends pas.



Vous avez commencé à travailler avec l'auto-optimiseur de xeon.

TestCommander (auto-optimisation) Outil du commerçant

Alors demande-lui.

D'ailleurs, ce produit est déjà payé, si je me souviens bien.

Il y a une aide, tout y est clairement expliqué.