czwartek, 8 listopada 2018

Giełda - Usunięcie przeterminowanych zleceń


Procedury nie ma sensu omawiać gdyż jest za prosta. W założeniu ma czyścić rynek z przeterminowanych zleceń.
Dodatkowo używam tu funkcji fDateDiff, która sprawdza dwa czasy i zwraca wynik z odejmowania dat, jeżeli mniejsze od zera to przeterminowany jeżeli większy to nieprzeterminowany
Mam dwa parametry, pomyślałem o jobie w nim będę puszczał tę procedurę, jeden to id tabeli MarketSquare drugi to interwał czasowy (mamy trzy do wyboru minuta, godzina, dzień), wszystko zależy jaki cykl giełdy che mieć. 
Procedura pOrderOverdue musi również zadbać o to żeby nastąpił zwrot środków do portfela przy zleceniu kupna ilości środków pieniężnych a przy zleceniu sprzedaży ilość akcji.
Problem widzę gdy mam zlecenia PKC czy  to kupna czy sprzedaży.


  • Przy kPKC chę kupić okręloną ilość akcji ale nie podaje ceny.
  • Przy sPKC chcę sprzedać określoną ilość akcji ale nie podaje ceny.
Zaglądając na procedury zlecenie kupna widzę że nie ma tam uwzględnionego statusu kPKC oraz sPKC.
Jakie jest rozwiązanie na teraz?
  1. Przy sprzedaży po każdej cenie mogę brać cenę z tabeli Stock i przeliczać wartość zakupionych (zlecenia kupna) akcji i ujmować odpowiednią kwotę z portfela.
  2. W zleceniu wpisuje tylko ilość akcji jaką chcę kupić nie odejmuje z portfela wartości bo póki nie jest zrealizowane nie wiem jaka aktualnie cena jest i w konsekwencji wartość zlecenia.
  3. Ostatnie co przychodzi mi na myśl to połączenie tych dwóch punktów czyli wystawiam zlecenie na pewną ilość akcji po cenie jak jest aktualnie na rynku, zabieram tę kwotę z portfela (rezerwuje ją), następnie jak zlecenie się przeterminowywuje (nowe słowo do słownika) to kwotę tą zwracam do portfela, w przeciwnym wypadku realizuje zlecenie ale cena w tedy już jest inna (bądź będzie inna) w tabeli Stock  dla danej akcji. Aby otrzymać kwotę jaką należy zabrać z portfela składającego zlecenie, powinienem pobrać ilość akcji ze zlecenia na rynku oraz znaleźć różnicę  w wartości akcji. W skład tego równania wejdzie ilość wartość zlecenia kupna w chwili jego składania (ilość akcji i cena akcji według tabeli Stock na tamtą chwilę) oraz ilość akcji razy aktualna cena z tabeli Stock.Jeżeli otrzymam wartość ujemną to oznacza że muszę pobrać dodatkową kwotę z portfela, w przeciwnym wypadku muszę do portfela dodać, a jeżeli zero to nic nie robię. Przed założeniem takiego zlecenia trzeba użytkownika ostrzec przed konsekwencjami, tylko co jeżeli braknie mu kasy na razie dług i komornik.   

PROCEDURE [dbo].[pOrderOverdue](
   @mark_id int,
   @interval int
)
AS
BEGIN
declare @dateEnd Datetime
declare @result int
declare @walId int
declare @info varchar(50)
--wallet state before order deactivate
declare @wallCountStocks int
declare @wallCountAllMoney decimal

--market square value
declare @marketSquareCountStocks int
declare @marketSquareCountMoney decimal
declare @marketSqureOrderStatusId int
--
declare @userLogin varchar(50) = 'baza-pOrderOverdue'
select @dateEnd = mark_dataEnd, @walId = wal_id,@marketSqureOrderStatusId = bs_id  
from MarketSquare
where
mark_id = @mark_id
-- wazna uwaga zlecenia kupna roznia sie od zlecen sprzedazy
-- kupno daje pieniadze nie trace ilosci
-- sprzedaz trace ilosc pieniadze bez zmian

select @result = dbo.fDateDiff(1,@dateEnd)
        if(@result < 0)
        begin
                declare @userLoginWallet varchar(50)
                --get login from user table
                select @userLoginWallet = usr_login  from UserTable where wal_id = @walId

                update MarketSquare set
                mark_aktywny = 0
                where
                mark_id = @mark_id
                --get old value from wallet
                select @wallCountStocks = wal_numberOfShares
                     , @wallCountAllMoney = wal_MoneyLimit
                from Wallet
                where
                        wal_id = @walId
                --overdue transaction in status = 2
                --buy
                if(@marketSqureOrderStatusId = 2)
                begin
                        declare @resultMoneyFromStock money
                        --get value from market square
                        select @marketSquareCountMoney = mark_TransactionPrice 
                        from MarketSquare 
                        where mark_id = @mark_id
                        set @resultMoneyFromStock = @marketSquareCountMoney 
                                                  + @wallCountAllMoney
                        update Wallet set
                               wal_MoneyLimit = @resultMoneyFromStock
                        where
                                wal_id = @walId

                        set @info = 'kupno, zwrot pieniedzy = ' 
                                  + CAST(@marketSquareCountMoney as varchar(10))
                        exec pAddInfoToLog 2,@userLoginWallet, @info
                end
                --sell
                if(@marketSqureOrderStatusId = 3)
                begin
                        declare @resultCountStock int
                        --get how many stock i sell transaction in market square
                        select @marketSquareCountStocks = mark_numberOfShares 
                        from MarketSquare 
                        where mark_id = @mark_id
                        set @resultCountStock = @marketSquareCountStocks 
                                              + @wallCountStocks   
                        update Wallet set
                               wal_numberOfShares = @resultCountStock
                        where
                               wal_id = @walId

                        set @info = 'sprzedaz, zwrot akcji = ' 
                                  + CAST(@marketSquareCountMoney as varchar(10))
                        exec pAddInfoToLog 2,@userLoginWallet, @info
                end
                --emission
                if(@marketSqureOrderStatusId = 4)
                begin
                              
                       exec pAddInfoToLog 2,@userLogin,'emisja akcji'
                end
                --return
                if(@marketSqureOrderStatusId = 5)
                begin
                              
                      exec pAddInfoToLog 2,@userLogin,'skup akcji'
                end
  end
END


FUNCTION [dbo].[fDateDiff]
(
   @interval int,
   @dateEnd datetime
)
RETURNS int
AS
 BEGIN
  DECLARE @result int

  if(@interval = 1)
  begin
      SELECT @result = DATEDIFF(minute, GetDAte(),@dateEnd)
   end
  if(@interval = 2)
  begin
     SELECT @result = DATEDIFF(HOUR, GetDAte(),@dateEnd)
  end
  if(@interval = 3)
  begin
    SELECT @result = DATEDIFF(DAY, GetDAte(),@dateEnd)
  end
RETURN @result

END

Brak komentarzy:

Prześlij komentarz

 Po wielu miesiącach przerwy Czteroletnim exodusie do bloga ismartdev, który zdechł w zeszłym roku w listopadzie, na powrót wstąpiłem w ten ...