[VP] Volumi REALI FUTURES e SPOT su MT4: THREAD OPERATIVO

Sezione dedicata a metatrader (ed altre piattaforme) ed al suo linguaggio di programmazione per il trading automatico
Rispondi
pipRaptor

[VP] Volumi REALI FUTURES e SPOT su MT4: THREAD OPERATIVO

Messaggio da pipRaptor »

in questo thread viewtopic.php?t=595 c'è tutta la storia dettagliata di come siamo arrivati, con l'aiuto di molti di voi, ad importare nella metatrader i dati reali dei futures

è però un thread molto lungo e con numerose diramazioni, e il lavoro deve ancora continuare!

così in questo argomento mettiamo invece il primo importante passo: come avere i dati dei futures a disposizione in mql4

primo passo: procurarsi la NinjaTrader illimitata e gratuita

la NinjaTrader è una delle più diffuse e migliore piattaforme per il trading dei futures e altri prodotti, ma è a pagamento o la foniscono con i conti reali per operare su futures & Co. (il conto minimo di solito è qualche K USD...)

cercando in giro, ho trovato 3 broker che la forniscono gratuitamente e senza limiti di utilizzo anche aprendo un conto demo:

ampfutures.com/ninjatrader_cqg.php
https://ninjatrader.com/FreeLiveData
globalfutures.com/platforms/ninjatrader.asp

ad esempio io sto usando questo: globalfutures.com/platforms/ninjatrader.asp e sei già nella pagina della NinjaTrader e in alto centro/sinistra c'è il tasto REQUEST A FREE DEMO, basta seguire tutte le istruzioni, scaricare la NinjaTrader per il data feed CQG e installare tutto

secondo passo: connettersi al conto demo

ti arrivano due mail, una dalla NinjaTrader con la LICENZA da usare e l'altra dal broker con il nome del conto demo e la tua password

appena installata, lanci la NinjaTrader e inserisci la LICENZA che ti hanno inviato, poi dal menù tools in alto -> account connection -> ADD... -> connection name che vuoi, per esempio globalfutures -> Provider CQG -> Connect on startup -> compare la pagina per mettere il nome e la password del tuo conto demo -> seleziona DEMO MODE -> CONFERMA TUTTO

dopo qualche secondo dovresti avere il collegamento VERDE in basso a sinistra e i dati in alto a sinistra con ASK, BID, VOLUMI, ....

terzo passo: caricare il grafico giusto

il grafico che interessa a noi sono gli euro futures con scadenza a marzo 2015, poi ovviamente scorrono con il tempo, comunque noi prendiamo la scadenza più vicina

dal menù in alto FILE -> NEW -> CHART... -> click sul quadratino con i puntini ... -> seleziona il 6E 03 - 15 e hai il grafico che ci interessa

ovviamente qui puoi giocare a piacere con i vari indicatori e le diverse visualizzazioni!

quarto passo, esportare i dati dei futures

scarica il pacchetto DataFutures.zip allegato qui sotto

daI menù in alto della NinjaTrader: FILE -> UTILITIES -> IMPORT NINJASCRIPT -> selezioni il pacchetto che hai scaricato

a questo punto menù TOOLS -> EDIT NINJASCRIPT -> INDICATORS e selezioni DataFutures dall'elenco che compare... e qui comincia il lavoro per i programmatori

il cuore dell'esportazione dei dati è questa funzione, basta sostituire il percorso del file DataFutures.csv e ti ritrovi (finalmente!) tutti i dati dei futures in un file CSV leggibile dalla metatrader

ovviamente è necessario mettere il percorso della cartella FILES della o delle proprie metatrader, attenzione anche alla "sicurezza" di windows, che la cartella sia accessibile in lettura e scrittura dalla NinjaTrader

Codice: Seleziona tutto

		protected override void OnMarketDepth(MarketDepthEventArgs e)
		{
			// Print MarketDepthEventArgs to string
			//Print(e.ToString());
			
			string dataStr = e.MarketDataType + " " + e.Operation + " pos " + e.Position + " price " + e.Price + " vol " + e.Volume;
			string dataCSV = e.MarketDataType + ";" + e.Operation + ";" + e.Position + ";" + e.Price + ";" + e.Volume;
			Print(dataStr);

			try
			{
				StreamWriter sw = File.CreateText(@"C:\Program Files (x86)\MetaTrader - Pepperstone Edge 2\MQL4\Files\DataFutures.csv");
				sw.Write(dataCSV);
				sw.Dispose();
			}
			catch
			{
				Print("Data file busy...");
			}
		}
quinto passo: importare i dati dei futures nella metatrader

scarica l'indicatore DataFutures.mq4 allegato e lancialo su un grafico M5 o M15 della metatrader, sulla sinistra ti compaiono le barre dei contratti reali dei futures ai vari livelli di prezzo

per i programmatori, il cuore che importa i dati dal file CSV è questo

Codice: Seleziona tutto

   int fHandle = FileOpen("DataFutures.csv", FILE_CSV | FILE_READ | FILE_SHARE_READ);

   if (fHandle < 0)
   { 
      Print("ERROR " + IntegerToString(GetLastError()));
   }
   else
   {
      // e.MarketDataType + ";" + e.Operation + ";" + e.Position + ";" + e.Price + ";" + e.Volume;
      // Bid;Update;1;1981.5;237
      string sType   = FileReadString(fHandle);
      string sOp     = FileReadString(fHandle);
      string sPos    = FileReadString(fHandle);
      string sPrice  = FileReadString(fHandle);
      string sVol    = FileReadString(fHandle);
      FileClose(fHandle); 

      Print(sType + " " + sOp + " " + sPos + " price " + sPrice + " vol " + sVol);
   
      int    nPos    = StrToInteger(sPos);
      double dPrice  = StrToDouble (sPrice);
      double dVol    = StrToDouble (sVol);
   }
l'indicatore è solo un esempio, lo vedi qui sotto sulla sinistra, con a destra il corrispondente della NinjaTrader, però non ha ancora nessua applicaziona pratica... il grosso del lavoro viene adesso: utilizzare efficacemente i dati importati!
141218 1200 Futures nella MT4.png
141218 1200 Futures nella MT4.png (105.12 KiB) Visto 4882 volte
Allegati
pipRaptor DataFutures V02.mq4
(4.05 KiB) Scaricato 199 volte
DataFutures.zip
(6.27 KiB) Scaricato 215 volte
Ultima modifica di pipRaptor il 21/12/2014, 12:45, modificato 5 volte in totale.
pipRaptor

Re: Come importare i dati REALI DEI FUTURES nella Metatrader

Messaggio da pipRaptor »

sto continuando nello studio dei dati che fornisce la NinjaTrader, così metto le indicazioni per i programmatori, il TapeReading si ottine con poche righe in C# isolando i dati in posizione 0 del market depth

Codice: Seleziona tutto

		protected override void OnMarketDepth(MarketDepthEventArgs e)
		{
			if (e.Position == 0)
			{
				Print(e.MarketDataType + ": " + e.Price + " vol " + e.Volume);
			}
		}

viene il risultato che si vede in figura, con la corrispondenza tra i prezzi attuali e i contratti ask e bid estratti e visualizzati nella finestra, che scorre appunto come un classico "TapeReading" con i contratti da 100.000 USD

questa è più una base per i programmatori, perché i numeri che scorrono non sono molto leggibili, anche se vedere "qualcuno" che di colpo piazza un sell con 50 contratti da 100.000 = 5.000.000 USD in contanti e senza leva, un certo significato ce l'ha...
141219 1545 Tape Reading.png
141219 1545 Tape Reading.png (117.83 KiB) Visto 4865 volte
pipRaptor

Re: Come importare i dati REALI DEI FUTURES nella Metatrader

Messaggio da pipRaptor »

per chi sta seguendo la programmazione dei dati dei futures, ho trovato come importare nella metatrader anche i contratti realmente chiusi

sono quelli che disegnano i grafici stile marketdelta footprint, come nell'immagine qui sotto

per la NinjaTrader basta mettere questo metodo nell'indicatore, con 3 variabili globali (attenzione alla directory del file CSV che deve essere ovviamente quello della metatrader installata)

Codice: Seleziona tutto

		private int nDelta = 0;
		private double bidPrice;
		private double askPrice;

                ...

		protected override void OnMarketData(MarketDataEventArgs e)
		{
			if (e.MarketDataType == MarketDataType.Ask) 
			{
				askPrice = e.Price;
			}
			else if (e.MarketDataType == MarketDataType.Bid)
			{
				bidPrice = e.Price;
			}
			else if (e.MarketDataType == MarketDataType.Last)
			{
				nDelta++;
				string dataCSV = string.Empty;

				if (e.Price == bidPrice)
				{
					dataCSV = nDelta + ";" + e.Time.ToString("yyyy.MM.dd HH.mm.ss") + ";BID;" + e.Price + ";" + e.Volume;
					Print(e.Time + " last BID " + e.Price + " vol " + e.Volume);
				}
				else if (e.Price == askPrice)
				{
					dataCSV = nDelta + ";" + e.Time.ToString("yyyy.MM.dd HH.mm.ss") + ";ASK;" + e.Price + ";" + e.Volume;
					Print(e.Time + " last ASK " + e.Price + " vol " + e.Volume);
				}
				else
				{
					dataCSV = nDelta + ";" + e.Time.ToString("yyyy.MM.dd HH.mm.ss") + ";NONE;" + e.Price + ";" + e.Volume;
					Print(e.Time + " NONE " + e.Price + " vol " + e.Volume);
				}

				try
				{
					StreamWriter sw = File.AppendText(@"C:\Program Files (x86)\MetaTrader - Pepperstone Edge 2\MQL4\Files\DeltaData.csv");
					sw.WriteLine(dataCSV);
					sw.Dispose();
				}
				catch
				{
					Print("Data file busy...");
				}
			}
		}
mentre nella Metatrader basta questo codice nell'indicatore, viene il print dei dati, poi ovviamente ognuno può usarli come serve

Codice: Seleziona tutto

   int fHandle = FileOpen("DeltaData.csv", FILE_CSV | FILE_READ | FILE_SHARE_READ);

   if (fHandle < 0)
   { 
      Print("ERROR " + IntegerToString(GetLastError()));
   }
   else
   {
      while (!FileIsEnding(fHandle))
      {
         // "BID;" + e.Price + ";" + e.Volume
         // "ASK;" + e.Price + ";" + e.Volume
         // "NONE;" + e.Price + ";" + e.Volume
         // BID;1.2267;1
         string sDelta  = FileReadString(fHandle);
         string sTime  = FileReadString(fHandle);
         string sType  = FileReadString(fHandle);
         string sPrice = FileReadString(fHandle);
         string sVol   = FileReadString(fHandle);
   
         Print(sDelta + " " + sTime + " " + sType + " price " + sPrice + " vol " + sVol);
      }
      
      FileClose (fHandle); 
      FileDelete("DeltaData.csv");
   }
in pratica il DOM riportato nelle colonne a destra si estrae con il OnMarketDepth(MarketDepthEventArgs e) come spiegato nei post più sopra, mentre il volumi dei contratti bid x ask realmente chiusi si trovano nel metodo OnMarketData(MarketDataEventArgs e) con il codice appena visto
141222 1400 MarketDelta.png
141222 1400 MarketDelta.png (69.97 KiB) Visto 4748 volte
ZePeq

Re: Come importare i dati REALI DEI FUTURES nella Metatrader

Messaggio da ZePeq »

Schermata 2014-12-24 alle 03.18.23.png
Schermata 2014-12-24 alle 03.18.23.png (543.02 KiB) Visto 4698 volte
Ok perfetto ho i dati nella meta.
Però il .csv li scrive tutti come BID, ho provato a smanettarci un pò e al massimo me li scrive tutti come ask, penso sia:
if (e.MarketDataType == MarketDataType.Ask)
{
askPrice = e.Price;
}
else if (e.MarketDataType == MarketDataType.Bid)
{
bidPrice = e.Price;
}
o comunque cade sempre nel primo if
pipRaptor

Re: Come importare i dati REALI DEI FUTURES nella Metatrader

Messaggio da pipRaptor »

è corretto, funziona proprio così, ci sono periodi anche molto lunghi in cui prevale l'Ask o viceversa, prova a mettere un semplice contatore che ti visualizza il totale di ask e bid finché, ad esempio, non cambi timeframe

poi confronta i valori con quelli del OFA e vedrai che coincidono, io l'ho provato confrontandolo con il marketdelta footprint e corrisponde tutto

(anzi! adesso che mi ci hai fatto pensare, preparo proprio un indicatore del genere che può essere utile!)
pipRaptor

Re: Come importare i dati REALI DEI FUTURES nella Metatrader

Messaggio da pipRaptor »

ho preparato e allegato l'indicatore per la NinjaTrader, solito pacchetto .zip da importare, che scrive sul file CSV i valori dei contratti ASK e BID, attenzione solo a mettere nel codice la directory corretta della Metatrader

il file dati viene come nell'immagine qui sotto, così è possibile vedere che ASK e BID effettivamente si alternano con periodi di prevalenza di uno sull'altro anche piuttosto lunghi
141224 0910 MarketDelta CSV.png
141224 0910 MarketDelta CSV.png (57.4 KiB) Visto 4685 volte
Allegati
MarketData.zip
(2 KiB) Scaricato 111 volte
ZePeq

Re: Come importare i dati REALI DEI FUTURES nella Metatrader

Messaggio da ZePeq »

Ok ora ci riprovo perchè come vedi confrontandolo con il time&sale della ninja avevo impostato i 2 colori mentre nel .cvs vedevo solo una sfilza di BID, ma erano le 3 di notte :lol:
Ho visto che hai messo una stringa per cancellare il .csv ogni volta mentre io pensavo una cosa differente, dalla ninja salvare i file ogni giorno il file con nome GG.MM.YYYY in modo da salvarci uno storico organizzato (dalla ninja puoi scaricare anche i 5 o + giorni precedenti di storico così se un giorno non ci si collega)

Eventualmente più avanti si può pensare di farlo anche via server in modo che la MT4 si collega e scarica in diretta il .cvs da server (dove girerà la ninja 24/7). Ora vedo anche come organizzare meglio le discussioni in modo da avere un thread operativo per i programmatori, uno dove rilasciamo gli indicatori completi ed uno magari di spunto e di raccolta/organizzazione idee
pipRaptor

Re: Come importare i dati REALI DEI FUTURES nella Metatrader

Messaggio da pipRaptor »

Redbullish ha scritto:Ho visto che hai messo una stringa per cancellare il .csv ogni volta mentre io pensavo una cosa differente, dalla ninja salvare i file ogni giorno il file con nome GG.MM.YYYY in modo da salvarci uno storico organizzato...
giusto!!! ottima idea!

aggiunta:

ecco, per salvare il file .CSV con la data nella forma anno-mese-giorno-nomefile basta questa riga al posto dell'attuale

Codice: Seleziona tutto

StreamWriter sw = File.AppendText(@"C:\Program Files (x86)\MetaTrader - Pepperstone Edge 2\MQL4\Files\" + DateTime.UtcNow.ToString("yyMMdd") + "_MarketData.csv");
ZePeq

Re: [VOLUMES PROJECT] Volumi REALI sulla MT4: THREAD OPERATI

Messaggio da ZePeq »

Ok funziona e mi scrive il .csv con la data (ottimo !!!) però vedo sempre solo BID...vedi il time&sale di fianco che è bid a ask alternati? (ovviamente nell'ordine inverso, li scrive tutti però li segna tutti come BID) non vorrei che dipendesse dal fatto che sono sul forex spot, ora provo a passare sul future...

Aggiornamento: Bene sui futures funziona come dovrebbe! Ora voglio capire come mai non mi fa la stessa cosa sullo SPOT: la funzione OnMarketData prende i valori dal T&S o da dove?
pipRaptor

Re: [VOLUMES PROJECT] Volumi REALI sulla MT4: THREAD OPERATI

Messaggio da pipRaptor »

per la data, conviene mettere nel nome file questo, così il file ha la stessa data dei volumi che contiene

... + e.Time.ToString("yyMMdd") + ...

invece per il BID, non puoi usare i dati del forex, non hanno i contratti REALI e separati tra ASK e BID come i futures, hanno solo il disegno della candela, BID appunto
Rispondi

Chi c’è in linea

Visitano il forum: Nessuno e 1 ospite