Ti stai perdendo delle opportunità di trading:
- App di trading gratuite
- Oltre 8.000 segnali per il copy trading
- Notizie economiche per esplorare i mercati finanziari
Registrazione
Accedi
Accetti la politica del sito e le condizioni d’uso
Se non hai un account, registrati
Ho chiamato la mia funzione DoubleRound con MODE_TICKVALUE (che è 12,50) invece di MODE_TICKSIZE (0,25).
L'ho corretto, ma non ha fatto sparire il #130
Ecco un log dell'errore con la linea DoubleRound aggiornata:
per confronto, ecco un log dove ha funzionato:
in ogni caso, sembra funzionare più spesso ora, ci stiamo sicuramente avvicinando :)
in ogni caso, sembra funzionare più spesso ora, ci stiamo sicuramente avvicinando :)
Non riesco a capire perché quella modifica è fallita... stai ricevendo un nuovo Bid/Ask tra OrderSend e OrderModify?
Tutto quello che posso suggerire ora è che quando ottieni un errore 130. . . stampi tutto di nuovo, Bid, Ask (usando MarketInfo), OOP, StopLevel, SL che stai cercando di impostare, ecc, ecc.
Ho chiamato la mia funzione DoubleRound con MODE_TICKVALUE (che è 12,50) invece di MODE_TICKSIZE (0,25).
L'errore #130 stoploss non appare più. Gli ultimi passi sembrano aver finalmente individuato il problema.
Pubblicherò un altro post dopo questo, riassumendo tutti i passi fatti. Così altri nel forum che combattono l'errore #130 possono usare questo thread come riferimento.
Grazie per il vostro continuo aiuto :).
shinobi
Grazie per il vostro continuo aiuto :).
shinobi
La tecnica più importante per combattere gli errori è un log eccessivo. Fate output per tutto ciò che potrebbe essere collegato in modo remoto all'errore. Se definisci una funzione di log che puoi attivare e disattivare, puoi mantenere il codice dopo aver risolto il problema.
Quando inizializzi il tuo consulente esperto dovresti registrare tutte le informazioni che MarketInfo può dirti: https://docs.mql4.com/constants/marketinfo
Inoltre assicuratevi sempre di controllare i valori di ritorno delle funzioni, ad esempio per OrderModify:
ECN Broker richiede di fare ordini separati per comprare/vendere e stoploss/takeprofit. Quindi devi dividere il tuo codice in due ordini come questo:
Per gli ordini di vendita dovete sostituire OP_BUY con OP_SELL. Dovresti anche controllare i valori di ritorno di OrderSelect e OrderModify (vedi Consigli generali sopra).
Alcuni Broker richiedono che stoploss, takeprofit e slippage siano regolati a 4/5 cifre. Potete farlo mettendo il seguente codice nella vostra funzione init() (grazie a WHRoeder):
Poi dovete moltiplicare stoploss, takeprofit e slippage con pips2db1 prima di inviarlo al Broker
Un'altra possibile causa è che i tassi di mercato sono cambiati tra il tick attivato l'Expert Advisor (EA), e l'EA OrderSend() o OrderModify() è stato eseguito. Per evitare questo problema, ci sono due possibili soluzioni:
La prima è quella di utilizzare : RefreshRates() prima di usare variabili di mercato predefinite come: Ask e Bid. (queste variabili ottengono i loro valori quando il tick attiva l'EA)
La seconda è quella di non usare affatto le variabili di mercato predefinite. Invece puoi usare i valori attuali del mercato con MarketInfo(). Invece di Ask, Bid e Point usa
Se lo stoploss o il takeprofit sono troppo vicini al prezzo di entrata, l'ordine verrà rifiutato. Per evitare questo problema, si dovrebbe prendere in considerazione lo spread attuale tra Ask e Bid. Anche in questo caso ci sono due soluzioni:
La prima è quella di calcolare lo spread e aggiungerlo/sottrarlo al vostro stoploss/takeprofit.
La seconda soluzione è quella di prendere implicitamente in considerazione lo spread usando Ask e Bid, quando si calcola lo stoploss o il takeprofit:
I broker hanno un certo livello di stop. Se il vostro stoploss è al di sotto di tale livello, il vostro ordine sarà rifiutato. Potete controllare il livello di stop con MarketInfo(Symbol(), MODE_STOPLEVEL).
Per evitare questo, controllate il vostro stoploss rispetto al livello di stop del broker e regolatelo se necessario:
Freeze Level è un concetto simile. Anche il vostro stopploss deve essere maggiore del livello di congelamento del broker. Potete controllare il livello di congelamento tramite MarketInfo(Symbol(), MODE_FREEZELEVEL).
Per evitare questo, controllate di nuovo il vostro stoploss rispetto al livello di congelamento del broker:
Infine il vostro stoploss o takeprofit potrebbe essere rifiutato, perché il simbolo supporta solo stoploss/takeprofit che corrispondono al suo ticksize. Il ticksize è la distanza minima che il premio del simbolo può salire e scendere. Per esempio, se il prezzo è 1000 e il ticksize 0.25, allora il prezzo può salire o scendere solo di un multiplo di 0.25 (0.25 * n, dove n è un numero naturale). Quindi il prezzo potrebbe salire di 0,25 a 1000,25 o scendere di 1,75 a 998,25.
Per tenere conto del ticksize, avete bisogno di una funzione che arrotonda i valori doppi ad un certo valore di passo (ad esempio il più vicino 0,25). Ecco una tale funzione:
Ad esempio chiamando DoubleRound con numero = 1023.81234 e passo = 0.25 si ottiene 1023.75. Chiamandola con 1023.967834 restituirebbe 1024.00
Ora, prima di inviare lo stoploss o il takeprofit, arrotondate al ticksize del Symbol con:
Ecco un piccolo esempio completo che tiene conto di tutte le contromisure di cui sopra:
Spero che questo aiuti a sbarazzarsi di #130. Se la modifica del vostro codice non funziona, usate prima un esempio minimo, come quello sopra. E poi, quando l'errore scompare, riprendete la modifica nel vostro codice.
Buona fortuna,
shinobi
I miei ringraziamenti a Raptor, WHRoeder, SDC, BigAl, gjol e 35806 per avermi aiutato ad eliminare l'errore e a mettere insieme questo riferimento.