Ti stai perdendo delle opportunità di trading:
- App di trading gratuite
- Oltre 8.000 segnali per il copy trading
- Notizie economiche per esplorare i mercati finanziari
Registrazione
Accedi
Accetti la politica del sito e le condizioni d’uso
Se non hai un account, registrati
Poiché non c'è limite alla perfezione, aggiungerò qualche altro commento sul codice:
Ho evidenziato in giallo due posti non banali.
1) Notate che il codice è ripetuto nel primo if e nel successivo else. L'unica differenza è nell'ultima riga e nell'azione finale (OpenBUY, OpenSell).
2) Le condizioni per entrare nel blocco else non sono ovvie. Non sono visibili a causa dell'abbondanza di ?? Infatti, dipendono solo dall'ultima linea:
Questo è un segno sicuro che qui manca una funzione.
Dobbiamo scrivere una funzione che restituisca vero se il tempo di apertura della posizione corrisponde a quello specificato (la scriverò più tardi).
Sì, Vasily, hai ragione, avremmo dovuto davvero scrivere la funzione.
Saluti, Vladimir.
A proposito, fate attenzione alla dimensione totale del vostro programma. È già abbastanza grande. Come ti piace? A proposito, un principiante non può scrivere un codice così grande: le variabili si confondono, le parentesi diventano troppo grandi, gli errori di compilazione si insinuano come funghi dopo la pioggia. Dopo la compilazione, un programma di tali dimensioni inizia a fare glitch e nessuno riesce a capire cosa c'è che non va. E tutto funziona nel tuo codice per qualche motivo), ed è chiaro nelle funzioni cosa sta succedendo e come. In una parola, è una bellezza.
Grazie Vasily! Molto del tuo lavoro qui, dato che il modello di trailing stop è stato fornito da te. Devo solo riempire le funzioni con del codice. Attualmente sto lavorando sul trailing stop. In parte è già stato fatto, ma ci sono alcune cose che devo ancora capire per mostrare la versione finale EA al pubblico.
Saluti, Vladimir.
Ho aggiunto alcune funzioni. Mi sono ritrovato con un codice come questo:
Ancora non capisco il lavoro di magia. Sulle reti non ha senso. In ogni caso si può facilmente rimuovere questo controllo, poiché è fatto solo in una funzione.Anche il blocco OnInit è sovrapensiero e non è ancora scritto in modo corretto. Prima di tutto, dovresti cercare di scrivere identificatori, non numeri. Restituisce INIT_SUCCEED invece di -1. In secondo luogo, l'interruttore è eccessivo qui. Si dovrebbe usare o 'if' o 'switch'. Prima deve essere scritto uno e poi l'altro sarà obsoleto.
In terzo luogo, dobbiamo monitorare tutti i tipi di account. Abbiamo Demo e poi abbiamo Real. E poi c'è il Concorso. Ma anche se non ci fosse un terzo conto, ci dovrebbe essere uno stub che catturi tutte le altre varianti:
E la ciliegina sulla torta: i commenti. Quando scriviamo funzioni, c'è molto spazio, la nostra mano è portata a mettere commenti nei pezzi di codice giusti:
Quando lo stesso codice è scritto "contemporaneamente" nel corpo di qualche funzione principale, diventa il più breve possibile e senza commenti:
Quindi scrivete più funzioni, vi incoraggiano a scrivere i giusti commenti, e anche se rendono il codice più prolisso, lo rendono anche più chiaro.
Il terzo punto: qui stai scrivendo:
Perché aggiungere un altro tipo di commento? Basta sostituire quello che c'è nel blocco con il tuo commento:
Ricordate, i commenti sono per voi, non voi per i commenti. Cancellate i vecchi e aggiungete i vostri al loro posto. Attieniti al formato - nell'intestazione della funzione, dichiara brevemente ma chiaramente nei commenti cosa fa la funzione e quali valori restituisce in quali casi.
A proposito, quando le condizioni del tempo di chiusura della posizione sono state separate in una funzione separata, è diventato chiaro che non era scritto correttamente:
Ho preso il contenuto interno dal tuo codice. È chiaro che la posizione sarà chiusa solo entro un minuto. В 23:50. Questo codice funzionerà, ma se qualcosa va storto alle 23:50, la posizione rimarrà sospesa alle 23:51. Per questo bisogna almeno scriverlo:
E anche questa opzione non è ideale. Una soluzione più potente è quella di utilizzare le modalità di trading. Tuttavia, questo è il prossimo livello di eccellenza. Finora questo design andrà bene.
Ciao Vasily! Grazie mille per il vostro tempestivo consiglio e supporto. I tuoi messaggi sul ruolo delle funzioni e sui principi di costruzione del codice del programma mi hanno davvero aiutato nell'apprendimento del linguaggio di programmazione MQL5:
Ora che le informazioni nella mia testa sono strutturate, è più facile capire il codice scritto non solo da me, ma anche da altri programmatori. Spero che questo argomento sia un buon aiuto per coloro che stanno iniziando ad imparare il linguaggio di programmazione MQL5 da zero.
Saluti, Vladimir.
Buon lavoro, Vladimir. I buoni codificatori di solito hanno buoni algoritmici, e hanno buoni fissatori di obiettivi... Tutto inizia con i giusti obiettivi e le giuste mete. Si può costruire subito una casa e poi trovare l'acqua. Si può trovare prima l'acqua e costruire la casa pensando all'acqua. Obiettivi / scopo, e la definizione degli obiettivi è da opportunità.... Vai direttamente all'algoritmo .... Ma in generale è molto buono!
A proposito, quando le condizioni del tempo di chiusura della posizione sono state separate in una funzione separata, è diventato chiaro che non era scritto correttamente:
Ho preso il contenuto interno dal tuo codice. È chiaro che la posizione sarà chiusa solo entro un minuto. В 23:50. Questo codice funzionerà, ma se qualcosa va storto alle 23:50, la posizione rimarrà sospesa alle 23:51. Per questo bisogna almeno scriverlo:
E anche questa opzione non è ideale. Una soluzione più potente è quella di utilizzare le modalità di trading. Tuttavia, questo è il prossimo livello di eccellenza. A patto che questo design sia in grado di gestirlo.
Vasily, sei un grande insegnante!
Nessun abbecedario o libro di testo può fornire una tale spiegazione. Tutto quello che hai suggerito lo implementerò sicuramente nella versione finale dell'EA.
Saluti, Vladimir.
Vado un attimo fuori tema e vi racconterò una storia di vita di un insegnante. Nel nostro istituto, quando già ci stavamo specializzando, avevamo un'insegnante meravigliosa. All'epoca stavamo studiando l'algebra della logica. Molti studenti non riuscivano a capire per molto tempo come 1+1 potesse essere uguale a 1? Se 1x1, sarebbe ovviamente uguale a 1. Ed ecco fatto!!! Questo insegnante ha usato semplici esempi per darci una spiegazione di ciò che è l'OR logico e ciò che è l'AND logico, che ricorderò per il resto della mia vita.
Immaginate, dice l'insegnante, che dovete arrivare all'istituto la mattina per le lezioni. Si può prendere un filobus OPPURE un tram per arrivare all'istituto. Siete arrivati alla fermata dell'autobus, ma non c'è né un filobus (condizionefalsa o uguale a 0), né un tram (condizione falsa o uguale a 0). Naturalmente, non sarete in grado di raggiungere l'istituto (condizione false o uguale a 0). Controllare 0+0=0. Meraviglioso! Se arrivi alla fermata dell'autobus e c'è un filobus (condizione vera o uguale a 1), OPPURE un tram (condizione vera o uguale a 1), OPPURE sia un filobus che un tram insieme, allora arriverai sicuramente all'istituto e la condizione vera o uguale a 1 sarà valida! Controllo: 1+0=1, 0+1=1 e 1+1=1. Tutto si adatta!
Usando gli stessi esempi con il filobus e il tram, ci ha spiegato cos'è l'AND logico.
Questo è il potere del talento di un insegnante! Lo ricorderò per il resto della mia vita!
Sinceramente, Vladimir.
Ottimo lavoro. I buoni codificatori di solito hanno buoni algoritmici, e hanno dei fissatori di obiettivi, e hanno dei fissatori di obiettivi... Tutto inizia con i giusti obiettivi e le giuste mete. Si può costruire subito una casa e poi trovare l'acqua. Si può trovare prima l'acqua e costruire la casa pensando all'acqua. Obiettivi / scopo, e la definizione degli obiettivi è da opportunità.... Vai direttamente all'algoritmo .... Ma in generale è molto buono!
Grazie, Valery, per la tua partecipazione all'argomento e al dialogo costruttivo.
Saluti, Vladimir.