我正在实施一个交易系统,我想对实时交易和回测使用相同的代码。在进行实时交易时,我需要持久化发生的所有事情,但是在回测时,我想使用相同的类和逻辑但不持久化它们(为了速度,因为我没有理由存储它们)。
我想我可以通过不调用 save() 来做到这一点,但我遇到了一个问题。我有一个 Account 类,其中包含 Position 对象的 hasMany 集合。问题是我需要在账户中找到正确的位置,但似乎我做不到,因为它从未被保存。我尝试遍历 hasMany 的 Positions 集合,但其中没有任何内容,即使我构造了一个 Position 对象并使用 addToPositions() 将其添加到帐户中。我想这在我试图避免的 save() 调用之后才有意义。
有没有办法为持久和瞬态目的重用相同的类,还是我试图做出不自然的行为?我愿意接受有关如何在这两种情况下重用这些类的任何建议。
更新(添加代码示例):
Account.groovy:
class Account {
String name
static belongsTo = [user:S2User]
static hasMany = [positions:Position, transactions:Transaction]
}
SimAccount.groovy:
class SimAccount extends Account {
}
位置.groovy:
class Position implements Serializable {
String symbol
static belongsTo = [account:Account]
}
BacktestController.groovy:
// add Account
def acct = new SimAccount(name:"backtest")
// add position
def pos = new Position(symbol:'SIRI')
acct.addToPositions(pos)
策略.groovy:
println "apply($accounts, $quotes) [$name]"
accounts.each{ a ->
println " acct $a (${a?.name})"
a?.positions?.each{ p ->
println " pos: $p"
}
}
def siri = Position.findByAccountAndSymbol(accounts[0], 'SIRI')
println "siri pos: $siri"
保存对象后 Strategy.groovy 的输出是
apply([com.lossless.account.SimAccount : 1, null], [:]) [Live SIRI 50k]
acct com.lossless.account.SimAccount : 1 (sim1)
pos: com.lossless.account.Position : 1
acct null (null)
siri pos: com.lossless.account.Position : 1
对象尚未保存时的输出是
apply([com.lossless.account.SimAccount : null, null], [bid:1.74, ask:1.74]) [Backtest SIRI 50k]
acct com.lossless.account.SimAccount : null (backtest)
pos: com.lossless.account.Position : null
acct null (null)
| Error 2013-01-21 03:11:11,984 [http-bio-8080-exec-2] ERROR errors.GrailsExceptionResolver - TransientObjectException occurred when processing request: [POST] /lossless/backtest/index - parameters:
object references an unsaved transient instance - save the transient instance before flushing: com.lossless.account.Account. Stacktrace follows:
Message: object references an unsaved transient instance - save the transient instance before flushing: com.lossless.account.Account
Line | Method
->> 105 | doCall in org.grails.datastore.gorm.GormStaticApi$_methodMissing_closure2
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
| 66 | apply in com.lossless.Strategy
Strategy.groovy 中的第 66 行是对Position.findByAccountAndSymbol()
.