mirror of
https://github.com/c9s/bbgo.git
synced 2024-11-10 09:11:55 +00:00
Compare commits
1 Commits
924a3f613d
...
359dc952a5
Author | SHA1 | Date | |
---|---|---|---|
|
359dc952a5 |
|
@ -58,4 +58,4 @@ bbgo [flags]
|
||||||
* [bbgo userdatastream](bbgo_userdatastream.md) - Listen to session events (orderUpdate, tradeUpdate, balanceUpdate, balanceSnapshot)
|
* [bbgo userdatastream](bbgo_userdatastream.md) - Listen to session events (orderUpdate, tradeUpdate, balanceUpdate, balanceSnapshot)
|
||||||
* [bbgo version](bbgo_version.md) - show version name
|
* [bbgo version](bbgo_version.md) - show version name
|
||||||
|
|
||||||
###### Auto generated by spf13/cobra on 4-Sep-2024
|
###### Auto generated by spf13/cobra on 21-Aug-2024
|
||||||
|
|
|
@ -41,4 +41,4 @@ bbgo account [--session SESSION] [flags]
|
||||||
|
|
||||||
* [bbgo](bbgo.md) - bbgo is a crypto trading bot
|
* [bbgo](bbgo.md) - bbgo is a crypto trading bot
|
||||||
|
|
||||||
###### Auto generated by spf13/cobra on 4-Sep-2024
|
###### Auto generated by spf13/cobra on 21-Aug-2024
|
||||||
|
|
|
@ -50,4 +50,4 @@ bbgo backtest [flags]
|
||||||
|
|
||||||
* [bbgo](bbgo.md) - bbgo is a crypto trading bot
|
* [bbgo](bbgo.md) - bbgo is a crypto trading bot
|
||||||
|
|
||||||
###### Auto generated by spf13/cobra on 4-Sep-2024
|
###### Auto generated by spf13/cobra on 21-Aug-2024
|
||||||
|
|
|
@ -40,4 +40,4 @@ bbgo balances [--session SESSION] [flags]
|
||||||
|
|
||||||
* [bbgo](bbgo.md) - bbgo is a crypto trading bot
|
* [bbgo](bbgo.md) - bbgo is a crypto trading bot
|
||||||
|
|
||||||
###### Auto generated by spf13/cobra on 4-Sep-2024
|
###### Auto generated by spf13/cobra on 21-Aug-2024
|
||||||
|
|
|
@ -39,4 +39,4 @@ bbgo build [flags]
|
||||||
|
|
||||||
* [bbgo](bbgo.md) - bbgo is a crypto trading bot
|
* [bbgo](bbgo.md) - bbgo is a crypto trading bot
|
||||||
|
|
||||||
###### Auto generated by spf13/cobra on 4-Sep-2024
|
###### Auto generated by spf13/cobra on 21-Aug-2024
|
||||||
|
|
|
@ -49,4 +49,4 @@ bbgo cancel-order [flags]
|
||||||
|
|
||||||
* [bbgo](bbgo.md) - bbgo is a crypto trading bot
|
* [bbgo](bbgo.md) - bbgo is a crypto trading bot
|
||||||
|
|
||||||
###### Auto generated by spf13/cobra on 4-Sep-2024
|
###### Auto generated by spf13/cobra on 21-Aug-2024
|
||||||
|
|
|
@ -41,4 +41,4 @@ bbgo deposits [flags]
|
||||||
|
|
||||||
* [bbgo](bbgo.md) - bbgo is a crypto trading bot
|
* [bbgo](bbgo.md) - bbgo is a crypto trading bot
|
||||||
|
|
||||||
###### Auto generated by spf13/cobra on 4-Sep-2024
|
###### Auto generated by spf13/cobra on 21-Aug-2024
|
||||||
|
|
|
@ -9,18 +9,16 @@ bbgo execute-order --session SESSION --symbol SYMBOL --side SIDE --target-quanti
|
||||||
### Options
|
### Options
|
||||||
|
|
||||||
```
|
```
|
||||||
--deadline duration deadline duration of the order execution, e.g. 1h
|
--deadline duration deadline of the order execution
|
||||||
--delay-interval duration order delay time after filled (default 3s)
|
-h, --help help for execute-order
|
||||||
-h, --help help for execute-order
|
--price-ticks int the number of price tick for the jump spread, default to 0
|
||||||
--order-update-rate-limit string order update rate limit, syntax: 1+1/1m (default "1s")
|
--session string the exchange session name for sync
|
||||||
--price-ticks int the number of price tick for the jump spread, default to 0
|
--side string the trading side: buy or sell
|
||||||
--session string the exchange session name for sync
|
--slice-quantity string slice quantity
|
||||||
--side string the trading side: buy or sell
|
--stop-price string stop price (default "0")
|
||||||
--slice-quantity string slice quantity
|
--symbol string the trading pair, like btcusdt
|
||||||
--stop-price string stop price (default "0")
|
--target-quantity string target quantity
|
||||||
--symbol string the trading pair, like btcusdt
|
--update-interval duration order update time (default 10s)
|
||||||
--target-quantity string target quantity
|
|
||||||
--update-interval duration order update time (default 10s)
|
|
||||||
```
|
```
|
||||||
|
|
||||||
### Options inherited from parent commands
|
### Options inherited from parent commands
|
||||||
|
@ -50,4 +48,4 @@ bbgo execute-order --session SESSION --symbol SYMBOL --side SIDE --target-quanti
|
||||||
|
|
||||||
* [bbgo](bbgo.md) - bbgo is a crypto trading bot
|
* [bbgo](bbgo.md) - bbgo is a crypto trading bot
|
||||||
|
|
||||||
###### Auto generated by spf13/cobra on 4-Sep-2024
|
###### Auto generated by spf13/cobra on 21-Aug-2024
|
||||||
|
|
|
@ -42,4 +42,4 @@ bbgo get-order --session SESSION --order-id ORDER_ID [flags]
|
||||||
|
|
||||||
* [bbgo](bbgo.md) - bbgo is a crypto trading bot
|
* [bbgo](bbgo.md) - bbgo is a crypto trading bot
|
||||||
|
|
||||||
###### Auto generated by spf13/cobra on 4-Sep-2024
|
###### Auto generated by spf13/cobra on 21-Aug-2024
|
||||||
|
|
|
@ -45,4 +45,4 @@ bbgo hoptimize [flags]
|
||||||
|
|
||||||
* [bbgo](bbgo.md) - bbgo is a crypto trading bot
|
* [bbgo](bbgo.md) - bbgo is a crypto trading bot
|
||||||
|
|
||||||
###### Auto generated by spf13/cobra on 4-Sep-2024
|
###### Auto generated by spf13/cobra on 21-Aug-2024
|
||||||
|
|
|
@ -42,4 +42,4 @@ bbgo kline [flags]
|
||||||
|
|
||||||
* [bbgo](bbgo.md) - bbgo is a crypto trading bot
|
* [bbgo](bbgo.md) - bbgo is a crypto trading bot
|
||||||
|
|
||||||
###### Auto generated by spf13/cobra on 4-Sep-2024
|
###### Auto generated by spf13/cobra on 21-Aug-2024
|
||||||
|
|
|
@ -41,4 +41,4 @@ bbgo list-orders open|closed --session SESSION --symbol SYMBOL [flags]
|
||||||
|
|
||||||
* [bbgo](bbgo.md) - bbgo is a crypto trading bot
|
* [bbgo](bbgo.md) - bbgo is a crypto trading bot
|
||||||
|
|
||||||
###### Auto generated by spf13/cobra on 4-Sep-2024
|
###### Auto generated by spf13/cobra on 21-Aug-2024
|
||||||
|
|
|
@ -38,4 +38,4 @@ margin related history
|
||||||
* [bbgo margin loans](bbgo_margin_loans.md) - query loans history
|
* [bbgo margin loans](bbgo_margin_loans.md) - query loans history
|
||||||
* [bbgo margin repays](bbgo_margin_repays.md) - query repay history
|
* [bbgo margin repays](bbgo_margin_repays.md) - query repay history
|
||||||
|
|
||||||
###### Auto generated by spf13/cobra on 4-Sep-2024
|
###### Auto generated by spf13/cobra on 21-Aug-2024
|
||||||
|
|
|
@ -41,4 +41,4 @@ bbgo margin interests --session=SESSION_NAME --asset=ASSET [flags]
|
||||||
|
|
||||||
* [bbgo margin](bbgo_margin.md) - margin related history
|
* [bbgo margin](bbgo_margin.md) - margin related history
|
||||||
|
|
||||||
###### Auto generated by spf13/cobra on 4-Sep-2024
|
###### Auto generated by spf13/cobra on 21-Aug-2024
|
||||||
|
|
|
@ -41,4 +41,4 @@ bbgo margin loans --session=SESSION_NAME --asset=ASSET [flags]
|
||||||
|
|
||||||
* [bbgo margin](bbgo_margin.md) - margin related history
|
* [bbgo margin](bbgo_margin.md) - margin related history
|
||||||
|
|
||||||
###### Auto generated by spf13/cobra on 4-Sep-2024
|
###### Auto generated by spf13/cobra on 21-Aug-2024
|
||||||
|
|
|
@ -41,4 +41,4 @@ bbgo margin repays --session=SESSION_NAME --asset=ASSET [flags]
|
||||||
|
|
||||||
* [bbgo margin](bbgo_margin.md) - margin related history
|
* [bbgo margin](bbgo_margin.md) - margin related history
|
||||||
|
|
||||||
###### Auto generated by spf13/cobra on 4-Sep-2024
|
###### Auto generated by spf13/cobra on 21-Aug-2024
|
||||||
|
|
|
@ -40,4 +40,4 @@ bbgo market [flags]
|
||||||
|
|
||||||
* [bbgo](bbgo.md) - bbgo is a crypto trading bot
|
* [bbgo](bbgo.md) - bbgo is a crypto trading bot
|
||||||
|
|
||||||
###### Auto generated by spf13/cobra on 4-Sep-2024
|
###### Auto generated by spf13/cobra on 21-Aug-2024
|
||||||
|
|
|
@ -44,4 +44,4 @@ bbgo optimize [flags]
|
||||||
|
|
||||||
* [bbgo](bbgo.md) - bbgo is a crypto trading bot
|
* [bbgo](bbgo.md) - bbgo is a crypto trading bot
|
||||||
|
|
||||||
###### Auto generated by spf13/cobra on 4-Sep-2024
|
###### Auto generated by spf13/cobra on 21-Aug-2024
|
||||||
|
|
|
@ -42,4 +42,4 @@ bbgo orderbook --session=[exchange_name] --symbol=[pair_name] [flags]
|
||||||
|
|
||||||
* [bbgo](bbgo.md) - bbgo is a crypto trading bot
|
* [bbgo](bbgo.md) - bbgo is a crypto trading bot
|
||||||
|
|
||||||
###### Auto generated by spf13/cobra on 4-Sep-2024
|
###### Auto generated by spf13/cobra on 21-Aug-2024
|
||||||
|
|
|
@ -40,4 +40,4 @@ bbgo orderupdate [flags]
|
||||||
|
|
||||||
* [bbgo](bbgo.md) - bbgo is a crypto trading bot
|
* [bbgo](bbgo.md) - bbgo is a crypto trading bot
|
||||||
|
|
||||||
###### Auto generated by spf13/cobra on 4-Sep-2024
|
###### Auto generated by spf13/cobra on 21-Aug-2024
|
||||||
|
|
|
@ -49,4 +49,4 @@ bbgo pnl [flags]
|
||||||
|
|
||||||
* [bbgo](bbgo.md) - bbgo is a crypto trading bot
|
* [bbgo](bbgo.md) - bbgo is a crypto trading bot
|
||||||
|
|
||||||
###### Auto generated by spf13/cobra on 4-Sep-2024
|
###### Auto generated by spf13/cobra on 21-Aug-2024
|
||||||
|
|
|
@ -51,4 +51,4 @@ bbgo run [flags]
|
||||||
|
|
||||||
* [bbgo](bbgo.md) - bbgo is a crypto trading bot
|
* [bbgo](bbgo.md) - bbgo is a crypto trading bot
|
||||||
|
|
||||||
###### Auto generated by spf13/cobra on 4-Sep-2024
|
###### Auto generated by spf13/cobra on 21-Aug-2024
|
||||||
|
|
|
@ -46,4 +46,4 @@ bbgo submit-order --session SESSION --symbol SYMBOL --side SIDE --quantity QUANT
|
||||||
|
|
||||||
* [bbgo](bbgo.md) - bbgo is a crypto trading bot
|
* [bbgo](bbgo.md) - bbgo is a crypto trading bot
|
||||||
|
|
||||||
###### Auto generated by spf13/cobra on 4-Sep-2024
|
###### Auto generated by spf13/cobra on 21-Aug-2024
|
||||||
|
|
|
@ -42,4 +42,4 @@ bbgo sync [--session=[exchange_name]] [--symbol=[pair_name]] [[--since=yyyy/mm/d
|
||||||
|
|
||||||
* [bbgo](bbgo.md) - bbgo is a crypto trading bot
|
* [bbgo](bbgo.md) - bbgo is a crypto trading bot
|
||||||
|
|
||||||
###### Auto generated by spf13/cobra on 4-Sep-2024
|
###### Auto generated by spf13/cobra on 21-Aug-2024
|
||||||
|
|
|
@ -42,4 +42,4 @@ bbgo trades --session=[exchange_name] --symbol=[pair_name] [flags]
|
||||||
|
|
||||||
* [bbgo](bbgo.md) - bbgo is a crypto trading bot
|
* [bbgo](bbgo.md) - bbgo is a crypto trading bot
|
||||||
|
|
||||||
###### Auto generated by spf13/cobra on 4-Sep-2024
|
###### Auto generated by spf13/cobra on 21-Aug-2024
|
||||||
|
|
|
@ -40,4 +40,4 @@ bbgo tradeupdate --session=[exchange_name] [flags]
|
||||||
|
|
||||||
* [bbgo](bbgo.md) - bbgo is a crypto trading bot
|
* [bbgo](bbgo.md) - bbgo is a crypto trading bot
|
||||||
|
|
||||||
###### Auto generated by spf13/cobra on 4-Sep-2024
|
###### Auto generated by spf13/cobra on 21-Aug-2024
|
||||||
|
|
|
@ -42,4 +42,4 @@ bbgo transfer-history [flags]
|
||||||
|
|
||||||
* [bbgo](bbgo.md) - bbgo is a crypto trading bot
|
* [bbgo](bbgo.md) - bbgo is a crypto trading bot
|
||||||
|
|
||||||
###### Auto generated by spf13/cobra on 4-Sep-2024
|
###### Auto generated by spf13/cobra on 21-Aug-2024
|
||||||
|
|
|
@ -40,4 +40,4 @@ bbgo userdatastream [flags]
|
||||||
|
|
||||||
* [bbgo](bbgo.md) - bbgo is a crypto trading bot
|
* [bbgo](bbgo.md) - bbgo is a crypto trading bot
|
||||||
|
|
||||||
###### Auto generated by spf13/cobra on 4-Sep-2024
|
###### Auto generated by spf13/cobra on 21-Aug-2024
|
||||||
|
|
|
@ -39,4 +39,4 @@ bbgo version [flags]
|
||||||
|
|
||||||
* [bbgo](bbgo.md) - bbgo is a crypto trading bot
|
* [bbgo](bbgo.md) - bbgo is a crypto trading bot
|
||||||
|
|
||||||
###### Auto generated by spf13/cobra on 4-Sep-2024
|
###### Auto generated by spf13/cobra on 21-Aug-2024
|
||||||
|
|
|
@ -1,35 +0,0 @@
|
||||||
## Fixes
|
|
||||||
|
|
||||||
- fixed xmaker bugs
|
|
||||||
- updated helm chart for sync cronjob
|
|
||||||
- fixed max deposits api
|
|
||||||
|
|
||||||
[Full Changelog](https://github.com/c9s/bbgo/compare/v1.60.0...main)
|
|
||||||
|
|
||||||
- [#1727](https://github.com/c9s/bbgo/pull/1727): FIX: update timeInForce for binance margin order
|
|
||||||
- [#1729](https://github.com/c9s/bbgo/pull/1729): FIX: [max] fix v3 deposit state conversion
|
|
||||||
- [#1723](https://github.com/c9s/bbgo/pull/1723): FIX: [xmaker] avoid calculate margin from 0.0 signal
|
|
||||||
- [#1721](https://github.com/c9s/bbgo/pull/1721): FIX: [xmaker] fix aggregatePrice method
|
|
||||||
- [#1725](https://github.com/c9s/bbgo/pull/1725): IMPROVE: [xmaker] improve hedge margin account leverage calculation
|
|
||||||
- [#1722](https://github.com/c9s/bbgo/pull/1722): FEATURE: [xmaker] add signals
|
|
||||||
- [#1720](https://github.com/c9s/bbgo/pull/1720): FEATURE: [xmaker] margin credit improvement
|
|
||||||
- [#1718](https://github.com/c9s/bbgo/pull/1718): FEATURE: [xmaker] add more config metrics
|
|
||||||
- [#1719](https://github.com/c9s/bbgo/pull/1719): IMPROVE: [xmaker] fix bollinger band price calculation
|
|
||||||
- [#1709](https://github.com/c9s/bbgo/pull/1709): IMPROVE: [xmaker] improve profit stats ticker and integrate rate limiter
|
|
||||||
- [#1708](https://github.com/c9s/bbgo/pull/1708): FEATURE: [xmaker] integrate circuit breaker
|
|
||||||
- [#1712](https://github.com/c9s/bbgo/pull/1712): FEATURE: [xmaker] add profit fixer
|
|
||||||
- [#1710](https://github.com/c9s/bbgo/pull/1710): IMPROVE: [xmaker] improve stability
|
|
||||||
- [#1717](https://github.com/c9s/bbgo/pull/1717): REFACTOR: [xmaker] refactor hedge worker and quote worker
|
|
||||||
- [#1716](https://github.com/c9s/bbgo/pull/1716): FIX: [xmaker] profit object can be nil
|
|
||||||
- [#1707](https://github.com/c9s/bbgo/pull/1707): FIX: [xmaker] position metrics missing label
|
|
||||||
- [#1715](https://github.com/c9s/bbgo/pull/1715): UPGRADE: [go] upgrade packages that are too old
|
|
||||||
- [#1713](https://github.com/c9s/bbgo/pull/1713): FEATURE: [chart] add env vars section
|
|
||||||
- [#1711](https://github.com/c9s/bbgo/pull/1711): FEATURE: [binance] add new margin order side effect AUTO_BORROW_REPAY
|
|
||||||
- [#1705](https://github.com/c9s/bbgo/pull/1705): FIX: [k8s] fix sync.enabled option
|
|
||||||
- [#1704](https://github.com/c9s/bbgo/pull/1704): FEATURE: [k8s] add cronjob for sync
|
|
||||||
- [#1700](https://github.com/c9s/bbgo/pull/1700): Fix: [autobuy] fix error when bollinger settings is not set
|
|
||||||
- [#1703](https://github.com/c9s/bbgo/pull/1703): FEATURE: [core] add position metrics
|
|
||||||
- [#1702](https://github.com/c9s/bbgo/pull/1702): IMPROVE: improve balance related metrics
|
|
||||||
- [#1699](https://github.com/c9s/bbgo/pull/1699): REFACTOR: [twap] upgrade twap command and add optional order update rate limiter
|
|
||||||
- [#1701](https://github.com/c9s/bbgo/pull/1701): RELEASE: v1.60.0
|
|
||||||
- [#1714](https://github.com/c9s/bbgo/pull/1714): dep: bump actions/setup-node from 2 to 4
|
|
|
@ -1005,13 +1005,16 @@ func (e *Exchange) submitMarginOrder(ctx context.Context, order types.SubmitOrde
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if len(order.TimeInForce) > 0 {
|
// could be IOC or FOK
|
||||||
// TODO: check the TimeInForce value
|
switch order.Type {
|
||||||
req.TimeInForce(binance.TimeInForceType(order.TimeInForce))
|
case types.OrderTypeLimit, types.OrderTypeStopLimit:
|
||||||
} else {
|
req.TimeInForce(binance.TimeInForceTypeGTC)
|
||||||
switch order.Type {
|
case types.OrderTypeLimitMaker:
|
||||||
case types.OrderTypeLimit, types.OrderTypeStopLimit:
|
// do not set TimeInForce for LimitMaker
|
||||||
req.TimeInForce(binance.TimeInForceTypeGTC)
|
default:
|
||||||
|
if len(order.TimeInForce) > 0 {
|
||||||
|
// TODO: check the TimeInForce value
|
||||||
|
req.TimeInForce(binance.TimeInForceType(order.TimeInForce))
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -247,6 +247,29 @@ func toGlobalTradeV3(t v3.Trade) ([]types.Trade, error) {
|
||||||
return trades, nil
|
return trades, nil
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func toGlobalTradeV2(t max.Trade) (*types.Trade, error) {
|
||||||
|
isMargin := t.WalletType == max.WalletTypeMargin
|
||||||
|
side := toGlobalSideType(t.Side)
|
||||||
|
return &types.Trade{
|
||||||
|
ID: t.ID,
|
||||||
|
OrderID: t.OrderID,
|
||||||
|
Price: t.Price,
|
||||||
|
Symbol: toGlobalSymbol(t.Market),
|
||||||
|
Exchange: types.ExchangeMax,
|
||||||
|
Quantity: t.Volume,
|
||||||
|
Side: side,
|
||||||
|
IsBuyer: t.IsBuyer(),
|
||||||
|
IsMaker: t.IsMaker(),
|
||||||
|
Fee: t.Fee,
|
||||||
|
FeeCurrency: toGlobalCurrency(t.FeeCurrency),
|
||||||
|
QuoteQuantity: t.Funds,
|
||||||
|
Time: types.Time(t.CreatedAt),
|
||||||
|
IsMargin: isMargin,
|
||||||
|
IsIsolated: false,
|
||||||
|
IsFutures: false,
|
||||||
|
}, nil
|
||||||
|
}
|
||||||
|
|
||||||
func toGlobalDepositStatus(a max.DepositState) types.DepositStatus {
|
func toGlobalDepositStatus(a max.DepositState) types.DepositStatus {
|
||||||
switch a {
|
switch a {
|
||||||
|
|
||||||
|
@ -261,21 +284,11 @@ func toGlobalDepositStatus(a max.DepositState) types.DepositStatus {
|
||||||
|
|
||||||
case max.DepositStateAccepted:
|
case max.DepositStateAccepted:
|
||||||
return types.DepositSuccess
|
return types.DepositSuccess
|
||||||
|
|
||||||
case max.DepositStateFailed: // v3 state
|
|
||||||
return types.DepositRejected
|
|
||||||
|
|
||||||
case max.DepositStateProcessing: // v3 states
|
|
||||||
return types.DepositPending
|
|
||||||
|
|
||||||
case max.DepositStateDone: // v3 states
|
|
||||||
return types.DepositSuccess
|
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
// other states goes to this
|
// other states goes to this
|
||||||
// max.DepositStateSuspect, max.DepositStateSuspended
|
// max.DepositStateSuspect, max.DepositStateSuspended
|
||||||
log.Errorf("unsupported deposit state %q from max exchange", a)
|
log.Warnf("unsupported deposit state %q from max exchange", a)
|
||||||
return types.DepositStatus(a)
|
return types.DepositStatus(a)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -116,11 +116,6 @@ const (
|
||||||
DepositStateSuspended DepositState = "suspended"
|
DepositStateSuspended DepositState = "suspended"
|
||||||
DepositStateAccepted DepositState = "accepted"
|
DepositStateAccepted DepositState = "accepted"
|
||||||
DepositStateChecking DepositState = "checking"
|
DepositStateChecking DepositState = "checking"
|
||||||
|
|
||||||
// v3 states
|
|
||||||
DepositStateProcessing DepositState = "processing"
|
|
||||||
DepositStateFailed DepositState = "failed"
|
|
||||||
DepositStateDone DepositState = "done"
|
|
||||||
)
|
)
|
||||||
|
|
||||||
type Deposit struct {
|
type Deposit struct {
|
||||||
|
|
|
@ -77,7 +77,7 @@ type Strategy struct {
|
||||||
// boll is the BOLLINGER indicator we used for predicting the price.
|
// boll is the BOLLINGER indicator we used for predicting the price.
|
||||||
boll *indicator.BOLL
|
boll *indicator.BOLL
|
||||||
|
|
||||||
CancelProfitOrdersOnShutdown bool `json:"shutdownCancelProfitOrders"`
|
CancelProfitOrdersOnShutdown bool `json: "shutdownCancelProfitOrders"`
|
||||||
}
|
}
|
||||||
|
|
||||||
func (s *Strategy) ID() string {
|
func (s *Strategy) ID() string {
|
||||||
|
|
|
@ -236,7 +236,7 @@ func (s *Strategy) scanDepositHistory(ctx context.Context, asset string, duratio
|
||||||
s.watchingDeposits[deposit.TransactionID] = deposit
|
s.watchingDeposits[deposit.TransactionID] = deposit
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
// ignore all initial deposits that are already in success status
|
// ignore all initial deposit history that are already success
|
||||||
logger.Infof("ignored succeess deposit: %s %+v", deposit.TransactionID, deposit)
|
logger.Infof("ignored succeess deposit: %s %+v", deposit.TransactionID, deposit)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -1,111 +0,0 @@
|
||||||
package xmaker
|
|
||||||
|
|
||||||
import (
|
|
||||||
"context"
|
|
||||||
"sync"
|
|
||||||
"time"
|
|
||||||
|
|
||||||
"github.com/prometheus/client_golang/prometheus"
|
|
||||||
|
|
||||||
"github.com/c9s/bbgo/pkg/bbgo"
|
|
||||||
"github.com/c9s/bbgo/pkg/fixedpoint"
|
|
||||||
"github.com/c9s/bbgo/pkg/types"
|
|
||||||
)
|
|
||||||
|
|
||||||
var tradeVolumeWindowSignalMetrics = prometheus.NewGaugeVec(
|
|
||||||
prometheus.GaugeOpts{
|
|
||||||
Name: "xmaker_trade_volume_window_signal",
|
|
||||||
Help: "",
|
|
||||||
}, []string{"symbol"})
|
|
||||||
|
|
||||||
func init() {
|
|
||||||
prometheus.MustRegister(tradeVolumeWindowSignalMetrics)
|
|
||||||
}
|
|
||||||
|
|
||||||
type TradeVolumeWindowSignal struct {
|
|
||||||
Threshold fixedpoint.Value `json:"threshold"`
|
|
||||||
Window types.Duration `json:"window"`
|
|
||||||
|
|
||||||
trades []types.Trade
|
|
||||||
symbol string
|
|
||||||
|
|
||||||
mu sync.Mutex
|
|
||||||
}
|
|
||||||
|
|
||||||
func (s *TradeVolumeWindowSignal) handleTrade(trade types.Trade) {
|
|
||||||
s.mu.Lock()
|
|
||||||
s.trades = append(s.trades, trade)
|
|
||||||
s.mu.Unlock()
|
|
||||||
}
|
|
||||||
|
|
||||||
func (s *TradeVolumeWindowSignal) Bind(ctx context.Context, session *bbgo.ExchangeSession, symbol string) error {
|
|
||||||
s.symbol = symbol
|
|
||||||
|
|
||||||
if s.Window == 0 {
|
|
||||||
s.Window = types.Duration(time.Minute)
|
|
||||||
}
|
|
||||||
|
|
||||||
if s.Threshold.IsZero() {
|
|
||||||
s.Threshold = fixedpoint.NewFromFloat(0.7)
|
|
||||||
}
|
|
||||||
|
|
||||||
session.MarketDataStream.OnMarketTrade(s.handleTrade)
|
|
||||||
return nil
|
|
||||||
}
|
|
||||||
|
|
||||||
func (s *TradeVolumeWindowSignal) filterTrades(now time.Time) []types.Trade {
|
|
||||||
startTime := now.Add(-time.Duration(s.Window))
|
|
||||||
startIdx := 0
|
|
||||||
|
|
||||||
s.mu.Lock()
|
|
||||||
defer s.mu.Unlock()
|
|
||||||
|
|
||||||
for idx, td := range s.trades {
|
|
||||||
// skip trades before the start time
|
|
||||||
if td.Time.Before(startTime) {
|
|
||||||
continue
|
|
||||||
}
|
|
||||||
|
|
||||||
startIdx = idx
|
|
||||||
break
|
|
||||||
}
|
|
||||||
|
|
||||||
trades := s.trades[startIdx:]
|
|
||||||
s.trades = trades
|
|
||||||
return trades
|
|
||||||
}
|
|
||||||
|
|
||||||
func (s *TradeVolumeWindowSignal) aggTradeVolume(trades []types.Trade) (buyVolume, sellVolume float64) {
|
|
||||||
for _, td := range trades {
|
|
||||||
if td.IsBuyer {
|
|
||||||
buyVolume += td.Quantity.Float64()
|
|
||||||
} else {
|
|
||||||
sellVolume += td.Quantity.Float64()
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
return buyVolume, sellVolume
|
|
||||||
}
|
|
||||||
|
|
||||||
func (s *TradeVolumeWindowSignal) CalculateSignal(_ context.Context) (float64, error) {
|
|
||||||
now := time.Now()
|
|
||||||
trades := s.filterTrades(now)
|
|
||||||
buyVolume, sellVolume := s.aggTradeVolume(trades)
|
|
||||||
totalVolume := buyVolume + sellVolume
|
|
||||||
|
|
||||||
threshold := s.Threshold.Float64()
|
|
||||||
buyRatio := buyVolume / totalVolume
|
|
||||||
sellRatio := sellVolume / totalVolume
|
|
||||||
|
|
||||||
sig := 0.0
|
|
||||||
if buyRatio > threshold {
|
|
||||||
sig = (buyRatio - threshold) / 2.0
|
|
||||||
} else if sellRatio > threshold {
|
|
||||||
sig = -(sellRatio - threshold) / 2.0
|
|
||||||
}
|
|
||||||
|
|
||||||
log.Infof("[TradeVolumeWindowSignal] %f buy/sell = %f/%f", sig, buyVolume, sellVolume)
|
|
||||||
|
|
||||||
tradeVolumeWindowSignalMetrics.WithLabelValues(s.symbol).Set(sig)
|
|
||||||
return sig, nil
|
|
||||||
}
|
|
|
@ -1,55 +0,0 @@
|
||||||
package xmaker
|
|
||||||
|
|
||||||
import (
|
|
||||||
"context"
|
|
||||||
"testing"
|
|
||||||
"time"
|
|
||||||
|
|
||||||
"github.com/stretchr/testify/assert"
|
|
||||||
|
|
||||||
"github.com/c9s/bbgo/pkg/fixedpoint"
|
|
||||||
"github.com/c9s/bbgo/pkg/types"
|
|
||||||
|
|
||||||
. "github.com/c9s/bbgo/pkg/testing/testhelper"
|
|
||||||
)
|
|
||||||
|
|
||||||
var tradeId = 0
|
|
||||||
|
|
||||||
func Trade(symbol string, side types.SideType, price, quantity fixedpoint.Value, t time.Time) types.Trade {
|
|
||||||
tradeId++
|
|
||||||
return types.Trade{
|
|
||||||
ID: uint64(tradeId),
|
|
||||||
Symbol: symbol,
|
|
||||||
Side: side,
|
|
||||||
Price: price,
|
|
||||||
IsBuyer: side == types.SideTypeBuy,
|
|
||||||
Quantity: quantity,
|
|
||||||
Time: types.Time(t),
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
func TestMarketTradeWindowSignal(t *testing.T) {
|
|
||||||
now := time.Now()
|
|
||||||
symbol := "BTCUSDT"
|
|
||||||
sig := &TradeVolumeWindowSignal{
|
|
||||||
symbol: symbol,
|
|
||||||
Threshold: fixedpoint.NewFromFloat(0.65),
|
|
||||||
Window: types.Duration(time.Minute),
|
|
||||||
}
|
|
||||||
|
|
||||||
sig.trades = []types.Trade{
|
|
||||||
Trade(symbol, types.SideTypeBuy, Number(18000.0), Number(1.0), now.Add(-2*time.Minute)),
|
|
||||||
Trade(symbol, types.SideTypeSell, Number(18000.0), Number(0.5), now.Add(-2*time.Second)),
|
|
||||||
Trade(symbol, types.SideTypeBuy, Number(18000.0), Number(1.0), now.Add(-1*time.Second)),
|
|
||||||
}
|
|
||||||
|
|
||||||
ctx := context.Background()
|
|
||||||
sigNum, err := sig.CalculateSignal(ctx)
|
|
||||||
if assert.NoError(t, err) {
|
|
||||||
// buy ratio: 1/1.5 = 0.6666666666666666
|
|
||||||
// sell ratio: 0.5/1.5 = 0.3333333333333333
|
|
||||||
assert.InDelta(t, 0.0083333, sigNum, 0.0001)
|
|
||||||
}
|
|
||||||
|
|
||||||
assert.Len(t, sig.trades, 2)
|
|
||||||
}
|
|
|
@ -65,7 +65,6 @@ type SignalConfig struct {
|
||||||
BollingerBandTrendSignal *BollingerBandTrendSignal `json:"bollingerBandTrend,omitempty"`
|
BollingerBandTrendSignal *BollingerBandTrendSignal `json:"bollingerBandTrend,omitempty"`
|
||||||
OrderBookBestPriceSignal *OrderBookBestPriceVolumeSignal `json:"orderBookBestPrice,omitempty"`
|
OrderBookBestPriceSignal *OrderBookBestPriceVolumeSignal `json:"orderBookBestPrice,omitempty"`
|
||||||
KLineShapeSignal *KLineShapeSignal `json:"klineShape,omitempty"`
|
KLineShapeSignal *KLineShapeSignal `json:"klineShape,omitempty"`
|
||||||
TradeVolumeWindowSignal *TradeVolumeWindowSignal `json:"tradeVolumeWindow,omitempty"`
|
|
||||||
}
|
}
|
||||||
|
|
||||||
func init() {
|
func init() {
|
||||||
|
@ -206,14 +205,7 @@ func (s *Strategy) CrossSubscribe(sessions map[string]*bbgo.ExchangeSession) {
|
||||||
if !ok {
|
if !ok {
|
||||||
panic(fmt.Errorf("maker session %s is not defined", s.MakerExchange))
|
panic(fmt.Errorf("maker session %s is not defined", s.MakerExchange))
|
||||||
}
|
}
|
||||||
|
|
||||||
makerSession.Subscribe(types.KLineChannel, s.Symbol, types.SubscribeOptions{Interval: "1m"})
|
makerSession.Subscribe(types.KLineChannel, s.Symbol, types.SubscribeOptions{Interval: "1m"})
|
||||||
|
|
||||||
for _, sig := range s.SignalConfigList {
|
|
||||||
if sig.TradeVolumeWindowSignal != nil {
|
|
||||||
sourceSession.Subscribe(types.MarketTradeChannel, s.Symbol, types.SubscribeOptions{})
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
func aggregatePrice(pvs types.PriceVolumeSlice, requiredQuantity fixedpoint.Value) (price fixedpoint.Value) {
|
func aggregatePrice(pvs types.PriceVolumeSlice, requiredQuantity fixedpoint.Value) (price fixedpoint.Value) {
|
||||||
|
@ -371,35 +363,44 @@ func (s *Strategy) calculateSignal(ctx context.Context) (float64, error) {
|
||||||
sum := 0.0
|
sum := 0.0
|
||||||
voters := 0.0
|
voters := 0.0
|
||||||
for _, signal := range s.SignalConfigList {
|
for _, signal := range s.SignalConfigList {
|
||||||
var sig float64
|
|
||||||
var err error
|
|
||||||
if signal.OrderBookBestPriceSignal != nil {
|
if signal.OrderBookBestPriceSignal != nil {
|
||||||
sig, err = signal.OrderBookBestPriceSignal.CalculateSignal(ctx)
|
sig, err := signal.OrderBookBestPriceSignal.CalculateSignal(ctx)
|
||||||
|
if err != nil {
|
||||||
|
return 0, err
|
||||||
|
}
|
||||||
|
|
||||||
|
if sig == 0.0 {
|
||||||
|
continue
|
||||||
|
}
|
||||||
|
|
||||||
|
if signal.Weight > 0.0 {
|
||||||
|
sum += sig * signal.Weight
|
||||||
|
voters += signal.Weight
|
||||||
|
} else {
|
||||||
|
sum += sig
|
||||||
|
voters++
|
||||||
|
}
|
||||||
|
|
||||||
} else if signal.BollingerBandTrendSignal != nil {
|
} else if signal.BollingerBandTrendSignal != nil {
|
||||||
sig, err = signal.BollingerBandTrendSignal.CalculateSignal(ctx)
|
sig, err := signal.BollingerBandTrendSignal.CalculateSignal(ctx)
|
||||||
} else if signal.TradeVolumeWindowSignal != nil {
|
if err != nil {
|
||||||
sig, err = signal.TradeVolumeWindowSignal.CalculateSignal(ctx)
|
return 0, err
|
||||||
}
|
}
|
||||||
|
|
||||||
if err != nil {
|
if sig == 0.0 {
|
||||||
return 0, err
|
continue
|
||||||
} else if sig == 0.0 {
|
}
|
||||||
continue
|
|
||||||
}
|
|
||||||
|
|
||||||
if signal.Weight > 0.0 {
|
if signal.Weight > 0.0 {
|
||||||
sum += sig * signal.Weight
|
sum += sig * signal.Weight
|
||||||
voters += signal.Weight
|
voters += signal.Weight
|
||||||
} else {
|
} else {
|
||||||
sum += sig
|
sum += sig
|
||||||
voters++
|
voters++
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if sum == 0.0 {
|
|
||||||
return 0.0, nil
|
|
||||||
}
|
|
||||||
|
|
||||||
return sum / voters, nil
|
return sum / voters, nil
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -1373,10 +1374,6 @@ func (s *Strategy) CrossRun(
|
||||||
if err := signalConfig.BollingerBandTrendSignal.Bind(ctx, s.sourceSession, s.Symbol); err != nil {
|
if err := signalConfig.BollingerBandTrendSignal.Bind(ctx, s.sourceSession, s.Symbol); err != nil {
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
} else if signalConfig.TradeVolumeWindowSignal != nil {
|
|
||||||
if err := signalConfig.TradeVolumeWindowSignal.Bind(ctx, s.sourceSession, s.Symbol); err != nil {
|
|
||||||
return err
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -13,13 +13,6 @@ type PriceVolume struct {
|
||||||
Price, Volume fixedpoint.Value
|
Price, Volume fixedpoint.Value
|
||||||
}
|
}
|
||||||
|
|
||||||
func NewPriceVolume(p, v fixedpoint.Value) PriceVolume {
|
|
||||||
return PriceVolume{
|
|
||||||
Price: p,
|
|
||||||
Volume: v,
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
func (p PriceVolume) InQuote() fixedpoint.Value {
|
func (p PriceVolume) InQuote() fixedpoint.Value {
|
||||||
return p.Price.Mul(p.Volume)
|
return p.Price.Mul(p.Volume)
|
||||||
}
|
}
|
||||||
|
|
|
@ -3,6 +3,6 @@
|
||||||
|
|
||||||
package version
|
package version
|
||||||
|
|
||||||
const Version = "v1.60.1-ec68e3c5f-dev"
|
const Version = "v1.60.0-3a2e4dfd2-dev"
|
||||||
|
|
||||||
const VersionGitRef = "ec68e3c5f"
|
const VersionGitRef = "3a2e4dfd2"
|
||||||
|
|
|
@ -3,6 +3,6 @@
|
||||||
|
|
||||||
package version
|
package version
|
||||||
|
|
||||||
const Version = "v1.60.1-ec68e3c5f"
|
const Version = "v1.60.0-3a2e4dfd2"
|
||||||
|
|
||||||
const VersionGitRef = "ec68e3c5f"
|
const VersionGitRef = "3a2e4dfd2"
|
||||||
|
|
Loading…
Reference in New Issue
Block a user