// Metoda IBosClient do składania nowego zlecenia. public string OrderCreate(OrderData data) { string clientId; Debug.WriteLine("\nOrderCreate..."); using (Socket socket = NolClient.GetSyncSocket()) { NewOrderSingleMsg request = new NewOrderSingleMsg(); clientId = request.ClientOrderId; // automatycznie przydzielone kolejne Id request.Account = data.AccountNumber; request.CreateTime = data.MainData.CreateTime; request.Instrument = FixmlInstrument.Find(data.MainData.Instrument); request.Side = (data.MainData.Side == BosOrderSide.Buy) ? OrderSide.Buy : OrderSide.Sell; request.Type = Order_GetType(data.MainData); request.Price = data.MainData.PriceLimit; request.StopPrice = data.MainData.ActivationPrice; request.Quantity = data.MainData.Quantity; request.MinimumQuantity = data.MainData.MinimumQuantity; request.DisplayQuantity = data.MainData.VisibleQuantity; request.TimeInForce = Order_GetTimeInForce(data.MainData); request.ExpireDate = data.MainData.ExpirationDate; request.Send(socket); ExecutionReportMsg response = new ExecutionReportMsg(socket); } Debug.WriteLine("OrderCreate OK\n"); return(clientId); }
/// <summary> /// Odczyt zebranych informacji o bieżących notowaniach wskazanego instrumentu. /// </summary> /// <param name="instrument"></param> /// <returns></returns> public MDResults MarketDataResults(FixmlInstrument instrument) { if (!mdResults.ContainsKey(instrument)) { mdResults.Add(instrument, new MDResults()); } return(mdResults[instrument]); }
// Metoda IBosClient do anulowania istniejącego zlecenia. public void OrderCancel(OrderData data) { Debug.WriteLine("\nOrderCancel..."); using (Socket socket = NolClient.GetSyncSocket()) { OrderCancelRequestMsg request = new OrderCancelRequestMsg(); request.Account = data.AccountNumber; request.BrokerOrderId2 = data.BrokerId; request.Instrument = FixmlInstrument.Find(data.MainData.Instrument); request.Side = (data.MainData.Side == BosOrderSide.Buy) ? OrderSide.Buy : OrderSide.Sell; request.Quantity = data.MainData.Quantity; request.Send(socket); ExecutionReportMsg response = new ExecutionReportMsg(socket); } Debug.WriteLine("OrderCancel OK\n"); }
/// <summary> /// Dodatkowy konstruktor pozwalający wciąż automatycznie zalogować się do NOL'a /// ale z ewentualnym pominięciem automatycznego otwierania kanału asynchronicznego. /// </summary> /// <param name="login">Czy ma się od razu zalogować? Jeśli "false", należy potem jawnie wywołać metodę "Login".</param> /// <param name="thread">Czy ma uruchomić wewnętrzną obsługę kanału asynchronicznego? Jeśli "false" (tutaj, lub przy /// pierwszym argumencie - oba są wymagane), o otwarcie socketu i odbiór komunikatów tam wysyłanych musimy zadbać sami.</param> public NolClient(bool login, bool thread) { StatementMsgEvent += StatementMsgHandler; ExecReportMsgEvent += ExecReportMsgHandler; MarketDataMsgEvent += MarketDataMsgHandler; UserResponseMsgEvent += AsyncUserResponseMsgHandler; FixmlInstrument.DictionaryLoad(); if (login) { Login(); } if (login && thread) { ThreadStart(); } }
// metoda IBosClient do ustawiania "filtra" subskrybowanych notowań. public void MarketUpdatesSubscription(Instrument[] instruments) { MarketDataSubscriptionClear(); if (instruments != null && instruments.Length > 0) { var fixmlInstruments = instruments.Select(i => FixmlInstrument.Find(i)).ToArray(); MarketDataSubscriptionAdd(fixmlInstruments); MarketDataSubscriptionAdd(MDEntryTypes.BasicBook); MarketDataSubscriptionAdd(MDEntryTypes.BasicTrade); MarketDataSubscriptionAdd(MDEntryTypes.SessionStats); MarketDataStart(); TradingSessionStatusStart(); } else { TradingSessionStatusStop(); } }
public void Dispose() { Debug.WriteLineIf(FixmlMsg.DebugInternals.Enabled, "NolClient.Dispose...", FixmlMsg.DebugCategory); try { if (thread != null) { ThreadStop(); } if (loggedIn) { Logout(); } FixmlInstrument.DictionarySave(); } catch (Exception e) { e.PrintError(); } GC.SuppressFinalize(this); }
// Metoda IBosClient do modyfikacji istniejącego zlecenia. public void OrderReplace(OrderData data) { Debug.WriteLine("\nOrderReplace..."); using (Socket socket = NolClient.GetSyncSocket()) { OrderReplaceRequestMsg request = new OrderReplaceRequestMsg(); request.Account = data.AccountNumber; request.BrokerOrderId2 = data.BrokerId; request.Instrument = FixmlInstrument.Find(data.MainData.Instrument); request.Side = (data.MainData.Side == BosOrderSide.Buy) ? OrderSide.Buy : OrderSide.Sell; request.Type = Order_GetType(data.MainData); request.Price = data.MainData.PriceLimit; request.StopPrice = data.MainData.ActivationPrice; request.Quantity = data.MainData.Quantity; request.MinimumQuantity = data.MainData.MinimumQuantity; request.DisplayQuantity = data.MainData.VisibleQuantity; request.TimeInForce = Order_GetTimeInForce(data.MainData); request.ExpireDate = data.MainData.ExpirationDate; request.Send(socket); ExecutionReportMsg response = new ExecutionReportMsg(socket); } Debug.WriteLine("OrderReplace OK\n"); }
/// <summary> /// Usunięcie z subskrypcji wskazanych instrumentów (po ich symbolach). /// </summary> /// <param name="symbols"></param> public void MarketDataSubscriptionRemove(params string[] symbols) { IEnumerable <FixmlInstrument> instruments = symbols.Select(sym => FixmlInstrument.FindBySym(sym)); MarketDataSubscriptionChange(mdEntryTypes, mdInstruments.Except(instruments)); }
/// <summary> /// Odczyt zebranych informacji o bieżących notowaniach wskazanego instrumentu (po symbolu). /// </summary> /// <param name="symbol"></param> /// <returns></returns> public MDResults MarketDataResults(string symbol) { return(MarketDataResults(FixmlInstrument.FindBySym(symbol))); }
/// <summary> /// Przykład wysyłki zleceń, korzystając bezpośrednio z klas NewOrderSingleMsg i spółki... /// Test ten wrzuca na giełdę zlecenie kupna 1 x FW20 po 1000zł (*raczej* nie ma szans się zrealizować :)), /// następnie je modyfikuje ustawiając limit ceny oczko wyżej... aż ostatecznie całe zlecenie anuluje. /// </summary> public void Execute() { var accountNumber = "00-22-..."; // <- wpisz tu swój numer, żeby program nie musiał o niego pytać if (accountNumber.EndsWith("...")) { Console.Write("Podaj numer rachunku (końcówkę z " + accountNumber + "): "); var str = Console.ReadLine(); accountNumber = accountNumber.Replace("...", str); Trace.WriteLine("Wybrany rachunek: " + accountNumber); } // nawiązanie połączenia z NOL3 i zalogowanie użytkownika using (var nol = new NolClient()) { Thread.Sleep(2000); var tmp = FixmlMsg.DebugFormattedXml.Enabled; try { ExecutionReportMsg execReport; // --- wysyłka nowego zlecenia --- Console.WriteLine("\nPress any key... to send NEW order request [Esc - exit]\n"); if (Console.ReadKey(true).Key == ConsoleKey.Escape) { return; } var newRequest = new NewOrderSingleMsg(); newRequest.Account = accountNumber; newRequest.Side = OrderSide.Buy; newRequest.Instrument = FixmlInstrument.FindBySym("FW20H12"); newRequest.Quantity = 1; newRequest.Price = 1000; using (var socket = NolClient.GetSyncSocket()) { FixmlMsg.DebugFormattedXml.Enabled = true; // <- wyświetli nam dokładną treść komunikatów newRequest.Send(socket); execReport = new ExecutionReportMsg(socket); FixmlMsg.DebugFormattedXml.Enabled = tmp; } Thread.Sleep(3000); // --- modyfikacja tego zlecenia --- Console.WriteLine("\nPress any key... to MODIFY this order request [Esc - exit]\n"); if (Console.ReadKey(true).Key == ConsoleKey.Escape) { return; } var replaceRequest = new OrderReplaceRequestMsg(); replaceRequest.BrokerOrderId2 = execReport.BrokerOrderId2; replaceRequest.Account = accountNumber; replaceRequest.Side = OrderSide.Buy; replaceRequest.Instrument = newRequest.Instrument; replaceRequest.Quantity = 1; replaceRequest.Price = 1001; using (var socket = NolClient.GetSyncSocket()) { FixmlMsg.DebugFormattedXml.Enabled = true; replaceRequest.Send(socket); execReport = new ExecutionReportMsg(socket); FixmlMsg.DebugFormattedXml.Enabled = tmp; } Thread.Sleep(3000); // --- anulowanie tego zlecenia --- Console.WriteLine("\nPress any key... to CANCEL this order request [Esc - exit]\n"); if (Console.ReadKey(true).Key == ConsoleKey.Escape) { return; } var cancelRequest = new OrderCancelRequestMsg(); cancelRequest.BrokerOrderId2 = replaceRequest.BrokerOrderId2; cancelRequest.Account = accountNumber; cancelRequest.Side = newRequest.Side; cancelRequest.Instrument = newRequest.Instrument; cancelRequest.Quantity = newRequest.Quantity; using (var socket = NolClient.GetSyncSocket()) { FixmlMsg.DebugFormattedXml.Enabled = true; cancelRequest.Send(socket); execReport = new ExecutionReportMsg(socket); FixmlMsg.DebugFormattedXml.Enabled = false; } Thread.Sleep(3000); Console.WriteLine("\nPress any key... to exit\n"); Console.ReadKey(true); Console.WriteLine("\n\nThank you :)\n"); } catch (Exception e) { MyUtil.PrintError(e); } FixmlMsg.DebugFormattedXml.Enabled = tmp; } // tu następuje wylogowanie }
/// <summary> /// Wykorzystanie klasy NolClient do subskrypcji bieżących notowań wybranych papierów wartościowych. /// </summary> public void Execute() { // nawiązanie połączenia z NOL3 i zalogowanie użytkownika using (var nol = new NolClient()) { try { if (Console.ReadKey(true).Key == ConsoleKey.Escape) { return; } Trace.WriteLine("\n--- market data subscription start ---"); // definiujemy filtr subskrybowanych danych nol.MarketDataSubscriptionAdd(MDEntryTypes.BasicBook); nol.MarketDataSubscriptionAdd(MDEntryTypes.BasicTrade); FixmlInstrument fw20 = FixmlInstrument.FindBySym("FW20H13"); nol.MarketDataSubscriptionAdd(fw20); // tutaj rozpoczynamy odbieranie notowań nol.MarketDataStart(); // subskrypcja informacji o statusie sesji nol.TradingSessionStatusStart(); if (Console.ReadKey(true).Key == ConsoleKey.Escape) { return; } Trace.WriteLine("\n--- market data subscription change ---"); // modyfikujemy filtr, wyłączając na ten czas notowania // (inaczej resetowałby je po każdej kolejnej zmianie, w tym przykładzie 2-krotnie) nol.MarketDataStop(); nol.MarketDataSubscriptionClear(); nol.MarketDataSubscriptionAdd(MDEntryTypes.All); nol.MarketDataSubscriptionAdd("WIG20", "FW20M12", "FW20H13"); nol.MarketDataStart(); if (Console.ReadKey(true).Key == ConsoleKey.Escape) { return; } Trace.WriteLine("\n--- market data subscription stop ---"); // zerujemy filtr (wyłączamy sybskrypcję notowań) nol.MarketDataSubscriptionClear(); // wydruk wszystkich zgromadzonych notowań foreach (var x in nol.MarketDataResults()) { Debug.WriteLine(string.Format("{0,-9} {1}\n", x.Key, x.Value)); } // wydruk wybranych danych konkretnego instrumentu var fw20data = nol.MarketDataResults(fw20); Debug.WriteLine(string.Format("{0} = {1,7} LOP = {2}", fw20, fw20data.CurrentPrice, fw20data.Lop)); if (Console.ReadKey(true).Key == ConsoleKey.Escape) { return; } // wyłączamy informacje o statusie sesji nol.TradingSessionStatusStop(); // wciąż aktywny kanał asynchroniczny... Console.ReadKey(true); Trace.WriteLine("\n--- done ---"); } catch (Exception e) { MyUtil.PrintError(e); } } // tu następuje wylogowanie }