0

我正在实施一个交易系统,我想对实时交易和回测使用相同的代码。在进行实时交易时,我需要持久化发生的所有事情,但是在回测时,我想使用相同的类和逻辑但不持久化它们(为了速度,因为我没有理由存储它们)。

我想我可以通过不调用 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().

4

0 回答 0