Example #1
0
        // 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);
        }
Example #2
0
 /// <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]);
 }
Example #3
0
 // 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");
 }
Example #4
0
 /// <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();
     }
 }
Example #5
0
 // 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();
     }
 }
Example #6
0
 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);
 }
Example #7
0
 // 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");
 }
Example #8
0
        /// <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));
        }
Example #9
0
 /// <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)));
 }
Example #10
0
        /// <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
        }