[Logo] Spazio Aperto Sella.it
[Register] Registrati   [Login] Login    
[Search] Ricerca   [Recent Topics] Argomenti Recenti   [Hottest Topics] Argomenti vivaci  
[Banner Pubblicitario]
Inserimento Ordini e Ricezione Messaggi Ordini  XML
Indice dei Forum » Sella Trading Bridge
Autore Messaggio
andrea.nicolabroglio


Registrato: 17/02/2011 16:45:37
Messaggi: 13
Offline

Buonasera,
le confermo che il messaggio di Waiting (CLASS=TRADING.ORDERS.INSERTED) viene sempre spedito.

Se mi fornisce il numero di ordine virtuale posso fare un controllo specifico

Saluti

Andrea Nicola Broglio
IT Trading On Line
tiozzo


Registrato: 05/10/2012 19:38:00
Messaggi: 87
Offline

Salve,
il giorno 27/06/2013 alle ore 15:25:12 relativamente all'inserimento dell'ordine VIRTUAL0003697 al prezzo di 94.36
ho ricevuto sicuramente lo stato Accettato prima di ricevere lo stato Waiting.

Io da codice faccio un controllo sullo stato in questo modo:

if (!message.Fields["V_STATUS"].IsNull)
{
order.statusOrder = message.Fields["V_STATUS"].Content.ToString();
orderModified = true;
}

if (orderModified)
{
switch (order.statusOrder)
case "W":
.......

case "A":
......
...

andrea.nicolabroglio


Registrato: 17/02/2011 16:45:37
Messaggi: 13
Offline

Buongiorno,
le confermo che dai log dei ns server risulta che i messaggi relativi all'ordine VIRTUAL0003697 siano stati inviati nei seguenti orari:

15:25:01.580 --> W
15:25:04.280 --> A

Nella modalità reale potrebbe capitare che i messaggi siano spediti in un diverso ordine. Questo è dovuto alle dinamiche di mercato (per esempio il canale degli accettati ha priorità diversa rispetto al canale dove vengono diffusi gli Eseguiti).

Le consiglio dunque di applicare questo ordine di priorità in ordine crescente (sono logiche che si applicano solitamente negli applicativi di Trading)

W --> A --> E

ovvero se il suo ordine è in stato A e riceve un aggiornamento di stato W deve lasciare lo stato in A, se il suo ordine è in stato E e riceve un aggiornamento di stato A deve lasciare lo stato in E

Saluti



Andrea Nicola Broglio
IT Trading On Line
tiozzo


Registrato: 05/10/2012 19:38:00
Messaggi: 87
Offline

Quindi a prescindere dal caso specifico di ieri,
mi stai dicendo che in reale (e a me alla fine interessa il reale)
io potrei ricevere prima Accettato e poi Waiting.

Il punto non è la logica da applicare (quella che hai indicato sotto e che è di facile implementazione);
il punto molto critico è rappresentato dal fatto che se io ricevo prima l'Accettato, siccome questo tipo di messaggio
non contiene il ClientID che io ho inserito al momento dell'invio dell'ordine, come faccio ad associarlo al giusto ordine?
In altre parole non so questo Accettato a quale ordine appartiene. Questo perchè non mi viene notificato il ClientID.

Quindi io ho scritto tutta la logica basandomi sul fatto che mi deve arrivare prima il Waiting
che contiene il ClientID, quindi io lo posso associare al giusto ordine che ho inviato e quando mi arriva l'Accettato
o qualsiasi altro stato so già di che ordine si tratta perhcè prima l'ho associato nel Waiting. Tutto funziona perfettamente

In mancanza di questo è impossibile fare qualsiasi operazione da codice, almeno io non ne vedo una.
Quando avete sviluppato la vostra logica come avete pensato potesse essere aggirato questo problema?

Grazie.
Matteo.



andrea.nicolabroglio


Registrato: 17/02/2011 16:45:37
Messaggi: 13
Offline

Noi suggeriamo di utilizzare il campo chiave V_ORDER_CODE presente su tutti i messaggi relativi ai suoi ordine
Viene popolato sulla classe order dopo aver inserito correttamente un ordine (order.OrderCode)

Maggiori dettagli li può trovare direttamente alla sezione "Operatività" del manuale per sviluppatori "SellaTradingBridgeOverview.pdf" che trova all'interno dello zip che ha scaricato.
Qui è presente anche un esempio di come inserire un ordine e di come ricavare il V_ORDER_CODE


Console.WriteLine("ORDER INSERTED CODE " + order.OrderCode);


Saluti

Andrea Nicola Broglio
IT Trading On Line
tiozzo


Registrato: 05/10/2012 19:38:00
Messaggi: 87
Offline

Salve,
non mi sono spiegato bene.
L'inserimento e la ricezione dell'ordine avvengono in due istanti diversi e sono eventi asincroni.

Da una parte io inserisco gli ordini (supponiamo che ne inserisca 10)
usando la funzione Session.OrderManager.ExecuteInsertOrder(order);
Quando inserisco gli ordini io non so qual è il codice dell'ordine quindi non posso "marcare" il relativo strumento (azione, obbigazione, etc..)

Dall'altra parte ricevo i messaggi relativi agli ordini
Catturo il codice dell'ordine (OrderCode) ma non posso sapere a quale strumento precedentemente inviato a mercato appartiene
Ovvero non posso sapere questo codice ordine a quale dei 10 strumenti appartiene.

Per fare questo dovrei avere la possibilità di passargli un codice univoco (un Transaction ID) prima di inserire l'ordine, che poi possa ritrovare
nel momento in cui mi arriva il relativo messaggio nella coda degli ordini.
La possibilità di inserire questo tid c'è; è il ClientID che io posso inserire, però me lo ritrovo solo nel tipo caso di ordine waiting.

Mi è stato detto che il ClientID sarà inserito a breve anche in tutti gli altri messaggi.

Sapresti dirmi quando sarà rilasciata questa modifica?

E' chiaro che nel frattempo io posso usare un work around, ma il modo che ho illustrato sopra (e che voi avete iniziato ad implementare) è il più immediato e veloce.

Grazie.
Matteo.



andrea.nicolabroglio


Registrato: 17/02/2011 16:45:37
Messaggi: 13
Offline

Buongiorno,
le allego un esempio tratto dal SellatradingBridgeOverview che dovrebbe chiarire la situazione.
Come può notare in questo esempio dopo la ExecuteInsertOrder, fatti i dovuti check sui flag per capire se l'ordine sia stato inserito correttamente, Lei ha già a sua disposizione il numero ordine ovvero order.OrderCode, quindi tutto in modo sincrono.

Dopo aver inserito l'ordine lei riceverà sulla coda asincrona anche i messaggi di tipo Inserted, Accepted ecc dove all'interno avrà sempre come chiave il V_ORDER_CODE.
Questi messaggi sono successivi al momento nel quale Lei riceve la risposta alla ExecuteInsertOrder

Quindi con la struttura attuale è in grado di realizzare la sua applicazione.


if(order.IsOrderReadyToInsert)
{
Session.OrderManager.ExecuteInsertOrder(order);

if (order.ErrorLevel == ErrorLevelType.Error)
{
Console.WriteLine("ERROR PREPARING ORDER";
foreach (OrderMessage orderMessage in order.Message)
{
Console.WriteLine(orderMessage.ErrorLevel + "\t" + orderMessage.Message);
}
}
else
{
Console.WriteLine("ORDER INSERTED CODE " + order.OrderCode);
}
}


Le confermo inoltre che stiamo implementando l'estensione del CLIENT_ID e che questo sarà disponibile entro settembre
Saluti

Andrea Nicola Broglio
IT Trading On Line
tiozzo


Registrato: 05/10/2012 19:38:00
Messaggi: 87
Offline

Mi dispiace dirtelo ma non è così, come ha confermato anche in questo thread Giulio Rattone il 3 giugno.

I due thread sono asincroni, quindi io potrei ricevere il messaggio nel thread degli ordini (PushMessageOrder) prima che venga eseguito il codice della execute durante l'inserimento dell'ordine, ovvero senza aver avuto la possibilità di catturare il codice dell'ordine che ho appena inserito.
Se non fosse stato così che motivo c'era di inserire il ClientId

Quel codice è sbagliato e fuorviante, infatti andrebbe eliminato dagli esempi.

Io ho seguito quell'esempio, ho implementato tutta la mia logica basandomi sul fatto di conoscere il codice dell'ordine all'atto dell'inserimento
prima che mi arrivasse il relativo messaggio nella coda degli ordini e purtroppo ho dovuto cambiare tutta la mia logica
L'ho cambiata credendo, come mi era stato detto, che mi arrivasse prima il waiting (che contiene il clientiD) e siccome anche questo non si è dimostrato
vero, ho dovuto riscrivere per la terza volta tutta la logica di gestione degli ordini....

Comunque per il momento ho risolto a modo mio, ma aspetto settembre per avere il clientid in tutti i messaggi di notifica.

Al momento ho un errore sulla funzione elimina ordine, ma domani faccio altri test e vi faccio sapere meglio.


Cmq grazie lo stesso.
Matteo.
tiozzo


Registrato: 05/10/2012 19:38:00
Messaggi: 87
Offline

Salve,
ho un problema nella modifica di un ordine: (in virtuale)
Mi va in eccezione sulla ExecuteModifyOrder con la motivazione: "This order is not ready"

Questo è quello che io faccio da codice:
Order order = new Order(codice_ordine);


order.Phase = PhaseType.NegoziazioneContinua;
order.Price = prezzo_ordine; //è il nuovo prezzo dell'ordine da inviare
order.Quantity = qtybuy; //è la nuova quantità da inviare
order.Sign = OrderSignType.Buy;

Session.OrderManager.ExecuteModifyOrder(order);

Oltre alle proprietà dell'oggetto order valorizzati sopra, devo valorizzare qualche altra cosa?


Ho provato a modificare il codice inserendo prima la PrepareModifyOrder
Session.OrderManager.PrepareModifyOrder(order);
if (order.ErrorLevel == ErrorLevelType.Ready)
{

Session.OrderManager.ExecuteModifyOrder(order);

ma anche in questo modo ricevo una eccezione sulla PrepareModifyOrder:
il messaggio è: An unhandled order request in virtual execution mode

Grazie.
Matteo
andrea.nicolabroglio


Registrato: 17/02/2011 16:45:37
Messaggi: 13
Offline

Buongiorno,
la modifica ordine non è disponibile in modalità Virtuale

In modalità reale dovrà procedere con 2 step (così come per l'inserimento dell'ordine), ovvero con l'accoppiata Prepare --> Execute.
Nello specifico dovrà procedere con la
"PreparareModifyOrder" ed in successione con la chiamata ad "ExecuteModifyOrder"

Le ricordo inoltre che anche per la modifica ordine è stata introdotta la modalità fast (ModifyOrderFast).

Saluti

Andrea Nicola Broglio
IT Trading On Line
tiozzo


Registrato: 05/10/2012 19:38:00
Messaggi: 87
Offline

Ok, Grazie.

Immagino che anche per quanto riguarda la cancellazione dell'ordine, questa non possa essere eseguita in virtuale
in quanto mi ritrovo più o meno lo stesso errore.

Ricapitolo la modalità di inserimento degli ordini in REALE

Inserimento:
Session.OrderManager.InsertOrderFast(order)
switch (order.ErrorLevel)
{
case ErrorLevelType.Executed:

Log.Write("InserOrdine: Ordine inviato" );

break;

case ErrorLevelType.Error:
Log.Write("InserimentoOrdine: Message: Errore in inserimento ordine";
break;


Modifica dell'ordine:
//per la modifica è sufficiente istanziare un nuovo oggetto order passandogli l'ordercode da modificare come faccio sotto
//e quindi gli altri parametri?

Order order = new Order(orderCode);
order.Phase = PhaseType.NegoziazioneContinua;
order.Price = prezzo_ordine_buy;
order.Quantity = qtybuy;
order.Sign = OrderSignType.Buy;
Session.OrderManager.ModifyOrderFast(order);
switch (order.ErrorLevel)
{
case ErrorLevelType.Executed:

Log.Write("ModificaOrdine: Ordine inviato";

break;

case ErrorLevelType.Error:
Log.Write("Errore in ModificaOrdine";
break;


Per quanto riguarda invece la cancellazione di un ordine, mi sembra che non ci sia la modalità veloce
quindi anche in REALE si dovrebbe codificare in questo modo:

Session.OrderManager.PrepareDeleteOrder(order);
if (order.ErrorLevel == ErrorLevelType.Ready)
{

Session.OrderManager.ExecuteDeleteOrder(order);
switch (order.ErrorLevel)
{
case ErrorLevelType.Executed:
Log.Write("eliminaOrdine: Ordine inviato";


break;
case ErrorLevelType.Error:
//
Log.Write("Errore in eliminaOrdine);

break;


Grazie.
Matteo.
andrea.nicolabroglio


Registrato: 17/02/2011 16:45:37
Messaggi: 13
Offline

Buongiorno
le confermo che la cancellazione di un ordine non è possibile in modalità virtuale

Rispetto a quanto riportato da lei deve aggiungere la logica di accettazione degli eventuali warning anche per la modalità Fast (sia inserimento che modifica)

Mi spiego meglio. Quando inserisce un ordine in modalità FAST deve giustamente testare "ErrorLevel"
Se ErrorLevelType.Executed --> ordine inserito correttamente
se ErrorLevelType.Error -> errore bloccante nell'inserimento ordine
se ErrorLevelType.Ready o Warning --> deve presentare i warning in modo da procedere con l'accettazione di questi e il conseguente inserimento ordine
In questo ultimo caso non potendo procedere con linserimento in modalità FAST si ritorna di fatto ad un inserimento in 2 step (Prepare --> Execute)

Questa logica è implementata nella form di inserimento ordine "frmBuySell" presente all'interno della XRemotingWinTestApplication contenuta nello zip SellaTradingBridge

Saluti





Andrea Nicola Broglio
IT Trading On Line
tiozzo


Registrato: 05/10/2012 19:38:00
Messaggi: 87
Offline

Ok, Grazie.

Quindi per ricapitolare, sia per la modifica che per la cancellazione il codice deve essere questo:
riporto solo la modifica:
Session.OrderManager.ModifyOrderFast(order);

switch (order.ErrorLevel)
{
case ErrorLevelType.Executed:
Log.Write("ModificaOrdineBuy: Ordine inviato";
break;

case ErrorLevelType.Error:
Log.Write("ModificaOrdineBuy: ERRORE Ordine inviato";
break;

case ErrorLevelType.Ready:
order.AcceptWarningMessage();
Session.OrderManager.ExecuteModifyOrder(order);
break;

case ErrorLevelType.Warning:
order.AcceptWarningMessage();
Session.OrderManager.ExecuteModifyOrder(order);
break;
}
giulio.rattone


Registrato: 22/07/2009 13:07:45
Messaggi: 183
Offline

Il codice postato a prima occhiata mi pare corretto.

In caso di ordine ready l'invocazione del metodo AcceptAllWarnings è inutile

Saluti

Giulio Rattone
Resp IT Titoli e Trading
giulio.rattone


Registrato: 22/07/2009 13:07:45
Messaggi: 183
Offline

@Tiozzo

Da oggi il campo ClientID è disponibile anche negli altri messaggi di notifica come concordato.
Saluti

Giulio Rattone
Resp IT Titoli e Trading
 
Indice dei Forum » Sella Trading Bridge
Vai a:   
E.t.v.s.p.b WLS11G