@serpens66
Also grundsätzlich mache ich alles so allgemein verwendbar wie möglich.
Beispiel Nachkommastellen. Ich unterscheide drei Fälle: Anzeige, Rechnungen und Handeln. Beispielsweise Nxt auf Bter: Wird mit drei Nachkommastellen gehandelt, aber mit acht Nachkommastellen berechnet und gespeichert.
In der Konfigurationsdatei gibts einen Abschnitt, der die Nachkommastellen definiert, jeweis für base (NXT), counter (BTC) und die rate, zu der das gehandelt wird.
8
8
8
8
8
7
3
8
7
Dann gibt es eine Klasse, die drei Instanzen eines Dezimalstellen-Sets aufnimmt. Das wird beim Start geladen und erzeugt.
case class Decimals ( calc: DecSet,
show: DecSet,
trade: DecSet )
case class DecSet ( decRate: Int,
decBase: Int,
decCntr: Int,
fmtHRtA: String => String,
fmtHRtB: String => String) {
import tradebot.div.tools._
/* rounding */
def rndRate(v: Double) = roundDouble(v, decRate)
def rndBase(v: Double) = roundDouble(v, decBase)
def rndCntr(v: Double) = roundDouble(v, decCntr)
/* formatting */
def fmtRate(v: Double) = format(v, decRate)
def fmtBase(v: Double) = format(v, decBase)
def fmtCntr(v: Double) = format(v, decCntr)
/* highlight the four relevant decimals */
def fmtHRate(v: Double) = { ... }
}
Jetzt kann ich anderen Klassen zu verschiedenen Zwecken Instanzen dieser DecSet- Klasse übergeben und muß mich nicht mehr um Runden, Formatieren etc. kümmern.
Beispiel
case class SDBasicTrade ( trdDirection: TTrdDir.TTrdDir,
amount: Double,
rate: Double) {
def toStr(decs: DecSet, units: BCUnits) =
List( TTrdDir.toStr(trdDirection).toUpperCase, decs.fmtBase(amount),
units.b, "@", decs.fmtRate(rate)).mkString(" ")
}
Jetzt kann ich sehr schnell und einheitlich eine Ausgabe auf die Konsole erzeugen:
val trade = SDBasicTrade ( trdDirection = tdBuy,
amount = 1,
rate = 0.01 )
println("executing trade -> " + trade.toStr(decs.trade, ... )
logic.executeTrade(trade)
So, die ganzen Vorarbeiten sind natürlich etwas länglich, aber wenn sie gemacht sind, kann ich alle Dezimalstellen einheitlich runden und formatieren. Und muß für ein anderes Handelpaar an einer anderen Exchange nur ein paar Zahlen in einer Konfigurationsdatei ändern.