Discussione sull’articolo "Introduzione a MQL5: Come scrivere un semplice Expert Advisor e un Indicatore Personalizzato" - pagina 3

 

Domanda 4: L'articolo afferma quanto segue:

...Inseriamo nella struttura request i valori che saranno comuni alla maggior parte dei casi di chiamata della funzione OrderSend in questo programma:

   request.symbol      =Symbol();
   request.volume      =Lots;
   request.tp          =0;
   request.deviation   =0;
   request.type_filling=ORDER_FILLING_AON;

L'elemento request.symbol contiene il nome simbolico dello strumento su cui vengono eseguite le operazioni di compravendita, l'elemento request.volume contiene il valore del contratto dello strumento finanziario, l'elementorequest.tp contiene il valore del prezzo di TakeProfit (in alcuni casi il valore di TakeProfit per l'ordine non sarà specificato, quindi inseriamo zero nell'elemento della struttura request.tp )....

Ma perché inseriamo zero nell'elemento di struttura request.tp? Perché se abbiamo un ordine di acquisto in sospeso , request.tp=0 significa che il TP sarà sempre inferiore al prezzo di offerta corrente. A mio parere, un ordine con un tale valore di TP dovrebbe essere rifiutato a causa del valore non corretto del parametro TP, oppure dovrebbe essere eseguito immediatamente al prezzo Bid corrente dopo che il server ha accettato l'ordine.

 

Domanda 5: L'articolo afferma quanto segue:

...Specifichiamo le variabili locali da utilizzare nella funzione OnTick e il loro tipo:

double h[], l[], ma[], atr_h[], atr_l[],
          lev_h, lev_l, StopLoss,
          StopLevel=_Point*SymbolInfoInteger(Symbol(),SYMBOL_TRADE_STOPS_LEVEL),
          Spread   =NormalizeDouble(SymbolInfoDouble(Symbol(),SYMBOL_ASK) - SymbolInfoDouble(Symbol(),SYMBOL_BID),_Digits);

...La variabile StopLevel è utilizzata per memorizzare il valore STOP_LEVEL - la distanza minima dal prezzo corrente all'ordine piazzato (in unità di prezzo). Questo valore si ottiene come prodotto del prezzo del punto (variabile predefinita _Point) per il valore STOP_LEVEL in punti. La funzione SymbolInfoInteger restituisce il valore STOP_LEVEL. Il primo parametro di questa funzione è il nome simbolico dello strumento e il secondo parametro è l'identificatore della proprietà richiesta....

Il Manuale di riferimento MQL5 afferma anche che"SYMBOL_TRADE_STOPS_LEVEL è il margine minimo in pip dal prezzo di chiusura corrente per impostare gli ordini di stop". A mio avviso, in entrambi i casi si tratta di soddisfare la disuguaglianza

ORDER_PRICE_CURRENT-request.price>=SYMBOL_TRADE_STOPS_LEVEL(in caso di ordine Sell_Stop).

Perché allora il codice dell'Expert Advisor controlla che la distanza tra Bid (Ask) e StopLoss non superi il margine minimo dello StopLevel?

               ...// il nuovo StopLoss non è vicino al prezzo corrente?
               && NormalizeDouble(SymbolInfoDouble(Symbol(),SYMBOL_BID)-StopLoss-StopLevel,_Digits)>0
               
               ...// il nuovo StopLoss non è vicino al prezzo corrente?
               && NormalizeDouble(StopLoss-SymbolInfoDouble(Symbol(),SYMBOL_ASK)-StopLevel,_Digits)>0

Tale controllo è necessario in tutti i casi o è una peculiarità dell'implementazione di una particolare strategia? In breve, devo sempre controllare la distanza tra Bid (Ask) e StopLoss quando inserisco un ordine pendente per vedere se il margine minimo StopLevel viene superato?

 
Yedelkin:

Ma perché mettiamo zero nell'elemento della struttura request.tp? Perché se abbiamo un ordine di acquisto in sospeso , request.tp=0 significa che il TP sarà sempre inferiore al prezzo di offerta corrente. E, a mio avviso, un ordine con un tale valore di TP dovrebbe essere rifiutato a causa di un valore non corretto del parametro TP, oppure dovrebbe essere eseguito immediatamente al prezzo Bid corrente dopo che il server ha accettato l'ordine.
Zero significa che non c'è TP.
 
Yedelkin:

In breve, devo sempre controllare la distanza tra Bid (Ask) e StopLoss quando inserisco un ordine pendente per vedere se il margine minimo dello StopLevel è superato?

È sempre necessario controllare il livello di prezzo SL/TP/Entry degli ordini pendenti per verificare il margine minimo nei casi in cui si lavora con ordini di impostazione molto vicini al mercato.

Se si lavora con stop o ordini pendenti in una modalità ragionevole e lontana dal mercato (decine e centinaia di punti), si può evitare questo controllo.

 
Renat:

È necessario controllare sempre il livello di SL/TP/Prezzo di ingresso degli ordini pendenti per verificare la rientranza minima nei casi in cui si lavori con ordini di impostazione molto vicini al mercato.

Chiarimento della domanda 5.1.

Ho fatto calcolare all'Expert Advisor tre livelli per ogni ordine pendente: prezzo di entrata/SL/TP.

Poiché non si sa in anticipo quanto vicino/lontano sarà il livello del prezzo di entrata rispetto al prezzo di mercato corrente, il controllo del livello del prezzo di entrata per verificare il rispetto del margine minimo non solleva alcun problema.

Ma quale livello dovremmo verificare per gli altri due livelli SL/TP? È alquanto illogico controllare i livelli SL/TP rispetto al prezzo di mercato corrente, perché il livello del prezzo di entrata può trovarsi molto lontano dal prezzo di mercato corrente, e tale controllo perde di importanza. Per questo motivo ho previsto la verifica della condizione |Prezzo di entrata-TP(SL)|>SYMBOL_TRADE_STOPS_LEVEL nell'Expert Advisor. In generale, l'Expert Advisor funziona bene con tali condizioni, ma quando ho iniziato a ottimizzare il codice dell'EA, mi sono chiesto se tale controllo fosse necessario dal punto di vista dell'elaborazione degli ordini in sospeso da parte del server. Il codice dell'Expert Advisor non è sovraccarico di controlli su questa condizione (la strategia dell'Expert Advisor stesso non richiede tale controllo).

In altre parole, l'ordine pendente con tre livelli Entry price/SL/TP deve sempre controllare i livelli SL/TP per il margine minimo? E, in caso affermativo, deve verificare il margine minimo rispetto a quale livello (prezzo)?

 

Manca la possibilità di modificare il mio post. Quindi aggiungerò qui:

= Per ogni ordine pendente, l'Expert Advisor calcola tre livelli in modo indipendente: Prezzo di entrata/SL/TP. Lo scopo di "impostare un ordine pendente più vicino al mercato" non viene perseguito. =

 

SL e TP nel livello pendente sono valutati dal prezzo di entrata in modo che non siano inferiori a un livello minimo da esso.

Funziona allo stesso modo in MT4.

 
Renat:

Lo SL e il TP nel livello pendente vengono valutati dal prezzo di entrata in modo che si trovino ad almeno un livello minimo di distanza da esso.

Funziona allo stesso modo in MT4.

OK, ora ho capito tutto. Quindi, non posso semplificare il codice dell'EA; inizialmente tutto è stato fatto secondo l'articolo, cioè correttamente.

E non ho familiarità con la MT4, quindi tali domande sono "da un manichino". Grazie!

 
Renat:

...Controllate sempre il livello di SL/TP/Prezzo di ingresso degli ordini pendenti per verificare la rientranza minima nei casi in cui si lavora con ordini molto vicini al mercato.

...Lo SL e il TP nel livello pendente sono stimati dal prezzo di entrata in modo che non si trovino a meno di un livello minimo da esso.

Domanda 6: È chiaro che si controlla la rientranza minima quando si inseriscono gli ordini pendenti. Ora abbiamo una domanda sulle peculiarità del controllo del margine minimo quando si modifica il TP/SL di una posizione aperta.

Situazione: una posizione aperta ha un TP fisso e uno SL "pull-up", che si avvicina al TP fisso quando il prezzo si muove in direzione favorevole. Per analogia con l'impostazione di un ordine pendente, ogni volta che l'Expert Advisor invia un ordine di modifica del TP/SL di una posizione aperta, controlla la rientranza minima rispetto a entrambi i livelli TP e SL.

Ma nella descrizione della funzione PositionModify della classe CTrade si specifica che il parametro tp è "Il nuovo prezzo al quale scatta il Take Profit (o, se la modifica non è necessaria, il valore precedente)".

Di conseguenza, la domanda è: se non è necessaria una modifica del livello di TP precedentemente impostato, quando si invia un ordine per modificare il TP/SL di una posizione aperta, è necessario controllare il margine minimo di questo livello di TP rispetto al prezzo corrente (effettivo)? Oppure in questa situazione è sufficiente controllare il margine minimo solo in relazione allo SL di modifica?

In altre parole, quando si invia un ordine di modifica del TP/SL di una posizione aperta, è possibile non controllare il margine minimo in relazione al TP, se questo livello di TP è già stato impostato in precedenza e non è soggetto a modifiche? E nell'ordine di modifica è sufficiente specificare il valore del TP precedente?

 

Dopo aver scaricato il file "indicator_TP_en.mql5", rinominatelo in "indicator_TP.mql5".