老师好,我有个策略是用来止损的,但是运行时可能会关联多个帐号,我需要查询一个最高的浮赢,然后根据比例来止损,例如我的代码如下:
变量定义如下:
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循环里面获取到的最高值都是同一个了