Come importare bid/ask da un'altra coppia di valute? - pagina 5

 
HosseinKOGO:

Questo è GBPAUD H4 3.12.2018 giorno intero! E non ho saltato alla fine questa volta.

Può la funzione di stampa perdere alcuni rapporti quando ha troppo da stampare?
Immagino che un altro problema potrebbe essere perché i tick di questi 3 strumenti escono in diversi millisecondi, quindi quando usiamo la funzione start/OnTick su GBPAUD, fa solo la funzione start ogni volta che il tick GBPAUD esce. E immagino che il tuo codice potrebbe dire di restituire tutti i prezzi di queste 3 coppie quando nessuno di loro è 0. Se è così, restituisce ogni volta che tutti i prezzi ask/bid di tutti gli strumenti escono allo stesso tempo esatto.

I dati sembrano a posto...

Hai ragione sulla funzione di stampa... Anch'io vedo molte linee mancanti nei miei test. Ma quando stampo tutto su file, non manca nulla.

Ecco alcune informazioni sul codice: il tempo di ogni tick GBPAUD sarà usato per ottenere i tick più recenti delle altre coppie (fino allo stesso tempo), quindi restituirà sempre qualcosa, non sarà zero.

Ho deciso di mettere la funzione in una classe, che dovrebbe essere più ordinata. Vedi allegato. Mettetela nella vostra cartella expert, insieme al vostro EA. Sentiti libero di modificarla.

Il seguente esempio mostra un modo di usarla (le linee evidenziate sono essenziali):

#include "TicksInfo.mqh"
CTicksInfo ticksInfo;

string otherPairs[] = {"GBPUSD","EURUSD"};
string allPairs[] = {};

int tickCount = 0;

//+------------------------------------------------------------------+
//| Expert initialization function                                   |
//+------------------------------------------------------------------+
int OnInit()
  {
   ticksInfo.init(otherPairs);
   int numSym = ArraySize(otherPairs)+1;
   ArrayResize(allPairs,numSym);
   allPairs[0] = _Symbol;
   for (int i=1; i<numSym; i++)
      allPairs[i] = otherPairs[i-1];
   
   return(INIT_SUCCEEDED);
  }
//+------------------------------------------------------------------+
//| Expert deinitialization function                                 |
//+------------------------------------------------------------------+
void OnDeinit(const int reason)
  {
   ticksInfo.deInit();
   Print ("Total Ticks = ", tickCount);
  }
//+------------------------------------------------------------------+
//| Expert tick function                                             |
//+------------------------------------------------------------------+
void OnTick()
  {
   tickCount++;
   Print ("=== Now process tick ", tickCount);
   MqlTick myTick;
   
   for (int i=0; i<ArraySize(allPairs); i++)
   {
      if (ticksInfo.getTick(allPairs[i],myTick))
         printTick (allPairs[i],myTick);
      else
         Print (allPairs[i], " Error");
   }
  }
//+------------------------------------------------------------------+

void printTicktoFile(string sym, MqlTick &tick)
{
   int file = FileOpen("LogFile.log",FILE_WRITE|FILE_READ|FILE_TXT);
   FileSeek(file,0,SEEK_END);
   FileWrite(file, sym, " tick number ", tickCount, ", at ", 
          tick.time, " ",
          IntegerToString(tick.time_msc-(tick.time*1000),3,'0'),
          " Ask = ", tick.ask, " Bid = ", tick.bid);
   FileClose(file);
}

void printTick(string sym, MqlTick &tick)
{
   Print (sym, " tick number ", tickCount, ", at ", 
          tick.time, " ",
          IntegerToString(tick.time_msc-(tick.time*1000),3,'0'),
          " Ask = ", tick.ask, " Bid = ", tick.bid);
}

Quindi la chiave in realtà, è solo questa linea:ticksInfo.getTick(<SYMBOL String>,<MqlTick Struct>). Se restituisce false, dovrai controllare il diario per il messaggio di errore.

File:
TicksInfo.mqh  5 kb
 
Seng Joo Thio:

I dati sembrano a posto...

Hai ragione sulla funzione di stampa... Anch'io vedo molte linee mancanti nei miei test. Ma quando stampo tutto su file, non manca nulla.

Ecco alcune informazioni sul codice: il tempo di ogni tick GBPAUD sarà usato per ottenere i tick più recenti delle altre coppie (fino allo stesso tempo), quindi restituirà sempre qualcosa, non sarà zero.

Ho deciso di mettere la funzione in una classe, che dovrebbe essere più ordinata. Vedi allegato. Mettetela nella vostra cartella expert, insieme al vostro EA. Sentiti libero di modificarla.

Il seguente esempio mostra un modo di usarla (le linee evidenziate sono essenziali):

Quindi la chiave in realtà, è solo questa linea:ticksInfo.getTick(<SYMBOL String>,<MqlTick Struct>). Se restituisce false, dovrai controllare il diario per il messaggio di errore.

Grazie per il vostro aiuto,

Ho copiato tutte queste linee in tutte le aree appropriate. Ma siccome non capisco il codice, per favore consigliatemi come mettere l'Ask e il Bid di SecondPair in Ask2,Bid2 e la stessa cosa per ThirdPair.
Ecco la mia area globale:

#include "TicksInfo.mqh"
CTicksInfo ticksInfo;

extern string SecondPair;
extern string ThirdPair;

string otherPairs[] = {SecondPair,ThirdPair};
string allPairs[] = {};

int tickCount = 0;
.
.
.

Questa parte restituisce 2 errori durante la compilazione. Cosa dovrei fare con loro?
'SecondPair' - espressione costante richiesta MyEA!.mq4
ThirdPair' - espressione costante richiesta MyEA!.mq4

 
HosseinKOGO:

Grazie per il vostro aiuto,

Ho copiato tutte queste linee in tutte le aree appropriate. Ma siccome non capisco il codice, per favore consigliatemi come mettere l'Ask e il Bid di SecondPair in Ask2,Bid2 e la stessa cosa per ThirdPair.
Ecco la mia area globale:

Questa parte restituisce 2 errori durante la compilazione. Cosa dovrei fare con loro?
'SecondPair' - espressione costante richiesta MyEA!.mq4
ThirdPair' - espressione costante richiesta MyEA!.mq4

Allora dichiarate le vostre otherPairs allo stesso modo di allPairs. E in OnInit, fai così:

ArrayResize(otherPairs,2);
otherPairs[0] = SecondPair;
otherPairs[1] = ThirdPair;

E per assegnare i valori in Ask2, Bid2, Ask3, Bid3, fai questo in OnTick:

   MqlTick myTick;
   
   if (ticksInfo.getTick(SecondPair,myTick))
   {
      Ask2 = myTick.ask;
      Bid2 = myTick.bid;
   }
   else
      Print (SecondPair, " Error");

   if (ticksInfo.getTick(ThirdPair,myTick))
   {
      Ask3 = myTick.ask;
      Bid3 = myTick.bid;
   }
   else
      Print (ThirdPair, " Error");
 
Seng Joo Thio:

Poi dichiarate le vostre otherPairs allo stesso modo di allPairs. E in OnInit, fate così:

E per assegnare i valori in Ask2, Bid2, Ask3, Bid3, fate così in OnTick:

Mi dà di nuovo 00 :(
La mia area globale:

#include "TicksInfo.mqh"
CTicksInfo ticksInfo;

extern string SecondPair;
extern string ThirdPair;

string otherPairs[] = {};
string allPairs[] = {};

int tickCount = 0;
.
.
.

OnInit:

   ticksInfo.init(otherPairs);
   int numSym = ArraySize(otherPairs)+1;
   ArrayResize(allPairs,numSym);
   allPairs[0] = _Symbol;
   for (int i=1; i<numSym; i++)
   allPairs[i] = otherPairs[i-1];
   
   ArrayResize(otherPairs,2);
   otherPairs[0] = SecondPair;
   otherPairs[1] = ThirdPair;
.
.
.

OnDeinit:

   ticksInfo.deInit();
   Print ("Total Ticks = ", tickCount);

OnTick:

   tickCount++;
   Print ("=== Now process tick ", tickCount);
   MqlTick myTick;
   
   for (int i=0; i<ArraySize(allPairs); i++)
   {
      if (ticksInfo.getTick(allPairs[i],myTick))
         printTick (allPairs[i],myTick);
      else
         Print (allPairs[i], " Error");
   }
   
   
   if (ticksInfo.getTick(SecondPair,myTick))
   {
      Ask2 = myTick.ask;
      Bid2 = myTick.bid;
   }
   else
      Print (SecondPair, " Error");

   if (ticksInfo.getTick(ThirdPair,myTick))
   {
      Ask3 = myTick.ask;
      Bid3 = myTick.bid;
   }
   else
      Print (ThirdPair, " Error");

Journal:
2019.05.14 17:37:14.686 2018.01.03 23:36:58 MyEA! GBPAUD,H4: Errore GBPCAD
2019.05.14 17:37:14.686 2018.01.03 23:36:58 MyEA! GBPAUD,H4: Errore GBPUSD
2019.05.14 17:37:14.686 2018.01.03 23:36:58 MyEA! GBPAUD,H4: GBPAUD tick numero 221179, al 2018.01.03 23:36:58 000 Ask = 1.72479 Bid = 1.72459
2019.05.14 17:37:14.686 2018.01.03 23:36:58 MyEA! GBPAUD,H4: === Ora processa il tick 221179



Dove mi sbaglio?
Mi dispiace per la mia abilità di livello zero :D

 
HosseinKOGO:

Mi dà di nuovo 00 :(
La mia area globale:

OnInit:

OnDeinit:

OnTick:

Dove mi sbaglio?
Mi dispiace per la mia abilità di livello zero :D

OnInit - le 3 nuove linee dovrebbero andare prima di tutto.
 
HosseinKOGO:

Mi dispiace per la mia abilità di livello zero :D

È tutta una questione di variabili e funzioni, e la volontà di sperimentare.
 
Seng Joo Thio:
OnInit - le 3 nuove linee dovrebbero andare prima di tutto.

L'ho fatto. Ma è molto strano: il timer per quelle due coppie extra non funziona...

2019.05.14 17:41:55.469    2018.01.05 11:11:24   MyEA! GBPAUD,H4: GBPCAD tick number 370711, at 1970.01.01 00:00:00 000 Ask = 0.0 Bid = 0.0
2019.05.14 17:41:55.469    2018.01.05 11:11:24   MyEA! GBPAUD,H4: GBPUSD tick number 370711, at 1970.01.01 00:00:00 000 Ask = 0.0 Bid = 0.0
2019.05.14 17:41:55.469    2018.01.05 11:11:24   MyEA! GBPAUD,H4: GBPAUD tick number 370711, at 2018.01.05 11:11:24 000 Ask = 1.72644 Bid = 1.72624
2019.05.14 17:41:55.469    2018.01.05 11:11:24   MyEA! GBPAUD,H4: === Now process tick 370711
 
HosseinKOGO:

L'ho fatto. Ma è molto strano: il timer per quelle due coppie extra non funziona...

Mostrami l'intero ea, dopo che hai finito di sperimentare e ancora non riesci a capire perché. Posso dare un'occhiata tra circa 8 ore :). Ora ho bisogno di 😴 ... 😂
 
  1. Seng Joo Thio: OnInit - le 3 nuove linee dovrebbero andare prima di tutto.
    Non cercare di usare alcuna funzione relativa al prezzo o al server in OnInit (o al caricamento), perché potrebbe non esserci ancora una connessione/cartografia:
    1. Il terminale si avvia.
    2. Vengono caricati gli indicatori/EA. Le variabili statiche e dichiarate globalmente sono inizializzate. (Non dipendono da un ordine specifico).
    3. OnInit viene chiamato.
    4. Per gli indicatori viene chiamato OnCalculate con qualsiasi storia esistente.
    5. L'uomo potrebbe dover inserire la password, inizia la connessione al server.
    6. Viene ricevuta una nuova cronologia, OnCalculate viene richiamato.
    7. Viene ricevuto un nuovo tick, OnCalculate/OnTick viene chiamato. Ora TickValue, TimeCurrent, informazioni sul conto e prezzi sono validi.

  2. Su MT4: A meno che il grafico corrente sia quella specifica coppia/TF di riferimento, è necessario gestire gli errori 4066/4073prima di accedere ai prezzi.
    Cronologia di download in MQL4 EA - MQL4 e MetaTrader 4 - Forum di programmazione MQL4
    Corretto

    La funzione collegata apre un grafico nascosto per il simbolo/TF in questione (se non è già aperto,) aggiornando così la cronologia, e mettendo temporaneamente il simbolo su Market Watch (se non c'è già,) così SymbolInfoDouble(symbol, SYMBOL_BID ) o MarketInfo(symbol, MODE_BID ) non restituiscono zero anche alla prima chiamata.

 
William Roeder:
  1. Non cercate di usare alcuna funzione relativa al prezzo o al server in OnInit (o al caricamento), poiché potrebbe non esserci ancora una connessione/cartografia:
    1. Il terminale si avvia.
    2. Vengono caricati gli indicatori/EA. Le variabili statiche e dichiarate globalmente sono inizializzate. (Non dipendono da un ordine specifico).
    3. OnInit viene chiamato.
    4. Per gli indicatori viene chiamato OnCalculate con qualsiasi storia esistente.
    5. L'uomo potrebbe dover inserire la password, inizia la connessione al server.
    6. Viene ricevuta una nuova cronologia, OnCalculate viene richiamato.
    7. Viene ricevuto un nuovo tick, OnCalculate/OnTick viene chiamato. Ora TickValue, TimeCurrent, informazioni sul conto e prezzi sono validi.

  2. Su MT4: A meno che il grafico corrente sia quella specifica coppia/TF di riferimento, è necessario gestire gli errori 4066/4073prima di accedere ai prezzi.
    Cronologia di download in MQL4 EA - MQL4 e MetaTrader 4 - Forum di programmazione MQL4
    Corretto

    La funzione collegata apre un grafico nascosto per il simbolo/TF in questione (se non è già aperto,) aggiornando così la cronologia, e mettendo temporaneamente il simbolo su Market Watch (se non c'è già,) in modo che SymbolInfoDouble(symbol, SYMBOL_BID ) o MarketInfo(symbol, MODE_BID ) non restituiscano zero anche alla prima chiamata.

Hai ragione. Non preoccuparti però, perché le uniche cose che facciamo in OnInit, qui, sono inizializzare gli array per memorizzare i nomi dei simboli, e preparare alcuni handle di file per leggere i nostri file di dati. Per quanto riguarda i prezzi di domanda e offerta (cioè i dati di 'tick'), vi accediamo solo in OnTick, e per lo più dai nostri file di dati, poiché MT4 strategy tester restituisce sempre degli zeri quando viene interrogato su tali dati di altri simboli (si noti che questo comportamento differisce dal recupero dei dati OHLC, che le persone hanno più familiarità con).