Skip to content

Commit d4c7767

Browse files
author
Dmitry Petukhov
committed
Update strategy algo
1 parent 6a719ef commit d4c7767

2 files changed

Lines changed: 19 additions & 11 deletions

File tree

source/BinanceBot.Market/MarketDepthPair.cs

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,8 @@ public class MarketDepthPair
99
{
1010
public MarketDepthPair(Quote ask, Quote bid, long updateTime)
1111
{
12-
if (updateTime <= 0) throw new ArgumentOutOfRangeException(nameof(updateTime));
12+
if (updateTime <= 0)
13+
throw new ArgumentOutOfRangeException(nameof(updateTime));
1314

1415
Ask = ask;
1516
Bid = bid;

source/BinanceBot.Market/NaiveMarketMakerStrategy.cs

Lines changed: 17 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -37,25 +37,32 @@ public Quote Process(MarketDepthPair marketPair)
3737

3838
Quote quote = null;
3939

40-
// spread in percentage points: spread_in_pp = spread/price * 100
41-
decimal spreadInPP = marketPair.PriceSpread.Value / marketPair.MediumPrice.Value * 100;
4240

4341
_logger.Info($"Best ask / bid: {marketPair.Ask.Price} / {marketPair.Bid.Price}. Update Id: {marketPair.UpdateTime}.");
44-
_logger.Info($"Spread absolute / relative: {marketPair.PriceSpread} / {spreadInPP:F3}%. Update Id: {marketPair.UpdateTime}.");
4542

46-
if (spreadInPP >= _marketStrategyConfig.TradeWhenSpreadGreaterThan)
43+
// get price spreads (in percent)
44+
decimal actualSpread = marketPair.PriceSpread.Value / marketPair.MediumPrice.Value * 100; // spread_relative = spread_absolute/price * 100
45+
decimal expectedSpread = _marketStrategyConfig.TradeWhenSpreadGreaterThan;
46+
47+
_logger.Info($"Spread absolute / relative: {marketPair.PriceSpread} / {actualSpread:F3}%. Update Id: {marketPair.UpdateTime}.");
48+
49+
50+
if (actualSpread >= expectedSpread)
4751
{
48-
// compute order price
49-
decimal orderPrice = marketPair.Bid.Price + marketPair.MediumPrice.Value * _marketStrategyConfig.TradeWhenSpreadGreaterThan / 100;
52+
// compute new order price
53+
decimal extra = marketPair.MediumPrice.Value * (actualSpread - expectedSpread) / 100; // extra = medium_price * (spread_actual - spread_expected)
54+
decimal orderPrice = marketPair.Bid.Price + extra; // new_price = best_bid + extra
5055

5156
// compute order volume
52-
decimal orderVolume = marketPair.VolumeSpread.Value > _marketStrategyConfig.MaxOrderVolume
57+
decimal volumeSpread = marketPair.VolumeSpread.Value;
58+
decimal orderVolume = volumeSpread > _marketStrategyConfig.MaxOrderVolume
5359
? _marketStrategyConfig.MaxOrderVolume // set max volume
54-
: (marketPair.VolumeSpread.Value < _marketStrategyConfig.MinOrderVolume
60+
: (volumeSpread < _marketStrategyConfig.MinOrderVolume
5561
? _marketStrategyConfig.MinOrderVolume // set min volume
56-
: marketPair.VolumeSpread.Value);
62+
: volumeSpread);
63+
5764

58-
// return price-volume pair
65+
// return new price-volume pair
5966
quote = new Quote(orderPrice, orderVolume, OrderSide.Buy);
6067
}
6168

0 commit comments

Comments
 (0)