![MQL5 - Linguaggio delle strategie di trading integrato nel client terminal MetaTrader 5](https://c.mql5.com/i/registerlandings/logo-2.png)
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
Anche Java non funziona al di fuori della sua macchina virtuale, lì avrete gli stessi problemi, non potete fare una dll che può essere caricata e chiamata da un programma C.
Se ti piace C# allora ti piacerà anche ObjectPascal (la sicurezza dei tipi, la severità, l'intera filosofia che c'è dietro, eccetto la cosa della VM). Dopo tutto il progettista e capo architetto di C# è la stessa persona che ha creato Turbo-Pascal e Delphi (ObjectPascal) e questo traspare. Per certi aspetti C# è come l'ObjectPascal con una sintassi C (brutta ma oggi alla moda).
Per interfacciarsi direttamente con la macchina e con C-APIs (come è necessario per MetaTrader) e usare ancora un linguaggio potente come C# non ci sono molte alternative a ObjectPascal. Alcuni dicono che il C++ è altrettanto potente (e può ovviamente essere usato anche al posto dell'OP) ma chiaramente non è così elegante, ha molte incongruenze ed è così incline all'errore che solo i veri esperti possono veramente padroneggiarlo.
.... il ritorno all'interno di una funzione la farà tornare nel luogo da cui la funzione è stata chiamata.
Questa è la distinzione cruciale 7bit: Sto parlando di invocare una funzione completamente diversa, una subroutine o anche codice importato, intere subroutine e/o funzioni FUORI dall'intera funzione corrente. Un esempio concettuale:
Sono in una funzione che si svolge dalla linea 100 alla linea 20, ma voglio invocare qualcosa che cade fuori da questo ambito. Forse una funzione completamente diversa che si trova nelle righe da 50 a 60. <=-Questo non si adatta ai parametri e all'esempio di cui sopra, che è ciò di cui sto chiedendo È un sostituto al 100% del vecchio gosub/return e inoltre la funzione permette di passare valori e restituire valori.
Si possono avere più dichiarazioni di ritorno all'interno della stessa funzione e si può anche uscire dai cicli con break ....
Capito
Ma continuo a sentirmi dire come posso muovermi all'interno dell'ambito di una specifica funzione, cosa che capisco. Ma questo NON è affatto quello che sto chiedendo e che ho dichiarato all'inizio di tutto questo.
Per quanto riguarda le 'eccezioni', immagino che possiate chiamarle così se volete. Come ho detto, sto cercando di trovare un 'work around' per aggiungere e utilizzare la funzionalità di funzioni come: GoTo, GoSub (al di fuori della funzione CURRENT) ecc. che non esiste come funzione direttamente in MQL4. Dalle vostre risposte, la maggior parte di voi conosce e comprende queste distinzioni di programmazione, ma non sta affrontando la vera domanda posta.
FourX:
Sono in una funzione che si svolge dalla linea 100 alla linea 20, ma voglio invocare qualcosa che cade fuori da questo ambito. Forse una funzione completamente diversa che si trova nelle linee 50 - 60.considera questo:
Ora cosa succederà? Cominciamo con main(), spiegherò tutti i passi durante l'esecuzione (i commenti sono in verde, le istruzioni sono in nero):
La funzione pippo ha bisogno di uno stack frame locale di 8 byte più l'indirizzo di ritorno e la funzione bar di soli 4 byte più l'indirizzo di ritorno. Le loro dichiarazioni di ritorno hanno già questo incorporato dal compilatore in fase di compilazione, essi pop quantità diverse di byte dallo stack, non è possibile utilizzare un ritorno per fare il lavoro dell'altro, ognuno funziona solo per la funzione per cui è stato compilato.
Questi vecchi linguaggi che avevano GOTO in tutto il programma non avevano scope di variabili locali e l'unica cosa che dovevi fare bene era far coincidere il numero di GOSUB e RETURN per essere uguali, tutti i loro ritorni facevano solo il pop dell'indirizzo di ritorno e nient'altro, tutti i ritorni si comportavano esattamente allo stesso modo. Ma ora abbiamo un sacco di "GOSUB" di dimensioni diverse (ognuno spinge quantità diverse sullo stack) e anche molti ritorni diversi che popano quantità diverse dallo stack. E abbiamo variabili locali sullo stack. Questo non può funzionare, non importa quali cose folli si cerchi di costruire nel compilatore.
Si potrebbe teoricamente fare il GOTO all'interno della *stessa* funzione (e alcuni linguaggi lo permettono) ma non potete mostrarmi un pezzo di codice in cui questo porterebbe effettivamente ad un codice più elegante, più facile da capire e più manutenibile di una corretta programmazione strutturata. Tutto ciò che farebbe è produrre un orribile casino. Nessuno ha bisogno di questo, quindi non è implementato.
Tutti sappiamo già che MQL4 non ha funzioni native come un GoTo o un 'GoSub -=> ReturnFromGoSub'. Non c'è dubbio su questo. Questo si è trasformato in ripetute spiegazioni ed esempi del fatto che MQL4 non ha tali funzioni native. Non c'è discussione. Questo non è il tema di questo thread e non lo è mai stato. Quindi possiamo per favore smettere di discutere su ciò che già sappiamo e su cui siamo d'accordo?
Sappiamo che queste sono funzioni valide in altri linguaggi di programmazione e possono essere molto utili.
Lo scopo di tutto questo è scoprire se possiamo simularle e utilizzarle con ciò che è disponibile in MQL4?
Per esempio, una valida funzione di completamento del secondo caso nella prima frase di'GoSub -=> ReturnFromGoSub ' sarebbe: Tornare al punto del programma in cui il GoSub è stato chiamato e restituire i valori dal GoSub al punto di chiamata nel programma.
Per esempio, un valido completamento di funzione del secondo caso nella prima frase di'GoSub -=> ReturnFromGoSub ' sarebbe: Tornare al punto del programma in cui il GoSub è stato chiamato e restituire i valori dal GoSub al punto di chiamata nel programma.
FourX:
'GoSub -=> ReturnFromGoSub ' sarebbe per: Tornare al punto del programma in cui il GoSub è stato chiamato e restituire i valori dal GoSub al punto chiamante nel programma.
FourX se stai imparando mql4 mentre la tua mente è ancora in BBC Basic pensa a defproc e proc e dimentica GoTo e GoSub.
Ho avuto un BBC micro nei primi anni '80 ....ahhhh mi ricordo ancora le gioie di cercare di far caricare i programmi dal suo lettore di cassette :( scrivevamo programmi in BBC Basic
FourX se stai imparando mql4 mentre la tua mente è ancora in BBC Basic pensa a defproc e proc e dimentica GoTo e GoSub.
Ho avuto un BBC micro nei primi anni '80 ....ahhhh mi ricordo ancora le gioie di cercare di far caricare i programmi dal suo lettore di cassette :( scrivevamo programmi in BBC Basic
LOL . . . Avevo un Acorn Electron . . . quando era caldo non leggeva le cose dal nastro che avevo scritto quando era freddo e viceversa . . . quelli erano giorni. ;-)
Sì, erano proprio quei giorni:) torcere un cacciavite piegato su quella piccola vite vicino alle testine del nastro mentre si sbatteva ripetutamente sul lato di essa haha