mirror of
https://github.com/c9s/bbgo.git
synced 2024-11-23 23:35:14 +00:00
fix: gosimple alert
This commit is contained in:
parent
f25f2f076f
commit
a5ffca7fe8
2
.gitignore
vendored
2
.gitignore
vendored
|
@ -42,6 +42,8 @@ otp*png
|
|||
|
||||
/.deploy
|
||||
|
||||
testoutput
|
||||
|
||||
*.swp
|
||||
/pkg/backtest/assets.go
|
||||
|
||||
|
|
|
@ -5,3 +5,4 @@ linters:
|
|||
disable-all: true
|
||||
enable:
|
||||
- gofmt
|
||||
- gosimple
|
||||
|
|
|
@ -11,10 +11,6 @@ import (
|
|||
"github.com/c9s/bbgo/pkg/types"
|
||||
)
|
||||
|
||||
func zero(a float64) bool {
|
||||
return int(math.Round(a*1e8)) == 0
|
||||
}
|
||||
|
||||
type Stock types.Trade
|
||||
|
||||
func (stock *Stock) String() string {
|
||||
|
|
|
@ -237,7 +237,6 @@ func (m *SimplePriceMatching) executeTrade(trade types.Trade) {
|
|||
|
||||
m.EmitTradeUpdate(trade)
|
||||
m.EmitBalanceUpdate(m.Account.Balances())
|
||||
return
|
||||
}
|
||||
|
||||
func (m *SimplePriceMatching) newTradeFromOrder(order *types.Order, isMaker bool) types.Trade {
|
||||
|
|
|
@ -859,7 +859,7 @@ func getAuthStoreID() string {
|
|||
}
|
||||
|
||||
func (environ *Environment) setupInteraction(persistence service.PersistenceService) error {
|
||||
var otpQRCodeImagePath = fmt.Sprintf("otp.png")
|
||||
var otpQRCodeImagePath = "otp.png"
|
||||
var key *otp.Key
|
||||
var keyURL string
|
||||
var authStore = environ.getAuthStore(persistence)
|
||||
|
|
|
@ -144,9 +144,8 @@ func (trader *Trader) AttachStrategyOn(session string, strategies ...SingleExcha
|
|||
return fmt.Errorf("session %s is not defined, valid sessions are: %v", session, keys)
|
||||
}
|
||||
|
||||
for _, s := range strategies {
|
||||
trader.exchangeStrategies[session] = append(trader.exchangeStrategies[session], s)
|
||||
}
|
||||
trader.exchangeStrategies[session] = append(
|
||||
trader.exchangeStrategies[session], strategies...)
|
||||
|
||||
return nil
|
||||
}
|
||||
|
|
|
@ -84,10 +84,7 @@ type Data struct {
|
|||
}
|
||||
|
||||
func (s Response) IsEmpty() bool {
|
||||
if len(s) == 0 {
|
||||
return true
|
||||
}
|
||||
return false
|
||||
return len(s) == 0
|
||||
}
|
||||
|
||||
func (s Response) First() Data {
|
||||
|
@ -120,8 +117,5 @@ func (s Response) LastOptions() map[string]float64 {
|
|||
}
|
||||
|
||||
func (s Response) HasOptions() bool {
|
||||
if len(s.First().Options) == 0 {
|
||||
return false
|
||||
}
|
||||
return true
|
||||
return len(s.First().Options) != 0
|
||||
}
|
||||
|
|
|
@ -82,7 +82,7 @@ func (d *datetime) UnmarshalJSON(b []byte) error {
|
|||
}
|
||||
}
|
||||
*/
|
||||
type accountResponse struct {
|
||||
type accountResponse struct { // nolint:golint,deadcode
|
||||
Success bool `json:"success"`
|
||||
Result account `json:"result"`
|
||||
}
|
||||
|
@ -93,7 +93,7 @@ type account struct {
|
|||
TotalAccountValue fixedpoint.Value `json:"totalAccountValue"`
|
||||
}
|
||||
|
||||
type positionsResponse struct {
|
||||
type positionsResponse struct { // nolint:golint,deadcode
|
||||
Success bool `json:"success"`
|
||||
Result []position `json:"result"`
|
||||
}
|
||||
|
@ -135,7 +135,7 @@ type position struct {
|
|||
CollateralUsed fixedpoint.Value `json:"collateralUsed"`
|
||||
}
|
||||
|
||||
type balances struct {
|
||||
type balances struct { // nolint:golint,deadcode
|
||||
Success bool `json:"success"`
|
||||
|
||||
Result []struct {
|
||||
|
@ -172,7 +172,7 @@ type balances struct {
|
|||
}
|
||||
]
|
||||
*/
|
||||
type marketsResponse struct {
|
||||
type marketsResponse struct { // nolint:golint,deadcode
|
||||
Success bool `json:"success"`
|
||||
Result []market `json:"result"`
|
||||
}
|
||||
|
@ -230,19 +230,19 @@ type Candle struct {
|
|||
Volume fixedpoint.Value `json:"volume"`
|
||||
}
|
||||
|
||||
type ordersHistoryResponse struct {
|
||||
type ordersHistoryResponse struct { // nolint:golint,deadcode
|
||||
Success bool `json:"success"`
|
||||
Result []order `json:"result"`
|
||||
HasMoreData bool `json:"hasMoreData"`
|
||||
}
|
||||
|
||||
type ordersResponse struct {
|
||||
type ordersResponse struct { // nolint:golint,deadcode
|
||||
Success bool `json:"success"`
|
||||
|
||||
Result []order `json:"result"`
|
||||
}
|
||||
|
||||
type cancelOrderResponse struct {
|
||||
type cancelOrderResponse struct { // nolint:golint,deadcode
|
||||
Success bool `json:"success"`
|
||||
Result string `json:"result"`
|
||||
}
|
||||
|
|
|
@ -133,16 +133,16 @@ type PrivateRequestParams struct {
|
|||
type GetPrivateTradesRequest struct {
|
||||
client requestgen.AuthenticatedAPIClient
|
||||
|
||||
market string `param:"market"`
|
||||
market string `param:"market"` // nolint:golint,structcheck
|
||||
|
||||
// timestamp is the seconds elapsed since Unix epoch, set to return trades executed before the time only
|
||||
timestamp *time.Time `param:"timestamp,seconds"`
|
||||
timestamp *time.Time `param:"timestamp,seconds"` // nolint:golint,structcheck
|
||||
|
||||
// From field is a trade id, set ot return trades created after the trade
|
||||
from *int64 `param:"from"`
|
||||
from *int64 `param:"from"` // nolint:golint,structcheck
|
||||
|
||||
// To field trade id, set to return trades created before the trade
|
||||
to *int64 `param:"to"`
|
||||
to *int64 `param:"to"` // nolint:golint,structcheck
|
||||
|
||||
orderBy *string `param:"order_by"`
|
||||
|
||||
|
|
|
@ -272,7 +272,7 @@ func toGlobalOrderType(orderType okexapi.OrderType) (types.OrderType, error) {
|
|||
}
|
||||
|
||||
func toLocalInterval(src string) string {
|
||||
var re = regexp.MustCompile("\\d+[hdw]")
|
||||
var re = regexp.MustCompile(`\d+[hdw]`)
|
||||
return re.ReplaceAllStringFunc(src, func(w string) string {
|
||||
return strings.ToUpper(w)
|
||||
})
|
||||
|
|
|
@ -231,7 +231,7 @@ func (v Value) MarshalJSON() ([]byte, error) {
|
|||
}
|
||||
|
||||
func (v *Value) UnmarshalJSON(data []byte) error {
|
||||
if bytes.Compare(data, []byte{'n', 'u', 'l', 'l'}) == 0 {
|
||||
if bytes.Equal(data, []byte{'n', 'u', 'l', 'l'}) {
|
||||
*v = Zero
|
||||
return nil
|
||||
}
|
||||
|
|
|
@ -16,7 +16,7 @@ func BenchmarkMul(b *testing.B) {
|
|||
for i := 0; i < b.N; i++ {
|
||||
x := NewFromFloat(20.0)
|
||||
y := NewFromFloat(20.0)
|
||||
x = x.Mul(y)
|
||||
x = x.Mul(y) // nolint
|
||||
}
|
||||
})
|
||||
|
||||
|
@ -24,7 +24,7 @@ func BenchmarkMul(b *testing.B) {
|
|||
for i := 0; i < b.N; i++ {
|
||||
x := NewFromFloat(88.12345678)
|
||||
y := NewFromFloat(88.12345678)
|
||||
x = x.Mul(y)
|
||||
x = x.Mul(y) // nolint
|
||||
}
|
||||
})
|
||||
|
||||
|
@ -32,7 +32,7 @@ func BenchmarkMul(b *testing.B) {
|
|||
for i := 0; i < b.N; i++ {
|
||||
x := big.NewFloat(20.0)
|
||||
y := big.NewFloat(20.0)
|
||||
x = new(big.Float).Mul(x, y)
|
||||
x = new(big.Float).Mul(x, y) // nolint
|
||||
}
|
||||
})
|
||||
|
||||
|
@ -40,7 +40,7 @@ func BenchmarkMul(b *testing.B) {
|
|||
for i := 0; i < b.N; i++ {
|
||||
x := big.NewFloat(88.12345678)
|
||||
y := big.NewFloat(88.12345678)
|
||||
x = new(big.Float).Mul(x, y)
|
||||
x = new(big.Float).Mul(x, y) // nolint
|
||||
}
|
||||
})
|
||||
}
|
||||
|
@ -170,8 +170,7 @@ func TestJson(t *testing.T) {
|
|||
_ = json.Unmarshal([]byte("0.00153917575"), &p)
|
||||
assert.Equal(t, "0.00153917", p.FormatString(8))
|
||||
|
||||
var q Value
|
||||
q = NewFromFloat(0.00153917575)
|
||||
q := NewFromFloat(0.00153917575)
|
||||
assert.Equal(t, p, q)
|
||||
_ = json.Unmarshal([]byte("6e-8"), &p)
|
||||
_ = json.Unmarshal([]byte("0.000062"), &q)
|
||||
|
|
|
@ -46,8 +46,6 @@ type Interact struct {
|
|||
states map[State]State
|
||||
statesFunc map[State]interface{}
|
||||
|
||||
authenticatedSessions map[string]Session
|
||||
|
||||
customInteractions []CustomInteraction
|
||||
|
||||
messengers []Messenger
|
||||
|
@ -97,10 +95,6 @@ func (it *Interact) getNextState(session Session, currentState State) (nextState
|
|||
return session.GetOriginState(), final
|
||||
}
|
||||
|
||||
func (it *Interact) handleCallback(session Session, payload string) error {
|
||||
return nil
|
||||
}
|
||||
|
||||
func (it *Interact) handleResponse(session Session, text string, ctxObjects ...interface{}) error {
|
||||
// We only need response when executing a command
|
||||
switch session.GetState() {
|
||||
|
|
|
@ -104,8 +104,6 @@ type Telegram struct {
|
|||
// Private is used to protect the telegram bot, users not authenticated can not see messages or sending commands
|
||||
Private bool `json:"private,omitempty"`
|
||||
|
||||
authorizing bool
|
||||
|
||||
sessions TelegramSessionMap
|
||||
|
||||
// textMessageResponder is used for interact to register its message handler
|
||||
|
@ -237,7 +235,7 @@ func (tm *Telegram) Sessions() TelegramSessionMap {
|
|||
}
|
||||
|
||||
func (tm *Telegram) RestoreSessions(sessions TelegramSessionMap) {
|
||||
if sessions == nil || len(sessions) == 0 {
|
||||
if len(sessions) == 0 {
|
||||
return
|
||||
}
|
||||
|
||||
|
|
|
@ -597,7 +597,6 @@ func (s *Server) tradingVolume(c *gin.Context) {
|
|||
}
|
||||
|
||||
c.JSON(http.StatusOK, gin.H{"tradingVolumes": rows})
|
||||
return
|
||||
}
|
||||
|
||||
func newServer(r http.Handler, bind string) *http.Server {
|
||||
|
|
|
@ -226,7 +226,7 @@ func (s *BacktestService) QueryKLinesCh(since, until time.Time, exchange types.E
|
|||
}
|
||||
|
||||
func returnError(err error) (chan types.KLine, chan error) {
|
||||
ch := make(chan types.KLine, 0)
|
||||
ch := make(chan types.KLine)
|
||||
close(ch)
|
||||
log.WithError(err).Error("backtest query error")
|
||||
|
||||
|
|
|
@ -47,11 +47,7 @@ func (s *DepositService) Sync(ctx context.Context, ex types.Exchange, startTime
|
|||
},
|
||||
Filter: func(obj interface{}) bool {
|
||||
deposit := obj.(types.Deposit)
|
||||
if len(deposit.TransactionID) == 0 {
|
||||
return false
|
||||
}
|
||||
|
||||
return true
|
||||
return len(deposit.TransactionID) != 0
|
||||
},
|
||||
LogInsert: true,
|
||||
},
|
||||
|
|
|
@ -40,7 +40,7 @@ func (t *LogHook) Fire(e *logrus.Entry) error {
|
|||
return nil
|
||||
}
|
||||
|
||||
var color = ""
|
||||
var color string
|
||||
|
||||
switch e.Level {
|
||||
case logrus.DebugLevel:
|
||||
|
|
|
@ -431,7 +431,7 @@ func (s *Strategy) validateOrder(order *types.SubmitOrder) error {
|
|||
order.Quantity.Compare(s.Market.MinQuantity) < 0 ||
|
||||
orderAmount.Compare(s.Market.MinNotional) < 0 {
|
||||
log.Debug("amount fail")
|
||||
return errors.New(fmt.Sprintf("amount fail: quantity: %v, amount: %v", order.Quantity, orderAmount))
|
||||
return fmt.Errorf("amount fail: quantity: %v, amount: %v", order.Quantity, orderAmount)
|
||||
}
|
||||
return nil
|
||||
} else if order.Side == types.SideTypeBuy {
|
||||
|
@ -458,7 +458,7 @@ func (s *Strategy) validateOrder(order *types.SubmitOrder) error {
|
|||
orderAmount.Compare(s.Market.MinNotional) < 0 ||
|
||||
order.Quantity.Compare(s.Market.MinQuantity) < 0 {
|
||||
log.Debug("amount fail")
|
||||
return errors.New(fmt.Sprintf("amount fail: quantity: %v, amount: %v", order.Quantity, orderAmount))
|
||||
return fmt.Errorf("amount fail: quantity: %v, amount: %v", order.Quantity, orderAmount)
|
||||
}
|
||||
return nil
|
||||
}
|
||||
|
@ -801,7 +801,7 @@ func (s *Strategy) Run(ctx context.Context, orderExecutor bbgo.OrderExecutor, se
|
|||
|
||||
store, ok := s.Session.MarketDataStore(s.Symbol)
|
||||
if !ok {
|
||||
return errors.New(fmt.Sprintf("cannot get marketdatastore of %s", s.Symbol))
|
||||
return fmt.Errorf("cannot get marketdatastore of %s", s.Symbol)
|
||||
}
|
||||
s.SetupIndicators(store)
|
||||
|
||||
|
@ -893,27 +893,22 @@ func (s *Strategy) Run(ctx context.Context, orderExecutor bbgo.OrderExecutor, se
|
|||
percentAvgTPfromCCI = percentAvgTPfromCCI*float64(counterTPfromCCI) + pnlRate
|
||||
counterTPfromCCI += 1
|
||||
percentAvgTPfromCCI /= float64(counterTPfromCCI)
|
||||
break
|
||||
case 1:
|
||||
percentAvgTPfromLongShort = percentAvgTPfromLongShort*float64(counterTPfromLongShort) + pnlRate
|
||||
counterTPfromLongShort += 1
|
||||
percentAvgTPfromLongShort /= float64(counterTPfromLongShort)
|
||||
break
|
||||
case 2:
|
||||
percentAvgTPfromAtr = percentAvgTPfromAtr*float64(counterTPfromAtr) + pnlRate
|
||||
counterTPfromAtr += 1
|
||||
percentAvgTPfromAtr /= float64(counterTPfromAtr)
|
||||
break
|
||||
case 3:
|
||||
percentAvgTPfromPeak = percentAvgTPfromPeak*float64(counterTPfromPeak) + pnlRate
|
||||
counterTPfromPeak += 1
|
||||
percentAvgTPfromPeak /= float64(counterTPfromPeak)
|
||||
break
|
||||
case 4:
|
||||
percentAvgSLfromSL = percentAvgSLfromSL*float64(counterSLfromSL) + pnlRate
|
||||
counterSLfromSL += 1
|
||||
percentAvgSLfromSL /= float64(counterSLfromSL)
|
||||
break
|
||||
|
||||
}
|
||||
}
|
||||
|
@ -1002,27 +997,22 @@ func (s *Strategy) Run(ctx context.Context, orderExecutor bbgo.OrderExecutor, se
|
|||
percentAvgTPfromCCI = percentAvgTPfromCCI*float64(counterTPfromCCI) + pnlRate
|
||||
counterTPfromCCI += 1
|
||||
percentAvgTPfromCCI /= float64(counterTPfromCCI)
|
||||
break
|
||||
case 1:
|
||||
percentAvgTPfromLongShort = percentAvgTPfromLongShort*float64(counterTPfromLongShort) + pnlRate
|
||||
counterTPfromLongShort += 1
|
||||
percentAvgTPfromLongShort /= float64(counterTPfromLongShort)
|
||||
break
|
||||
case 2:
|
||||
percentAvgTPfromAtr = percentAvgTPfromAtr*float64(counterTPfromAtr) + pnlRate
|
||||
counterTPfromAtr += 1
|
||||
percentAvgTPfromAtr /= float64(counterTPfromAtr)
|
||||
break
|
||||
case 3:
|
||||
percentAvgTPfromPeak = percentAvgTPfromPeak*float64(counterTPfromPeak) + pnlRate
|
||||
counterTPfromPeak += 1
|
||||
percentAvgTPfromPeak /= float64(counterTPfromPeak)
|
||||
break
|
||||
case 4:
|
||||
percentAvgSLfromSL = percentAvgSLfromSL*float64(counterSLfromSL) + pnlRate
|
||||
counterSLfromSL += 1
|
||||
percentAvgSLfromSL /= float64(counterSLfromSL)
|
||||
break
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
|
@ -550,8 +550,8 @@ func (s *Strategy) placeBounceSellOrders(ctx context.Context, resistancePrice fi
|
|||
|
||||
for i := 0; i < numLayers; i++ {
|
||||
balances := s.session.GetAccount().Balances()
|
||||
quoteBalance, _ := balances[s.Market.QuoteCurrency]
|
||||
baseBalance, _ := balances[s.Market.BaseCurrency]
|
||||
quoteBalance := balances[s.Market.QuoteCurrency]
|
||||
baseBalance := balances[s.Market.BaseCurrency]
|
||||
|
||||
// price = (resistance_price * (1.0 - ratio)) * ((1.0 + layerSpread) * i)
|
||||
price := resistancePrice.Mul(fixedpoint.One.Sub(s.BounceShort.Ratio))
|
||||
|
|
|
@ -36,7 +36,7 @@ type State struct {
|
|||
}
|
||||
|
||||
func (s *State) IsOver24Hours() bool {
|
||||
return time.Now().Sub(time.Unix(s.Since, 0)) >= 24*time.Hour
|
||||
return time.Since(time.Unix(s.Since, 0)) >= 24*time.Hour
|
||||
}
|
||||
|
||||
func (s *State) PlainText() string {
|
||||
|
|
|
@ -42,7 +42,7 @@ type State struct {
|
|||
}
|
||||
|
||||
func (s *State) IsOver24Hours() bool {
|
||||
return time.Now().Sub(s.AccumulatedFeeStartedAt) >= 24*time.Hour
|
||||
return time.Since(s.AccumulatedFeeStartedAt) >= 24*time.Hour
|
||||
}
|
||||
|
||||
func (s *State) Reset() {
|
||||
|
|
|
@ -113,7 +113,7 @@ func (s *Strategy) update(orderExecutor bbgo.OrderExecutor, session *bbgo.Exchan
|
|||
func (s *Strategy) updateOrders(orderExecutor bbgo.OrderExecutor, session *bbgo.ExchangeSession, side types.SideType) {
|
||||
var book = s.book.Copy()
|
||||
var pvs = book.SideBook(side)
|
||||
if pvs == nil || len(pvs) == 0 {
|
||||
if len(pvs) == 0 {
|
||||
log.Warnf("empty side: %s", side)
|
||||
return
|
||||
}
|
||||
|
|
|
@ -123,7 +123,7 @@ func (m AssetMap) SlackAttachment() slack.Attachment {
|
|||
Short: false,
|
||||
})
|
||||
} else {
|
||||
text := fmt.Sprintf("%s", a.NetAsset.String())
|
||||
text := a.NetAsset.String()
|
||||
|
||||
if !a.Borrowed.IsZero() {
|
||||
text += fmt.Sprintf(" Borrowed: %s", a.Borrowed.String())
|
||||
|
|
|
@ -50,7 +50,7 @@ func (b Balance) Net() fixedpoint.Value {
|
|||
}
|
||||
|
||||
func (b Balance) ValueString() (o string) {
|
||||
o = fmt.Sprintf("%s", b.Available.String())
|
||||
o = b.Available.String()
|
||||
|
||||
if b.Locked.Sign() > 0 {
|
||||
o += fmt.Sprintf(" (locked %v)", b.Locked)
|
||||
|
|
|
@ -135,8 +135,8 @@ func Predict(a Series, lookback int, offset ...int) float64 {
|
|||
if a.Length() < lookback {
|
||||
lookback = a.Length()
|
||||
}
|
||||
x := make([]float64, lookback, lookback)
|
||||
y := make([]float64, lookback, lookback)
|
||||
x := make([]float64, lookback)
|
||||
y := make([]float64, lookback)
|
||||
var weights []float64
|
||||
for i := 0; i < lookback; i++ {
|
||||
x[i] = float64(i)
|
||||
|
@ -163,9 +163,9 @@ func NextCross(a Series, b Series, lookback int) (int, float64, bool) {
|
|||
if b.Length() < lookback {
|
||||
lookback = b.Length()
|
||||
}
|
||||
x := make([]float64, lookback, lookback)
|
||||
y1 := make([]float64, lookback, lookback)
|
||||
y2 := make([]float64, lookback, lookback)
|
||||
x := make([]float64, lookback)
|
||||
y1 := make([]float64, lookback)
|
||||
y2 := make([]float64, lookback)
|
||||
var weights []float64
|
||||
for i := 0; i < lookback; i++ {
|
||||
x[i] = float64(i)
|
||||
|
@ -295,20 +295,20 @@ func Add(a interface{}, b interface{}) Series {
|
|||
var aa Series
|
||||
var bb Series
|
||||
|
||||
switch a.(type) {
|
||||
switch tp := a.(type) {
|
||||
case float64:
|
||||
aa = NumberSeries(a.(float64))
|
||||
aa = NumberSeries(tp)
|
||||
case Series:
|
||||
aa = a.(Series)
|
||||
aa = tp
|
||||
default:
|
||||
panic("input should be either *Series or float64")
|
||||
|
||||
}
|
||||
switch b.(type) {
|
||||
switch tp := b.(type) {
|
||||
case float64:
|
||||
bb = NumberSeries(b.(float64))
|
||||
bb = NumberSeries(tp)
|
||||
case Series:
|
||||
bb = b.(Series)
|
||||
bb = tp
|
||||
default:
|
||||
panic("input should be either *Series or float64")
|
||||
|
||||
|
@ -367,19 +367,19 @@ func (a *MinusSeriesResult) Length() int {
|
|||
var _ Series = &MinusSeriesResult{}
|
||||
|
||||
func switchIface(b interface{}) Series {
|
||||
switch b.(type) {
|
||||
switch tp := b.(type) {
|
||||
case float64:
|
||||
return NumberSeries(b.(float64))
|
||||
return NumberSeries(tp)
|
||||
case int32:
|
||||
return NumberSeries(float64(b.(int32)))
|
||||
return NumberSeries(float64(tp))
|
||||
case int64:
|
||||
return NumberSeries(float64(b.(int64)))
|
||||
return NumberSeries(float64(tp))
|
||||
case float32:
|
||||
return NumberSeries(float64(b.(float32)))
|
||||
return NumberSeries(float64(tp))
|
||||
case int:
|
||||
return NumberSeries(float64(b.(int)))
|
||||
return NumberSeries(float64(tp))
|
||||
case Series:
|
||||
return b.(Series)
|
||||
return tp
|
||||
default:
|
||||
fmt.Println(reflect.TypeOf(b))
|
||||
panic("input should be either *Series or float64")
|
||||
|
@ -427,19 +427,19 @@ func Mul(a interface{}, b interface{}) Series {
|
|||
var aa Series
|
||||
var bb Series
|
||||
|
||||
switch a.(type) {
|
||||
switch tp := a.(type) {
|
||||
case float64:
|
||||
aa = NumberSeries(a.(float64))
|
||||
aa = NumberSeries(tp)
|
||||
case Series:
|
||||
aa = a.(Series)
|
||||
aa = tp
|
||||
default:
|
||||
panic("input should be either Series or float64")
|
||||
}
|
||||
switch b.(type) {
|
||||
switch tp := b.(type) {
|
||||
case float64:
|
||||
bb = NumberSeries(b.(float64))
|
||||
bb = NumberSeries(tp)
|
||||
case Series:
|
||||
bb = b.(Series)
|
||||
bb = tp
|
||||
default:
|
||||
panic("input should be either Series or float64")
|
||||
|
||||
|
@ -490,7 +490,7 @@ func ToArray(a Series, limit ...int) (result []float64) {
|
|||
if l < a.Length() {
|
||||
l = a.Length()
|
||||
}
|
||||
result = make([]float64, l, l)
|
||||
result = make([]float64, l)
|
||||
for i := 0; i < l; i++ {
|
||||
result[i] = a.Index(i)
|
||||
}
|
||||
|
@ -510,7 +510,7 @@ func ToReverseArray(a Series, limit ...int) (result Float64Slice) {
|
|||
if l < a.Length() {
|
||||
l = a.Length()
|
||||
}
|
||||
result = make([]float64, l, l)
|
||||
result = make([]float64, l)
|
||||
for i := 0; i < l; i++ {
|
||||
result[l-i-1] = a.Index(i)
|
||||
}
|
||||
|
|
|
@ -563,6 +563,8 @@ type KLineSeries struct {
|
|||
func (k *KLineSeries) Last() float64 {
|
||||
length := len(*k.lines)
|
||||
switch k.kv {
|
||||
case kOpUnknown:
|
||||
panic("kline series operator unknown")
|
||||
case kOpenValue:
|
||||
return (*k.lines)[length-1].GetOpen().Float64()
|
||||
case kCloseValue:
|
||||
|
|
|
@ -38,13 +38,13 @@ func (slice PriceVolumeSlice) CopyDepth(depth int) PriceVolumeSlice {
|
|||
return slice.Copy()
|
||||
}
|
||||
|
||||
var s = make(PriceVolumeSlice, depth, depth)
|
||||
var s = make(PriceVolumeSlice, depth)
|
||||
copy(s, slice[:depth])
|
||||
return s
|
||||
}
|
||||
|
||||
func (slice PriceVolumeSlice) Copy() PriceVolumeSlice {
|
||||
var s = make(PriceVolumeSlice, len(slice), len(slice))
|
||||
var s = make(PriceVolumeSlice, len(slice))
|
||||
copy(s, slice)
|
||||
return s
|
||||
}
|
||||
|
|
|
@ -153,7 +153,7 @@ func (b *SliceOrderBook) Update(book SliceOrderBook) {
|
|||
}
|
||||
|
||||
func (b *SliceOrderBook) Print() {
|
||||
fmt.Printf(b.String())
|
||||
fmt.Print(b.String())
|
||||
}
|
||||
|
||||
func (b *SliceOrderBook) String() string {
|
||||
|
|
|
@ -115,8 +115,7 @@ func (t *MillisecondTimestamp) UnmarshalJSON(data []byte) error {
|
|||
|
||||
}
|
||||
|
||||
// fallback to RFC3339
|
||||
return (*time.Time)(t).UnmarshalJSON(data)
|
||||
// Unreachable
|
||||
}
|
||||
|
||||
func convertFloat64ToTime(vt string, f float64) (time.Time, error) {
|
||||
|
|
|
@ -27,7 +27,7 @@ type TradeSlice struct {
|
|||
|
||||
func (s *TradeSlice) Copy() []Trade {
|
||||
s.mu.Lock()
|
||||
slice := make([]Trade, len(s.Trades), len(s.Trades))
|
||||
slice := make([]Trade, len(s.Trades))
|
||||
copy(slice, s.Trades)
|
||||
s.mu.Unlock()
|
||||
|
||||
|
|
|
@ -19,7 +19,7 @@ func StartTimeProfile(args ...string) TimeProfile {
|
|||
}
|
||||
|
||||
func (p *TimeProfile) TilNow() time.Duration {
|
||||
return time.Now().Sub(p.StartTime)
|
||||
return time.Since(p.StartTime)
|
||||
}
|
||||
|
||||
func (p *TimeProfile) Stop() time.Duration {
|
||||
|
|
Loading…
Reference in New Issue
Block a user