[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
pipRaptor

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

Messaggio da pipRaptor » 19/12/2014, 15:19

in questo thread indicatore-contratti-reali-futures-t595-60.html 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:

http://www.ampfutures.com/ninjatrader_cqg.php
http://www.ninjatraderbrokerage.com/fre ... ading_demo
http://www.globalfutures.com/platforms/ninjatrader.asp

ad esempio io sto usando questo: http://www.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
Non hai i permessi necessari per visualizzare i file allegati in questo messaggio.
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 » 19/12/2014, 16:51

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
Non hai i permessi necessari per visualizzare i file allegati in questo messaggio.

pipRaptor

Re: Come importare i dati REALI DEI FUTURES nella Metatrader

Messaggio da pipRaptor » 23/12/2014, 16:18

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
Non hai i permessi necessari per visualizzare i file allegati in questo messaggio.

ZePeq

Re: Come importare i dati REALI DEI FUTURES nella Metatrader

Messaggio da ZePeq » 24/12/2014, 4:10

Schermata 2014-12-24 alle 03.18.23.png
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
Non hai i permessi necessari per visualizzare i file allegati in questo messaggio.

pipRaptor

Re: Come importare i dati REALI DEI FUTURES nella Metatrader

Messaggio da pipRaptor » 24/12/2014, 8:42

è 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 » 24/12/2014, 10:12

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
Non hai i permessi necessari per visualizzare i file allegati in questo messaggio.

ZePeq

Re: Come importare i dati REALI DEI FUTURES nella Metatrader

Messaggio da ZePeq » 24/12/2014, 15:43

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 » 24/12/2014, 15:53

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 » 24/12/2014, 16:22

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 » 24/12/2014, 16:29

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

Chi c’è in linea

Visitano il forum: CC [Bot] e 0 ospiti