Monday, 2 October 2017

Mql4 Chiudere Ordine Pendente In Forex


Ho scritto questo codice per chiudere un ordine pendente. Quando eseguo l'EA gli ordini non sono chiusi. Qualcuno mi può dare alcun aiuto Che cosa ho fatto di male Ecco il codice (parte del mio programma) per (cnt0cntlttotalcnt) OrderSelect (cnt, SELECTBYPOS, MODETRADES) se (OrderType () ltOPSELL ampamp controllare posizione aperta OrderSymbol () Simbolo () ) verificare la presenza di simboli se (OrderType () OPBUYSTOP) se (OrderOpenPrice () lt Chiedi-StopLossPoint) OrderDelete (OrderTicket ()) return (0) ho scritto questo codice per chiudere un ordine pendente. Quando eseguo l'EA gli ordini non sono chiusi. Qualcuno mi può dare alcun aiuto Che cosa ho fatto di male Ecco il codice (parte del mio programma) Beh, per cominciare c'erano vecchie abbastanza per abbinare per (cnttotal-1cntgt0cnt--) OrderSelect (cnt, SELECTBYPOS, MODETRADES) se (OrderSymbol ( ) simbolo ()) verificare la presenza di simboli se (OrderType () OPBUYLIMIT OrderType () OPBUYSTOP) verificare la presenza di buy stopslimits se (OrderOpenPrice) lt Chiedi-StopLossPoint) OrderDelete (OrderTicket ()) else if (OrderType () OPSELLLIMIT OrderType () OPSELLSTOP ( ) verificare la presenza di stopslimits vendere se (OrderOpenPrice () lt Bid-StopLossPoint) OrderDelete (OrderTicket ()) Questo dovrebbe farlo. Sarebbe anche una buona idea di inserire numeri magici in là in modo che il vostro EA può sapere quale ordine si placed. Closing ed eliminazione di ordini richieste di transazione per la chiusura degli ordini di mercato si formano utilizzando la funzione OrderClose (). OrderClose function () Si tratta di una funzione utilizzata per chiudere un ordine di mercato. La funzione restituisce TRUE, se il commercio è eseguita con successo. Restituisce FALSE, se il commercio fallisce. biglietto - il numero unico dell'ordine. lotti - la quantità di lotti da chiudere. E 'consentito specificare un valore che è inferiore alla quantità disponibile di lotti nell'ordine. In questo caso, se la richiesta commercio viene eseguito con successo, l'ordine sarà chiuso in parte. prezzo - prezzo di chiusura. Questo parametro è impostato secondo i requisiti e le limitazioni accettate per l'esecuzione di mestieri (vedi Ordine Caratteristiche e regole per fare mestieri e appendice 3). Se non esiste un prezzo richiesto disponibile per la chiusura della disciplina di mercato nel flusso di prezzo o se si è superata, questa richiesta commercio sarà respinta se il prezzo non è aggiornato, ma ha trovato nel flusso dei prezzi e, al tempo stesso, la sua deviazione dalle fasce di prezzo attuali all'interno del valore di slittamento, la richiesta di scambio sarà accettato dal terminale del cliente e inviato al server commercio. slittamento - il massimo consentito deviazione del prezzo richiesto per la chiusura dell 'ordine dal prezzo di mercato (in punti). Colore - il colore della freccia di chiusura in un grafico. Se questo parametro non è disponibile o il suo valore è uguale a quella del CLRNONE, la freccia non viene visualizzata nel grafico. Se il programma contiene informazioni sul tipo di ordine da chiudere, in merito a un numero unico, nonché del numero di lotti da chiudere, allora è molto facile da chiudere l'ordine. Per questo, è necessario utilizzare nel codice del programma la chiamata di funzione OrderClose () con parametri preimpostati. Ad esempio, se il numero unico d'ordine Buy è 12345 e se si desidera chiudere 0,5 sacco, la chiamata alla funzione di chiusura l'ordine può apparire come segue: Al fine di decidere quali ordini e in che sequenza dovrebbe essere chiuso, bisogna avere i dati di tutti gli ordini aperti nella situazione attuale. In MQL4, vi è un numero di funzioni che possono essere utilizzati per ottenere varie informazioni che caratterizzano qualsiasi ordine. Ad esempio, la funzione OrderOpenPrice () restituisce il valore del prezzo di apertura ordine (o del prezzo richiesto per gli ordini in attesa), le OrderLots function () restituisce la quantità di lotti, la funzione OrderType () restituisce il tipo di ordine, ecc Tutte le funzioni che restituiscono i valori di un caratteristico richiamo ordine al loro esecuzione all'ordine che è stata selezionata dalla funzione OrderSelect (). OrderSelect function () al fine di ottenere i parametri di uno qualsiasi dei vostri ordini (non importa di mercato o in attesa, chiuso o quelli eliminati), si deve prima selezionarlo utilizzando la funzione OrderSelect (). OrderSelect è una funzione che seleziona un ordine per ulteriori operazioni con esso. Restituisce vero, se la funzione viene eseguita con successo. In caso contrario, restituisce false. index - la posizione ordine o il numero, dipende dal secondo parametro. seleziona - la bandiera del metodo di selezione. Parametro di selezione può assumere uno dei due valori possibili: SELECTBYPOS - nella indice parametro, viene restituito il numero d'ordine nella lista (la numerazione inizia con 0), SELECTBYTICKET - nell'indice parametro, il numero del biglietto (il numero d'ordine univoco) è restituito. piscina - la fonte dei dati per la selezione. La piscina parametro viene utilizzato, quando il parametro di selezione è uguale al valore di SELECTBYPOS. La piscina parametro viene ignorato, se l'ordine viene selezionato il numero del biglietto (SELECTBYTICKET). La piscina parametro può assumere due possibili valori: MODETRADES (per impostazione predefinita) - l'ordine è stato selezionato in ordini aperti e pendenti, vale a dire tra gli ordini visualizzati nella scheda quotTradequot della finestra MODEHISTORY quotTerminalquot - l'ordine è selezionata nel chiuso e cancellato ordini, vale a dire tra gli ordini visualizzati nella scheda quotAccount Historyquot della finestra quotTerminalquot. In questo caso, la profondità della storia specificato dall'utente per la visualizzazione di ordini chiusi e cancellate è importante. Al fine di dimostrare il metodo di utilizzo di funzioni commerciali per la chiusura degli ordini di mercato, consente di risolvere un problema: Problema 28. Scrivere uno script che chiude uno degli ordini di mercato disponibili sul conto. L'esecuzione script deve comportare chiusura dell'ordine più vicino alla posizione dello script attaccato alla finestra simbolo con il mouse. Supponiamo che ci siano tre ordini di mercato aperto nel terminale per l'EurUsd simbolo e un ordine in corso aperto per UsdChf: Fig. 90. Visualizzazione diversi ordini aperti per i diversi simboli nella finestra del terminale. Dobbiamo scrivere uno script che può essere trascinata con il mouse dalla finestra quotNavigatorquot nella finestra simbolo, che dovrebbe risultare in chiusura di uno degli ordini di mercato, cioè, l'ordine più vicina al cursore (come del momento in cui l'utente rilasciato il pulsante del mouse). In Fig. 91, si può vedere l'alternativa, in cui il cursore è vicino a ordine di vendita 4372889. È questo ordine che deve essere chiuso a seguito dell'esecuzione di script. Per risolvere il problema, si dovrebbe selezionare (utilizzando la funzione OrderSymbol ()) fra tutti gli ordini solo quelli aperti per il simbolo, nella finestra di cui si elimina lo script. Poi dobbiamo trovare i prezzi più aperte di tutti gli ordini di mercato selezionati (cioè eseguire la funzione OrderOpenPrice () in successione per ogni ordine). Conoscere i prezzi di apertura di ordine, possiamo facilmente scegliere uno di loro che corrisponde con la dichiarazione del problema. Per specificare i valori corretti dei parametri nella funzione OrderClose (), abbiamo anche bisogno di conoscere alcuni altri dati circa l'ordine selezionato: la quantità di lotti (determinata dai OrderLots funzione ()) e il numero d'ordine univoco (determinata dalla funzione OrderTicket ()). Inoltre, per trovare uno o altro prezzo di un preventivo bidirezionale, dobbiamo conoscere il tipo di ordine (determinata dalla funzione OrderType ()). Consente di considerare quali parametri devono essere specificati nella funzione OrderSelect () al fine di ottenere le caratteristiche di ordine di cui sopra. Innanzitutto, è necessario scegliere il metodo di selezione ordine. Nel nostro problema, il metodo di scelta è determinata dalla dichiarazione problema stesso: i dati relativi numeri di ordine dovrebbe essere disponibile nel programma del momento del lancio script per l'esecuzione, cioè il programma viene considerata come un blocco che sarebbe determinare quei numeri di ordinazione. Questo significa che dovremmo controllare tutti gli ordini uno per uno visualizzato in quotTerminalquot (Fig. 64.1), quindi dobbiamo utilizzare il parametro SELECTBYPOS. La fonte per la selezione di ordini è evidente, pure. Per risolvere il problema, è necessario analizzare ordini chiusi e cancellate. In questo caso, siamo interessati a solo l'ordine di mercato, quindi dovremo cercare in loro utilizzando i MODETRADES parametro nella funzione OrderSelect (). Per la piscina parametro, il valore predefinito di MODETRADES è specificato nell'intestazione della funzione, in modo che possa essere saltata. Sotto è mostrato come un blocco di analisi di mercato ed in attesa ordini può essere costruito: Nell'intestazione dell'operatore ciclo, il valore iniziale è specificato come i1, mentre la condizione di uscire dal ciclo è l'espressione iltOrdersTotal (). OrdersTotal function () restituisce la quantità totale di mercato e gli ordini in corso, vale a dire quegli ordini che vengono mostrati nella scheda quotTradequot della finestra quotTerminalquot. Questo è il motivo per cui non ci saranno tanti iterazioni del ciclo come molti ordini partecipano nel commercio. Ad ogni iterazione, quando la condizione è calcolato nel all'operatore se, verrà eseguito il OrderSelect funzione (i-1, SELECTBYPOS). Il seguente questione importante deve notare qui: La numerazione degli ordini nell'elenco di mercato e ordini pendenti inizia con zero. Ciò significa che il primo ordine nella lista (Fig. 90) è posto in posizione zero, la posizione del secondo ordine numerato come 1, quella del terzo ordine è numerata come 2, ecc Questo è il motivo per cui, nella funzione CALL OrderSelect (), il valore di indice è data come i-1. Così, per tutti gli ordini selezionati, questo indice sarà sempre 1 inferiore al valore della variabile i (che coincide con il numero della iterazione successiva). La OrderSelect function () restituisce true, se l'ordine viene selezionato con successo. Ciò significa che è possibile che una scelta ordine può sicuro. Ciò può accadere, se la quantità di ordini modificato durante la loro lavorazione. Quando si programma in MQL4, si dovrebbe anche ricordare che un programma applicativo funziona in modalità real-time e che, mentre è in corso l'elaborazione dei parametri, i valori di questi parametri possono cambiare. Ad esempio, la quantità di ordini di mercato può cambiare come risultato sia openingclosing degli ordini e la modifica di ordini in quelle di mercato attesa. Questo è il motivo per cui si dovrebbe tenere alla seguente regola durante la programmazione di elaborazione degli ordini: Gli ordini devono essere trattati il ​​più presto possibile, mentre il blocco di programma responsabile di questo trattamento non dovrebbe, se possibile, contenere le linee di programma ridondanti. Secondo il codice rappresentato in Fig. 64,3, nell'intestazione dell'operatore, nel caso, il programma analizza se l'ordine successivo è disponibile nell'elenco ordine nel momento in cui viene selezionata. Se l'ordine successivo è disponibile, il controllo viene passato al corpo dell'operatore, nel caso per elaborare i parametri d'ordine. Si deve notare che tale costruzione non aiuta molto, in caso di possibili conflitti, perché l'ordine può essere perso (chiuso) durante l'elaborazione dei suoi parametri. Tuttavia, questa soluzione risulta essere più efficiente se, a partire dal momento della sua selezione, l'ordine non è più disponibile. Nel corpo dell'operatore, nel caso, i parametri dell'ordine selezionato vengono analizzati. Quando si esegue l'OrderOpenPrice funzioni (), OrderTicket (), OrderType () e altri del genere, ciascuno di essi restituire il valore di una determinata caratteristica dell'ordine selezionato come risultato dell'esecuzione della funzione OrderSelect (). Tutto il ragionamento sopra è stato utilizzato nel programma che avrebbe risolto Problema 28. Un esempio di un semplice script destinato chiusura di un ordine di mercato, il prezzo aperta che è più vicino alla posizione dell'attacco di script che i prezzi di apertura di altri ordini (closeorder. mq4). L'intero codice del closeorder. mq4 programma è concentrata nella speciale funzione start (). Nel blocco 1-2, alcune variabili vengono inizializzate. La variabile Dist è la distanza dalla posizione in cui lo script è stato lasciato cadere l'ordine più vicino. Il RealOrder variabile è un flag che visualizza la disponibilità di almeno un ordine di mercato nel terminale del cliente (valore negativo). Il WinPrice variabile è il prezzo, al quale l'utente ha allegato lo script alla finestra simbolo. Nel blocco 2-6, l'ordine viene analizzato: Uno degli ordini disponibili viene assegnato per essere chiuso. Block 6-10 è il blocco di chiusura dell'ordine e di elaborare gli errori che possono verificarsi durante l'esecuzione del commercio. A partire dal momento in cui l'utente collegato lo script alla finestra simbolo, i valori delle variabili vengono calcolati nel blocco 1-2, il WinPrice variabile prendendo il valore del prezzo, al livello di cui l'utente collegato lo script. Ora è necessario trovare la cassa (con le sue caratteristiche) che è più vicino a questa posizione. Nel ciclo for (bloccare 2-6), gli ordini sono ricercati in. Nel blocco 2-3, il programma controlla se vi sia un ordine nella riga successiva del quotTerminalquot. Se un ordine viene trovato, il controllo viene passato al corpo dell'operatore, nel caso di ottenere e analizzare le caratteristiche di tale ordine. Nel blocco 3-4, gli ordini aperti per i simboli sbagliati (non il simbolo, per il quale è in esecuzione il programma) vengono filtrati. Nel nostro caso, si tratta di ordine 4.372.930 aperto per UsdChf. OrderSymbol function () restituisce il nome simbolo dell'ordine selezionato. Se questo nome simbolo è diverso da quello, per cui viene eseguito il programma, l'iterazione corrente è rotto, impedendo l'ordine aperto per un altro simbolo da trattare. Se l'ordine in analisi risulta essere aperto per il simbolo quotourquot, verrà eseguito un controllo di più. Il tipo di ordine è determinato utilizzando la funzione OrderType () (vedere Tipi di scambi). Se il tipo di ordine risulta essere più di 1, significa che l'ordine è sospeso uno. In questo caso, l'iterazione corrente viene interrotta, anche perché non siamo interessati a ordini in sospeso. Nel nostro esempio, abbiamo un tale ordine, ma è aperto per un altro simbolo, per cui è già stato filtrato. Tutti gli ordini che passano blocco 3-4 con successo sono quelle di mercato. Block 4-5 è destinato per la selezione di un solo ordine di tutti gli ordini di mercato che hanno superato con successo il blocco precedente. Tale ordine deve essere il più vicino al prezzo predefinito (il valore della WinPrice variabile). L'utente non è tenuto a quotpinpointquot la linea di ordine con il suo cursore del mouse. L'ordine che è più vicino di tutti gli altri ordini al cursore come del momento di lanciare lo script per l'esecuzione verrà selezionato. Il prezzo di apertura dell 'ordine processato viene trovato utilizzando la funzione OrderOpenPrice (). Se il valore assoluto della distanza tra il prezzo dell'ordine corrente e il pricequot quotcursor è inferiore alla stessa distanza per l'ordine precedente, l'ordine corrente viene selezionato (il valore assoluto della distanza è necessaria per escludere l'influenza di la posizione del cursore - sotto o al di sopra della linea di ordine). In questo caso, l'ordine verrà memorizzato nella iterazione corrente del ciclo a un precursore per essere chiuso. Per questo scopo, il numero del biglietto (il numero individuale dell'ordine) e la quantità di lotti sono calcolati alla fine del blocco 4-5. In questo esempio (Fig. 90), l'importo totale degli ordini è di quattro (tre quelli di mercato e un ordine in corso), quindi ci saranno quattro iterazioni eseguiti nel ciclo, che si tradurrà nella ricerca di tutti i dati necessari per la chiusura di uno nell'ordine selezionato. Poi il controllo del programma in esecuzione sarà passato all'operatore ciclo, mentre (blocco 6-10). Nel blocco 6-7, gli ordini di mercato trovati vengono controllati per la disponibilità. Se nessun ordini di mercato si trovano nel blocco 2-4 (che è del tutto possibile, in generale), il valore della RealOrder bandiera rimarrà uguale a -1, il che significa che l'indisponibilità di ordini di mercato. Se la verifica nel blocco 6-7 non rileva ordini di mercato, l'esecuzione del ciclo, mentre è rotto, il programma poi completato le operazioni. Se il valore della variabile di RealOrder risulta essere uguale a 0 o 1, ciò significa che un mercato è predefinito per la chiusura e deve essere chiuso. Nel blocco 7-8, secondo il tipo di ordine, viene calcolato il prezzo di chiusura dell'ordine. E 'il valore d'offerta per ordini di acquisto e il valore di Richiesta di Vendita ordini (vedere Requisiti e limitazioni a fare mestieri). Nel blocco 7-8, vengono calcolati i valori del testo variabile ausiliaria. La richiesta di commercio per la chiusura dell 'ordine è formato nella funzione OrderClose () nella riga sotto: Trade funzione OrderClose () restituisce true, se il commercio è fatto con successo, e falso, se non. Se la richiesta di commercio viene eseguita con successo sul server, il valore vero verrà assegnato ai Ans variabili (risposta). In questo caso, durante l'esecuzione del blocco 8-9, il programma informerà l'utente di chiudere ordine di successo. Dopo di che, l'esecuzione del ciclo, mentre dell'operatore verrà interrotto e il programma terminerà sue operazioni. Altrimenti, il controllo verrà passato al blocco 9-10 per analizzare l'errore restituito dal terminale del cliente al programma. All'inizio del blocco 9-10, il codice di errore viene calcolato. Dopo di che, secondo il codice di errore, programma di uscita o di funzionamento ripetuto vengono eseguite. Nella prima cambiare operatore, il programma elabora gli errori che sono implicitamente overcomable, vale a dire gli errori possono essere considerati come difficoltà temporanee di svolgimento del commercio. Tutte le azioni necessarie sono prese per ciascuna di tali errori, allora l'iterazione corrente viene interrotta e l'esecuzione del ciclo, mentre riavvio. (Si noti che, in questo esempio, si usa per errore durante il processo l'interruttore operatore che è uscito come risultato dell'utilizzo dell'operatore continueranno che, come tale, non è inteso per il passaggio del controllo esterno dell'interruttore dell'operatore. Opere Questa costruzione solo perché l'interruttore dell'operatore è una parte del contenuto del gestore ciclo esterno mentre l'operatore continua interrompe l'iterazione corrente passando del controllo all'intestazione dell'operatore mentre). Se il codice di errore non viene elaborato nel primo interruttore dell'operatore, questo errore è ritenuta critica. In questo caso, il controllo viene passato al secondo interruttore dell'operatore, che viene eseguita per informare l'utente che si è verificato uno o un altro errore critico. Inoltre, il programma utilizza la rottura operatore che interrompe l'esecuzione del ciclo, mentre. Uscendo dal ciclo, mentre, per qualsiasi ragione, si tradurrà nel passaggio del controllo al blocco 9-10 che produce un messaggio circa la fine delle operazioni del programma. Il ritorno operatore interrompe l'esecuzione della speciale funzione start (), e il programma ha completato le operazioni. risultato pratico ottenuto dopo il lancio dello script alle condizioni indicate (vedi Fig. 90 e 91) è indicato di seguito. Il commercio è stato fatto con successo sul server. Come risultato della chiusura di uno degli ordini, ci sono due ordini a destra nella finestra di EurUsd. Chiusura ordine è stato visualizzato nella finestra quotTerminalquot: Fig. 94. Dopo l'esecuzione del closeorder. mq4 Script. Due ordini di mercato sono visualizzati nella finestra quotTerminalquot. Più tardi, gli altri due ordini sono chiusi utilizzando questo script, anche. L'eliminazione di ordini in corso le richieste di transazione per la cancellazione degli ordini pendenti sono formati utilizzando la funzione OrderDelete (). OrderDelete function () La funzione cancella l'ordine pendente precedentemente posizionato. Restituisce vero, se ha lavorato con successo. In caso contrario, restituisce false. biglietto - il numero unico di un ordine. arrowcolor - il colore di una freccia in un grafico. Se questo parametro non è disponibile o il suo valore è uguale a quella del CLRNONE, la freccia non viene visualizzata nel grafico. È facile capire che la funzione OrderDelete () non contiene una specifica del volume e il prezzo di chiusura dell 'ordine da eliminare. L'ordine viene eliminato indipendentemente eventuali prezzi di mercato. La parte cancellazione di un ordine è impossibile, troppo. È possibile diminuire la quantità di lotti in un ordine pendente in due fasi: cancellare l'ordine esistente e quindi effettuare un nuovo ordine in attesa con la (qualsiasi) quantità ridotta di lotti. L'algoritmo del programma che cancellare un ordine pendente può essere del tutto identica a quella di chiusura ordine di mercato. Una leggera differenza è che non è necessario alcun prezzo vicino a cancellare un ordine pendente, in modo che il programma di seguito non contiene il blocco che aggiorna i prezzi di mercato. Un esempio di un semplice script destinato per l'eliminazione di un ordine pendente, il prezzo richiesto, di cui è più vicino al luogo del sequestro scrittura rispetto ai prezzi di altri ordini pendenti (deleteorder. mq4). Il blocco di errori di elaborazione è stato anche un po 'cambiato. Si dovrebbe prendere in considerazione la possibilità di errori relativi alle variazioni dei prezzi (errori 135 e 136), quando la chiusura ordini di mercato, ma tali errori dont si verificano durante l'eliminazione di ordini pendenti. Per lo stesso motivo, i RefreshRates funzione () è usato nulla nel programma. Elaborazione di tali errori come errore di 4 e l'errore 137 (vedi codici di errore) può essere un po 'difficile. Ad esempio, quando ottiene l'errore 137, il programma può prendere in considerazione che quotbroker è busyquot. Tuttavia, una domanda sorge naturale: quando è il broker gratuito, per l'utente di continuare il suo commercio 137does errore non forniscono tali informazioni. Questo è il motivo per cui il programmatore lui o lei stessa deve decidere come costruire il programma di elaborazione tali errori correttamente. In un caso semplice, la richiesta può essere ripetuto dopo una certa pausa (nel nostro esempio, in 3 secondi). D'altra parte, dopo una serie di tentativi falliti di eliminare (o, in un caso comune, per chiudere, aprire o modificare) un ordine, il server può restituire l'errore 141 - troppe richieste. Questo errore si verifica in quanto lo script deleteorder. mq4 smette di funzionare. Generalmente, tali conflitti non sono gli elementi di programmazione. In questi casi, è necessario contattare il servizio di assistenza centri di negoziazione e chiarire le ragioni per il rifiuto di eseguire la richiesta del commercio. Errore 145 può verificarsi, se un ordine di attesa (in un caso comune, può essere un ordine di arresto di un ordine di mercato) è troppo vicino al prezzo di mercato. Questo errore non si verifica, se si sta costantemente negoziazione in un mercato calmo. Se i prezzi cambiano rapidamente, il broker può decidere che un certo ordine sarà aperto presto, in modo che il broker non consentirà di eliminare o modificarlo. Questo errore è considerato nello script come una critica e si traduce in chiusura del programma (doesnt ha senso perdere tempo il broker con le richieste di transazione). Se le variazioni di prezzo dopo un po ', si può provare a cancellare l'ordine lanciando nuovamente lo script per l'esecuzione. In generale, il verificarsi di un errore 145 può essere evitato, se si considera il livello di congelamento stabilito dal centro di spaccio. livello Freeze è un valore che determina la fascia di prezzo, all'interno della quale l'ordine è considerato come congelato, cioè può essere vietato per eliminarlo. Ad esempio, se un ordine pendente è posto a 1,2500 ed il livello di congelamento è pari a 10 punti, significa che, se il prezzo varia da 1.2490 attraverso 1.2510, è vietata la soppressione dell'ordine pendente. È possibile ottenere il valore del livello di blocco dopo aver eseguito la funzione MarketInfo () con l'identificatore di richiesta di MODEFREEZELEVEL. Chiusura Ordini fronte opposto (Counter) ordine è un ordine di mercato aperto in direzione opposta alla direzione di un altro ordine di mercato aperto per lo stesso simbolo. Se si dispone di due ordini opposti per un determinato simbolo, è possibile chiudere contemporaneamente, uno per l'altra, utilizzando la funzione OrderCloseBy (). Potrai risparmiare una diffusione se si esegue tale operazione. OrderCloseBy Function () La funzione chiude un ordine di mercato da un altro ordine di mercato aperto per lo stesso simbolo nella direzione opposta. La funzione restituisce TRUE, se viene completata con successo, e il falso, se non. biglietto - il numero unico della fine di essere chiuso. opposto - il numero unico di ordine inverso. Colore - il colore della freccia di chiusura in un grafico. Se questo parametro non è disponibile o il suo valore è uguale a quella del CLRNONE, la freccia non viene visualizzata nel grafico. Non è necessario che gli ordini opposti hanno lo stesso volume. Se si chiude un ordine da un ordine opposto, il commercio sarà svolgere nel volume dell'ordine che ha il volume più piccolo. Consente di considerare un esempio. Non ci devono essere due ordini di mercato dello stesso volume nel terminale del cliente, uno Buy e uno di vendita. Se chiudiamo ciascuno di essi separatamente utilizzando la funzione OrderClose (), la nostra produzione economica sarà la somma dei profitti ottenuti da ciascun ordine: Fig. 95. Risultato di chiusura separata degli ordini usando la funzione OrderClose (). Tuttavia, se usiamo in questa situazione la funzione OrderCloseBy () destinate chiusura fronte di ordini, la produzione economica sarà meglio (rispetto all'alternativa precedente) dalla quantità proporzionale al costo di un ordine diffuse: Fig. 96. Risultato di ordini di chiusura da parte di altri ordini utilizzando la funzione OrderCloseBy (). È evidente che, se vi sono ordini opposti da chiudere nel terminale, sarebbe economicamente utilizzare la funzione OrderCloseBy (), non OrderClose (). Per quanto riguarda il salvataggio di una diffusione a chiusura degli ordini opposti, dobbiamo dare alcune spiegazioni più generali. È un dato di fatto, l'apertura di un ordine (per esempio, un ordine di acquisto) è implicitamente un commercio che è opposta all'apertura di un ordine nella direzione opposta (cioè un ordine di vendita) allo stesso grado come chiusura della cassa (Buy ordine). In altre parole, è economicamente la stessa quale delle alternative da utilizzare: solo chiudere un ordine di mercato o aprire un ordine opposto dello stesso volume (e quindi chiudere entrambi gli ordini da ogni altro). La differenza tra queste due alternative possono consistere solo in diversi metodi utilizzati in diversi centri si occupano di calcolare i soldi per essere deviato per supportare ordini di mercato (vedi Fig. 85 e Fig. 88). E 'anche facile vedere che il prezzo di chiusura non è necessario specificare nella funzione OrderCloseBy () per la chiusura degli ordini opposti. Non è necessario, perché il profitto e la perdita di due ordini opposti ripagano reciprocamente, per cui la produzione economica totale non dipende dal prezzo di mercato. Naturalmente, questa regola è valida solo per gli ordini dello stesso volume. Se, per esempio, abbiamo due ordini per un simbolo: un Buy ordine di 1 lotto e un ordine di vendita di 0,7 sacco, questo commercio dipende solo dal prezzo di mercato legato alla parte Buy ordine di 0,3 sacco, mentre 0,7 sacco di entrambi gli ordini dont dipenda dal prezzo di simbolo. gli ordini di partenza non influenzano i risultati totali di negoziazione. Questo è il motivo per cui le tattiche di negoziazione sulla base di apertura degli ordini opposti non hanno alcun contenuto informali (per questo motivo, alcuni centri si occupano forzatamente chiudere gli ordini opposti entro gli importi coincidenza di lotti). L'unico (negativa) influenza di queste tattiche può consistere nel deviare di denaro secondo le regole accettate in alcuni centri di negoziazione. Inoltre, la disponibilità di diversi ordini opposti fornisce maggiori difficoltà nel contesto della negoziazione programmato, di un ordine fa. Se consideriamo varie commissioni e swap (per ogni ordine di mercato a parte), la necessità di chiudere gli ordini opposti diventa evidente. Un esempio di un semplice script che chiude tutti gli ordini opposti per un simbolo (closeby. mq4). L'algoritmo dello script di cui sopra è un po 'diverso da quelli precedenti. Questa differenza consiste nel fatto che lo stesso codice deve essere eseguito tante volte per chiudere diversi ordini (la quantità di ordini da chiudere a titolo esemplificativo) correttamente. Lo script è stato testato su un insieme casuale di ordini di mercato. 5 ordini di diversi volumi sono rappresentati in Fig. 97 di seguito. Per chiudere gli ordini opposti disponibili, dovremmo predefinire i criteri di selezione. Questo criterio nel dato algoritmo è la dimensione dell'ordine - gli ordini di volumi più grandi sono chiusi, poi gli ordini di piccoli volumi sono chiusi. Dopo gli ordini opposti di diversi volumi sono stati chiusi, gli ordini dei volumi riposo rimangono. Ad esempio, la chiusura degli ordini opposti acquistare (1 lotto) e vendere (0,8 sacco) si tradurrà in questo ordine Buy (0,2 sacco) rimane aperto. Questo è il motivo per cui, dopo ogni chiusura con successo, il programma deve fare riferimento alla lista aggiornata degli ordini per trovare altre due maggiori ordini opposti in questo elenco aggiornato. I calcoli di cui sopra sono realizzati in un (condizionalmente) ciclo continuo mentre, in blocchi 2-10. All'inizio del ciclo, ad ogni iterazione del programma suppone che non vi sono ordini di un certo tipo più. Per questo, il valore di -1 viene assegnato alle variabili HedgBuy e HedgSell. L'algoritmo del blocco di elaborazione degli ordini è, in generale, conservate (vedere il codice di closeby. mq4). Nell'ordine-ricerca ciclo, vale a dire nel blocco 3-4, come nei programmi precedenti, gli ordini quotwrongquot vengono filtrate. In questo caso, questi sono gli ordini aperti per un altro simbolo e ordini pendenti. Nel blocco 4-5, il volume di ogni ordine check-in blocco 3-4 viene calcolato. Se si scopre durante i calcoli che l'ordine attualmente trattamento è la più grande in termini di volume tra tutti gli ordini processati, il suo biglietto viene memorizzato. Ciò significa che l'ordine con questo biglietto è, in questa fase di calcolo, un candidato per la chiusura degli ordini opposti. Dal momento in cui l'ultima iterazione del ciclo per finiture, sono già state conosciuto i biglietti di ordini di importo massimo di lotti aperti in direzioni opposte. Questi ordini sono selezionati dal programma. Se tutti gli ordini di qualsiasi tipo sono già diventati disponibili da questo momento, bloccare 5-6 esce dal programma. Blocco 6-10 rappresenta l'elaborazione degli errori. È completamente uguali a quelle sopra considerate (in questa sezione e le precedenti). La richiesta di commercio per la chiusura degli ordini opposti si forma nel blocco 7-8 utilizzando la funzione OrderCloseBy (). Se fallisce, secondo il codice di errore, il programma passa il controllo sia per ritentare rendendo commercio (per gli stessi biglietti) o al ritorno all'operatore che termina le operazioni del programma. Se viene eseguita con successo un commercio, il programma esce blocco error-trattamento, e l'iterazione corrente del ciclo più esterno mentre finirà. la prossima iterazione di questo ciclo, tutti i calcoli si ripeterà: ricerca negli ordini disponibili, selezionando ordini di mercato, selezionato uno spuntato per ciascuno dei tipi di ordine, formando una richiesta commercio per la chiusura opposta, e la successiva analisi di errore. Questo ciclo viene eseguito fino a quando non vi sono ordini disponibili di un certo tipo (o, in un caso particolare, di entrambi i tipi) nel terminale. Questo evento sarà calcolato nel blocco 5-6, quindi il programma termina le sue operazioni. I seguenti messaggi sono stati ricevuti all'esecuzione del closeby. mq4 scritto destinato chiusura ordini di mercato mostrati in Fig. 97: Nella scheda quotAccount Historyquot della finestra quotTerminalquot, si può vedere che alcuni ordini sono chiusi con un utile pari a zero. Questo è quello che risparmiamo quando si chiude ordini opposti. È possibile confrontare i risultati economici in Fig. 97 e Fig. 99: Nella scheda quotJournalquot nella finestra quotTerminalquot, è possibile tenere traccia la storia di ordine di chiusura (gli ultimi eventi sono in cima): l'esecuzione dello script, secondo l'algoritmo, gli ordini del volume massimo disponibile al momento saranno chiuso. Nonostante il fatto che gli ordini sono stati aperti in sequenza casuale (Fig. 97), i primi ordini da chiudere erano Acquisto 778.594 e vendere 778.595, con i volumi di 1 lotto e 0,8 lot, rispettivamente (linee inferiori in Fig . 100). Poiché questi ordini hanno volumi differenti, la chiusura opposta prodotto un nuovo ordine, Acquisto 778.597, con il volume di riposo di 0,2 lotto. Then the program selected orders Buy 778592 and Sell 778593, 0.5 lot each, to be closed as opposite orders. These orders were closed without opening a resting order. By the moment the third iteration started, two orders had remained in the symbol window in the external cycle: initial order Sell 778596 of 0.3 lot and the order opened as a result of the execution of the script, Buy 778597 of 0.2 lot. In the upper lines of Fig. 100, you can see that those orders are also closed as opposite orders. The volumes of those orders were different, so the last trade resulted in that one market order of 0.1 lot remained in the symbol window (please note the economic results): It is convenient to use the script closeby. mq4 in manual trading, especially in cases of many differently-directed market orders available in the symbol window.

No comments:

Post a Comment