Alla ricerca del sacro 'graal'... - pagina 9

 
Hoper23 >> :
Il problema è che l'obiettivo del compito è chiaro, ma la possibilità della sua implementazione in MQL sembra poco chiara, dato che non ho ancora familiarità con la funzione built-in array del tester-optimizer. Sto cercando di rileggere il manuale MQL ma non ho ancora trovato questo blocco. E l'ottimizzatore autocostruito da thecore non è tanto inaffidabile quanto poco comprensibile. Le variabili sono composte in modo piuttosto strano, non ci sono annotazioni e sono fondamentalmente diverse dalla versione funzionante menzionata nel link sopra. Se non è difficile, caro thecore, spiega il tuo punto di vista dell'ottimizzatore, in modo da poter adattare tutti i 19 parametri e auto-sostituire il risultato.

Mi sembra strano sentirlo dire da un programmatore, ma cercherò di spiegarlo (non di sillabarlo):

1. Supponiamo di avere una funzione con N parametri di ingresso

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

2.Parametri

n1 varia da n1Min a n1Max con passo n1Step

....

n19 cambia da n19Min a n19Max con n19Step


È necessario:

- Passa attraverso tutti (per il metodo lineare) i parametri in entrata o non tutti (per il metodo della convergenza veloce) i parametri in entrata.

Ci sono molti metodi di convergenza veloce, uno dei quali è l'algoritmo genetico.

- Ogni volta che si inserisce un nuovo gruppo di parametri, si ottiene il risultato della funzione in uscita.

- Dovete scrivere un blocco per analizzare questi risultati e decidere se il risultato è

bene.

Ho capito che hai problemi con l'unità di analisi. Perché se non sapete come scrivere una funzione o come

o come guardare attraverso i parametri di input, non è per me, è per le classi di programmazione o per le persone a cui piace scrivere

le basi della programmazione.

Cosa fa l'unità di analisi:

1.Prende la barra BAR_Y più vecchia che volete analizzare, e infila i dati attuali al tempo Y nel vostro

funzione. Cioè, la vostra funzione pensa che BAR_Y sia TimeCurrent.

2.Ora prendete tante barre nella profondità della storia quante ne prenderebbe la vostra Function(n1,n2,...,n19) se fosse alla barra 0.

e ottenere qualche risultato.

Per esempio, la tua strategia sta cercando un estremo lungo iMA3,iMA2,iMA1. Allora abbiamo iMA_Y+2,iMA_Y+1,iMA_Y

Se è un punto estremo, ci fermiamo, altrimenti facciamo Y++;

OK. Troviamo il punto di estremo nella posizione t, cioè iMAt+2,iMAt+1,iMAt

Ora abbiamo bisogno di calcolare se il TP o lo SL saranno attivati

Cioè dal punto t scendiamo le barre t-1 e analizziamo la distanza da Open[t] a High[t] e a Low[t],

e poi da Open[t] a High[t-1] e a Low[t-1], se non raggiungiamo TP o SL andiamo oltre - prendiamo t-2 e così via fino a quando non funziona

TP o SL o entrambi.

Abbiamo trovato la PRIMA condizione per Funzione(n1,n2,...,n19).

Salviamo il risultato,

Poi facciamo t-- e procediamo con l'analisi fino alla barra 0.

4. Spostiamo Y e ripetiamo il processo.

Così troviamo tutte le occorrenze della nostra funzione Function(n1,n2,...,n19) fino al momento attuale.

5. Analizzare il momento attuale e vedere se ci sono state situazioni simili in passato e come sono finite.

6. Salvare il risultato.

7.Prendere la prossima serie di parametri n1,,n19 per Function(n1,n2,...,n19) e controllarla

8.Ripetere fino ad esaurire i parametri.

9. scegliamo il miglior set di parametri o diversi set, e secondo le loro raccomandazioni, impostiamo BUY, SELL o

non fare nulla.

Questo è tutto.

Spero che sia difficile, perché è davvero difficile.


 
Hoper23 >> :
Il problema è che lo scopo del compito è chiaro, ma la possibilità della sua implementazione in MQL sembra poco chiara, dato che non ho ancora familiarità con la funzione dell'array incorporato del tester-optimizer. Sto cercando di rileggere il manuale MQL ma non ho ancora trovato questo blocco. E l'ottimizzatore autocostruito da thecore non è tanto inaffidabile quanto poco comprensibile. Le variabili sono scritte in modo abbastanza bizzarro lì, non ci sono annotazioni e sono fondamentalmente diverse dalla versione funzionante menzionata nel link di cui sopra. Se non è difficile, caro thecore, spiega il tuo punto di vista dell'ottimizzatore, in modo che io possa stipare tutti i 19 parametri e il risultato di autocompletamento.

A proposito, non iniziate con il blocco di enumerazione - è molto più facile da scrivere che il parser.

E se trovate tutto ciò che ho detto troppo complicato, cercate l'auto-ottimizzatore di xeon.

Utilizza l'ottimizzatore MetaTrader. Non cercate la funzione di auto-ottimizzazione incorporata. Non c'è nessuno.

 
Figar0 >> :

Ecco l' indicatore di klot con l'ottimizzatore GA incorporato nell'indicatore.

Penso che Hoper23 non lo analizzerà geneticamente, non importa se questo link è rotto o no.

Tanto più che non è rotto.

 

thecore==> secondo il tuo ragionamento, così come il mio, si ottiene for(S = Sstart; S <= Send; S += Sstep), bene, in termini generali. Ecco cosa ho ottenuto

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);
Ulteriore stallo - non so come fissare il risultato positivo e sostituire la variabile automaticamente.
 
Hoper23 писал(а) >>

yyyy ..... "Il link che ti ha portato a questa pagina è "morto" o cancellato". Un po' simile alla direzione di andare a farsi fottere. (senza offesa, solo per divertimento).

Ecco un grazie), a me per il link, a klot'y per la soluzione effettivamente pronta su un piatto), lì hai sia il tester che l'ottimizzatore, basta modificarlo un po' per soddisfare le tue esigenze... E tutto si apre.

 

Risposta non aperta!!!


 
Hoper23 >> :

thecore==> secondo il tuo ragionamento, così come il mio, si ottiene for(S = Sstart; S <= Send; S += Sstep), bene, in termini generali. Ecco cosa ho ottenuto

1.Non cercare di risolvere il problema di petto.

Perché è necessario salvare TUTTE le varianti di tutte le soluzioni possibili.

Non stai risolvendo un problema di matematica. Stai guardando la storia per una situazione simile a quella che hai

oggi e ora per decidere cosa fare.

Quindi, prima descrivete la situazione attuale e cercate in modo specifico.

Questo ridurrà il numero di passaggi, variabili e risultati di MOLTO.

Poi, stop - non so come fissare un risultato positivo e metterlo in una variabile automaticamente.

Nella prima fase, l'ho salvato in un file. Ricevuto sulla storia di circa 10.000-50.000 opzioni vincenti.

Poi analizzati in Excel.

2. Non cercare una corrispondenza esatta. Non è che stiamo descrivendo un'onda sinusoidale.

3.Scrivete prima un'unità di raccolta dati per UNA variabile, fate il debug, e poi aggiungete altre 18 o quante variabili avete.

 

Bene. L'idea è logica. Allora, come si risolve la formula per ottimizzare su combinazioni con un solo parametro? Il punto è che in questo esempio sono interconnessi. Non conosco ancora un altro esempio a causa della mia limitata conoscenza del linguaggio MQL.

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

Questa assurdità è stata progettata per ottimizzare la

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

Viene fornito con una bibbia.

бла-бла-бла

E c'è una biblah per accompagnarlo.

бла-бла-бла

E NON FUNZIONA NULLA... o meglio si incasina da solo, stressa la CPU, ma nessun cambiamento nelle variabili e fa tutto velocemente - un paio di secondi e basta. Non capisco.
 
Hoper23 >> :

Questa assurdità è stata progettata per ottimizzare la

Viene fornito con una bibbia.

E poi c'è la biblah.

E non funziona... o meglio, fa un po' di confusione, stressa la CPU, ma nessun cambiamento nelle variabili e rende tutto veloce - un paio di secondi e basta. Non capisco.



Avete iniziato a lavorare con l'auto-ottimizzatore di xeon

TestCommander (autoottimizzazione) Strumento del commerciante

Quindi chiedeteglielo.

A proposito, questo prodotto è già pagato, se ricordo bene.

C'è un aiuto in esso, tutto è spiegato chiaramente.

Motivazione: