'Diramazione condizionale - 'GoTo' Kluge ? - pagina 3

 
FourX:

Per quanto sono stato in grado di capire finora Raptor, non c'è nulla come i comandi GoSub / Return o la capacità di fare una tale funzione in MQL4. Da qui il mio tentativo di capire un kluge in MQL4 per svolgere questa capacità.

Una funzione fa lo stesso di GOSUB/RETURN . . .

start()
  {
  Print("About to call a function called, a_function . . .");
  a_function();                                               //  GOSUB
  Print("Just returned from a function called, a_function");
  return(0);
  } 
   
   
   
void a_function()
   {
   Print("a_function has been called . . . ");
   return;                                          // RETURN
   }
   
   
   
 
RaptorUK:

Una funzione fa la stessa cosa di GOSUB/RETURN . . .

Riconosco che innumerevoli funzioni standard e personalizzate possono essere 'chiamate' e utilizzate in qualsiasi punto (appropriato) di Raptor, ma non c'è nulla in MQL4 come un GoSub e/o GoTo in qualsiasi punto specifico all'interno del programma come GoTo Line 185 o una specifica etichetta/funzione ecc, come tu stesso hai descritto. Quindi eseguirlo e poi tornare al punto del programma da cui è stato chiamato; o forse continuare da quella subroutine chiamata e/o sezione/funzione del programma a seconda del risultato condizionale di quella subroutine. Come hai dichiarato, tu stesso hai usato GoSub per anni e fare un salto condizionale oltre un paio di linee sequenziali di codice non è affatto la stessa cosa. Non voglio continuare a discutere di questa distinzione che già conosciamo e che non svolge affatto la stessa funzione. Così questo post. Non abbiamo ancora capito come utilizzare un vero 'GoSub' che per esempio salti ad un punto precedente del programma e riutilizzi la stessa funzione necessaria già stabilita nel programma invece di doverla codificare ripetutamente ogni volta che è necessario.

Per tua informazione: il MetaEditor va in crash circa l'85% delle volte che ci copio del testo. Questo su MOLTE diverse istanze di MT4 e numerosi computer diversi e su 3 diverse versioni di Windows. Senza contare i sistemi a 32 e 64 bit su cui ho usato MQL4. MT4 va bene, l'editor MQL4 no. Quindi copiare e incollare non è proprio un'opzione praticabile per me. Anche se lo è, questo ancora non offre le stesse capacità di un 'GoSub' o GoTo'.

 

C'è davvero un senso a tutto questo? E' un fatto che mql4 è mql4, quindi quando si codifica in mql4 si deve pensare mql4, non ha senso cercare di codificare in un linguaggio considerando come si sarebbe risolto in un altro che supporta costrutti diversi. Se avete un problema di codifica in mql4 che credete possa essere risolto solo con l'uso di GoSub/Return e GoTo's mi piacerebbe vederlo, perché penso che scoprirete che c'è sempre più di un modo per spellare un gatto.

 

FourX:

Anche se lo fosse, questo ancora non offre le stesse capacità di un 'GoSub' o GoTo'.

Mi dispiace, ho davvero difficoltà a capire il tuo punto di vista secondo cui una funzione MQL4 e un GOSUB sono diversi in qualche modo. (Goto è tutto un altro paio di maniche).

Rimaniamo su questa cosa del Gosub. Una funzione MQL4 è una subroutine. Può restituire o meno un valore. Tutte le chiamate di subroutine ritornano alla linea successiva nel codice principale da dove sono state chiamate. Sono d'accordo al 100% con Raptor su questo.

(Sono anche d'accordo con il punto di vista di SDC sopra).

 

Il punto di questo thread è vedere se è possibile fare ramificazioni condizionali in QUALSIASI punto del programma, o anche esternamente da altri programmi, per riutilizzare ripetutamente moduli/funzioni del programma come quelli previsti in altri ambienti, come quelli citati all'inizio: fGoTo, fGoSub. So già che MQL4 non li prevede direttamente. Questo è il punto di questo thread: è possibile fare un 'work-around (SubRoutine?)' ecc per realizzare questa funzionalità? Concettualmente questo ha anche delle somiglianze con i file 'include' in MQL4.

Simile al work-around che tutti noi usiamo per compensare le limitate capacità del debugger MQL4 con l''Alerting' o la 'Stampa' dei valori della funzione GetLastError().

Questo non è affatto come le normali funzioni MQL4 che contengono un certo numero di booleani condizionali come if, while, loop, continue, return etc che possono saltare avanti o indietro all'interno della funzione in quanto il workaround che sto cercando di fornire per le capacità come gli esempi forniti da altri ambienti dove si può riutilizzare qualsiasi modulo di programmazione / funzione ripetutamente, spesso da (molto) prima nel programma. Dichiararlo una volta: usarlo può più volte per la maggior parte in qualsiasi altro posto all'interno del programma in cui si ha bisogno della funzionalità è già stato fornito. Il fGoSub in alcuni ambienti permette agli utenti di importare e utilizzare tali altre fSubRoutines, spesso da piccoli programmi separati che sono moduli che svolgono una funzione specifica. Forse un po' simile ai file 'Include' di MQL4.

Solo perché ora non c'è, significa che non dovremmo utilizzare questa potente funzionalità di programmazione se possiamo creare un 'work around' per essa?

Come tutti sappiamo, ci sono numerosi modi di programmare qualcosa per ottenere lo stesso risultato. Questo non è un caso di 'Mostrami il tuo problema e ti dirò come farlo senza un fGoTo o un fGoSub'. È un caso di: Se possiamo creare la funzionalità, allora abbiamo questa ulteriore flessibilità e capacità di programmazione che possiamo utilizzare in molti modi diversi in molte situazioni diverse.

 

Non credo che tu abbia capito cos'è una funzione personalizzata in mql4 . . . forse puoi fare un esempio del perché una funzione personalizzata in mql4 non fa esattamente quello che stai descrivendo? Penso che lo faccia... Ho un sacco di funzioni che riutilizzo in molti altri EA, indicatori e script.

Pensa a start() come il programma. . da qualsiasi punto all'interno di start posso chiamare una funzione personalizzata . . . quando la funzione è finita il programma ritorna alla linea dopo la linea dove è stata chiamata la funzione personalizzata . . . proprio come un GOSUB.

 

FourX:

Il punto di questo thread è vedere se è possibile fare la ramificazione condizionale in QUALSIASI punto del programma, o anche esternamente da altri programmi, per riutilizzare ripetutamente moduli/funzioni del programma come sono previsti in altri ambienti come quelli indicati all'inizio: fGoTo, fGoSub.

Sto cercando di fornire le capacità come gli esempi dati da altri ambienti dove si può riutilizzare qualsiasi modulo/funzione di programmazione ripetutamente, spesso da (molto) prima nel programma.

Mql4 è un linguaggio vecchio stile, il suo livello è circa 1990. Ma i tuoi goto e gosub sono costruzioni ancora più vecchie, dal 1970 circa. Che senso ha rendere il tuo stile di programmazione più vecchio di mql4? Molto meglio usare un vero linguaggio di programmazione, come C#, tramite dll-s. La maggior parte delle invenzioni degli anni '90 e 2000 (come le classi, le interfacce, gli oggetti, i design pattern come gli eventi e i listener, i metodi di programmazione come il test driven programming, ecc.) servono a prevenire la ripetizione del codice e ad aiutarvi a scrivere rapidamente codici riutilizzabili, affidabili e leggibili. Penso che dovresti dimenticare tutto questo progetto goto.
 
FourX:

Riconosco che innumerevoli funzioni standard e personalizzate possono essere 'chiamate' e utilizzate in qualsiasi punto (appropriato) Raptor, ma non c'è nulla in MQL4 come un GoSub e/o un GoTo in qualsiasi punto specifico all'interno del programma, come GoTo Line 185 o una specifica etichetta/funzione ecc, come tu stesso hai descritto. Quindi eseguirlo e poi tornare al punto del programma da cui è stato chiamato;

il ritorno all'interno di una funzione la farà tornare al punto da cui la funzione è stata chiamata. È un sostituto al 100% del vecchio gosub/return. e inoltre la funzione permette di passare valori e restituire valori, hanno anche il loro spazio dei nomi e lo stack frame, quindi non c'è più bisogno di un casino di variabili globali. Davvero non capisco il tuo problema. Per favore, fornisci un esempio concreto (magari in pseudo-codice o BASIC) di ciò che vuoi effettivamente fare e potremmo mostrarti come lo stesso esempio potrebbe essere fatto in un modo molto più chiaro e riutilizzabile e mantenibile con if/else, switch/case e chiamate di funzione.

L'unica cosa che manca davvero sono le eccezioni. State cercando di simulare le eccezioni? Non puoi farlo nemmeno con GOTO, avresti anche bisogno di preoccuparti adeguatamente (e srotolare) lo stack delle chiamate quando fai questo.

Si possono avere più dichiarazioni di ritorno all'interno della stessa funzione e si può anche uscire dai cicli con break, questa è la cosa più vicina a un GOTO in un linguaggio strutturato e queste cose (uscite multiple) sono già disapprovate da alcuni puristi rigorosi.

 
erzo:
Molto meglio usare un vero linguaggio di programmazione, come C#, attraverso le DLL.

C# non è raccomandato per fare DLL che interagiscono con questa API piatta di basso livello della convenzione di chiamata C. C# è perfetto se volete interagire con altri C# e varie cose microsoft, ma non è così generico come altri ambienti. È molto specializzato.

Se volete fare DLL che si interfacciano facilmente con le convenzioni di chiamata C in un linguaggio di programmazione moderno, allora vi suggerisco ObjectPascal (Free Pascal) o Delphi.

 
7bit:

C# non è raccomandato per fare DLL che interagiscono con questa API di basso livello con convenzione di chiamata C.

Conosco meglio java, e considerato da usare, ma è difficile fare un ponte. Ma se non si consiglia C#, che pensavo sarebbe stato più facile, proverò comunque java. (Pascal non è il mio stile.) Grazie per i vostri consigli!