Qualsiasi domanda da principiante, per non ingombrare il forum. Professionisti, non passate oltre. Da nessuna parte senza di te - 6. - pagina 843

 
artmedia70:
Per chiudere una posizione con un ticket, devi prima conoscere il numero esatto del ticket della posizione da chiudere. Poi dovete selezionare l'ordine usando la funzione OrderSelect(ticket,SELECT_BY_TICKET), con verifica della selezione riuscita. Poi dobbiamo controllare il tempo di chiusura dell'ordine selezionato con successo. Perché? Perché quando selezioniamo per ticket, il parametro pool della funzione OrderSelect(..., ..., pool) viene ignorato (viene usato solo quando selezioniamo per indice). E significa che anche se abbiamo selezionato con successo un ordine, dobbiamo ancora sapere in quale lista lo abbiamo scelto - la lista delle posizioni chiuse o aperte. È il controllo del tempo di chiusura che ci permette di sapere "se l'ordine è ancora sul mercato". Se il tempo di chiusura è uguale a zero, l'ordine è ancora sul mercato. Se il tempo è diverso da zero, l'ordine è già stato chiuso prima. E dopo tutta questa procedura, possiamo inviare un ordine per chiudere quell'ordine.

Ho un grafico davanti a me, vedo che un ordine è aperto su di esso e decido di chiuderlo. tutto qui. non è necessario nient'altro.

(Lo chiedo perché. Posso chiudere con una croce "one-click trade", ma mi trovo molto bene con i tasti di scelta rapida)

 
evillive:

int OrdersTotal(); - restituisce un numero, non vero-falso, ecco cosa è sbagliato. Non ci sono ordini, significa 0, e se ci sono ordini, non è solo 1.

E non ci sono ordini chiusi solo su un conto appena aperto su cui non abbiamo ancora fatto trading. Di nuovo, questo è un uso scorretto della funzione.

E perché RefreshRates(); DOPO che l'ordine è stato inviato al server? È come pagare prima qualcosa e poi chiedere "quanto costa?

Grazie, ho capito.
 
evillive:

int OrdersTotal(); - restituisce un numero, non vero-falso, ecco cosa è sbagliato. Non ci sono ordini, significa 0, e se ci sono ordini, non è solo 1.

E non ci sono ordini chiusi solo su un conto appena aperto su cui non abbiamo ancora fatto trading. Di nuovo, questa è un'applicazione errata della funzione.

Ma perché RefreshRates(); DOPO che l'ordine è stato inviato al server? È come pagare qualcosa e poi chiedere "quanto costa?

Una volta ho sentito l'espressione "Il nome della capitale russa ha due errori" e sono rimasto scioccato. Dove si possono trovare lì? Poi ho capito che si possono fare due errori.

Quello che voglio dire è che c'è anche più di un errore nella linea di codice che stiamo discutendo.

if (!OrdersTotal()==true)

if(negazione -> espressione == vero) Naturalmente possiamo capire, come spiega Artem, se 0 allora falso tutto il resto è vero Poi si scopre che se neghiamo che ci sono ordini aperti allora... oops... è più facile scrivere Mosca con due errori.

 
Escapee:

Ho un grafico davanti a me, vedo che un ordine è aperto su di esso e decido di chiuderlo. tutto qui. non è necessario nient'altro.

(Lo chiedo perché. Posso chiuderlo con una croce "one-click trade", ma trovo molto comodo usare i tasti di scelta rapida)

Qui vi sto dicendo come farlo programmaticamente nel modo giusto.

1. Avete davanti a voi una tabella con un ordine. Si può vedere il suo numero di biglietto, e il programma? Il programma deve conoscere questo numero.

2. Volete chiuderla. Così potete vedere che l'ordine con tale biglietto è aperto. E il programma? Il programma non lo sa. Quindi il programma deve sapere se l'ordine con tale biglietto è aperto o no.

3. Si può cliccare sulla croce, ed è tutto. E il programma deve dare un comando.

Pertanto, la conclusione è la seguente:

1. Scopriamo se c'è una posizione aperta

2. Se è così, cerchiamo il biglietto dell'ordine richiesto

3. Selezioniamo l'ordine in base al biglietto trovato. Se l'abbiamo selezionato con successo, allora...

4. Controlla il tempo di chiusura dell'ordine selezionato dal biglietto. Se il tempo di chiusura è uguale a zero, allora...

5. Lo chiudiamo.

 

Correggerei la tua risposta in questo modo.

artmedia70:


1. Davanti a voi c'è una tabella con un ordine. Puoi vedere il suo numero di biglietto

2. Volete chiuderla.

3. Puoi cliccare sulla croce e sul punto...

5. Chiudere quello.

 
AlexeyVik:

Correggerei la tua risposta in questo modo.

Stai ancora scherzando?
 
artmedia70:
Stai ancora scherzando?

Sì, è il giorno libero.


 
artmedia70:


cioè non è possibile fare uno script di chiusura simile a quello di apertura? Perché è così semplice...Stavo pensando...
 
Escapee:
Quindi, non possiamo fare uno script di chiusura simile a quello dell'ordine aperto? Perché è così semplice... stavo pensando...

Anche aprire un ordine non è così semplice - non con un solo comando di invio dell'ordine di compravendita. Tutti questi comandi devono essere "avvolti" in una funzione completa con il controllo dei codici di ritorno del server commerciale e la reazione a queste risposte. Controllare i livelli validi, ricalcolarli se nell'ordine viene dato un livello calcolato errato, ecc.

E la chiusura - la stessa cosa: una funzione separata di ricerca dell'ordine giusto, che chiama una funzione completa di chiusura, piuttosto che solo una linea di codice con l'invio di un ordine al server.

 
artmedia70:

Anche aprire un ordine non è così semplice - non con un solo comando di invio dell'ordine di compravendita. Tutti questi comandi devono essere "avvolti" in una funzione completa con il controllo dei codici di ritorno del server commerciale e la reazione a queste risposte. Controllare i livelli validi, ricalcolarli se l'ordine specifica un livello calcolato errato, ecc.

Aspetta... finalmente capisco di cosa ho bisogno...

Ecco l'apertura dell'ordine di cui avevo bisogno - OrderSend(Symbol(),OP_SELL,0.1,Bid,3,0,0); . E questo script funziona.

Ora ho bisogno di chiudere......

Motivazione: