关于多帐号的序列变量的赋值和使用问题
老师好,我有个策略是用来止损的,但是运行时可能会关联多个帐号,我需要查询一个最高的浮赢,然后根据比例来止损,例如我的代码如下:变量定义如下:Vars Series<Numeric> highLProfit; // 多仓最高盈亏 Series<Numeric> highSProfit; // 空仓最高盈亏关键代码如下:Numeric i; For i = 0 to A_AccountCount()-1{ Array<String> acct_symbols; A_GetPositionSymbols(acct_symbols, i); Numeric j; For j = 0 to GetArraySize(acct_symbols)-1 { Position pos; A_GetPosition(acct_symbols[j], pos, \"\", i); highLProfit=Max(highLProfit, pos.longFloatProfitO;); highSProfit=Max(highSProfit, pos.shortFloatProfitO;); ... 然后balaala代码 }}理论上,着两个high应该获取到最高值啊,但是我发现取到的数据永远是最新的数据并不是历史最高,请问是哪里的业务逻辑有问题么?
用一个global一定不行,因为两个帐号数据会相互覆盖,用Series也不行,因为同根K线下会被覆盖。可以这样:Global Array<Numeric> AA;就是搞多个全局变量,太多的话就弄成全局数组,一个全局变量对应一个帐号就可以了
使用global 和 profile 的本质区别就是一个放内存,一个放硬盘。作为一个计数器或者状态变量,两者能应用的场景应该是完全一样的。用global不行但是profile可以,我确实不太理解
回复:因为我是一个for循环遍历用来做止损(拿最高回撤举例),我要记录每一个帐号的每一个合约的最高浮赢(计算回撤比例),如果是序列值就会被此被覆盖成当前值(就是当前值变成了最高值),如果是global类型,如果是单帐户单合约是没问题的,如果是多合约,因为我只取最高浮赢,有些合约已入场可能就是负数,这个时候我会默认把最高浮赢置为零(因为入场就为负数有另外一个对浮亏更加敏感的循环来实现,他俩的比例和敏感度不一样),所以如果碰到这种情况,就会发现A合约的global值(假如最高浮赢是正数)会传递给B合约(假如是最高浮赢是负数)从而导致结果不准确。但是如果存到dbprofile就没问题了,每个都是自己单独的。
回复:哦 那你可以试试全局数组啊
使用Series或者Global在多帐号多合约的场景下, 都不行,我使用TBProfile中转存储一下搞定了,谢谢老师。
尤其是多帐号多合约的时候,这两个值就完全和预期不一致了。所以请教老师看看是不是代码的设计逻辑有点问题
回复:不要用序列,换成global看看
回复:谢谢老师,如果换成global变量的话,那么第二个j循环里面获取到的最高值都是同一个了