![MQL5 - Linguaggio delle strategie di trading integrato nel client terminal MetaTrader 5](https://c.mql5.com/i/registerlandings/logo-2.png)
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 provato a fargli prendere i dati in 2 modi:
1:
void OnTick()
{
Ask = SymbolInfoDouble(Symbol(), SYMBOL_ASK);
Bid = SymbolInfoDouble(Symbol(), SYMBOL_BID);
double sym1Bid = SymbolInfoDouble(symbol1, SYMBOL_BID);
double sym2Bid = SymbolInfoDouble(symbol2, SYMBOL_BID);
double sym3Bid = SymbolInfoDouble(symbol3, SYMBOL_BID);
double sym1Ask = SymbolInfoDouble(symbol1, SYMBOL_ASK);
double sym2Ask = SymbolInfoDouble(symbol2, SYMBOL_ASK);
double sym3Ask = SymbolInfoDouble(symbol3, SYMBOL_ASK);
2:
double sym3Ask = symbol3_tick.ask;
purtroppo escono sempre prezzi diversi:
lo screen è stato fatto dal bot in funzione su conto demo, ma sul live è la stessa cosa
Forum sul trading, sistemi di trading automatizzati e test di strategie di trading
Regole generali e buone pratiche del Forum.
Alain Verleyen , 03.08.2018 23:01
Quando inserisci il codice usa il pulsante SRC!
Ciao,
Si prega di MODIFICARE il messaggio e utilizzare il pulsante CODICE quando si inserisce il codice .
Hai conto netting o hedge?
Non te lo so dire con sicurezza. Dove lo vedo?
Comunque credo si hedging perché con altri bot avevo diverse posizioni aperte contemporaneamente sullo stesso assett sia in sell che in buy
Allora bisogna leggere il codice per capire.
Non ti posso mettere il codice completo perché ho firmato un NDA.
Comunque questo è il modo in cui apre la posizione:
MqlTick last_tick;
SymbolInfoTick(Symbol(), last_tick);
MqlTradeRequest request = {TRADE_ACTION_DEAL};
MqlTradeResult result = {0};
request.action = TRADE_ACTION_DEAL;
request.type = ORDER_TYPE_SELL;
request.volume = lottaggio;
request.symbol = Symbol();
request.price = last_tick.ask;
request.sl = last_tick.ask + stop_loss * SymbolInfoDouble(Symbol(), SYMBOL_POINT);
request.tp = last_tick.ask - take_profit * SymbolInfoDouble(Symbol(), SYMBOL_POINT);
request.magic = magic_number;
request.comment = "Sell";
request.type_filling = ORDER_FILLING_IOC;
request.type_time = ORDER_TIME_GTC;
int res = OrderSend(request, result);
if (res > 0) {
in_position = true;
last_trade_time = TimeCurrent();
}
Questo è come la chiude:
int positions_total = (int)PositionsTotal();
if (omissis) {
for (int i = 0; i < positions_total; i++) {
ulong position_ticket = PositionGetTicket(i);
if (position_ticket != 0) {
ENUM_POSITION_TYPE position_type = (ENUM_POSITION_TYPE)PositionGetInteger(POSITION_TYPE);
int position_magic = (int)PositionGetInteger(POSITION_MAGIC);
if (position_type == POSITION_TYPE_SELL && position_magic == magic_number) {
trade.PositionClose(position_ticket);
}
}
}
}
quello che sospetto è che lavorando più bot insieme uno vada a chiudere le posizioni dell'altro, visto che lavorano in direzioni opposte, se pur con simboli diversi.
Inoltre ho notato che mentre in backtest mi apre le posizioni giuste in tempo reale spesso me le apre invertite. Non ho idea del perché visto che poi ribacktestando quello stesso frangente temporale poi le operazioni le apre in maniera corretta
Non ti posso mettere il codice completo perché ho firmato un NDA.
Comunque questo è il modo in cui apre la posizione:
MqlTick last_tick;
SymbolInfoTick(Symbol(), last_tick);
MqlTradeRequest request = {TRADE_ACTION_DEAL};
MqlTradeResult result = {0};
request.action = TRADE_ACTION_DEAL;
request.type = ORDER_TYPE_SELL;
request.volume = lottaggio;
request.symbol = Symbol();
request.price = last_tick.ask;
request.sl = last_tick.ask + stop_loss * SymbolInfoDouble(Symbol(), SYMBOL_POINT);
request.tp = last_tick.ask - take_profit * SymbolInfoDouble(Symbol(), SYMBOL_POINT);
request.magic = magic_number;
request.comment = "Sell";
request.type_filling = ORDER_FILLING_IOC;
request.type_time = ORDER_TIME_GTC;
int res = OrderSend(request, result);
if (res > 0) {
in_position = true;
last_trade_time = TimeCurrent();
}
Questo è come la chiude:
int positions_total = (int)PositionsTotal();
if (omissis) {
for (int i = 0; i < positions_total; i++) {
ulong position_ticket = PositionGetTicket(i);
if (position_ticket != 0) {
ENUM_POSITION_TYPE position_type = (ENUM_POSITION_TYPE)PositionGetInteger(POSITION_TYPE);
int position_magic = (int)PositionGetInteger(POSITION_MAGIC);
if (position_type == POSITION_TYPE_SELL && position_magic == magic_number) {
trade.PositionClose(position_ticket);
}
}
}
}
quello che sospetto è che lavorando più bot insieme uno vada a chiudere le posizioni dell'altro, visto che lavorano in direzioni opposte, se pur con simboli diversi.
Inoltre ho notato che mentre in backtest mi apre le posizioni giuste in tempo reale spesso me le apre invertite. Non ho idea del perché visto che poi ribacktestando quello stesso frangente temporale poi le operazioni le apre in maniera corretta
Quando posti del codice utilizza l'apposito tasto. Detto questo siccome nel metodo di chiusura non controlli il simbolo della posizione mi viene da pensare che utilizzi lo stesso magic number su entrambi gli Expert. Sarebbe meglio inserire un controllo anche sul simbolo.
Si hai ragione, mi sono accorto dopo che serve mettere il codice nel riquadro.
Comunque per la chiusura in teoria lo dovrebbe prendere il magic number da qua:
Dici che non va bene?
In ogni caso mettendo un magic diverso per ogni bot sembra che quel problema sia risolto, per ora, o almeno non si è più presentato.
Quello che succede invece è che spesso non rispetta le regole, o così sembra.
Ad esempio a volte dovrebbe aprire in sell e apre in buy o viceversa. Insomma fa delle cose che non dovrebbe fare. Tutto questo sempre in conto demo. In backtest va perfetto, nel senso che tutte le operazioni sono precise, al di là di slippage, spread ecc.
Si hai ragione, mi sono accorto dopo che serve mettere il codice nel riquadro.
Comunque per la chiusura in teoria lo dovrebbe prendere il magic number da qua:
Dici che non va bene?
In ogni caso mettendo un magic diverso per ogni bot sembra che quel problema sia risolto, per ora, o almeno non si è più presentato.
Quello che succede invece è che spesso non rispetta le regole, o così sembra.
Ad esempio a volte dovrebbe aprire in sell e apre in buy o viceversa. Insomma fa delle cose che non dovrebbe fare. Tutto questo sempre in conto demo. In backtest va perfetto, nel senso che tutte le operazioni sono precise, al di là di slippage, spread ecc.
La mia supposizione era giusta allora. Se vuoi mantenere lo stesso magic devi aggiungere obbligatoriamente un controllo anche sul simbolo altrimenti devi cambiare il magic per ogni bot. Se in backtest funziona e in live no, sicuramente è perché nel test gira un solo ea, a questo punto c'è qualcosa nel codice da rivedere.
allora questa la situazione:
Prima facevo girare lo stesso codice sui 3 grafici dei 3 simboli della strategia. Ho notato che quando le operazioni erano sbagliate era perchè c'era un lasso di tempo nell'apertura delle posizioni. Quando le apriva tutte insieme (come dovrebbe essere) erano giuste, quando invece venivano aperte a distanza (100ms o più) erano sbagliate. andando a vedere i valori con cui aveva fatto i calcoli però le operazioni risultavano corrette, era soltanto cambiata la situazione del mercato.
Quindi errore di codice lo escludo perché:
1. In back test funziona perfetto
2. In tempo reale le operazioni sono giuste, solo che spesso vengono fatte non in sincro
Il problema della desincronizzazione potrebbe essere dovuta che la vps non riesce a stare dietro a tutti i calcoli contemporaneamente (stavo facendo girare 8 sistemi, ognuno da 3 simboli).
Quindi ho modificato il codice per far girare ogni sistema su un solo ea, associato ad un solo grafico e che apre da lì le posizioni per tutti e 3 i simboli. In Back test funziona.
Ora la domanda è: così risolvo il problema della sincronizzazione, ma non quello della velocità di calcolo ed operazione.
Nella tua esperienza una frequenza di controllo di 100ms è troppo o posso spingere ancora? c'è qualche modo per semplificare il processo?
Grazie