Come controllare se un ordine è selezionato - pagina 19

 
In linea di principio, sì, ma il "puntatore" dovrà avere il suo proprio puntatore. Pensate al mio suggerimento con la funzione, mi sembra una soluzione universale. naturalmente c'è una questione sulla velocità di tale codice, ma sembra essere un terzo problema.
 
FAQ:
In linea di principio, sì, ma il "puntatore" dovrà avere il suo proprio puntatore. pensate alla mia proposta con la funzione, mi sembra una soluzione universale. naturalmente c'è una domanda sulla velocità di tale codice, ma sembra essere la terza domanda.

Grazie, sempre felice di avere una conversazione costruttiva.

 
Ant_TL:

Quindi, se la funzione A nel programma seleziona un certo ordine nel ciclo e poi chiama la funzione ausiliaria B dalla libreria, anche se B seleziona un altro ordine nel processo, la selezione dell'ordine nella funzione A non dovrebbe essere influenzata dal ritorno.

Se metti il valore della funzione in una variabile, allora sì. Se no, allora questa funzione è globale e può cambiare alla prima chiamata.
 
Ant_TL:

Grazie, sempre felice di avere una conversazione costruttiva.


Sei il benvenuto, ma non saltare alle conclusioni.
 
Roger:
Se si memorizza il valore della funzione in una variabile, sì. In caso contrario, la funzione è globale e può cambiare alla prima chiamata.

Sono un po' confuso. Intendevo la seguente situazione: chiamiamo la funzione di libreria B() dalla funzione A() nel modulo del programma principale, che, per esempio, seleziona semplicemente il primo ordine della lista (supponendo che ci sia un ordine a priori):

void B(){

OrderSelect(0,SELECT_BY_POS);

}

Quando il controllo ritorna dalla libreria al modulo principale dopo che questa funzione è stata chiamata, se chiamiamo OrderTicket() o qualsiasi altra funzione in esso che si aspetta che l'ordine sia preselezionato, otterremo esattamente lo stesso errore 4105. Ma se prima della chiamata della funzione B nel modulo principale è già stato selezionato qualche altro ordine, questo rimarrà selezionato indipendentemente dal nuovo Select nella libreria, perché l'ordine attualmente selezionato, a quanto ho capito, è unico solo all'interno del modulo.

Ma se chiamiamo la stessa funzione B dalla funzione A del modulo principale, allora l'ordine selezionato nella funzione A prima della chiamata a B cambierà in ordine 0 (cioè, l'ordine attualmente selezionato dopo il ritorno dalla funzione B sarà ordine 0, non importa quale fosse l'ordine attualmente selezionato prima della chiamata a B).

Pertanto, se chiamiamo una funzione che usa OrderSelect da sola, dovremmo assicurarci che quando torniamo da questa funzione l'ordine che abbiamo scelto prima di chiamare questa funzione, in modo da poterlo usare in seguito. Se non ti assicuri di questo, può portare a errori logici difficili da trovare nel tuo codice.

 
Ant_TL:

In particolare, il "puntatore" - lo stato della selezione dell'ordine corrente - è globale all'interno del modulo, cioè questo puntatore è lo stesso per la biblioteca e diverso per il modulo del programma. Questo significa che se la funzione A nel programma seleziona un certo ordine nel ciclo e poi chiama la funzione ausiliaria B dalla libreria, allora anche se durante la sua operazione B seleziona un altro ordine, la selezione dell'ordine nella funzione A non dovrebbe essere cambiata al ritorno. Ma se entrambe le funzioni sono all'interno di un modulo, allora quando si ritorna dalla funzione B, abbiamo bisogno di ricordare e ripristinare la selezione dell'ordine corrente o prima e dopo che B è chiamata nella funzione A stessa o nella funzione B quando inizia e finisce il suo lavoro in modo che la logica del lavoro della funzione A non sia violata in quel punto.


Il tuo punto è chiaro...

Vedo un'analogia con i costrutti dei popolari Expert Advisor, quando i numeri dei ticket sono memorizzati in variabili e utilizzati in seguito (nei prossimi tick, come se un byticket è stato aperto, ecc...).

Se volete ottenere un biglietto dell'ultimo ordine aperto, basta usare le proprietà di questo ordine, OrderSelect() e tutto andrà bene.Significa che in qualsiasi momento, l'Expert Advisor deve "capire" in quale stato si trova la strategia di trading e agire in base a questo stato, indipendentemente da ciò che accade con l'elettricità e gli altri Expert Advisors in funzione nel terminale.

Ant_TL:

Quando il controllo ritorna dalla libreria al modulo principale dopo che questa funzione è stata chiamata, se chiamiamo la funzione OrderTicket() o qualsiasi altra funzione in essa che è stata progettata per la preselezione dell'ordine, otterremo esattamente lo stesso errore 4105. Ma se prima di chiamare la funzione B nel modulo principale è già stato selezionato qualche altro ordine, questo rimarrà selezionato indipendentemente dal nuovo Select nella libreria, perché l'ordine attualmente selezionato, a quanto ho capito, è unico solo all'interno del modulo.

È stato dimostrato che funziona così, o pensi che funzioni così?


Per me non c'è separazione in moduli e librerie... una volta compilato il codice funziona come un unico costrutto...


ogni volta che OrderSelect() è chiamato lo stesso OrderTicket() dell'ultimo ordine selezionato sarà restituito...

Penso che dovrebbe funzionare così...

 
keekkenen:

è dimostrato che funziona così, o pensi che sia così?

Per me non c'è divisione in moduli e librerie... dopo la compilazione il codice funziona come un unico costrutto...

Ogni volta che OrderSelect() è chiamato lo stesso OrderTicket() dell'ultimo ordine selezionato sarà restituito...

Penso che dovrebbe funzionare così...

È stato verificato che l'ordine selezionato nella libreria non è l'ordine selezionato quando viene restituito nel modulo principale. Pertanto, l'ordine che è logicamente selezionato dovrebbe essere l'ultimo ordine selezionato nel modulo principale, anche se non l'ho ancora controllato.

Ho risolto questo problema da solo creando dei wrapper per le funzioni di libreria nel file include library mqh simile al seguente:

bool GetOrder(int a=0){
return(OrderSelect(_GetOrder(a),SELECT_BY_TICKET));
}

A proposito, non si possono nemmeno passare parametri predefiniti alle funzioni di libreria.

Qui _GetOrder(int a) è la funzione di libreria stessa che trova e restituisce un ordine. La funzione è chiamata dalla biblioteca con un parametro esplicito "a", nella funzione wrapper è 0 per default, in più il biglietto restituito nel wrapper è selezionato nuovamente nel modulo del programma principale, perché la sua selezione nella funzione di biblioteca non raggiungerà il "destinatario".

 

Lo penso anch'io, non importa da dove viene chiamata questa funzione, essa darà un insieme di parametri selezionati per un ordine particolare e il software non li cambierà fino alla prossima volta che questa funzione viene chiamata, non importa da dove viene chiamata.

Perché altrimenti avreste avvolto questa funzione in una funzione aggiuntiva, completamente inutile?

PYSYS. Consiglio - create una variabile statica intera, passate il valore dell'ordine dopo l'apertura, non cambierà, finché non lo vorrete, ed eseguirà accuratamente ciò che avete pianificato.

 
Ant_TL:

Controllato che l'ordine selezionato nella libreria non sia l'ordine selezionato quando si ritorna al modulo principale. Quindi logicamente l'ordine selezionato al ritorno dovrebbe essere l'ultimo ordine selezionato nel modulo principale, anche se non l'ho ancora verificato.

E questa affermazione ha bisogno di un chiarimento: l'affermazione è vera se stiamo parlando SOLO di un modulo compilato (libreria) (*.mg4-libraries dalla cartella delle librerie). Per i moduli che fanno parte del file compilato principale (*.mgh-library), questa affermazione NON è vera!
 
TarasBY:
Questa affermazione deve essere chiarita: l'affermazione è vera se stiamo parlando di un modulo (libreria) che è compilato SOLO (*.mg4-libraries dalla cartella delle librerie). Per i moduli che fanno parte del file compilato principale (*.mgh-library), questa affermazione NON è vera!

MQH non è un modulo separato, ma un inserto nel modulo principale, situato in un file diverso. Quindi ovviamente stiamo parlando di una libreria .ex4 separata