Skip to content

Commit a357f41

Browse files
committed
bfx wip
1 parent b829e43 commit a357f41

File tree

6 files changed

+152
-233
lines changed

6 files changed

+152
-233
lines changed

pub/bfx/src/Bfx.hs

Lines changed: 113 additions & 75 deletions
Original file line numberDiff line numberDiff line change
@@ -18,8 +18,6 @@ module Bfx
1818
cancelOrderById,
1919
cancelOrderByClientId,
2020
cancelOrderByGroupId,
21-
submitCounterOrder,
22-
submitCounterOrderMaker,
2321
dumpIntoQuote,
2422
dumpIntoQuoteMaker,
2523
netWorth,
@@ -28,6 +26,8 @@ module Bfx
2826
tickers,
2927
MkOrder (..),
3028
mkOrder,
29+
MkCounterOrder (..),
30+
mkCounterOrder,
3131
module X,
3232
)
3333
where
@@ -332,79 +332,6 @@ cancelOrderByGroupId env gid = do
332332
. CancelOrderMulti.ByOrderGroupId
333333
$ Set.singleton gid
334334

335-
submitCounterOrder ::
336-
( MonadThrow m,
337-
MonadUnliftIO m
338-
) =>
339-
Env ->
340-
OrderId ->
341-
CounterRates ->
342-
SubmitOrder.Options ->
343-
m Order
344-
submitCounterOrder =
345-
mkSubmitCounterOrder submitOrder
346-
347-
submitCounterOrderMaker ::
348-
( MonadThrow m,
349-
MonadUnliftIO m
350-
) =>
351-
Env ->
352-
OrderId ->
353-
CounterRates ->
354-
SubmitOrder.Options ->
355-
m Order
356-
submitCounterOrderMaker =
357-
mkSubmitCounterOrder submitOrderMaker
358-
359-
mkSubmitCounterOrder ::
360-
( MonadThrow m,
361-
MonadUnliftIO m
362-
) =>
363-
( Env -> SubmitOrder.Request -> m Order
364-
) ->
365-
Env ->
366-
OrderId ->
367-
CounterRates ->
368-
SubmitOrder.Options ->
369-
m Order
370-
mkSubmitCounterOrder submit env id0 rates opts = do
371-
remOrder <- getOrder env id0
372-
let sym = orderSymbol remOrder
373-
case orderBuyOrSell remOrder of
374-
Buy | orderStatus remOrder == Executed -> do
375-
counter <-
376-
mkCounterOrder
377-
CounterArgs
378-
{ counterArgsEnterBuyOrSell = Buy,
379-
counterArgsEnterGrossBase =
380-
orderBaseAmount remOrder,
381-
counterArgsEnterQuotePerBase =
382-
orderRate remOrder,
383-
counterArgsRates =
384-
rates
385-
}
386-
let exitAmt = counterExitGrossBase counter
387-
let exitRate = counterExitQuotePerBase counter
388-
currentRate <-
389-
marketAveragePrice
390-
MarketAveragePrice.Request
391-
{ MarketAveragePrice.buyOrSell = Sell,
392-
MarketAveragePrice.baseAmount = exitAmt,
393-
MarketAveragePrice.symbol = sym
394-
}
395-
submit
396-
env
397-
SubmitOrder.Request
398-
{ SubmitOrder.buyOrSell = Sell,
399-
SubmitOrder.baseAmount = exitAmt,
400-
SubmitOrder.symbol = sym,
401-
SubmitOrder.rate = max exitRate currentRate,
402-
SubmitOrder.options = opts
403-
}
404-
_ ->
405-
throw
406-
$ ErrorRemoteOrderState remOrder
407-
408335
mkDumpIntoQuote ::
409336
( MonadThrow m,
410337
MonadUnliftIO m
@@ -640,3 +567,114 @@ mkOrder args = do
640567
where
641568
bos = mkOrderBuyOrSell args
642569
sym = mkOrderCurrencyPair args
570+
571+
data MkCounterOrder = MkCounterOrder
572+
{ mkCounterOrderEnterBuyOrSell :: BuyOrSell,
573+
mkCounterOrderEnterGrossBase :: MoneyAmount,
574+
mkCounterOrderEnterQuotePerBase :: QuotePerBase,
575+
mkCounterOrderCurrencyPair :: CurrencyPair,
576+
mkCounterOrderEnterFee :: FeeRate,
577+
mkCounterOrderExitFee :: FeeRate,
578+
mkCounterOrderProfit :: ProfitRate
579+
}
580+
deriving stock
581+
( Eq,
582+
Ord,
583+
Show,
584+
Read,
585+
Data,
586+
Generic
587+
)
588+
589+
mkCounterOrder ::
590+
( MonadThrow m,
591+
MonadUnliftIO m
592+
) =>
593+
MkCounterOrder ->
594+
m SubmitOrder.Request
595+
mkCounterOrder args = do
596+
exitBase <-
597+
tweakMoneyAmount exitBos exitGrossBase
598+
exitRate <-
599+
roundQuotePerBase
600+
. QuotePerBase
601+
$ unMoneyAmount exitGrossQuote
602+
/ unMoneyAmount exitBase
603+
currentRate <-
604+
marketAveragePrice
605+
MarketAveragePrice.Request
606+
{ MarketAveragePrice.buyOrSell = exitBos,
607+
MarketAveragePrice.baseAmount = exitBase,
608+
MarketAveragePrice.symbol = sym
609+
}
610+
let bestRate =
611+
case exitBos of
612+
Buy -> min exitRate currentRate
613+
Sell -> max exitRate currentRate
614+
pure
615+
SubmitOrder.Request
616+
{ SubmitOrder.buyOrSell = exitBos,
617+
SubmitOrder.baseAmount = exitBase,
618+
SubmitOrder.symbol = sym,
619+
SubmitOrder.rate = bestRate,
620+
SubmitOrder.options = SubmitOrder.optsDef
621+
}
622+
where
623+
sym :: CurrencyPair
624+
sym = mkCounterOrderCurrencyPair args
625+
enterBos :: BuyOrSell
626+
enterBos = mkCounterOrderEnterBuyOrSell args
627+
exitBos :: BuyOrSell
628+
exitBos = nextEnum enterBos
629+
enterRate :: QuotePerBase
630+
enterRate = mkCounterOrderEnterQuotePerBase args
631+
enterBase :: MoneyAmount
632+
enterBase = mkCounterOrderEnterGrossBase args
633+
enterNetLoss :: MoneyAmount
634+
enterNetLoss =
635+
MoneyAmount $ case enterBos of
636+
Buy ->
637+
-- Quote
638+
unMoneyAmount enterBase
639+
* unQuotePerBase enterRate
640+
Sell ->
641+
-- Base
642+
unMoneyAmount enterBase
643+
enterNetGain :: MoneyAmount
644+
enterNetGain =
645+
MoneyAmount $ case enterBos of
646+
Buy ->
647+
-- Base
648+
unMoneyAmount enterBase
649+
* (1 - unFeeRate enterFeeRate)
650+
Sell ->
651+
-- Quote
652+
unMoneyAmount enterBase
653+
* unQuotePerBase enterRate
654+
* (1 - unFeeRate enterFeeRate)
655+
exitGrossGain :: MoneyAmount
656+
exitGrossGain =
657+
--
658+
-- Buy = Quote
659+
-- Sell = Base
660+
--
661+
MoneyAmount
662+
$ unMoneyAmount enterNetLoss
663+
* (1 + unProfitRate profitRate)
664+
/ (1 - unFeeRate exitFeeRate)
665+
exitGrossBase :: MoneyAmount
666+
exitGrossBase =
667+
case enterBos of
668+
Buy -> enterNetGain
669+
Sell -> exitGrossGain
670+
exitGrossQuote :: MoneyAmount
671+
exitGrossQuote =
672+
case enterBos of
673+
Buy -> exitGrossGain
674+
Sell -> enterNetGain
675+
enterFeeRate :: FeeRate
676+
enterFeeRate = mkCounterOrderEnterFee args
677+
exitFeeRate :: FeeRate
678+
exitFeeRate = mkCounterOrderExitFee args
679+
profitRate :: ProfitRate
680+
profitRate = mkCounterOrderProfit args

pub/bfx/src/Bfx/Math.hs

Lines changed: 0 additions & 116 deletions
Original file line numberDiff line numberDiff line change
@@ -5,10 +5,6 @@ module Bfx.Math
55
roundQuotePerBase,
66
tweakMoneyAmount,
77
tweakQuotePerBase,
8-
CounterArgs (..),
9-
CounterRates (..),
10-
CounterExit (..),
11-
mkCounterOrder,
128
)
139
where
1410

@@ -104,115 +100,3 @@ tweakQuotePerBaseRec prev tweak = do
104100
if next /= prev
105101
then pure next
106102
else tweakQuotePerBaseRec prev $ tweak . tweak
107-
108-
data CounterArgs = CounterArgs
109-
{ counterArgsEnterBuyOrSell :: BuyOrSell,
110-
counterArgsEnterGrossBase :: MoneyAmount,
111-
counterArgsEnterQuotePerBase :: QuotePerBase,
112-
counterArgsRates :: CounterRates
113-
}
114-
deriving stock
115-
( Eq,
116-
Ord,
117-
Show,
118-
Read,
119-
Data,
120-
Generic
121-
)
122-
123-
data CounterRates = CounterRates
124-
{ counterRatesFee :: FeeRate,
125-
counterRatesProfit :: ProfitRate
126-
}
127-
deriving stock
128-
( Eq,
129-
Ord,
130-
Show,
131-
Read,
132-
Data,
133-
Generic
134-
)
135-
136-
data CounterExit = CounterExit
137-
{ counterExitBuyOrSell :: BuyOrSell,
138-
counterExitGrossBase :: MoneyAmount,
139-
counterExitQuotePerBase :: QuotePerBase
140-
}
141-
deriving stock
142-
( Eq,
143-
Ord,
144-
Show,
145-
Read,
146-
Data,
147-
Generic
148-
)
149-
150-
mkCounterOrder :: (MonadThrow m) => CounterArgs -> m CounterExit
151-
mkCounterOrder args = do
152-
let exitBos = nextEnum enterBos
153-
exitBase <-
154-
tweakMoneyAmount exitBos exitGrossBase
155-
exitRate <-
156-
roundQuotePerBase
157-
. QuotePerBase
158-
$ unMoneyAmount exitGrossQuote
159-
/ unMoneyAmount exitBase
160-
pure
161-
CounterExit
162-
{ counterExitBuyOrSell = exitBos,
163-
counterExitGrossBase = exitBase,
164-
counterExitQuotePerBase = exitRate
165-
}
166-
where
167-
enterBos :: BuyOrSell
168-
enterBos = counterArgsEnterBuyOrSell args
169-
enterRate :: QuotePerBase
170-
enterRate = counterArgsEnterQuotePerBase args
171-
enterBase :: MoneyAmount
172-
enterBase = counterArgsEnterGrossBase args
173-
enterNetLoss :: MoneyAmount
174-
enterNetLoss =
175-
MoneyAmount $ case enterBos of
176-
Buy ->
177-
-- Quote
178-
unMoneyAmount enterBase
179-
* unQuotePerBase enterRate
180-
Sell ->
181-
-- Base
182-
unMoneyAmount enterBase
183-
enterNetGain :: MoneyAmount
184-
enterNetGain =
185-
MoneyAmount $ case enterBos of
186-
Buy ->
187-
-- Base
188-
unMoneyAmount enterBase
189-
* (1 - unFeeRate feeRate)
190-
Sell ->
191-
-- Quote
192-
unMoneyAmount enterBase
193-
* unQuotePerBase enterRate
194-
* (1 - unFeeRate feeRate)
195-
exitGrossGain :: MoneyAmount
196-
exitGrossGain =
197-
--
198-
-- Buy = Quote
199-
-- Sell = Base
200-
--
201-
MoneyAmount
202-
$ unMoneyAmount enterNetLoss
203-
* (1 + unProfitRate profitRate)
204-
/ (1 - unFeeRate feeRate)
205-
exitGrossBase :: MoneyAmount
206-
exitGrossBase =
207-
case enterBos of
208-
Buy -> enterNetGain
209-
Sell -> exitGrossGain
210-
exitGrossQuote :: MoneyAmount
211-
exitGrossQuote =
212-
case enterBos of
213-
Buy -> exitGrossGain
214-
Sell -> enterNetGain
215-
feeRate :: FeeRate
216-
feeRate = counterRatesFee $ counterArgsRates args
217-
profitRate :: ProfitRate
218-
profitRate = counterRatesProfit $ counterArgsRates args

0 commit comments

Comments
 (0)