bbgo_origin/doc/topics/rw-strategy.md

2.0 KiB

Print/Modify Strategy Fields

The following utility functions are commonly used in the elliottwave and drift strategies. You can refer to their implementations in pkg/strategy for further details.

To handle output or modification of strategy fields, BBGO offers a utility that simplifies parameter serialization, similar to how JSON fields are marshaled. This utility adopts JSON-like tag syntax with additional tags for specific behaviors.

For example:

type Strategy struct {
    // The Debug field will be serialized to JSON with "debug" as the key.
    Debug bool `json:"debug"`
}

This utility is located in github.com/c9s/bbgo/pkg/dynamic, and the style configuration can be found in github.com/c9s/bbgo/pkg/style.

To output the configuration, use dynamic.PrintConfig, which only serializes fields that can be marshaled into JSON:

import (
    "io"
    "github.com/c9s/bbgo/pkg/dynamic"
    "github.com/c9s/bbgo/pkg/interact"
    "github.com/jedib0t/go-pretty/v6/table"
)

func (s *Strategy) Print(f io.Writer, pretty bool, withColor ...bool) {
    var tableStyle *table.Style
    if pretty {
        tableStyle = style.NewDefaultTableStyle()
    }
    dynamic.PrintConfig(s, f, tableStyle, len(withColor) > 0 && withColor[0], dynamic.DefaultWhiteList()...)
}

We can now register a command to allow users to interact with the strategy:

import (
    "bytes"
    "github.com/c9s/bbgo/pkg/bbgo"
    "github.com/c9s/bbgo/pkg/interact"
)

...
bbgo.RegisterCommand("/config", "Show latest config", func(reply interact.Reply) {
    var buffer bytes.Buffer
    s.Print(&buffer, false)
    reply.Message(buffer.String())
})

To dump all strategy fields, you can use dynamic.ParamDump. If certain fields should be excluded, simply add the ignore: "true" tag to the field definition.

To make fields modifiable, use the modifiable: "true" tag and call bbgo.RegisterModifier(s) to enable editing. This will automatically add /modify commands to the strategy.