我正在实施一个交易系统,我想在实时交易和回测中使用相同的代码。在进行实时交易时,我需要坚持发生的所有事情,但在回测时,我想使用相同的类和逻辑,但不要坚持它们(为了速度,因为我没有理由存储它们。)
我以为我可以通过不对它们调用save()来做到这一点,但我遇到了一个问题。我有一个Account类,其中包含一个hasMany Position对象集合。麻烦的是我需要在帐户中找到正确的位置,但似乎我不能,因为它从未被保存过。我尝试迭代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 {
}
Position.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)
Strategy.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()
的调用。