Discussione sull’articolo "L'implementazione di una modalità multivaluta su MetaTrader 5" - pagina 5

 
Lazarev:

ditemi,

1. se ho bisogno solo di Bid e Ask di altre valute, è giusto usare le "spie"?

2. è solo un'idea, non c'è la possibilità nella funzione onChartEvent di controllare gli eventi di altre valute e non solo della valuta corrente?

3. è possibile impostare il valore del timer inferiore a uno nell'evento onTimer, in modo da scaricare il valore delle quotazioni molto più spesso e di conseguenza ritardare l'ora dell'ultimo tick di un tempo minimo?

4. oppure è possibile utilizzare "CHARTEVENT_CUSTOM+n" per controllare, nel mio caso, l'incrocio delle maschere su altri grafici?

1. Utilizzo.

2. Esiste un'opzione. L'evento di un'altra valuta deve essere inviato al grafico in cui è impostato l'EA con OnChartEvent().

3. No. Uno è il minimo.

4. È possibile.

 

Ho creato un semplice "indicatore spia" SendEvent.mq5, che invia un evento quando arriva una nuova quotazione:

#property indicator_chart_window
#property indicator_plots 0
int OnInit()
  {
   return(0);
  }

int OnCalculate(const int rates_total,
                const int prev_calculated,
                const int begin,
                const double &price[])
  {
   EventChartCustom(0,1,0,0,_Symbol);
   return(rates_total);
  }

Ho creato un semplice Expert Advisor che riceve gli eventi da questo indicatore e cerca di effettuare un'operazione di trading (ecco una parte, il testo completo è nel file allegato):

void OnChartEvent(const int id, // Gestore dell'evento ChartEvent
                  const long &lparam,
                  const double &dparam,
                  const string &sparam)            // sparam contiene il nome dello strumento
  {
      // richiedere Digit,Point,Ask,Bid per lo strumento per il quale si è verificato l'evento
      if(!SymbolInfoInteger(sparam,SYMBOL_DIGITS,dig)) Print("SymbolInfoInteger(SYMBOL_DIGITS) ERROR!");
      if(!SymbolInfoDouble(sparam,SYMBOL_POINT,p)) Print("SymbolInfoDouble(SYMBOL_POINT) ERROR!");
      if(!SymbolInfoDouble(sparam,SYMBOL_BID,Bid)) Print("SymbolInfoDouble(SYMBOL_BID) ERROR!");
      if(!SymbolInfoDouble(sparam,SYMBOL_ASK,Ask)) Print("SymbolInfoDouble(SYMBOL_ASK) ERROR!");
      d=(int)dig;
      if(1>0) // compriamo sempre
        {
         q.action=TRADE_ACTION_DEAL; // riempire la struttura MqlTradeRequest e tentare di effettuare un'operazione di compravendita
         q.symbol=sparam; // sparam contiene il nome dello strumento
         q.volume=Lot;
         q.price=NormalizeDouble(Ask,d);
         q.sl=NormalizeDouble(Ask-p*StopLoss,d);
         q.tp=NormalizeDouble(Ask+p*TakeProfit,d);
         q.deviation=0;
         q.type=ORDER_TYPE_BUY;
         q.type_filling=ORDER_FILLING_FOK;
         // controllare le proprietà dello strumento corrente
         Print("Bid=",DoubleToString(Bid,8),", Ask=",DoubleToString(Ask,8),", Digits=",d,", Points=",DoubleToString(p,8));
         // controllare la struttura della richiesta di compravendita che invieremo
         Print("q.action=",q.action,", q.symbol=",q.symbol,", q.volume=",q.volume,", q.price=",DoubleToString(q.price,d),", q.sl=",DoubleToString(q.sl,d),", q.tp=",DoubleToString(q.tp,d),", q.deviation=",q.deviation,", q.type=",q.type,", q.type_filling=",q.type_filling);
         Print(OrderCheck(q,ch));                                  // verificare se è possibile eseguire un'operazione commerciale
         Print("ch.retcode=",ch.retcode,", ch.comment=",ch.comment); // risultato
         Print("OrderSend:",OrderSend(q,s));                        // tentativo di effettuare un'operazione di compravendita
         Print("s.retcode=",s.retcode,", s.comment=",s.comment);     // risultato
        }
      if(0>0) // se la condizione è corretta, venderemo
        {
         // аналогично для продажи
        }
     }
  }

L'Expert Advisor riceve gli eventi dall'indicatore, ma nel tester (sia con che senza visualizzazione) non può eseguire un'operazione di trading - viene restituito l'errore "Invalid Request", codice di ritorno 10013. In tempo reale funziona normalmente. Se l'operazione di trading nell'Expert Advisor viene eseguita da OnTick() invece che da OnChartEvent(), funziona bene.

Ho inserito l'invio della richiesta di negoziazione nel modello di Expert Advisor offerto dall'autore dell'articolo in CodeBase - anche le operazioni di negoziazione non funzionano (stesso errore).

Qualcuno sa dirmi qual è il motivo? Ho letto in questo thread che OnChartEvent() non viene elaborato nel tester, ma in questo caso gli eventi inviati dall'indicatore vengono elaborati nel tester, ma è impossibile eseguire un'operazione di trading da OnChartEvent() nel tester.

File:
ea.mq5  4 kb
SendEvent.mq5  1 kb
[Eliminato]  
zdd:

Ho creato un semplice "indicatore-spia" SendEvent.mq5, che invia un evento quando arriva una nuova quotazione:

Ho creato un semplice Expert Advisor che riceve gli eventi da questo indicatore e cerca di effettuare un'operazione di trading (ne fornisco una parte, il testo completo è nel file allegato):

L'Expert Advisor riceve eventi dall'indicatore, ma nel tester (sia con che senza visualizzazione) non può eseguire un'operazione di trading - viene restituito l'errore "Invalid Request", codice di ritorno 10013. In tempo reale funziona normalmente. Se un'operazione di trading nell'Expert Advisor viene eseguita da OnTick() invece che da OnChartEvent(), funziona bene.

Ho inserito l'invio della richiesta di negoziazione nel modello di Expert Advisor offerto dall'autore dell'articolo in CodeBase - anche le operazioni di negoziazione non funzionano (stesso errore).

Qualcuno sa dirmi qual è il motivo? Ho letto in questo thread che OnChartEvent() non viene elaborato nel tester, ma in questo caso gli eventi inviati dall'indicatore vengono elaborati nel tester, ma è impossibile eseguire un'operazione di trading da OnChartEvent() nel tester.

Cercate di farvi venire in mente il mio pesce. Naturalmente, la logica non è completa e molto stupida, ma sembra essere molto simile a quello che ti serve.

Almeno le posizioni del mercato si aprono sia nel tester che nella demo.

Non so perché (sono troppo pigro per capirlo), ma il tuo esempio mi dava 10013 in qualsiasi situazione.

PS

È meglio legarsi a oggetti standard (come CAccountInfo e CTrade). Ma se avete la pazienza di scrivere tutto da soli, ne sarò felice.

A proposito, l'implementazione della spia stessa è meglio prenderla dall'articolo, o farne una copia modificabile (ad esempio, suggerisco di sostituire l'anno "(long)_Period" con la data di invio dell'evento o altre informazioni utili). La vostra variante è in qualche modo piuttosto "grezza".

File:
DemoEA.mq5  20 kb
 
Interesting:

Vedete se riuscite a far funzionare il mio pesce. La logica è incompleta e molto ottusa, ma sembra essere molto simile a quella che ti serve.

Grazie, ho capito. Se dichiari le strutture MqlTradeRequest e MqlTradeResult a livello globale, funziona!
 
Grazie mille per l'articolo!
 

Sto cercando di ottenere i prezzi di tre coppie EURUSD, EURGBP, GBPUSD. Tutto funziona bene quando seleziono "Tutti i tick" o "Solo prezzi aperti" nel tester della strategia. Ma se scelgo "Ogni tick basato sui tick reali", per qualche motivo possono verificarsi diversi eventi "Nuova barra" in un minuto per uno strumento.

Per ripetere, è possibile selezionare un intervallo, ad esempio da 2016.07.15 a 2016.07.19. Ecco un esempio di log, osservando il 7° minuto e il 9° minuto:

2016.07.15 00:05:00 >  -> id=2:  EURGBP CHARTEVENT_NEWBAR_M1 price=0.8333

2016.07.15 00:05:00 >  -> id=0:  EURUSD CHARTEVENT_NEWBAR_M1 price=1.1119

2016.07.15 00:05:00 >  -> id=1:  GBPUSD CHARTEVENT_NEWBAR_M1 price=1.33399

2016.07.15 00:06:00 >  -> id=2:  EURGBP CHARTEVENT_NEWBAR_M1 price=0.8334

2016.07.15 00:06:00 >  -> id=0:  EURUSD CHARTEVENT_NEWBAR_M1 price=1.1119

2016.07.15 00:06:00 >  -> id=1:  GBPUSD CHARTEVENT_NEWBAR_M1 price=1.33394

2016.07.15 00:07:19 >  -> id=2:  EURGBP CHARTEVENT_NEWBAR_M1 price=0.8333700000000001

2016.07.15 00:07:19 >  -> id=0:  EURUSD CHARTEVENT_NEWBAR_M1 price=1.11174

2016.07.15 00:07:19 >  -> id=1:  GBPUSD CHARTEVENT_NEWBAR_M1 price=1.33382

2016.07.15 00:07:19 >  -> id=2:  EURGBP CHARTEVENT_NEWBAR_M1 price=0.8333700000000001

2016.07.15 00:07:19 >  -> id=0:  EURUSD CHARTEVENT_NEWBAR_M1 price=1.11174

2016.07.15 00:07:19 >  -> id=1:  GBPUSD CHARTEVENT_NEWBAR_M1 price=1.33381

2016.07.15 00:07:19 >  -> id=2:  EURGBP CHARTEVENT_NEWBAR_M1 price=0.8333700000000001

2016.07.15 00:07:19 >  -> id=0:  EURUSD CHARTEVENT_NEWBAR_M1 price=1.11174

2016.07.15 00:07:19 >  -> id=1:  GBPUSD CHARTEVENT_NEWBAR_M1 price=1.33384

2016.07.15 00:08:00 >  -> id=2:  EURGBP CHARTEVENT_NEWBAR_M1 price=0.83329

2016.07.15 00:08:00 >  -> id=0:  EURUSD CHARTEVENT_NEWBAR_M1 price=1.11167

2016.07.15 00:08:00 >  -> id=1:  GBPUSD CHARTEVENT_NEWBAR_M1 price=1.33394

2016.07.15 00:09:00 >  -> id=2:  EURGBP CHARTEVENT_NEWBAR_M1 price=0.83327

2016.07.15 00:09:00 >  -> id=0:  EURUSD CHARTEVENT_NEWBAR_M1 price=1.11166

2016.07.15 00:09:00 >  -> id=1:  GBPUSD CHARTEVENT_NEWBAR_M1 price=1.33396

2016.07.15 00:09:00 >  -> id=2:  EURGBP CHARTEVENT_NEWBAR_M1 price=0.83327

2016.07.15 00:09:00 >  -> id=0:  EURUSD CHARTEVENT_NEWBAR_M1 price=1.11166

Qual è la ragione di questo comportamento quando si seleziona la modalità "Tutti i tick basati sui tick reali"?
 
ooparadise:

Sto cercando di ottenere i prezzi di tre coppie EURUSD, EURGBP, GBPUSD. Tutto funziona bene quando seleziono "Tutti i tick" o "Solo prezzi aperti" nel tester della strategia. Ma se scelgo "Ogni tick basato sui tick reali", per qualche motivo possono verificarsi diversi eventi "Nuova barra" in un minuto per uno strumento.

Per ripetere, è possibile selezionare un intervallo, ad esempio da 2016.07.15 a 2016.07.19. Ecco un esempio di log, osservando il 7° minuto e il 9° minuto:

Qual è la ragione di questo comportamento quando si seleziona la modalità "Tutti i tick basati sui tick reali"?

Come si cattura l'evento "Nuova barra"? Nella build 1375 la precisione dell'arrivo dei tick è stata migliorata in millisecondi:

Tester: Aggiunto il supporto per la precisione al millisecondo. In precedenza nel tester della strategia il tempo era di un secondo.

  • Le funzioni EventSetMillisecondTimer e Sleep funzionano ora con maggiore precisione nel tester della strategia.
  • È aumentata l'accuratezza della presentazione dei tick nel test degli Expert Advisor multicurrency. In precedenza, se venivano inseriti più tick in un secondo (il volume di tick di una barra di un minuto è superiore a 60), a tutti veniva assegnato lo stesso tempo. Quando si testano Expert Advisor monovaluta, questo non ha molta importanza, poiché i tick vengono semplicemente passati all'Expert Advisor in modo sequenziale. Tuttavia, quando si eseguono test su diverse coppie, è importante sapere quale coppia di tick è arrivata per prima. In precedenza, i tick di ciascun simbolo venivano trasmessi all'Expert Advisor in modo sequenziale: prima tutti i tick di un simbolo per un secondo, poi tutti i tick di un altro simbolo. Ora vengono trasmessi tenendo conto dei millisecondi.

    Quando si eseguono i test sui tick reali, i millisecondi vengono presi dai dati dei tick originali. Quando si generano i tick, i millisecondi sono scritti in base al volume del tick. Ad esempio, se ci sono 3 tick in un secondo, ad essi verrà assegnato il tempo 000, 333 e 666 millisecondi.
 

Catturo unanuova barra nel modo in cui è scritto nell'articolo. Cioè, l'indicatore invia l'evento "Nuova barra" in questo modo (rispetto al tempo precedente minuti, ore, giorni, mesi):

   double price_current=price[rates_total-1];

   TimeCurrent(time);

   if(prev_calculated==0)

     {

      EventCustom(CHARTEVENT_INIT,price_current);

      prev_time=time; 

      return(rates_total);

     }

//--- new tick

   if((flag_event & CHARTEVENT_TICK)!=0) EventCustom(CHARTEVENT_TICK,price_current);       


//--- check change time

   if(time.min==prev_time.min && 

      time.hour==prev_time.hour && 

      time.day==prev_time.day &&

      time.mon==prev_time.mon) return(rates_total);


//--- new minute

   if((flag_event & CHARTEVENT_NEWBAR_M1)!=0) EventCustom(CHARTEVENT_NEWBAR_M1,price_current); 

AGGIORNAMENTO: il problema è scomparso con l'installazione della build 1375.

 

Grazie per questo enorme articolo. Non avevo mai sentito parlare di EventChartCustom. Stavo provando altri eventi grafici, ma prendevano in considerazione solo gli eventi causati dall'azione umana. Questo risolve molte cose.

A proposito, io lavoro su MQL4, era al 98% la stessa cosa.

Salute

 

Grazie mille per questo, è così utile. Ottimo lavoro!