2020-10-16 02:21:37 +00:00
|
|
|
package pnl
|
2020-09-19 01:05:06 +00:00
|
|
|
|
|
|
|
import (
|
2021-12-05 16:47:41 +00:00
|
|
|
"encoding/json"
|
2020-09-19 01:05:06 +00:00
|
|
|
"strconv"
|
|
|
|
"time"
|
|
|
|
|
2022-05-10 10:27:23 +00:00
|
|
|
"github.com/fatih/color"
|
2020-09-19 01:05:06 +00:00
|
|
|
"github.com/slack-go/slack"
|
|
|
|
|
2022-05-09 17:11:12 +00:00
|
|
|
"github.com/c9s/bbgo/pkg/fixedpoint"
|
|
|
|
|
2020-10-11 08:46:15 +00:00
|
|
|
"github.com/c9s/bbgo/pkg/slack/slackstyle"
|
|
|
|
"github.com/c9s/bbgo/pkg/types"
|
2020-09-19 01:05:06 +00:00
|
|
|
)
|
|
|
|
|
2022-09-01 11:02:18 +00:00
|
|
|
type AverageCostPnLReport struct {
|
2022-05-10 10:27:23 +00:00
|
|
|
LastPrice fixedpoint.Value `json:"lastPrice"`
|
|
|
|
StartTime time.Time `json:"startTime"`
|
|
|
|
Symbol string `json:"symbol"`
|
|
|
|
Market types.Market `json:"market"`
|
|
|
|
|
2022-07-12 11:50:28 +00:00
|
|
|
NumTrades int `json:"numTrades"`
|
|
|
|
Profit fixedpoint.Value `json:"profit"`
|
|
|
|
UnrealizedProfit fixedpoint.Value `json:"unrealizedProfit"`
|
|
|
|
|
|
|
|
NetProfit fixedpoint.Value `json:"netProfit"`
|
|
|
|
GrossProfit fixedpoint.Value `json:"grossProfit"`
|
|
|
|
GrossLoss fixedpoint.Value `json:"grossLoss"`
|
2022-09-01 11:02:18 +00:00
|
|
|
Position *types.Position `json:"position,omitempty"`
|
2022-07-12 11:50:28 +00:00
|
|
|
|
2022-06-08 06:51:31 +00:00
|
|
|
AverageCost fixedpoint.Value `json:"averageCost"`
|
|
|
|
BuyVolume fixedpoint.Value `json:"buyVolume,omitempty"`
|
|
|
|
SellVolume fixedpoint.Value `json:"sellVolume,omitempty"`
|
|
|
|
FeeInUSD fixedpoint.Value `json:"feeInUSD"`
|
|
|
|
BaseAssetPosition fixedpoint.Value `json:"baseAssetPosition"`
|
|
|
|
CurrencyFees map[string]fixedpoint.Value `json:"currencyFees"`
|
2020-09-19 01:05:06 +00:00
|
|
|
}
|
|
|
|
|
2022-09-01 11:02:18 +00:00
|
|
|
func (report *AverageCostPnLReport) JSON() ([]byte, error) {
|
2021-12-05 16:47:41 +00:00
|
|
|
return json.MarshalIndent(report, "", " ")
|
|
|
|
}
|
|
|
|
|
2022-09-01 11:02:18 +00:00
|
|
|
func (report AverageCostPnLReport) Print() {
|
2022-05-10 10:27:23 +00:00
|
|
|
color.Green("TRADES SINCE: %v", report.StartTime)
|
|
|
|
color.Green("NUMBER OF TRADES: %d", report.NumTrades)
|
2022-09-01 11:02:18 +00:00
|
|
|
color.Green(report.Position.String())
|
2022-05-10 10:27:23 +00:00
|
|
|
color.Green("AVERAGE COST: %s", types.USD.FormatMoney(report.AverageCost))
|
2022-06-08 06:51:31 +00:00
|
|
|
color.Green("BASE ASSET POSITION: %s", report.BaseAssetPosition.String())
|
|
|
|
|
2022-05-10 10:27:23 +00:00
|
|
|
color.Green("TOTAL BUY VOLUME: %v", report.BuyVolume)
|
|
|
|
color.Green("TOTAL SELL VOLUME: %v", report.SellVolume)
|
|
|
|
|
|
|
|
color.Green("CURRENT PRICE: %s", types.USD.FormatMoney(report.LastPrice))
|
|
|
|
color.Green("CURRENCY FEES:")
|
2020-09-19 01:05:06 +00:00
|
|
|
for currency, fee := range report.CurrencyFees {
|
2022-05-10 10:27:23 +00:00
|
|
|
color.Green(" - %s: %s", currency, fee.String())
|
|
|
|
}
|
|
|
|
|
|
|
|
if report.Profit.Sign() > 0 {
|
|
|
|
color.Green("PROFIT: %s", types.USD.FormatMoney(report.Profit))
|
|
|
|
} else {
|
|
|
|
color.Red("PROFIT: %s", types.USD.FormatMoney(report.Profit))
|
|
|
|
}
|
|
|
|
|
|
|
|
if report.UnrealizedProfit.Sign() > 0 {
|
|
|
|
color.Green("UNREALIZED PROFIT: %s", types.USD.FormatMoney(report.UnrealizedProfit))
|
|
|
|
} else {
|
|
|
|
color.Red("UNREALIZED PROFIT: %s", types.USD.FormatMoney(report.UnrealizedProfit))
|
2020-09-19 01:05:06 +00:00
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2022-09-01 11:02:18 +00:00
|
|
|
func (report AverageCostPnLReport) SlackAttachment() slack.Attachment {
|
2020-10-09 07:59:33 +00:00
|
|
|
var color = slackstyle.Red
|
|
|
|
|
2022-02-02 11:37:18 +00:00
|
|
|
if report.UnrealizedProfit.Sign() > 0 {
|
2020-09-19 01:05:06 +00:00
|
|
|
color = slackstyle.Green
|
|
|
|
}
|
|
|
|
|
|
|
|
return slack.Attachment{
|
|
|
|
Title: report.Symbol + " Profit and Loss report",
|
|
|
|
Text: "Profit " + types.USD.FormatMoney(report.Profit),
|
|
|
|
Color: color,
|
|
|
|
// Pretext: "",
|
|
|
|
// Text: "",
|
|
|
|
Fields: []slack.AttachmentField{
|
|
|
|
{Title: "Profit", Value: types.USD.FormatMoney(report.Profit)},
|
|
|
|
{Title: "Unrealized Profit", Value: types.USD.FormatMoney(report.UnrealizedProfit)},
|
2022-02-03 04:55:25 +00:00
|
|
|
{Title: "Current Price", Value: report.Market.FormatPrice(report.LastPrice), Short: true},
|
|
|
|
{Title: "Average Cost", Value: report.Market.FormatPrice(report.AverageCost), Short: true},
|
2021-12-05 16:46:50 +00:00
|
|
|
|
2021-12-04 18:16:48 +00:00
|
|
|
// FIXME:
|
|
|
|
// {Title: "Fee (USD)", Value: types.USD.FormatMoney(report.FeeInUSD), Short: true},
|
2022-06-08 06:51:31 +00:00
|
|
|
{Title: "Base Asset Position", Value: report.BaseAssetPosition.String(), Short: true},
|
2020-09-19 01:05:06 +00:00
|
|
|
{Title: "Number of Trades", Value: strconv.Itoa(report.NumTrades), Short: true},
|
|
|
|
},
|
|
|
|
Footer: report.StartTime.Format(time.RFC822),
|
|
|
|
FooterIcon: "",
|
|
|
|
}
|
|
|
|
}
|