avventure di un principiante - pagina 10

 
niko:
Your wish is my command (stavo per dire 'high flyer' ma poi ho controllato sul dizionario online e apparentemente è un commento maleducato, non importa)

Ok, ho dato solo un'occhiata veloce perché ora sei un po' troppo casuale per i miei gusti.

Non hai basato le tue modifiche sull'ultima versione del mio codice.

Pertanto, non ho idea se l'ultima versione del mio codice abbia fatto ciò di cui avevi bisogno, prima di iniziare ad aggiungere altre cose alla versione precedente.

Ma quello che ho notato è che proprio all'inizio della funzione start() manca la tua parentesi graffa di apertura. Pensavo che ne avessimo già parlato.

Devi esercitare un po' di controllo. Se hai intenzione di cambiare qualcosa - assicurati di aggiungere la tua modifica all'ultima versione. E facci sapere qual è il tuo cambiamento e perché lo stai facendo.


CB.

 
niko wrote >>

Tim,

Ho portato il codice al punto in cui non ci sono errori segnalati quando viene compilato (era solo la correzione di alcuni bug che hai evidenziato), anche se in strategy tester non fa ancora alcun trade. Ma sono perplesso su qualcosa: ...

Ciao Nick,

Guardando i tuoi commenti qui e alcune delle modifiche che hai fatto al codice, sospetto che la tua 'perplessità' possa essere dovuta alla confusione tra variabili e parametri di funzione. Sembrano e agiscono in modo piuttosto simile, ma in realtà sono bestie abbastanza diverse.


Forse l'esempio di codice commentato qui sotto renderà le cose un po' più chiare.


Mi sono preso la libertà di riordinare un po' di più il codice di sviluppo e di cambiare un po' i nomi di alcuni parametri di funzione per cercare di differenziarli dalle altre variabili. Ho anche spostato tutte le note superflue, i commenti, ecc. in un "Appendum" alla fine del file perché possiate farne ciò che volete.

Il codice sembra buono. Ci sono ancora alcune piccole cose da fare che ho segnato nel file come TODO, ma il compito principale davanti a te ora è il debug e il test.


I test sono una parte molto importante del ciclo di sviluppo. Con i sistemi di trading, la mancanza di test adeguati può portare a problemi sottili che possono giocare un brutto tiro con la vostra strategia di trading e, in definitiva, con il vostro conto. Il compito principale dei test è quello di assicurarsi che il codice stia facendo ciò che ci si aspetta che faccia. In effetti dovete scrivere o dire a voi stessi: "In questa situazione, mi aspetto questo risultato". Poi ideate ed eseguite il vostro test per vedere se questo è effettivamente ciò che accade. Se non è così, devi correggere il problema. Ripeti questo processo per tutte le situazioni probabili che puoi immaginare e forse anche per alcune improbabili. Naturalmente stai anche cercando errori di runtime o bug che possono o non possono essere visualizzati con i messaggi di errore del sistema MetaTrader.


Con MT4, il vostro principale strumento di test sarà lo Strategy Tester e i file di log (sotto la scheda Journal) così come i risultati, i grafici e i report.


Con il file di log spesso trovo più facile aprire l'intero file in Microsoft Notepad piuttosto che cercare di guardarne una parte attraverso il Journal viewer. Non dimenticate di cancellare il file di log/diario prima di ogni esecuzione o finirete per guardare un sacco di informazioni vecchie e forse non più rilevanti. Dopo ogni esecuzione di test nel tester di strategia, esaminate il file di log sia per i messaggi di debug che per i messaggi di sistema di MetaTrader. È possibile utilizzare la documentazione di MetaTrader onine per cercare codici di errore per ulteriori informazioni. Usate anche le funzioni Risultati, Grafici e Report per vedere cosa sta facendo il programma in un particolare insieme di condizioni.


Suggerimento - Quando fate i vostri test iniziali, mantenete il periodo di test breve, per minimizzare la quantità di dati nel file di log.


Abbiamo già incorporato alcune strutture di debug nel codice, ma probabilmente avrete bisogno di espanderle. Disabilitate le singole istruzioni di debug come richiesto per mantenere le informazioni nel file di log condensate e rilevanti. C'è un esempio nel codice di come fare questo senza cancellare o commentare le istruzioni di debug che possono richiedere molto tempo. Lascio le mie principali dichiarazioni di debug nel file del programma a tempo indeterminato e le spengo tutte con il flag DEBUG_ON nel programma una volta che ho finito i test.


Gestire i file di log e le dichiarazioni di debug in modo efficiente è, credo, la chiave per un buon ed efficiente test e debugging nell'ambiente MetaTrader. Ho visto persone su questo forum lamentarsi della mancanza di strumenti di debug in MetaTrader. Milioni di linee di codice commerciale sono state degbuggate e testate con successo usando strumenti non più sofisticati di quelli che si trovano in MetaTrader. Questi strumenti possono essere di base, ma funzionano bene, a condizione che tu sappia come usarli correttamente.


Un altro punto che vale la pena sottolineare è che cercare di fare il debug di un codice disordinato o mal organizzato può essere molto lungo e frustrante. E' da questo punto in poi che inizierete davvero a raccogliere i benefici del vostro codice ben strutturato e ben commentato. Se qualcun altro avrà mai bisogno di lavorare sul tuo codice, ti sarà molto grato per i tuoi sforzi in questo senso.


Nick, questo viaggio ha ancora una strada da percorrere. Per me, il test, il debug e l'ottimizzazione - il "far funzionare tutto" è la parte più interessante del lavoro, e spesso la più impegnativa. Ti passo il codice per iniziare i test e aspetto che tu mi risponda con domande e/o problemi che incontri.


Saluti

Tim



Un semplice esempio di codice per provare a dimostrare la differenza tra una variabile globale e un parametro di funzione

//+------------------------------------------------------------------+
//| Hello Trader.mq4 |
//| Copyright © 2009, Your Name |
//| |
//+------------------------------------------------------------------+
#property copyright "Copyright © 2009, Your Name"
#property link ""


//+------------------------------------------------------------------+
//| expert initialization function |
//+------------------------------------------------------------------+
stringMyGlobalVariable; // This global variable which holds a string i.e text value has been declared
// but as yet has no value in it. It is a 'container' which at this point in time holds
// only an empty or null string.

int init()

{

MyGlobalVariable = "Nick"; // Now we assign i.e put a value in the variable. Our 'container' which is named
// MyGlobalVariable now holds the string value of "Nick"

return(0);
}


//+------------------------------------------------------------------+
//| expert deinitialization function |
//+------------------------------------------------------------------+
int deinit()
{

return(0);
}


//+------------------------------------------------------------------+
//| expert start function |
//+------------------------------------------------------------------+
int start()
{

MyFunction(MyGlobalVariable); // This calls the function named MyFunction which is declared below
// This function requires one string parameter.

// In this case we have passed it our global variable as a parameter.

// MyFunction("Fred"); // We could also pass this function the literal string "Fred"

// MyFunction(12.739); // This would not work. The passed value must be a string because that is what we
// have declared the parameter as in the function declaration below.

// MyFunction(DoubleToStr(12.739,3)); // This would work because we have used an inbuilt MT4 function to convert the decimal
// number to a string i.e "12.739").
// We can also pass other functions as parameters as we have shown here, provided the
// function that we are using as a parameter returns the correct data type which in
// this case is a string.

return(0);
}


//+------------------------------------------------------------------+
//| A function with one parameter |
//+------------------------------------------------------------------+


void MyFunction(string MyFunctionParameter) // The function is declared with a parameter in the same way that a varible is declared
// but it is a function parameter not a variable. It can be used just like a variable
// but only inside the function. The big difference is that it can be passed a different value
// from outside the function whenever the function is called. This enables functions to
// be used as general purpose blocks or modules.
// Function parameters are also used in some circumstances to return values from the
// function to the outside world but that is another more complex story for another day!

{
Comment(MyFunctionParameter); // The value passed to 'MyFunctionParameter' will be displayed at the top, left hand
// corner of the screen

}

 
Ciao CB, è strano perché salvo sempre il file mq4 come nuovo, con l'ultima data per separare gli altri file. deve essermi sfuggita la confusione. la staffa volevo includerla, ma ho pensato che a un certo punto mi avevi chiesto di toglierla (era l'ultima, ma senza l'ultima, la start() sarebbe stata sbilanciata. ecco perché ho tolto anche la prima, ma la rimetto).
 
niko:
hey CB, è strano perché salvo sempre il file mq4 come nuovo, con l'ultima data per separare gli altri file. deve essermi sfuggita la confusione. la staffa volevo includerla, ma ho pensato che ad un certo punto mi avevi chiesto di rimuoverla (era l'ultima, ma senza l'ultima, la start() sarebbe stata sbilanciata. ecco perché ho rimosso anche la prima, ma la rimetterò).

Non cominciamo ad aggiungere e rimuovere parentesi graffe volenti o nolenti. Avevo già fatto notare che avevi una serie completamente superflua, che poteva essere rimossa.

Ecco l'ultima versione. Per favore fate quanto segue:

- Compilatela prima e correggete eventuali errori - in questo modo saprete che eventuali errori successivi sono dovuti a modifiche che potreste fare

- Fatemi sapere se ci sono stati o meno errori che avete dovuto correggere

- Provalo e vedi se fa quello che ti serve

- Fammi sapere come va - e fammi sapere quali modifiche pensi di dover fare


CB

File:
 
Grazie CB. Me ne occuperò, scusa se ti ho frustrato un po'.
 

Grazie Tim,

Apprezzo molto la lunghezza con cui mi spieghi queste cose, è molto incoraggiante. Mi sembra di avere dei 'flash' di capire e poi di non capire affatto (riguardo alle funzioni e alle chiamate) anche se devo aver letto la documentazione sulle funzioni già venti volte. Ci dedicherò più tempo. Per quanto riguarda il 'testing e debugging', l'ho già fatto in un altro pacchetto (passando attraverso ogni trade che è stato fatto, assicurandomi che tutto combaciasse) perché penso che sia essenziale, anche per il trading manuale(test della strategia). Procederò con il tuo codice e ti farò sapere.

 
niko:
Grazie CB. Ci penso io, scusa se ti ho frustrato un po'.

Non preoccuparti, amico. Sto solo cercando di fare un passo alla volta.


CB

 

Ciao CB,


Ho corretto alcuni bug nel codice, principalmente mancava la parentesi, è evidenziata nel codice. Niente più errori di sintassi.

Ho eseguito il codice su strategy tester, ma fa solo operazioni di acquisto. Nessun trade corto. Ho dato un'occhiata ai log, i produttori dell'errore 130 (a che fare con gli stop) quindi questo non fa luce sul nostro problema.

Ho provato a vedere se riesco a capire dov'è l'errore (presumo sia in fnSHouldWeTrade o fnOrderDuplicate).

Ultima versione del codice allegata, ho aggiunto valori a TopFilter e BotFilter per permettere alla strategia di fare trade.

ps: ho capito perché ho incollato il vecchio codice per voi prima, ho reinstallato mt4 in una cartella diversa (nessun errore di connessione) e il codice era un vecchio duplicato dalla vecchia cartella

 
niko:

Ciao CB,


Ho risolto alcuni bug nel codice, principalmente mancava la parentesi, è evidenziata nel codice. Niente più errori di sintassi.

Ho eseguito il codice su strategy tester, ma fa solo operazioni di acquisto. Nessun trade corto. Ho dato un'occhiata ai log, i produttori dell'errore 130 (a che fare con gli stop) quindi questo non fa luce sul nostro problema.

Ho provato a vedere se riesco a capire dov'è l'errore (presumo sia in fnSHouldWeTrade o fnOrderDuplicate).

Ultima versione del codice allegata, ho aggiunto valori a TopFilter e BotFilter per permettere alla strategia di fare trade.

ps: ho capito perché ho incollato il vecchio codice per voi prima, ho reinstallato mt4 in una cartella diversa (nessun errore di connessione) e il codice era un vecchio duplicato dalla vecchia cartella


Modifica:

OrderSend(Symbol(),OP_SELL,Lots,Bid,5,0,Bid+TakeProfit*Point, "Nikos First EA",0,0,0,Red);

a:

OrderSend(Symbol(),OP_SELL,Lots,Bid,5,0,Ask-TakeProfit*Point, "Nikos First EA",0,0,Red);


CB

 
grazie CB, avrei dovuto notarlo, quindi l'errore era giusto alla fine (130).