134 lines
3.8 KiB
Go
134 lines
3.8 KiB
Go
package main
|
|
|
|
import (
|
|
"os"
|
|
"strconv"
|
|
)
|
|
|
|
// ================== Config ==================
|
|
//
|
|
// Matrix ENV attese (nuovo):
|
|
// MATRIX_HS es. https://matrix.tuodominio.tld
|
|
// MATRIX_USER es. demone oppure @demone:tuodominio.tld
|
|
// MATRIX_PASS password
|
|
// MATRIX_DEVICE_NAME (opzionale) nome dispositivo, default "daemon-bot"
|
|
// MATRIX_ROOM ID (!...), alias (#...), o permalink (https://matrix.to/#/...)
|
|
//
|
|
// Retro-compat:
|
|
// MATRIX_ROOM_ID (vecchio nome campo; se presente ma c'è anche MATRIX_ROOM, vince MATRIX_ROOM)
|
|
//
|
|
|
|
type Config struct {
|
|
// Dati e simboli
|
|
DataDir string
|
|
StateDir string
|
|
BinanceSymbol string // es. "BTCUSDT" o "ETHUSDT"
|
|
|
|
// Asset THORChain
|
|
ThorFrom string // es. "ETH.USDT-0xdAC17F..." (USDT ERC-20 mainnet)
|
|
ThorTo string // es. "BTC.BTC" oppure "ETH.ETH"
|
|
FromUnitPow int // unità per quote (tipicamente 8 per THORChain)
|
|
ToUnitPow int // unità per quote (tipicamente 8 per THORChain)
|
|
|
|
// Dataset / training
|
|
Lookback int
|
|
LearningRate float64
|
|
BatchSize int
|
|
ValSplit float64
|
|
MaxEpochs int
|
|
EarlyStopFrac float64
|
|
ValConfZ float64
|
|
|
|
// Decisione
|
|
SafetyBps float64
|
|
MinMoveBps float64
|
|
|
|
// Quantità di riferimento per quote e per istruzioni manuali
|
|
RefFrom float64 // es. 100.0 USDT
|
|
RefTo float64 // es. 0.1 ETH/BTC
|
|
|
|
// Matrix (username+password da env; il token lo gestiamo noi)
|
|
MatrixHS string // es. "https://matrix.tuodominio.tld"
|
|
MatrixUser string // es. "demone" oppure "@demone:tuodominio.tld"
|
|
MatrixPass string // password dell'utente bot
|
|
MatrixDeviceName string // opzionale: nome dispositivo per il login
|
|
|
|
// Nuova chiave generica stanza (ID/alias/permalink). Preferita.
|
|
MatrixRoom string
|
|
|
|
// Legacy per retro-compat (ID puro). Usata solo se MatrixRoom è vuota.
|
|
MatrixRoomID string
|
|
}
|
|
|
|
func getenvDefault(k, def string) string {
|
|
if v := os.Getenv(k); v != "" {
|
|
return v
|
|
}
|
|
return def
|
|
}
|
|
func getInt(k string, def int) int {
|
|
if v := os.Getenv(k); v != "" {
|
|
if n, err := strconv.Atoi(v); err == nil {
|
|
return n
|
|
}
|
|
}
|
|
return def
|
|
}
|
|
func getF(k string, def float64) float64 {
|
|
if v := os.Getenv(k); v != "" {
|
|
if f, err := strconv.ParseFloat(v, 64); err == nil {
|
|
return f
|
|
}
|
|
}
|
|
return def
|
|
}
|
|
|
|
func loadConfig() Config {
|
|
cfg := Config{
|
|
// Cartelle / simboli
|
|
DataDir: getenvDefault("DATA_DIR", "data"),
|
|
StateDir: getenvDefault("STATE_DIR", "state"),
|
|
BinanceSymbol: getenvDefault("BINANCE_SYMBOL", "BTCUSDT"),
|
|
|
|
// THORChain
|
|
ThorFrom: getenvDefault("THOR_FROM", "ETH.USDT-0xdAC17F958D2ee523a2206206994597C13D831ec7"),
|
|
ThorTo: getenvDefault("THOR_TO", "BTC.BTC"),
|
|
FromUnitPow: getInt("FROM_UNIT_POW", 8),
|
|
ToUnitPow: getInt("TO_UNIT_POW", 8),
|
|
|
|
// Training
|
|
Lookback: getInt("LOOKBACK", 30),
|
|
LearningRate: getF("LR", 0.03),
|
|
BatchSize: getInt("BATCH", 32),
|
|
ValSplit: getF("VAL_SPLIT", 0.2),
|
|
MaxEpochs: getInt("MAX_EPOCHS", 100),
|
|
EarlyStopFrac: getF("EARLY_STOP_PCT", 0.5),
|
|
ValConfZ: getF("VAL_CONF_Z", 0.90),
|
|
|
|
// Decisione
|
|
SafetyBps: getF("SAFETY_BPS", 10.0),
|
|
MinMoveBps: getF("MIN_MOVE_BPS", 5.0),
|
|
|
|
// Quote di riferimento
|
|
RefFrom: getF("REF_FROM", 100.0),
|
|
RefTo: getF("REF_TO", 0.1),
|
|
|
|
// Matrix base
|
|
MatrixHS: getenvDefault("MATRIX_HS", ""),
|
|
MatrixUser: getenvDefault("MATRIX_USER", ""),
|
|
MatrixPass: getenvDefault("MATRIX_PASS", ""),
|
|
MatrixDeviceName: getenvDefault("MATRIX_DEVICE_NAME", "daemon-bot"),
|
|
|
|
// Matrix room (nuovo + legacy)
|
|
MatrixRoom: getenvDefault("MATRIX_ROOM", ""),
|
|
MatrixRoomID: getenvDefault("MATRIX_ROOM_ID", ""),
|
|
}
|
|
|
|
// Retro-compatibilità: se MATRIX_ROOM è vuota ma MATRIX_ROOM_ID è valorizzata, usa quella.
|
|
if cfg.MatrixRoom == "" && cfg.MatrixRoomID != "" {
|
|
cfg.MatrixRoom = cfg.MatrixRoomID
|
|
}
|
|
|
|
return cfg
|
|
}
|