[ARCHIVIO]Qualsiasi domanda da principiante, per non ingombrare il forum. Professionisti, non passate oltre. Non posso andare da nessuna parte senza di te - 5. - pagina 366

 
lottamer:


non ci sono zecche.

forse la mancanza di normalizzazione all'interno dell'EA dà questo effetto.

Tuttavia, quando appare la scheda dei parametri di input, l'ottimizzazione stessa non avviene.

Il tester fa qualcosa, in basso si può vedere il numero attuale di overshoots (7/62), ma al completamento nelle schede risultati di ottimizzazione, e il grafico di ottimizzazione è vuoto!

il segno di spunta sul parametro è ovviamente ....

Non so nemmeno da che parte guardare...


Il tester non fornisce risultati ripetibili con dati invariati, poiché la diffusione cambia inconsapevolmente durante il test.

Cura:https://www.mql5.com/ru/forum/119830

 
Chiripaha:

I valori vuoti possono indicare che il risultato dell'ottimizzazione dei parametri specifici non è redditizio - cioè uno scarico. Provate a eseguire uno dei parametri con Visualisation e potreste vedere questo risultato.

Per quanto riguarda la normalizzazione, non credo che ci sarà un tale effetto, perché dato che i valori sono gli stessi, i numeri matematici saranno esattamente gli stessi - quindi nessun cambiamento.

Per quanto riguarda "da che parte pensare" - a volte è meglio non pensare e rimandare la domanda - l'idea e i pensieri verranno dopo. Devi dare al tuo cervello lo spazio per manovrare, riposare e pensare senza sforzarsi.


1. il consulente è redditizio.

2. Ho già controllato a mano - è redditizio su tutta la gamma del parametro. Volevo solo allargare un po' la gamma e rendere il passo più piccolo.

 
tara:


Il tester non fornisce risultati ripetibili con dati invariati, perché la diffusione cambia inconsapevolmente durante il test.

La cura:https://www.mql5.com/ru/forum/119830



Lo spread galleggia, vero?

un'altra cosa è che deve essere cementata nella storia...

in generale il risultato fluttua leggermente e il numero di scambi non cambia...quindi questo problema non mi spaventa troppo...

L'altra cosa è che l'ottimizzatore non funziona affatto! Questo è fastidioso...

questo è ciò che dice il tester nel log..:



2013.05.29 12:20:10 Ci sono stati 8 passaggi fatti durante l'ottimizzazione, 8 risultati sono stati scartati come insignificanti

 
tara:


Il tester non fornisce risultati ripetibili con dati invariati perché la diffusione cambia inconsapevolmente durante il test.

La cura:https://www.mql5.com/ru/forum/119830

Può essere possibile, ma la mia dimensione di spread è messa in Info - e quando la cambi, si vede. Sul tester non ho notato lo spread fluttuante. Prende i dati dei parametri standard di MarketInfo del conto corrente e non li modifica più.

Questa cura cambia lo spread p-r in modo da poter vedere diversi risultati di ottimizzazione con diversi spread. Da quanto ho capito, questo è l'unico scopo per il quale il software al link è necessario.

 
lottamer:


2013.05.29 12:20:10 Ci sono stati 8 passaggi fatti durante l'ottimizzazione, 8 risultati sono stati scartati come insignificanti

Bene, è vero - Questi risultati sono stati scartati come insignificanti. - Ecco perché non appare nei risultati o nel grafico.
 
Chiripaha:
Beh, è vero - questi risultati sono stati contrassegnati come insignificanti. - Ecco perché non appare nei risultati o nel grafico.



Credo di avere un problema più profondo qui.

La mia prima domanda di ieri era come ottimizzare i parametri all'interno di una funzione utente.

Mi è stato detto: spostateli in extern double

L'ho fatto.

e ora l'ottimizzatore lancia il risultato... devo averli messi male.

Ecco il codice. È un comune modificatore di stop e take

Invece di STOP e TAKE, c'erano i numeri 100 e 200

Ho cambiato i numeri in STOP e TAKE

e all'inizio del codice ho aggiunto

extern double STOP = 100;
extern double TAKE = 200;

C'è un errore qui da qualche parte?

(il modificatore stesso funziona al 100%)

int My_modify()
 {
   bool   result;
   double take_profit,stop_loss,point;
   int    cmd,total,error;
//----
   total=OrdersTotal();
   point=MarketInfo(Symbol(),MODE_POINT);
//----
//   for(int i=0; i<total; i++)
//     {
      if(OrderSelect(0,SELECT_BY_POS,MODE_TRADES))
        {
         //---- print selected order
         OrderPrint();
         cmd=OrderType();
         //---- buy or sell orders are considered
         if(cmd==OP_BUY || cmd==OP_SELL)
           {
            //---- modify first market order
            while(true)
              {
               if(cmd==OP_BUY) stop_loss=OrderOpenPrice()-STOP*point;
               else            stop_loss=OrderOpenPrice()+STOP*point;
               
                if(cmd==OP_BUY) take_profit=OrderOpenPrice()+TAKE*point;
                           else take_profit=OrderOpenPrice()-TAKE*point;
               
               
               result=OrderModify(OrderTicket(),0,stop_loss, take_profit,0,CLR_NONE);
               if(result!=TRUE) { error=GetLastError(); Print("LastError = ",error); }
               else error=0;
               if(error==135) RefreshRates();
               else break;
              }
             //---- print modified order (it still selected after modify)
             OrderPrint();
//            break;
           }
        }
      else { Print( "Error when order select ", GetLastError()); }
//     }
//----
   return(0);
  }
 

Per ora sto guardando il codice, ma permetterò qualche commento lungo la strada.

Questa linea non ha alcun senso:

point=MarketInfo(Symbol(),MODE_POINT);  /* поскольку это ровным счетом то же самое, что штатный параметр */ Point 

Sarà necessario solo se avete una strategia multi-valuta, ma allora, invece di una strategia multi-valuta, dovete usare

Symbol()

Dovrete usare altri valori predefiniti, ma non questa funzione normale.

Anche questa variabile non è necessaria.

total=OrdersTotal();

Perché all'interno della vostra funzione è applicata solo una volta, in enumerazione, che è commentata per qualche motivo, e ingombra solo il codice. - Da qui la domanda - Perché hai commentato l'enumerazione per ordine?

Questo:

if(cmd==OP_BUY) stop_loss=OrderOpenPrice()-STOP*point;
else            stop_loss=OrderOpenPrice()+STOP*point;
               
if(cmd==OP_BUY) take_profit=OrderOpenPrice()+TAKE*point;
           else take_profit=OrderOpenPrice()-TAKE*point;

meglio raggruppati insieme in generale - la condizione è la stessa. A proposito, li hai scritti in modo diverso per struttura. - È alla questione della perdita di struttura. Lo stile di scrittura deve essere uniforme - allora si può vedere la struttura ed eventuali errori verranno fuori come dossi dopo la nevicata.

if(cmd==OP_BUY){ stop_loss   = OrderOpenPrice()-STOP*point;
                 take_profit = OrderOpenPrice()+TAKE*point; }

else           { stop_loss   = OrderOpenPrice()+STOP*point;
                 take_profit = OrderOpenPrice()-TAKE*point; }

Da quello che hai presentato non ho trovato nessun punto principale che possa influenzare il risultato. Ma... Hai presentato solo una funzione qui (scritta in modo piuttosto sciatto, a meno che non conti l'enumerazione commentata - questo si riflette nella domanda). Per dire il verdetto - non hai bisogno della funzione, hai bisogno del codice del programma, perché non sai dove e dove sta la causa e devi cercarla. Per fare questo, dovete eseguire il programma nel tester e vedere con i vostri occhi gli errori che possono verificarsi. Poi già si esegue il codice (o in ordine inverso) e si cerca la causa.

Come sensazione generale posso dire che tu, Oleg, hai parecchie sciatterie (indifferenza, direi). Questo può portare a 1. Al littering del sistema in uso. 2. Perdita di struttura a causa di questo littering e difficoltà di identificazione e rilevamento dell'insetto. Quindi il mio consiglio è questo. - Se possibile, buttate via tutta la "spazzatura" (eccessi) dal codice - l'errore sarà più facile da trovare. - Questo è un classico errore della maggior parte delle persone che chiedono aiuto: la disattenzione.

 
lottamer:


Probabilmente è più profondo di così.

La mia prima domanda di ieri era come ottimizzare i parametri all'interno di una funzione personalizzata.

Mi è stato detto: metteteli in extern double.

L'ho fatto.

E ora l'ottimizzatore lancia il risultato... apparentemente, li ho tolti in qualche modo sbagliato.

No, penso che ti sbagli. Il tester lancia il risultato non a causa dei parametri che abbiamo tolto, ma perché i risultati non superano il criterio di significatività.

Ma è possibile che il programma stesso contenga un errore. Inoltre, i risultati instabili ne sono un'indicazione indiretta. - Significa che c'è qualcosa che non va. Nella mia pratica, non permetto a tali programmi di arrivare al mondo reale. Perché se qualcosa non va, significa che la situazione è incontrollabile. E tutto può venire fuori.

I parametri Stop-Loss e Take-Profit, per definizione, sono in variabili esterne in qualsiasi programma, e non solo perché devono essere ottimizzati. Non è che andrete nel vostro codice ogni volta che volete cambiarli. Quindi, non importa se si tratta di variabili esterne o interne. - Questo è sicuro.

 
Chiripaha:

Per ora sto guardando il codice, ma permetterò qualche commento lungo la strada.

Questa linea non ha alcun senso:

Ne avrete bisogno solo se avete una strategia multi-valuta, ma allora invece di

Sarà necessario sostituire altri valori predefiniti, ma non questa funzione di base.

Anche questa variabile non è necessaria.

È usato solo una volta all'interno della funzione nell'enumerazione, che è commentata per qualche motivo e ingombra solo il codice. - Da qui la domanda - Perché hai commentato l'enumerazione per ordini?

Ecco qui.

In generale, sarebbe meglio raggrupparli insieme - la condizione è la stessa.

Beh, non ho trovato nessun punto di principio da quello che hai presentato che possa influenzare il risultato. Ma... Hai presentato solo una funzione qui (scritta in modo piuttosto sciatto, a meno che non conti l'enumerazione commentata - questo si riflette nella domanda). Per dire il verdetto - non hai bisogno della funzione, hai bisogno del codice del programma, perché non sai dove e dove sta la causa e devi cercarla. Per fare questo, dovete eseguire il programma nel tester e vedere con i vostri occhi gli errori che possono verificarsi. Poi, già eseguite il codice (o in ordine inverso) e cercate questa causa.

Come sensazione generale posso dire che tu, Oleg, hai un bel po' di disattenzione (indifferenza, direi). Questo può portare a 1. Al littering del sistema in uso. 2. Perdita di struttura a causa di questo littering e difficoltà di identificazione e rilevamento dell'insetto. Quindi il mio consiglio è questo. - Se possibile, buttate via tutta la "spazzatura" (inutile) dal codice - l'errore sarà più facile da trovare. - Questo è un classico errore della maggior parte delle persone che chiedono aiuto: la disattenzione.


Non ho scritto io questo modificatore.

L'ho preparato dalle biblioteche.

La cosa principale è che funziona al 100%.

Ma perché il parametro al suo interno non è ottimizzato - questa è la domanda.....

Non ci sono errori di base!

Il resto del codice funziona.

Mettere qualsiasi condizione sull'algoritmo.

- acquisto

-modificare

- vicino a

---------------------------

e provare a proottimizzare il parametro all'interno del mio MODIFICATORE d'ordine - cioè stop e take

 
Chiripaha:

No, penso che vi sbagliate. Il tester non viene buttato fuori a causa dei parametri inseriti, ma perché i risultati non superano i criteri di significatività.

Ma è possibile che il software stesso contenga un errore. Inoltre, i risultati instabili ne sono un'indicazione indiretta. - Significa che c'è qualcosa che non va. Nella mia pratica, non permetto a tali programmi di arrivare al mondo reale. Perché se qualcosa non va, significa che la situazione è incontrollabile. E tutto può venire fuori.

I parametri Stop-Loss e Take-Profit, per definizione, sono in variabili esterne in qualsiasi programma, e non solo perché devono essere ottimizzati. Non è che vai nel codice ogni volta che vuoi cambiarli. Quindi, non importa se le variabili sono esterne o interne. - Questo è sicuro.

Beh, guarda,

Se ora riporto tutto indietro, cioè rimuovo i parametri esterni STOP e TAKE e scrivo numeri all'interno della funzione al loro posto, allora l'EA è stato eseguito settimana dopo settimana per 10 settimane e mostra risultati chiari.

E se cambio manualmente i parametri di stop e take - tutto funzionerà e darà risultati leggermente diversi (questo è naturale)

Ma ora perché, quando sposto questi parametri fuori dal modificatore - l'ottimizzatore li considera insignificanti?