avventure di un principiante - pagina 7

 
niko:

A CB:


Ehi, volano alto! Ho fatto tutto quello che potevo con i compiti di Tim e così ho deciso di iniziare a guardare il tuo codice in modo più dettagliato.


Ho esaminato il tuo codice, cercando di capire e correggere gli errori in esso contenuti. Sono riuscito a ridurre gli errori a solo 'parentesi sbilanciate' per la stringa fnGenerateSignal(). Non so perché dice sbilanciamento in questo caso.


Come sempre apprezzerei i vostri pensieri sui miei progressi con il vostro codice! Tenete a mente che ci sono ancora un sacco di bit e pezzi che non capisco, anche le cose molto elementari.

Vedere le annotazioni.

Ho notato quanto segue:

- stavi dichiarando che le funzioni si aspettavano che le variabili passassero loro come parametri, ma poi non le passavano effettivamente nella chiamata alla funzione - così ti ho chiesto solo di spostare le variabili nel blocco superiore in modo che fossero disponibili per tutte le tue funzioni per ora - manteniamo il tutto semplice come poss per ora

- sembravi pensare di dover dichiarare anche il nome della tua funzione come variabile. Ecco come usare le funzioni e passare le variabili dentro e fuori di esse:


Dichiarare:

int abcdef(int x, string s) //che la funzione con nome abcdef accetta in ingresso un intero e una stringa e restituisce un intero come uscita (in questo caso o 0 o 9)

{

la funzione fa delle cose con x e s

se (qualche condizione)

ritorna(9);

altrimenti

return(0);

}


E per chiamare:

...

myResponse = abcdef(myInteger, myString);

se (myResponse == 9)

{

blah

 

Ciao CB,

Grazie. Questa è la parte che non riuscivo a capire, me l'hai resa molto chiara. Penso di essere sulla strada giusta ora.

CB, domanda1:

bool fnOrderDuplicate()

{

iDuplicateOrders=0 // CB non dovrebbe iDuplicateOrders essere dichiarato come int o doppio?

iOrders = OrdersTotal()-1 // Ora capisco, con il tuo aiuto, che questo chiama la funzione OrdersTotal. ma di nuovo iOrders non dovrebbe essere dichiarato come variabile?

CB, domanda2:

int fnTrade() //Perché questo non è "int fnTrade(string sSignal)", visto che stiamo usando sSignal nella funzione. ?

{ if(sSignal=="OP_BUY")

...

CB, quesytion3:

Mi hai chiesto di rimuovere return(0) e } alla fine del codice. ma questo significherebbe che la funzione Start() non si chiude con un tipico 'return(0) e le parentesi non sono chiuse, in quanto tutte le parentesi graffe (da quello che ho controllato) sono particolari all'apertura e chiusura delle funzioni specifiche che abbiamo progettato. ?

 
niko:

Ciao CB,

Grazie. Questa è la parte che non riuscivo a capire, me l'hai resa molto chiara. Penso di essere sulla strada giusta ora.

CB, domanda1:

bool fnOrderDuplicate()

{

iDuplicateOrders=0 // CB non dovrebbe iDuplicateOrders essere dichiarato come int o doppio?

iOrders = OrdersTotal()-1 // Ora capisco, con il tuo aiuto, che questo chiama la funzione OrdersTotal. ma di nuovo iOrders non dovrebbe essere dichiarato come variabile?

CB, domanda2:

int fnTrade() //Perché questo non è "int fnTrade(string sSignal)", visto che stiamo usando sSignal nella funzione. ?

{ if(sSignal=="OP_BUY")

...

CB, quesytion3:

Mi hai chiesto di rimuovere return(0) e } alla fine del codice. ma questo significherebbe che la funzione Start() non si chiude con un tipico 'return(0) e le parentesi non sono chiuse, in quanto tutte le parentesi graffe (da quello che ho controllato) sono particolari all'apertura e chiusura delle funzioni specifiche che abbiamo progettato. ?

D1: Entrambe queste variabili SONO definite. Guardate le variabili che vi ho suggerito di spostare nella sezione in cui avete definito i vostri esterni. Questo le renderà automaticamente disponibili a tutte le funzioni.

Q2: La variabile sSignal, se dichiarata all'esterno di tutte le funzioni, è disponibile a tutte le funzioni senza bisogno di passarla esplicitamente nella chiamata di funzione.

Q3: Ah - ora capisco il tuo malinteso. Mi chiedevo perché avessi messo quella dichiarazione di ritorno e quella parentesi graffa lì. Il mio commento sull'istruzione fnTrade() ha risposto a questa domanda. Noterai che ti avevo chiesto di aggiungere una chiamata di ritorno e una parentesi graffa di chiusura lì dentro. La ragione è che stavi (erroneamente) dichiarando tutte le tue funzioni all'interno del blocco di codice della funzione start().


CB

 
niko wrote >>

Ciao Tim,

Ho fatto i pezzi che mi hai chiesto per il codice. Grazie per aver fornito risposte dettagliate alle mie domande e per aver scritto molti commenti in tutto il codice per aiutarmi a capire. Sto cominciando a vedere come le cose si incastrano, come usare correttamente gli array e chiamare funzioni specifiche (e il ruolo delle variabili globali e locali).

Ho allegato l'ultima versione del nostro codice.

Una domanda, c'è un motivo per cui non abbiamo fatto la funzione EntryRules per contenere tutto (comprese le bandiere) per darci una condizione di acquisto/corto, ma invece la chiamiamo con le bandiere in seguito per prendere la decisione di entrata?

Ciao Nick


Ho messo in ordine alcune cose nel codice e spero di aver risposto alle vostre domande. La funzione EntryFunction è ora completa. Dovete solo chiamarla dalla funzione iniziale (principale) come ho indicato nel codice e passarle i parametri richiesti come mostrato. Solo pochi minuti di lavoro, spero, e poi potrete provare a compilare e testare. Mi aspetto che tu abbia qualche piccolo bug da affrontare, ma spero niente di grave.


Una volta compilato, prova ad eseguire l'EA nel tester e dai un'occhiata al file di log per vedere se sembra fare quello che ti aspetti in questa fase. Dovresti essere in grado di vedere segnali di ACQUISTO e VENDITA per ciascuna delle coppie di valute.


Direi che a questo punto il vostro codice è completo al 75%.


Il prossimo passo dopo questo è quello di scrivere un'altra funzione per controllare gli ordini aperti per una data coppia di valute e la direzione degli scambi.


Suggerirei di dare un'occhiata alla documentazione di MT4 sotto Funzioni di trading. OrdersTotal(), OrderSelect(), Order Symbol() e OrderType() sembrano candidati ideali per questo compito.


Per quanto riguarda la tua domanda sul fare in modo che la funzione EntryRules contenga tutto, comprese le bandiere, non vedo perché no. Perché non provi a modificare la funzione EntryRules?

Ti suggerisco di farlo dopo aver compilato, eseguito e testato quello che hai già fatto.


Saluti

Tim

 

CB: Grazie amico, questo aiuta a chiarire ulteriormente le cose per me. Per qualche ragione pensavo che tutto dovesse essere all'interno della funzione di avvio.

Domanda: Non dovremmo dichiarare le ema all'interno della funzione start dato che vogliamo che siano calcolate/aggiornate ad ogni tick?

 

Ehi Tim: grazie ancora una volta per il tuo aiuto. Procederò con le cose dalla mia parte non appena lascio il lavoro questa sera. lavorando con te e CB ora ho più idee su come mettere insieme le cose, e cominciando a pensare in modo più flessibile a tutto questo.

 
niko:

CB: Grazie amico, questo aiuta a chiarire ulteriormente le cose per me. Per qualche ragione pensavo che tutto dovesse essere all'interno della funzione di avvio.

Domanda: Non dovremmo dichiarare le ema all'interno della funzione start dato che vogliamo che siano calcolate/aggiornate ad ogni tick?

No. Se dichiarate una variabile all'interno di una funzione, essa è disponibile solo all'interno di quella funzione. Se la dichiarate al di fuori di tutte le funzioni, è disponibile per tutte le funzioni. Quindi potete dichiarare le variabili ema in alto e poi fare i calcoli su di esse all'interno della funzione di avvio.


CB

 
cloudbreaker wrote >>

No. Se dichiarate una variabile all'interno di una funzione, è disponibile solo all'interno di quella funzione. Se la dichiarate al di fuori di tutte le funzioni, è disponibile per tutte le funzioni. Perciò potete dichiarare le variabili ema all'inizio e poi fare dei calcoli su di esse all'interno della funzione start.

CB

Grazie CB, ora ho capito!

 

Ciao Tim,


Sono tornata ora dalla Turchia. Ho avuto un tempo incredibile a Kusadasi, e davvero non volevo andarmene. I turchi sono molto più amichevoli degli inglesi. Mi sono sentito a casa lì, anche se non ci sono mai stato prima.


Ho passato le ultime 5 ore circa ad aggiornare il codice che stiamo progettando. È allegato.

Le modifiche chiave sono state:

1. Ho creato una funzione Order Count, e l'ho chiamata all'interno della funzione start. Mi aspetto che questo sia pieno di errori perché ci sono parti che ancora non capisco (ad esempio: come assicurarsi che segua il ciclo [c] in modo che funzioni solo per coppia di valute)

2. Ho cercato di correggere il codice per quanto riguarda il nome currencySymbol vs. currencySym, poiché abbiamo cambiato il nome a metà strada. Ma questo potrebbe essersi confuso.

3. Ho chiamato la funzione EntryRules all'interno della funzione start


Apprezzerei molto se correggete i grandi e piccoli errori se continuate a introdurre //perché il vecchio codice è sbagliato, commenti, mi aiuta a correggere il mio pensiero logico.


Come sempre attendo con ansia le tue modifiche!

 

Ciao CB,


Penso che Tim sia in vacanza ora, dato che non lo sento da qualche giorno. Così sto continuando con il tuo codice, dato che mi aiuterà a fare trading (dato che sto facendo trading manualmente con la strategia ora, e significa svegliarsi presto, ecc). Ho modificato tutto il codice come richiesto, ma per qualche motivo continua a restituire un errore (a che fare con "==" questa volta, molto strano).


Un'altra cosa è che ho notato che la funzione start non era chiusa. Così ho aggiunto "}" dopo la prima funzione all'interno dell'inizio (), se non lo facciamo, il codice genera un errore con la successiva funzione stringa fnGenerateSignal() (dicendo che la definizione della funzione per questo è inaspettata).


Grazie come sempre. Attendo con ansia i vostri commenti/modifiche!

Nick

Motivazione: