Questo pagina è pensata per mettere in condizione chiunque voglia collegare un software di trading, sviluppato personalmente o da terze parti, al flusso informativo e al piattaforma di trading di Directa S.I.M.p.A.
Questo servizio utilizza il metodo classico dei server socket, ovvero la connessione ad una porta tramite il proprio host locale (127.0.0.1). Sono disponibli tre canali:
PORTA | SERVIZIO |
---|---|
10001 | Connessione al DATAFEED |
10002 | Connessione al TRADING |
10003 | Connessione per le CHIAMATE STORICHE |
TRADING
mentre è sottoposto a un canone mensile di 20€ per quanto riguarda il DATAFEED
. Il servizio è sottoposto a controllo da parte di Directa.
Le attuali normative non permettono in alcun caso di accedere ai servizi forniti dalle Borse
senza le opportune credenziali e senza il rispetto di alcune norme disciplinari molto precise.
Per questa ragione Directa non fornisce alcun conto prova per sviluppare applicazioni esterne:
è necessario, prima di tutto, che il programmatore interessato a utilizzare le interfacce
e le API di Darwin sia dotato di un regolare numero di conto presso Directa.
Ricezione del flusso prezzi
Servizio attualmente disponibile
Un programma esterno può connettersi a una specifica porta IP locale di Darwin. Fornendo opportuni comandi di sottoscrizione degli strumenti finanziari desiderati, si ottiene la ricezione in tempo reale delle quotazioni da parte del programma.
TRADING
Servizio disponibile in effettivo
Darwin consente a un programma esterno l'accesso a una seconda porta IP locale, distinta da quella utilizzabile per ricevere il flusso prezzi, attraverso la quale il programma può dare disposizioni operative ai server Directa (ordine, modifica ordine, revoca, etc.) e ricevere informazioni connesse (disponibilità, portafoglio, etc.).
Il plugin Servizio Prezzi (SP) consente all'utente di esportare i dati dalla piattaforma Darwin verso l'esterno della piattaforma stessa.
Il metodo utilizzato è quello classico classico del server socket in attesa su una o più porte locali.
Aprendo la Darwin ci saranno a disposizione 3 porte, nel dettaglio la porta 10001 per la ricezione DataFeed, la 10002 per il Trading
e la 10003 per le chiamate storiche, le porte sono aperte localmente(localhost o 127.0.0.1 a seconda del sistema operativo)
e sono a disposizione fino a che la Darwin rimarrà aperta, possono gestire una o più connessioni da parte del client.
Nella sezione TUTORIAL sono a disposizione degli esempi di connessione al servizio.
Avvenuta la connessione alla porta/e, è possibile ricevere i dati richiesti tramite i comandi predisposti per il servizio.
I messaggi, siano essi di sottoscrizione (clien t--> Darwin) o di ricezione (Darwin --> client) sono in formato
stringa (UTF-8) e terminati dal carattere di NEWLINE (in funzione del sistema operativo).
Per inviare/ricevere messaggi è sufficiente quindi rispettivamente utilizzare una writeline o una readline
(istruzione presente nella maggior parte dei linguaggi di programmazione).
Il plugin sottoscrive in automatico sul sistema Darwin i titoli che vengono richiesti.
Qualora si tentasse di sottoscrivere più volte lo stesso titolo verrebbe restituito un errore e in maniera analoga si ottiene un
errore se si tenta di desottoscrivere un titolo non sottoscritto.
Il numero massimo di titoli sottoscrivibili è quello fissato dalla piattaforma Darwin (attualemente fissa a 100).
NB
È molto importante sottolineare come la connessione al server di trading è unica, se vengono utilizzare le stesse crendenziali
su un'altra postazione o dispositivo il modulo trading non sarà più connesso.
Se l'utente è abilitato alle API, il servizio viene avviato automaticamente con la piattaforma trading Darwin; in caso contrario il servizio non sarà disponibile.
Il servizio apre tre Socket server TCP/IP (uno per l'informativa, uno per il trading e uno per le chiamate storiche) in ascolto sulle porte configurate (di default rispettivamente 10001, 10002 e 10003) e attende i messaggi provenienti dal client.
È possibile aprire più connessioni sullo stesso socket. Il plugin gestirà in automatico l'inoltro dei messaggi al client che ne ha fatto richiesta.
Il segnale di vita è utilizzato per mantenere attiva la connessione. Infatti, in presenza di connessioni scadenti, il socket potrebbe essere chiuso inaspettatamente.
Per evitare questo comportamento il servizio prezzi prevede l'invio di un pacchetto "Heartbeat" costituito dal carattere H (codice Ascii 72).
Ovviamente è cura dello sviluppatore gestire in base alle esigenze il segnale HeartBeat.
La connessione al socket invia in automatico il segnale di vita ogni 10 secondi.
Formato del Messaggio di Heartbeat:
H\NEWLINE
DATAFEED
TRADING
CHIAMATE STORICHE
DATAFEED
TRADING
CHIAMATE STORICHE
DATAFEED
, la risposta sarà di questo tipo:
È possibile richiedere informazioni attaverso le nostre API trading circa la situazione del portafoglio eseguendo alcuni comandi specifici sul canale di trading.
<CODICE COMANDO>\n
I possibili valori per <CODICE COMANDO> sono i seguenti:
COMANDO | FLUSSO | AZIONE |
---|---|---|
INFOSTOCKS | TRADING |
Elenco azioni in portafoglio e in negoziazione |
INFOAVAILABILITY | TRADING |
Situazione liquidità portafoglio |
DARWINSTATUS | ALL |
Restituisce le informazioni di versione e lo stato della connessione |
GETPOSITION | TRADING |
Restituisce informazioni sulla posizione di un singolo strumento nello stesso formato del comando INFOSTOCKS |
GETPOSITION | TRADING |
Restituisce informazioni sulla posizione di un singolo strumento nello stesso formato del comando INFOSTOCKS |
INFOACCOUNT | TRADING |
Restituisce informazioni sullo stato patrimoniale del conto |
ORDERLIST | TRADING |
Restituisce l'elenco degli ordini della giornata(sono compresi anche i multiday) |
TABLELIST | ALL |
Restituisce le tabelle impostate sul proprio conto |
TABLE | ALL |
Restituisce l'elenco dei tickers presenti in una determinata tabella |
Riscontrando che la lista ordini può diventare molto folta a causa delle operazioni che si possono effettuare, abbiamo creato dei comandi che permettono l'accesso a delle liste oridni filtrate. I due nuovi comandi a disposizione sono:
NB
nell'ambito della creazione di questi comandi abbiamo deciso, per non appesantire la connessione iniziale al trading, che se la lista ordini è maggiore o uguale a 100
la lista ordini sarà l'equivalente del comando ORDERLISTNOREV, così da avere come dettaglio iniziale gli ordini eseguiti ed eventuai pending, non ci fossero pending o eseguiti ma la lista revocati supera i 100 verrà mandato un codice errore 1019
ma in realtà la lista non è vuota. Ovviamente la consultazione della ORDERLIST nativa, comprendente tutti gli ordini è sempre garantita. Questa gestione del limite 100 è
solamente in funzione all'atto della connessione del socket Trading.
Il servizio prezzi invia al client i messaggi informativi sul socket di trading sotto forma di stringa, terminati dal carattere NEWLINE (ASCII 10 \n).
Il formato generico del messaggio è il seguente:
<TIPO_MESSAGGIO> ; <TICKER> ; <ORA HH:MM:SS>;<DATI...> \n
I possibili valori per <TIPO MESSAGGIO> sono i seguenti:
CODICE | FLUSSO | SIGNIFICATO |
---|---|---|
STOCK | TRADING |
Informazioni di portafoglio (azioni in carico e in negoziazione) |
AVAILABILITY | TRADING |
Liquidità portafoglio (con e senza marginatura) |
DARWIN_STATUS | ALL |
Stringa con informazioni sulla connessione e versione |
INFOACCOUNT | TRADING |
Informazioni sullo stato del conto |
ORDER | TRADING |
Elenco ordini |
NB
Il flusso STOCK è scatenato dai comandi:NB
Indicazioni per il campo <QUANTITÀ IN NEGOZIAZIONE>
VALORE | SIGNIFICATO |
---|---|
TRUE | utenza abilitata al datafeed |
FALSE | utenza non abilitata al datafeed |
CODICE | SIGNIFICATO |
---|---|
CONN_UNAVAILABLE | Connessione non attiva |
CONN_SLOW | Connessione lenta |
CONN_OK | Connessione attiva |
CONN_TROUBLE | Connessione con problemi |
NB
L'orario del flusso ORDER indica l'ora esatta dell'immissione dell'ordine, nel caso ci fossero dei problemi con il reperimento dell'orario verrà messo il dettaglio 00:00:00.
CODICE | SIGNIFICATO |
---|---|
2000 | In negoziazione |
2001 | Errore immissione |
2002 | In negoziazione dopo conferma ricevuta |
2003 | Eseguito |
2004 | Revocato |
2005 | In attesa di conferma |
NB
Il flusso ORDER è scatenato dal comando ORDERLIST che restituisce l'elenco degli ordini (tutti).NB
: Per porter sfruttare il comando TABLE <nome_tabella> è sempre necessario prima richiamare il comando TABLELIST in modo che il sistema riesca ad inizializzare tutte le informazioni relative alle proprie tabelle.
Di seguito i codici comunicati al client in casso di messaggio ERR:
CODICE | NOME | DESCRIZIONE | FLUSSO |
---|---|---|---|
0 | ERR_UNKNOWN | Errore generico | Tutti i flussi |
1000 | ERR_MAX_SUBSCRIPTION_OVERFLOW | Limite massimo di titoli sottoscritti raggiunto | DATAFEED |
1001 | ERR_ALREADY_SUBSCRIBED | Titolo richiesto già sottoscritto | DATAFEED |
1002 | ERR_EMPTY_LIST | Nessun titolo inviato nel comando | DATAFEED |
1003 | ERR_UNKNOWN_COMMAND | Comando sconosciuto | Tutti i flussi |
1004 | ERR_COMMAND_NOT_EXECUTED | Comando non eseguito | Tutti i flussi |
1005 | ERR_NOT_SUBSCRIBED | Errore sottoscrizione | DATAFEED |
1006 | ERR_DARWIN_STOP | Chiusura Darwin in corso | Tutti i flussi |
1007 | ERR_BAD_SUBSCRIPTION | Errore titolo inesistente | Tutti i flussi |
1008 | ERR_DATA_UNAVAILABLE | Flusso richiesto non disponibile | DATAFEED |
1009 | ERR_TRADING_CMD_INCOMPLETE | Comando trading non completo | TRADING |
1010 | ERR_TRADING_CMD_ERROR | Comando trading errato | TRADING |
1011 | ERR_TRADING_UNAVAILABLE | Trading non abilitato | TRADING |
1012 | ERR_TRADING_REQUEST_ERROR | Errore immissione ordine | TRADING |
1013 | ERR_HISTORYCALL_PARAMS | Errore numero paramentri nel comando | CHIAMATE STORICHE |
1015 | ERR_HISTORYCALL_RANGE_INTRADAY | Errore range per chiamate intraday, con dettaglio massimo range disponibile per l'intraday | CHIAMATE STORICHE |
1016 | ERR_HISTORYCALL_DAY_OR_RANGE | Errore nei giorni o nel range date nel comando inviato | CHIAMATE STORICHE |
1018 | ERR_EMPTY_STOCKLIST | Nessuno strumento nel portafoglio | TRADING |
1019 | ERR_EMPTY_ORDERLIST | Nessun ordine presente | TRADING |
1020 | ERR_DUPLICATED_ID | ID Ordine duplicato | TRADING |
1021 | ERR_INVALID_ORDER_STATE | Stato ordine incongruente con l'operazione richiesta | TRADING |
1024 | ERR_TRADING_PUSH_DISCONNECTED | Sengala la disconnessione del trading | TRADING |
1025 | ERR_TRADING_PUSH_RECONNECTION_OK | Sengale di riconnessione | TRADING |
1026 | ERR_TRADING_PUSH_RELOAD | Segnala il reload del trading | TRADING |
1027 | ERR_DATAFEED_DISCONNECTED | Segnala la disconessione del datafeed | DATAFEED |
1028 | ERR_DATAFEED_RELOAD | Segnala il reload del datafeed | DATAFEED |
1030 | ERR_MARKET_UNAVAILABLE | Mercato non abilitato per il ticker richiesto | DATAFEED |
1031 | CONTATTO_NON_ATTIVO | Contatto verso il nostro server di trading scuduto, necessario riavviare l'applicazione per fare operazioni di trading | TRADING |
1032 | DATAFEED NON ABILITATO | quotazioni non abilitate | DATAFEED |
COMANDI DI SOTTOSCRIZIONE/DESOTTOSCRIZIONE
NB
È bene ricordare che, indipendentemente dal numero di connessioni che si stabiliscono con la porta 10001, il limite massimo di titoli sottoscrivibili da Darwin è al momento pari a 100.
CODICE | FLUSSO | PORTA | TIPO | DATI |
---|---|---|---|---|
SUB | DATAFEED |
10001 | Sottoscrizione standard | Eseguiti + Book 5 livelli |
SUBALL | DATAFFED |
10001 | Tutti i flussi | Eseguiti + Book 5 livelli + Bidask |
SUBPRZ | DATAFEED |
10001 | Solo Prezzi | Eseguiti |
SUBPRZALL | DATAFEED |
10001 | Prezzi e Bidask | Eseguiti + Bidask |
SUB10 | DATAFEED |
10001 | Tutti i flussi | Eseguiti + Book 5 livelli + Book 10 livelli + Bidask |
SUB15 | DATAFEED |
10001 | Tutti i flussi | Eseguiti + Book 5 livelli + Book 10 livelli + Book 15 livelli + Bidask |
SUB20 | DATAFEED |
10001 | Tutti i flussi | Eseguiti + Book 5 livelli + Book 10 livelli + Book 15 livelli + Book 20 livelli + Bidask |
CODICE | TIPO | PORTA | DATI |
---|---|---|---|
UNS | Desottoscrizione | 10001 | Tutti i flussi |
NB
: I codici di sottoscrizione/desottoscrizione sono case sensitive; non è possibile cambiare il tipo di sottoscrizione per un titolo. È necessario desottoscrivere il titolo e risottoscriverlo con il codice desiderato.
FORMATO DEI MESSAGGI
CODICE | FLUSSO | DESCRIZIONE |
---|---|---|
ANAG | DATAFEED |
Informazioni anagrafiche |
PRICE | DATAFEED |
Eseguito |
PRICE_AUCT | DATAFEED |
Eseguito Asta (tutte le aste) |
BOOK_5 | DATAFEED |
Book livelli da 1 a 5 |
BOOK_10 | DATAFEED |
Book livelli da 6 a 10 |
BOOK_15 | DATAFEED |
Book livelli da 11 a 15 |
BOOK_20 | DATAFEED |
Book livelli da 16 a 20 |
BIDASK | DATAFEED |
Bid/ask |
Formato messaggio BIDASK
NB
: Il dato relativo al numero di PROPOSTE potrebbe non essere disponibile in funzione del mercatoCHIAMATE STORICHE
e utilizzare i Ticker presenti nell'elenco indicato in precedenza.
NB
Per le chiamate storiche è necessario utilizzare i ticker degli indici in Maiuscolo digitato in maniera diversa il ticker non verrà riconosciuto.
È possibile gestire il dettaglio di LOG inviando alcuni comandi specifici sul canale dei prezzi.
<CODICE COMANDO> {<OPZIONI>}\n
I possibili valori per <CODICE COMANDO> sono i seguenti:
CODICE | FLUSSO | AZIONE |
---|---|---|
ENABLELOG | DATAFEED |
Abilita il LOG al massimo dettaglio. |
DISABLELOG | DATAFEED |
Disabilita il LOG. Verranno tracciati solo i messaggi importanti e gli errori |
Il servizio prezzi invia al client i messaggi diagnostici sul socket dei prezzi sotto forma di stringa, terminati dal carattere NEWLINE (ASCII 10 \n).
Il formato generico del messaggio è il seguente:
<TIPO_MESSAGGIO>\n
I possibili valori per <TIPO MESSAGGIO> sono i seguenti:
CODICE | SIGNIFICATO |
---|---|
LOG_ENABLED | Il LOG al massimo dettaglio è stato abilitato. |
LOG_DISABLED | Il LOG al massimo dettaglio è stato disabilitato. |
Per effettuare operazioni di trading è necessario inviare al servizio un messaggio nel seguente formato:
<CODICE COMANDO> {<ID_ORDINE>},{<TICKER>,<QUANTITA'>},{<PREZZO>}\n
Il sistema trading può richiedere la conferma dell'ordine al client. In caso di richiesta conferma è necessario rispondere con apposito comando di conferma e <ID_ORDINE> corrispondente.
<ID_ORDINE> deve essere generato dal client ed essere univoco per la sessione corrente di connessione al socket.
NB
Tuttel le informazioni utili sui tipi di ordini possibli con Directa sono documentato sul nostro sito commerciale clicca qui
I possibili valori per <CODICE AZIONE> sono i seguenti:
CODICE | FLUSSO | AZIONE |
---|---|---|
ACQAZ | TRADING |
Acquista strumento finanziario al prezzo limite indicato |
VENAZ | TRADING |
Vendi strumento finanziario al prezzo limite indicato |
ACQMARK/ACQMARKET | TRADING |
Acquista strumento finanziario senza limite di prezzo |
VENMARK/VENMARKET | TRADING |
Vendi strumento finanziario senza limite di prezzo |
ACQSTOP | TRADING |
Acquista strumento finanziario con ordine stop market |
VENSTOP | TRADING |
Vendi strumento finanziario con ordine stop market |
ACQSTOPLIMIT | TRADING |
Acquista strumento finanziario con prz. limite e prz.segnale |
VENSTOPLIMIT | TRADING |
Vendi strumento finanziario con prz. limite e prz.segnale |
REVORD | TRADING |
Revoca strumento finanziario specificato |
REVALL | TRADING |
Revoca tutti gli ordini per il ticker specificato |
CONFORD | TRADING |
Conferma l'ordine specificato |
MODORD | TRADING |
Modifica prezzo per l'ordine specificato |
Per le informazioni relative alla validità degli ordini fare riferimento alla tabella all'interno
dell'
Help Trading Online | Validità degli ordini condizionati del sito commerciale directa.it
REVALL STLAM\n
N.B La REVALL è valida solamente per gli ordini normali e non per quelli stop o stopLimit, dove è necessario
eseguire una revoca puntuale
dell'ordine tramite REVORD <id_ordine>,
in quanto è lo stesso comportamento della Darwin.
https://www1.directatrading.com
Il servizio prezzi invia al client il risultato delle operazioni di trading sotto forma di stringa, terminati dal carattere NEWLINE (ASCII 10 \n).
Il formato generico del messaggio è il seguente:
<TIPO_MESSAGGIO> ; <TICKER> ; <ID_ORDINE> ; <CODICE> ; <COMANDO INVIATO> ; <QUANTITÀ RICHIESTA|QUANTITÀ ESEGUITA> ; <PREZZO IMMISSIONE> ; <DESCRIZIONE ERRORE>\n
I possibili valori per <TIPO MESSAGGIO> sono i seguenti:
CODICE | FLUSSO | SIGNIFICATO |
---|---|---|
TRADOK | TRADING |
Esito positivo operazione (IMMISSIONE, ESEGUITO, REVOCA) |
TRADERR | TRADING |
Esito negativo |
TRADCONFIRM | TRADING |
È richiesta conferma dell'ordine da parte del client |
CODICE | SIGNIFICATO |
---|---|
3000 | Immissione ordine avvenuta correttamente |
3001 | Ordine eseguito |
3002 | Ordine revocato |
3003 | Richiesta conferma ordine - presente solamente nella risposta TRADCONFIRM |
TRADING
A seguito di numeroso proposte abbiamo cercato di creare dei comandi per ampliare il set d'informazioni reperibili dalle API.
Al momento è stata data particolare attenzione all'ampliamento delle informazioni relative al trading.
E' stato scelto, per non intaccare Trading System attualmente in uso, di creare dei comandi attivabili e disattivabili per accedere alle nuove funzionabilità.
Di seguito i comandi disponibili:
COMANDO | SIGNIFICATO | VALORE | DEFAULT |
---|---|---|---|
FLOWPOINT | Marcatori inizio fine flusso pacchetti ORDER e STOCKS | FALSE / TRUE | FALSE |
UPDATEORDER | Possibilità all'invio dell'ordine di ricevere aggiornamenti senza inviare comandi specifici | FALSE / TRUE | FALSE |
PRICEEXE | Aggiunta campi relativi al prezzo eseguito, quantità e id_ordine relativi ai pacchetti TRADOK e ORDER. Utile per avere informazioni maggiori sui vari ordini e soprattuto per la gestione degli ordini parzialmente eseguiti. |
FALSE / TRUE | FALSE |
LOGCMD | Aggiunta in fondo ai pacchetti TRADOK e TRADERR del comando che ha generato il pacchetto | FALSE / TRUE | FALSE |
POINTUPDATEORDER | Un nuovo modo per aver un aggiornamento automatico sulla propria situazione a fronte di operazione trading. | FALSE / TRUE | FALSE |
AUTOREC | Metodo automatico per riconnettere la connessione trading a causa di cadute | FALSE / TRUE | FALSE |
COMANDO FLOWPOINT
COMANDO UPDATEORDER
OPERAZIONE | DESCRIZIONE |
---|---|
IMMISSIONE ORDINE | Oltre al pacchetto TRADOK (con codice 3000) verrà inviato il pacchetto ORDER relativo all'ordine immesso e le informazioni sullo stato patrimoniale del conto pacchetto INFOACCOUNT |
ORDINE MODIFICATO | Oltre al pacchetto TRADOK (con codice 3000) verrà inviato il pacchetto ORDER relativo all'ordine modificato, la STOCK relativa allo strumento , il dettaglio del comando AVAILABILITY-Liquidità portafoglio (con e senza marginatura) e e le informazioni sullo stato patrimoniale del conto pacchetto INFOACCOUNT( questo appararirà due volte essendo stata fatta una modifica ). |
ORDINE ESEGUITO | Quando un ordine va eseguito arriva dettaglio TRADOK (con codice 3001) e in aggiunta il dettaglio dell'ordine tramite il pacchetto ORDER, la STOCK relativa allo strumento , il dettaglio AVAILABILITY-Liquidità portafoglio (con e senza marginatura) e le informazioni sullo stato patrimoniale del conto pacchetto INFOACCOUNT |
ORDINE REVOCATO | Oltre al pacchetto TRADOK (con dettaglio 3002) in aggiunta ci sarà il pacchetto STOCK relativo allo strumento , il dettaglio AVAILABILITY-Liquidità portafoglio (con e senza marginatura) e le informazioni sullo stato patrimoniale del conto pacchetto INFOACCOUNT |
COMANDO PRICEEXE
NB
i campi saranno aggiunti di seguito nell'ordine in cui sono descritti, gli altri campi saranno nello stesso ordine originale senza l'attivazione del comando PRICEEXE.COMANDO LOGCMD
COMANDO POINTUPDATEORDER
NB
I campi sono inizializzati tutti con una U per evidenziare il fatto che quel campo è relativo all'aggiornamento e per evitare confusioni rispetto agli altri campi.2006
;0.0;0.0;0;S4216523407947NB
attivando questo comando gli ordini modificati avranno come dettaglio per lo stato ordine il valore 2006
, questo e' stato richiesto per avere un dettaglio
di diversità rispetto ai codici 2000/2002 standard, questo codice avrà effetto anche sul comando ORDERLIST, se il comando verrà
disattivato il dettaglio 2006 non sarà più disponibile e si tornerà alla codifica di default(2000/2002).
NB
Consigliamo per non incorrere in errori di tenere attivato solamente un metodo di aggiornamento, quindi o il comando UPDATEORDER o il comando POINTUPDATEORDER. Nel caso si attivassero tutti e due il comando POINTUPDATEORDER avrà priorità maggiore e nel caso uno venga disattivato verranno disattivati entrambi, questo per non rischiare di dare degli update non precisi.
COMANDO AUTOREC
(attualmente in fase di test)TIME FRAME | PROFONFDITÀ MASSIMA(storico massimo diponibile) |
---|---|
1 e 5 secondi | Limite massimo 1 giorno |
10 e 30 secondi | Limite massimo 3 giorni |
1, 2, 3 e 4 minuti | Limite massimo 100 giorni |
END OF DAY | Fino a 15 anni |
TBT
Per abilitare la connessione è necessario usare una connessione tramite socket sulla porta 10003.
Si possono usare quattro comandi, TBT(Uso 1) TBTRANGE(Uso 2) CANDLE(Uso 3) e CANDLERANGE(Uso 4).
Per usare i comandi è necessario inserire uno spazio tra un argomento e l‘altro.
I comandi di tipo Uso 1 e Uso 2 sono relativi alle chiamate storiche di tipo TickByTick
mentre i comandi Uso 3 e Uso 4 sono specifici per le Candele.
Uso 1:
TBT titolo numero_giorni
titolo: codice del titolo
numero_giorni: il numero di giorni da richiedere (incluso oggi)
TBTRANGE titolo data_ora_inizio data_ora_fine
titolo: codice del titolo
data_ora_inizio: data iniziale del range, il formato sarà del tipo yyyyMMddHHmmss
data_ora_fine: data finale del range, il formato sarà del tipo yyyMMddHHmmss
CANDLE titolo numero_giorni periodo_candela
titolo: il codice del titolo
numero_giorni: il numero dei giorni (incluso oggi)
periodo_candela: il periodo in secondi per la rappresentazione della candela.
CANDLERANGE titolo data_ora_inizio data_ora_fine periodo_candela
titolo: il codice del titolo
data_ora_inizio: data iniziale del range, il formato sarà del tipo yyyyMMddHHmmss
data_ora_fine: data finale del range, il formato sarà del tipo yyyMMddHHmmss
periodo_candela: il periodo in secondi per la rappresentazione della candela.
IMPOSTAZIONE DEL DETTAGLIO DEI VOLUMI DURANTE LA FASE DI AFTERHOURS
Descrizione per il comando VOLUMEAFTERHOURS
Comando per settare il dettaglio dei volumi durante la fase di AFTERHOURS(AH), per i titoli che fanno AH.
Di default in fase di AH il servizio risponde al dettaglio dei volumi con la somma dei volumi della continua più i volumi dell'AH.
Se si volesse cambiare questo dettaglio è a disposzione il comando:
VOLUMEAFTERHOURS
Può essere utilizzato in due diversi modi:
Solamente digitando il comando VOLUMEAFTERHOURS il quale come risposta ci dirà come è impostata la scelta.
le scelte sono le seguenti:
PARAMETRO | DESCRIZIONE |
---|---|
CNT | dettaglio volumi fase continua |
AH | dettaglio volumi fase afterhours |
CNT+AH | somma dei volumi continua+afterhours |
Esempi per avere l'informativa del settaggio: digitando VOLUMEAFTERHOURS si possono avere 3 tipi di risposte:
VOLUME_AFTERHOURS CNT+AH impostazione di default indica la somma dei volumi in continua con i volumi AH |
VOLUME_AFTERHOURS AH impostazione che indica che verranno visualizzati i volumi in AH |
VOLUME_AFTERHOURS CNT impostazione che indica che verranno visualizzati i volumi in continua |
Esempi per il cambio del settaggio del dettaglio volumi:
Settaggio per i volumi CNT+AH
comando: VOLUME_AFTERHOURS CNT+AH risposta: VOLUME_AFTERHOURS CNT+AH, indica che il settaggio a CNT+AH è stato eseguito |
Settaggio per i volumi CNT
comando: VOLUME_AFTERHOURS CNT risposta: VOLUME_AFTERHOURS CNT, indica che il settaggio a CNT è stato eseguito |
Settaggio per i volumi AH
comando: VOLUME_AFTERHOURS AH risposta: VOLUME_AFTERHOURS AH, indica che il settaggio a AH è stato eseguito |
Esempio per l'utilizzo del comando VOLUMEAFTERHOURS:
in questo esempio sono evidenziate con TX i comandi inviati mentre con RX le risposte.
17:58:50 TX Connection socket localhost port:100003
17:58:52 RX DARWIN_STATUS;CONN_OK;TRUE;Release 1.2.1 build 01/08/2020 14:10:00 more info...
18:00:11 TX VOLUMEAFTERHOURS
18:00:12 RX VOLUME_AFTERHOURS CNT+AH
18:00:23 TX CANDLE STLAM 1 86400
18:00:23 RX BEGIN CANDLES
18:00:33 RX CANDLE;STLAM;20141106;09:00:00;8.82500;8.80000;9.01500;8.85000;11597547
18:00:33 RX END CANDLES
18:00:41 TX VOLUMEAFTERHOURS CNT
18:00:41 RX VOLUME_AFTERHOURS CNT
18:00:47 TX CANDLE STLAM 1 86400
18:00:47 RX BEGIN CANDLES
18:00:57 RX CANDLE;STLAM;20141106;09:00:00;8.84500;8.80000;9.01500;8.85000;11597147
18:00:57 RX END CANDLES
18:01:02 TX VOLUMEAFTERHOURS AH
18:01:02 RX VOLUME_AFTERHOURS AH
18:01:29 TX CANDLE STLAM 1 86400
18:01:29 RX BEGIN CANDLES
18:01:39 RX CANDLE;STLAM;20141106;09:00:00;8.82500;8.80000;9.01500;8.85000;400
18:01:39 RX END CANDLES
18:01:57 TX VOLUMEAFTERHOURS CNT
18:01:57 RX VOLUME_AFTERHOURS CNT
18:02:01 TX CANDLE STLAM 1 86400
18:02:01 RX BEGIN CANDLES
18:02:11 RX CANDLE;STLAM;20141106;09:00:00;8.84500;8.80000;9.01500;8.85000;11597147
18:02:11 RX END CANDLES
18:02:38 TX VOLUMEAFTERHOURS CNT+AH
18:02:38 RX VOLUME_AFTERHOURS CNT+AH
18:02:43 TX CANDLE STLAM 1 86400
18:02:43 RX BEGIN CANDLES
18:02:53 RX CANDLE;STLAM;20141106;09:00:00;8.82500;8.80000;9.01500;8.85000;11597547
18:02:53 RX END CANDLES
I volumi sono evidenziati in grassetto e si può notare come il dettaglio cambia in base al nostro settaggio,
NB: al termine della connessione si ritornerà nella situazione di default (CNT+AH)
In questa sezione sono riportati degli esempi di risposta dopo aver fatto un comando per le chiamate storiche, gli esempi sono relativi ai quattro tipi di comandi disponibili.
1.83 - 13/07/2020
.13/07/2020 aggiornamento per acquisizione 100 giorni dati intraday
11/02/2020 uniformato aggregazione dati storici per composizione candele - allegerimento file di log
27/04/2018 Corretto freeze momentaneo su revoca ordine
21/07/2017 Migliorate le exit strategy, indicazione prezzo per ordini a mercato
09/02/2017 Migliorata gestione chiamate storiche fuori range
13/01/2017 Gestione lettura file migliorata per utilizzo con DarwinCommandLine
14/11/2016 Risolta problematica volumi per grafici con compressione 1Day
04/07/2016 Ultimo rilascio disponibile plugin Multicharts
Per utilizzare il nuovo DCL.jar serviranno pochissimi passaggi:
1) Scaricare il file DCL.jar
2)Lanciarlo da riga di comando: java -jar DCL.jar codiceUtente password
3)Una volta lanciato il DCL.jar si occuperà ogni volta di aggiornare le risorse necessarie che verranno
salvate nella propria cartella Utente sotto la cartella .directa/engine.
Il file DCL.jar può essere lanciato anche sul nostro ambiente di test richiamando il .jar in questo modo:
-jar DCL.jar codiceUtente password -test
Il DCL.jar è stato già pensato per Multicharts, quindi non è necessario specificare nulla nei parametri per la compatibilità con il plugin Multicharts.
Se vi è necessità di non mettere la password in chiaro come parametro, il DCL.jar può essere fatto partire
da un file sul proprio pc, ovvero l'unico parametro sarà il percorso del file dove sarà necessario scrivere le credenziali,
in questo modo: codiceUtente;password (questa modalità non supporta però la partenza in ambiente test).
11/02/2020 IdOrdine mantenuto anche su socket diversi
12/11/2018 IdOrdine viene salvato e mantenuto in tutte le sessioni.
26/07/2018 Miglioramenti gestione file per utilizzo con Multicharts
08/06/2018 IdOrdine valido per un'intera sessione DCL
17/05/2018 Aggiornamento generale
05/01/2018 Inserimento codice errore 1031 per informazione contattatto non attivo
21/07/2017 Rivista gestione autoriconessione par il modulo trading
07/06/2017 Migliorata gestione dell'autorec per la connessione ai prezzi
27/03/2017 Allineamento migliorato tra BidAsk e Book5 - prezzo ordine modificato - gestione timezone
09/03/2017 Aggiornamento certificato - gestione timezone flusso prezzi
19/01/2017 (In fase di test) Comando AUTOREC attivabile anche per il datafeed
04/07/2016 Primo rilascio della versione Beta
28/12/2022 Il progetto non sarà ulteriormente sviluppato, ma solo manutenuto
13/02/2018 Corretto gestione pacchetti in asta e aggiunto ribbon Directa
05/01/2018 Aggiunto formula anag per ricevere l'anagrafica del titolo
17/04/2017 Cambiata la gestione dell'id ordine non più progressivo ma tramite timestamp
29/07/2016 Primo rilascio della versione Beta
liberi
liberi
,
selezionando il relativo checkbox.
Inserendo il comando e cliccando SEND CMD le risposte/a verranno visualizzate nella Textarea dedicata,
le righe in blu con dettaglio TX sono i comandi inviati mentre quelle nere con dettaglio RX sono le risposte.
Il contenuto della TextBox è scritto esattamente sul socket ed inviata in Upstream.
Cliccando CLEAR CMD viene cancellato il contenuto della textbox.
17:02:11 TX Connection socket localhost port:10003
17:02:12 RX DARWIN_STATUS;CONN_OK;TRUE;Release 1.2.1 build 01/08/2020...
17:02:33 TX CANDLE STLAM 1 3600
17:02:39 RX BEGIN CANDLES
17:02:39 RX CANDLE;STLAM;20150707;09:00:00;13.00000;12.77000;13.04000;12.94000;3574235
17:02:39 RX CANDLE;STLAM;20150707;10:00:00;12.99000;12.88000;13.00000;13.00000;1445758
17:02:39 RX CANDLE;STLAM;20150707;11:00:00;12.92000;12.91000;13.00000;12.98000;924531
17:02:39 RX CANDLE;STLAM;20150707;12:00:00;12.81000;12.79000;12.93000;12.92000;1012106
17:02:39 RX CANDLE;STLAM;20150707;13:00:00;12.78000;12.74000;12.86000;12.81000;644852
17:02:39 RX CANDLE;STLAM;20150707;14:00:00;12.75000;12.74000;12.85000;12.78000;571338
17:02:39 RX CANDLE;STLAM;20150707;15:00:00;12.75000;12.67000;12.82000;12.74000;1457200
17:02:39 RX CANDLE;STLAM;20150707;16:00:00;12.60000;12.44000;12.81000;12.76000;2255510
17:02:39 RX CANDLE;STLAM;20150707;17:00:00;12.57000;12.57000;12.59000;12.59000;70532
17:02:39 RX END CANDLES
Close Socket port:10003
NB
Le righe blu e rosse non fanno parte della risposta dei socket.DataFeed
è utilizzato per simulare i comandi relativi al flusso prezzi.DataFeed
sono:DataFeed
.
Trading
vuole essere un esempio per l'operatività tramite API.NB
Il TAB è completamente operativo, quindi è necessario fare attenzione a mandare ordini.NB
Questi esempi sono stati volutamente composti per NON essere operativi, ticker non esistenti o prezzi molto fuori mercato, per evitare invio ordini non voluti.
Trading
.
liberi
sarà possibile inviare anche comandi CANDLE,
in ogni caso è possibile tenere attivi tutti i due TAB essendo possibile avere connessioni multiple.
Ci sono delle sezioni da attivare tramite checkbox per usufruire dei vari comandi. In dettaglio:Chiamate Storiche
.
liberi
sarà possibile inviare anche comandi TBT,
in ogni caso è possibile tenere attivi tutti i due TAB essendo possibile avere connessioni multiple.
Ci sono delle sezioni da attivare tramite checkbox per usufruire dei vari comandi. In dettaglio:Chiamate Storiche
.
È possibile, una volta avviato Darwin, testare se il servizio Prezzi è correttamente funzionante. È sufficiente collegarsi sul pc localmente utilizzando la funzione TELNET sulla porta del servizio (default 10001).
È possibile utilizzare il comando TELNET per tutte le porte definite ovvero la 10001 (DataFeed) 10002 (Trading) e 10003 (Chiamate storiche).
Una volta connessi digitare il comando e premere invio (corrisponde al carattere NEWLINE \n ascii 10). Il sistema inizierà ad inviare i dati.
Il comando da digitare per verificare la connessione è : telnet localhost -porta-
Di seguito un esempio su sistema OSX:
MacBook-Pro:~$ telnet localhost 10001
Trying ::1...
Connected to localhost.
Escape character is '^]'.
H
SUBALL STLAM
ANAG;STLAM;16:41:21;NL0010877643;STLAM;6.875;6.88;1202181255
PRICE;STLAM;16:41:11;6.8;228;18979588;10726;6.57;6.93
BIDASK;STLAM;16:41:21;14381;0;6.795;5458;0;6.805
BOOK_5;STLAM;16:41:21;14381;5;6.795;96406;12;6.79;51883;8;6.785;34462;17;6.78;26426;10;6.775;5458;4;6.805;18446;11;6.81;24190;10;6.815;27929;9;6.82;18412;8;6.825
BIDASK;STLAM;16:41:21;14381;0;6.795;5458;0;6.805
BOOK_5;STLAM;16:41:21;14381;5;6.795;96406;12;6.79;51883;8;6.785;34462;17;6.78;26426;10;6.775;5458;4;6.805;18446;11;6.81;24190;10;6.815;27929;9;6.82;18412;8;6.825
BOOK_5;STLAM;16:41:21;14381;5;6.795;96406;12;6.79;51883;8;6.785;34462;17;6.78;26426;10;6.775;5458;4;6.805;18446;11;6.81;24190;10;6.815;28129;10;6.82;18412;8;6.825
BIDASK;STLAM;16:41:21;16000;0;6.795;3841;0;6.805
BOOK_5;STLAM;16:41:21;16000;6;6.795;94785;11;6.79;51883;8;6.785;34462;17;6.78;36665;11;6.775;3841;3;6.805;20062;12;6.81;24190;10;6.815;28129;10;6.82;18412;8;6.825
BOOK_5;STLAM;16:41:21;16000;6;6.795;94785;11;6.79;51883;8;6.785;34462;17;6.78;36665;11;6.775;3841;3;6.805;20062;12;6.81;24190;10;6.815;28129;10;6.82;18412;8;6.825
BOOK_5;STLAM;16:41:21;16000;6;6.795;94785;11;6.79;51883;8;6.785;34462;17;6.78;36665;11;6.775;3841;3;6.805;20062;12;6.81;24190;10;6.815;27929;9;6.82;18412;8;6.825
BIDASK;STLAM;16:41:21;16000;0;6.795;3841;0;6.805
BIDASK;STLAM;16:41:22;16000;0;6.795;4668;0;6.805
BOOK_5;STLAM;16:41:21;16000;6;6.795;94785;11;6.79;51883;8;6.785;34462;17;6.78;36665;11;6.775;4668;4;6.805;20062;12;6.81;24190;10;6.815;27929;9;6.82;18412;8;6.825
H
H
H
H
^]
telnet> quit
Connection closed.
MacBook-Pro:~ $
//DarwinClient.cs Classe che implementa le funzioni Socket
//CLASSE DARWINCLIENT
using System;
using System.Net.Sockets;
namespace DarwinClient
{
public class DarwinClient
{
private TcpClient clientSocket;
private String host;
private int port;
private NetworkStream serverStream;
private System.IO.StreamReader streamReader;
//Metodo costruttore - imposta HOST e PORTA di connessione
public DarwinClient (String host, int port)
{
this.host = host;
this.port = port;
clientSocket = new TcpClient ();
}
//Apre la connessione al server
public void startConnection ()
{
clientSocket.Connect (this.host, this.port);
serverStream = clientSocket.GetStream ();
streamReader = new System.IO.StreamReader (clientSocket.GetStream ());
}
//Termina la connessione
public void endConnection ()
{
clientSocket.Close ();
}
//Invia il comando al server (aggiunge in automatico il NEWLINE)
public void sendCmd (String msg)
{
byte[] outStream = System.Text.Encoding.ASCII.GetBytes (msg + "\n");
serverStream.Write (outStream, 0, outStream.Length);
serverStream.Flush ();
}
//Legge dal server una riga
public String readLine ()
{
String returndata = streamReader.ReadLine ();
return returndata;
}
}
}//end class
//Main.cs Main program che utilizza la classe DarwinClient e stampa in console i dati per 120 secondi prima di chiudere la connessione
//CLASSE MAIN
using System;
namespace DarwinClient
{
class MainClass
{
public static void Main ()
{
Console.WriteLine ("Starting client...");
try {
//Instanziamo la classe che ci server per gestire il socket
DarwinClient dClient = new DarwinClient ("localhost", 10001);
//Apriamo la connessione
dClient.startConnection ();
Console.WriteLine ("Connection to localhost:10001 successfull");
//Inviamo il comando (sottoscrizione standard STLAM Book + Price + Bidask)
String cmd = "SUBALL STLAM";
dClient.sendCmd (cmd);
Console.WriteLine (" --> " + cmd);
String line = null;
long start = DateTime.UtcNow.Ticks;
bool continua = true;
//Leggiamo per 120 secondi
while (continua) {
//Leggo la prossima linea
line = dClient.readLine ();
if (line != null) {
Console.WriteLine (" <-- " + line);
}
long now = DateTime.UtcNow.Ticks;
long sec = (now - start) / 10000000;
if (sec > 120) {
continua = false;
}
}
//Terminiamo la sottoscrizione
Console.WriteLine ("Terminating subscriptions");
dClient.sendCmd ("UNS STLAM");
Console.WriteLine ("Connection closed");
//Chiudiamo il socket
dClient.endConnection ();
} catch (Exception exx) {
//Se ci sono errori li visualizziamo
Console.WriteLine ("Error in DarwinClient: " + exx.Message);
Console.WriteLine (exx.StackTrace);
}
}
}
}//end class
//Esempio in java per la connessione alla ricezione del flusso prezzi porta 10001
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.PrintWriter;
import java.net.Socket;
import java.util.Scanner;
/**
*Classe esempio per la connessione al DataFeed porta 10001.
*Effetuata la connessione viene chiesto un comando in input,
*dato questo comando partirà l'informativa del titolo/i richiesto/i per 60 secondi.
*Passato il minuto verrà sottoscritto il titolo/i e chiusa la connessione.
*
*Ovviamente se viene inserito un comando sbagliato ci sarà codice errore e chiusura.
*/
public class ConnectDataFeed{
Socket s; //il socket che utilizziamo per la connessione
PrintWriter pW; //fornisce i metodi print e println, che permettono di scrivere qualunque dato Java, convertendolo automaticamente in stringa.
BufferedReader bfr; //usa un buffer (memoria tampone) per memorizzare temporaneamente i caratteri da leggere/scrivere
int porta; //porta sul quale fare l'accesso
String host; //host sul quale fare l'accesso
//variabili per sviluppo del codice
static String tick;
static boolean verifica=true;
/**
*Costruttore,in questo caso inizializziamo l'host e la porta per la connessiona
*/
public ConnectDataFeed(int porta,String host){
this.porta=porta;
this.host=host;
}
/**
*Connessione al socket.
*creo il socket il printwriter e il buffer.
*/
private void Connessione(){
try{
s = new Socket(host, porta);
pW = new PrintWriter(s.getOutputStream(), true);
bfr = new BufferedReader(new InputStreamReader(s.getInputStream()));
System.out.println("Connessione avvenuta");
System.out.println(RLine());
} catch (Exception e) {
System.err.println("Unable to connect to the DataFeed: " + e );
}
}
/**
*Metodo per la chiusura della connessione.
*/
private void closeConnection(){
try {
System.out.println("Chiusura in corso.");
pW.close();
bfr.close();
s.close();
System.out.println("Chiusura effettuata!");
} catch (Exception e){
System.err.println("Error disconnecting from the DataFeed: " + e);
}
}
/**
* Metodo per fare la send del comando dato in input
* @param cmd il comando
/*
private void sendCommand(String cmd){
pW.println(cmd);
}
/**
* Metodo per stampare il contenuto del buffer.
* @return stringa contente la stringa del buffer
*/
private String RLine(){
String line = null;
try {
line = bfr.readLine();
} catch (IOException e) {
e.printStackTrace();
}
return line;
}
/**
* metodo utilizzato per la stampa del buffer per un numero di secondi preso in input
*/
private void sott_nsec(){
int timer=120; //secondi
boolean continua=true;
String line="";
long start= System.currentTimeMillis();//variabile per il temporizzatore
System.out.println("Stampati per -->"+timer+"<-- secondi le sottoscrizioni per "+tick);
while(continua){
line=RLine();//prende il messaggio dal buffer
if(line.startsWith("ERR")){
continua=false;
verifica=false;
}
System.out.println(line);//stampa delle risposta
long now=System.currentTimeMillis();//gestione del temporizzatore
long tot= (now-start)/1000;
if(tot>timer) continua=false;
}
}
/**
* Metodo utilizzato per ricavare il ticker del titolo dal comando in input
* Questo metodo non è fondamentale ma serve per far vedere come si desottoscrive un titolo.
* Non è fondamentale perchè quando si chiude la connessione i titoli sottoscritti vengono desottoscritti.
* @param cmd comando da input
* @return il ticker
*/
private String formatTick(String cmd){
String formats=cmd.replace(" ", "\t\t\t\t\t\t\t\t");
String tick=formats.substring(formats.length()-8,formats.length()).trim();
return tick;
}
//Il main della classe
public static void main(String args[]){
System.out.println("TEST DATAFEED");
ConnectDataFeed t=new ConnectDataFeed(10001,"localhost");//creazione dell'oggetto
t.Connessione();//connessione
Scanner scanner = new Scanner(System.in); //variabile per gestione input
System.out.print("Digitare il comando:");
String cmd = scanner.nextLine();//input del comando
t.sendCommand(cmd);//invio il comando
//richiamo della stampa del buffer,con dei controlli
if(cmd.startsWith("SUB")){
tick=t.formatTick(cmd);//prendo il ticker
t.sott_nsec();//metodo per la sottoscrzione per n secondi
if(verifica==true){
System.out.println("\ndesottoscrizione del titolo---> UNS "+tick);
}
}
else
System.out.println(t.RLine());
t.closeConnection();//chiusura della connessione
}
}
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <string.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <netdb.h>
//Metodo per la gestione errori,non fondamentale ai fini della connessione
void error(const char *msg)
{
perror(msg);
exit(0);
}
//La classe main
int main(int argc, char *argv[])
{
int sockfd, portno, n;
struct sockaddr_in serv_addr;
struct hostent *server;
int i=0;
char buffer[256];
char command[256];
int nb;
int nLine=100;
printf("Connessione al DATAFEED\n\n");
char host[20];
sprintf(host,"localhost");
//variabile contente il numero della porta
portno=10001;
//apertura del socket
sockfd = socket(AF_INET, SOCK_STREAM, 0);
if (sockfd < 0)
error("ERROR opening socket");
//variabile per settare l'host in questo caso localhost ovvero 127.0.0.1
server=gethostbyname(host);
if (server == NULL) {
fprintf(stderr,"ERROR, no such host\n");
exit(0);
}
//gestione della connessione al socket
bzero((char *) &serv_addr, sizeof(serv_addr));
serv_addr.sin_family = AF_INET;
bcopy((char *)server->h_addr,
(char *)&serv_addr.sin_addr.s_addr,
server->h_length);
serv_addr.sin_port = htons(portno);
//gestione per eventuali errori nella connessione al socket
if (connect(sockfd, (struct sockaddr *) &serv_addr, sizeof(serv_addr)) < 0)
error("ERROR connecting");
bzero(buffer,256);
n = write(sockfd, command, strlen(command));
if (n < 0)
error("ERROR writing to socket");
bzero(buffer,256);
n = read(sockfd, buffer, 255);
if (n < 0)
error("ERROR reading from socket");
//Stampa di avvenuta connessione
printf("CONNESSIONE AVVENUTA sulla porta %d\n",portno);
printf("%s\n", buffer);
//send del client del comando in questo caso esempio di sottoscrizione di STLAM
nb=sprintf(buffer,"SUB STLAM\n");
write(sockfd,buffer,nb);
while(i<=nLine){
//lettura e stampa del buffer ovvero la risposta del server
//qui stampa le 100 prime righe,poi esce dal ciclo
nb=read(sockfd,buffer,256);
buffer[nb]=0;
printf("%d messaggio da server: %s\n",i,buffer);
i++;
}
//chiusura della connessione al socket.
printf("Chiusura della connessione\n");
close(sockfd);
return 0;
}//end main
# API Directa - Esempio DataFeed
# Python 3.9.13 (main, Aug 25 2022, 18:29:29)
# [Clang 12.0.0 ]
# DIRECTA API Documentation
# http://app1.directatrading.com/trading-api-directa/index.html
# Libreria python per gestione socket
# https://docs.python.org/3/library/socket.html
import socket
# Funzione per printare il messaggio di errore
def errore(messaggio):
print(messaggio)
exit(0)
# Funzione per la connessione e la ricezione del feed
def datafeed():
sfeed = ""
porta = 10001
buffersize = 256
nfeed = 100
comando = "SUBPRZ UCG\n"
host = "127.0.0.1"
# Socket
try:
sfeed = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
except socket.error as err:
errore(f"errore nel creare il socket: {err}")
# Connessione al socket
try:
sfeed.connect((host, porta))
except socket.error as err:
errore(f"errore di connessione: {err}")
# Invio comando
try:
sfeed.sendall(comando.encode('utf-8'))
except socket.error as err:
errore(f"errore di invio del comando: {err}")
# Ricezione
try:
response = sfeed.recv(buffersize)
print(response.decode('utf-8'))
except socket.error as err:
errore(f"errore di ricezione del datafeed: {err}")
for i in range (1,nfeed):
try:
response = sfeed.recv(buffersize)
print(f"Messaggio numero: {i} dal server: {response.decode('utf-8')}")
except socket.error as err:
errore(f"Errore di ricezione della risposta: {err}")
# Chiusura della connessione
print("Chiusura Connessione")
sfeed.close()
# Comando per eseguire
datafeed()
NB
Per SICUREZZA questo esempio riporta un comando inventato che non esegue nessun ordine.
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.PrintWriter;
import java.net.Socket;
import java.util.Vector;
/**
* Classe d'esempio per la connessione al Trading tramite la porta 10002.
* Questo esempio si connette e stampa la situazione portafoglio e l'elenco degli ordini.
* Poi fa un esempio di send di un comando trading,per sicurezza è stato inserito un comando che non fa NULLA.
* Dopo aver mandato il comando si otterrà la risposta a video e si chiuderà la connessione e terminarà il programma.
*
* NB:avendo messo un comando NULLO ovviamente la risposta sarà NULLA,a video si visualizzerà un H(HeartBeat),
* ma questa non è la risposta ma quello che passa in quel momento,cioè NULLA.
* /
public class TradingConnect{
Socket s; //il socket che utilizziamo per la connessione
PrintWriter pW; //fornisce i metodi print e println, che permettono di scrivere qualunque dato Java, convertendolo automaticamente in stringa.
BufferedReader bfr; //usa un buffer (memoria tampone) per memorizzare temporaneamente i caratteri da leggere/scrivere
int porta; //porta sul quale fare l'accesso
String host; //host sul quale fare l'accesso
Vector ordini=new Vector();
TradingConnect(int porta,String host){
this.porta=porta;
this.host=host;
}
/**
* Connessione al socket.
* creo il socket il printwriter e il buffer.
/*
private void Connessione(){
try {
s = new Socket(host, porta);
pW = new PrintWriter(s.getOutputStream(), true);
bfr = new BufferedReader(new InputStreamReader(s.getInputStream()));
System.out.println("Connessione avvenuta");
System.out.println(RLine());
System.out.println(RLine());
boolean state=true;
System.out.println("Lista ordini");
System.out.print("Caricamento");
while(state){
String line=RLine();
if(line.startsWith("ORDER")){
System.out.print(".");
ordini.add(line);
}
else if(line.startsWith("ERR")){
System.out.println(line);
state=false;
}
else
state=false;
}
System.out.println(".");
int i=0;
while(i
System.out.println(ordini.get(i));
i++;
}
System.out.println("end Lista");
} catch (Exception e) {
System.err.println("Unable to connect to the DataFeed: " + e );
}
}
/**
* Metodo per la chiusura della connessione.
*/
private void closeConnection(){
try {
System.out.println("Chiusura in corso.");
pW.close();
bfr.close();
s.close();
System.out.println("Chiusura effettuata!");
catch (Exception e){
System.err.println("Error disconnecting from the DataFeed: " + e);
}
}
/**
* Metodo per stampare il contenuto del buffer.
* @return stringa contente la stringa del buffer
*/
private String RLine(){
String line = null;
try {
line = bfr.readLine();
} catch (IOException e) {
e.printStackTrace();
}
return line;
}
private void sendCommand(String cmd){
pW.println(cmd);
}
public static void main(String[] args){
TradingConnect t=new TradingConnect(10002,"localhost");
t.Connessione();
System.out.println("---Fine elenco ordini----\n");
//Prova di comando trading
//Facendo una sendcmd si potrebbe provare un comando trading,
//per precauzione mettiamo un esempio che non fa nulla.
//qui inserire il comando
//comando acqz: ACQAZ <ordine>,<ticker>,<quantità>,<prezzo>
String cmd="ACQAZ ORD001,PIPPO,10,0.000";
t.sendCommand(cmd);
System.out.println(cmd);
String risposta;
//in questo caso la risposta sarà un heartbeat perchè il nostro comando non fa nulla
//si specifica che la risposta non è l'heartbeat ma non avendo nulla,stampa quello che che passa ovvero un H
risposta=t.RLine();
System.out.println(risposta);
t.closeConnection();
}//end class
esempio trading con C Sharp -da sviluppare-
esempio trading con C -da sviluppare-
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.PrintWriter;
import java.net.Socket;
/**
* Classe esempio per le chiamate storiche connessione socket sulla porta 10003
* Connessione sulla porta e messaggio di connessione avvenuta tramite riga Darwinstatus,
* Effettuata la connessione manda il comando tramite una send e stampa a video il contenuto richiesto.
*/
public class TbtConnect{
Socket s; //il socket che utilizziamo per la connessione
PrintWriter pW; //fornisce i metodi print e println, che permettono di scrivere qualunque dato Java, convertendolo automaticamente in stringa.
BufferedReader bfr; //usa un buffer (memoria tampone) per memorizzare temporaneamente i caratteri da leggere/scrivere
int porta; //porta sul quale fare l'accesso
String host; //host sul quale fare l'accesso
public TbtConnect(int porta,String host){
this.porta=porta;
this.host=host;
}
/**
*Connessione al socket.
*creo il socket il printwriter e il buffer.
*/
public void Connessione(){
try {
s = new Socket(host, porta);
pW = new PrintWriter(s.getOutputStream(), true);
bfr = new BufferedReader(new InputStreamReader(s.getInputStream()));
System.out.println("Connessione avvenuta");
System.out.println(RLine());
} catch (Exception e) {
System.err.println("Unable to connect to the DataFeed: " + e );
}
}
/**
*Metodo per la chiusura della connessione.
*/
public void closeConnection(){
try {
System.out.println("Chiusura in corso.");
pW.close();
bfr.close();
s.close();
System.out.println("Chiusura effettuata!");
} catch (Exception e){
System.err.println("Error disconnecting from the DataFeed: " + e);
}
}
/**
* Metodo per fare la send del comando dato in input
* @param cmd il comando
*/
public void sendCommand(String cmd){
pW.println(cmd);
}
/**
* Metodo per stampare il contenuto del buffer.
* @return stringa contente la stringa del buffer
*/
public String RLine(){
String line = null;
try {
line = bfr.readLine();
} catch (IOException e) {
e.printStackTrace();
}
return line;
}
public static void main(String args[]){
TbtConnect t=new TbtConnect(10003,"localhost");
t.Connessione();
String cmd="CANDLE STLAM 1 60";
//String cmd="TBT STLAM 1"; comando commentato,se si vuole provare il tbt decommentare
//TBT <tit> <ngiorni>
t.sendCommand(cmd);
boolean stato=true;
while(stato){
String line=t.RLine();
if(line.equals("END TBT") || line.equals("END CANDLES")){
System.out.println(line);
stato=false;
}
else
System.out.println(line);
}
t.closeConnection();
}
} //end class
import socket
import time
import threading
import Queue
def worker(socket, stopper, rx_queue):
"""thread worker function"""
message = ""
while not stopper.is_set():
data = client_socket.recv(512)
if data == "":
time.sleep(1)
else:
message = message + (data)
if "END " in data:
print("Message Received");
rx_queue.put(message)
message = ""
return
###########################################
###########################################
if __name__ == "__main__":
rx_queue =Queue.Queue() # create a Thread Safe Queue
stopper = threading.Event() # create a Thread Safe Event
client_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
client_socket.connect(('localhost', 10003)) # connect to HISTORICAL DATA socket
t = threading.Thread(target=worker, args=(client_socket, stopper, rx_queue ) )
t.start()
time.sleep( 5 )
print("Extract 1 hour candles")
print("Extract EOD pricesfor last 5 years")
cmd="CANDLE MSE 1250 86400"
client_socket.send(cmd+"\n")
time.sleep( 5 )
print("Wait for 15 seconds")
time.sleep( 15 )
stopper.set() # force thread stop
t.join();
client_socket.close()
f = open("MSE.txt", 'w')
while not rx_queue.empty():
message = rx_queue.get()
f.write(message)
f.close()
print("Done!")
esempio chiamate con C Sharp -da sviluppare-
esempio chiamate con C -da sviluppare-
01/08/2020 Aggiornamento servizo datafeed, multicharts
11/02/2020 Aggiornamento contenuti generale
12/11/2018 Informazioni su utilizzo di dGO e DCL
12/11/2018 Aggiornamento sezione Darwin Command Line
13/02/2018 Aggiornamento librerie excel
05/02/2018 Aggiunta dettaglio per ricevere book oltre al quinto livello
05/02/2018 Aggiunta sezione per utilizzo API con più utenze
05/02/2018 Aggiornamento Tutorial - Esempi di codice (codice per chiamate storiche)
14/11/2016 Aggiunta codice errore per mercato non abilitato per sottoscrizione strumento
13/10/2016 Informazione sulla connessione della Darwin
30/08/2016 Nuovo comando per autoriconessione trading - AUTOREC
30/08/2016 Nuovo comando attivabile per update - POINTUPDATEORDER
29/07/2016 Aggiunto comando a sezione nuovi comandi trading
29/07/2016 Aggiunta Sezione Multicharts
11/07/2016 Update comando ORDERLIST
25/04/2016 Aggiunta comando chiusura Darwin tramite API.
Rimozione dettaglio chiamate storiche deprecate.
03/02/2016 Aggiornamento output comando UPDATEORDER
03/12/2015 Documentazione nuovi comandi trading e Nuove specifiche chiamate storiche
10/09/2015 Aggiornamento comando TABLELIST
25/08/2015 Informazione ricezione orario flusso Order
10/08/2015 Specifiche DarwinApp
10/08/2015 Specifiche Devkit
28/07/2015 Specifiche comando REVALL
13/07/2015 Nuovi comandi per importazioni Tabelle
30/06/2015 Informazioni flusso BIDASK
29/06/2015 Informazioni aggiuntive per i codici errori
02/06/2015 Informazioni gestione della conferma Ordini
20/04/2015 Aggiunto informazioni al dettaglio quantità in negozazione flusso STOCK
10/04/2015 Specifiche per l'informativa degli Indici
31/03/2015 Tabella specifiche periodi chiamate Storiche
17/03/2015 Informazione comandi Revoca
17/03/2015 Aggiunta informazioni comandi
05/03/2015 Aggiornamento informazioni validità ordini
Aggiornamento descrizione Funzionalità - dettagli mercati
19/01/2015 Introduzione contatto mail e aggiornamento traduzioni
26/12/2014 Introduzione ed aggiornarmento della guida in inglese
Inserimento in sezione comando storici -dettaglio volumi in AH-
Aggiornamento comandi sezione Trading
Aggiornamento comando sezione Trading
10/11/2014 Aggiornamento introduzione link nella mail d'attivazione
16/10/2014 Aggiornamento esempi
08/10/2014 Aggiornamento sezione Chiamate Storiche comando TBT
07/10/2014 Aggiornamento sezione Chiamate Storiche
26/08/2014 Primo rilascio della pagina