各位老师新年快乐!
公式在下单前会检查账户可用的保证金并调整下单仓位来控制整体风险,但是当有多个策略单元应用公式交易不同的品种时会有可能同时产生信号,虽然每个策略检查时都可以以一个安全的仓位下单,但是同时下单还是会超越账户整体资金使用的安全险,请老师提供一些思路来解决这个问题。
如果你是组合交易,我不推荐你在下单的时候才检查保证金
因为,一旦多品种交易,肯定会出现,两个品种同时下单,同时查询,任何一个单独下单保证金都够,但是同时下单就不够,导致打架。
正确的做法应该是策略内部给定资金量,开仓不得超过这个资金量。同时风控也会很好做。
如果是单一品种,不用考虑多个品种同步处理的问题,那么正常查询就行了。
如果执意要用组合交易还要查询可用保证金这种形式,我也没有什么号的办法,只能硬查,而且也解决不了多个品种同时开仓的兼容问题
谢谢老师的回复,我也觉得在下单的时候检查保证金会出问题。通过设置一个跨策略的全局锁大概率也不行,我猜咱们TB3的全局变量用作锁的时候未必能保证原子性和互斥性。
我的一个初步的想法是弄一个【独立的策略单元】,所以其它策略单元要下单时候就把下单信息通过event推送给这个【独立的策略单元】,然后这个【独立策略单元里】将收到的信息放到一个队列(比如以数组的形式),这个【独立的策略单元】就按照顺序依次处理下单处理,这样来避免并发下单的问题,然后下单后止盈止损还是由原来下单的策略各自负责,然后止盈止损的订单还是推送给【独立的策略单元】来处理。请问下老师,抛开实现这个思路的实现难度,但从技术可能性上来说,TB3应该是能支持的吧?
可以支持
写数据库,写基础数据来实现。
不过感觉会很麻烦,需要解决的问题也比较多
谢谢老师,我先弄您建议的给定资金量那个版本,再来尝试弄这个复杂些的
AI正在改变世界
DeepSeek, Kimi,ChatGPT, 豆包, Perplexity, Github Copilot这些辅助的AI我都有,我也可以自己问,自己测试,如果不麻烦老师做AI的搬运工。
当多个策略单元同时交易不同品种时,虽然每个策略单元单独检查保证金和仓位是安全的,但多个策略单元同时下单可能会导致整体资金使用超出安全范围。为了解决这个问题,可以采用以下思路:
通过全局变量或函数统一管理账户的资金使用情况,确保多个策略单元的总仓位和资金使用不超过预设的安全范围。
pascal
复制
Vars:
Numeric totalMarginUsed(0); // 全局变量,记录已用保证金
Numeric maxMarginRatio(0.5); // 最大保证金使用比例(50%)
Numeric accountEquity(0); // 账户净值
Begin
// 获取账户净值
accountEquity = Portfolio_CurrentCapital();
// 计算当前可用保证金
Numeric availableMargin = accountEquity * maxMarginRatio - totalMarginUsed;
// 策略单元1下单逻辑
If (Condition1 And availableMargin > RequiredMargin1) Then
Begin
Buy(1, Open);
totalMarginUsed = totalMarginUsed + RequiredMargin1; // 更新已用保证金
End;
// 策略单元2下单逻辑
If (Condition2 And availableMargin > RequiredMargin2) Then
Begin
SellShort(1, Open);
totalMarginUsed = totalMarginUsed + RequiredMargin2; // 更新已用保证金
End;
End
为多个策略单元设置信号排队机制和优先级,确保在同一时间只有一个策略单元可以下单。
pascal
复制
Vars:
Bool isTrading(False); // 全局变量,标记是否有策略单元正在下单
Begin
// 策略单元1下单逻辑
If (Condition1 And Not isTrading) Then
Begin
isTrading = True; // 标记为正在下单
Buy(1, Open);
isTrading = False; // 标记为下单完成
End;
// 策略单元2下单逻辑
If (Condition2 And Not isTrading) Then
Begin
isTrading = True; // 标记为正在下单
SellShort(1, Open);
isTrading = False; // 标记为下单完成
End;
End
根据账户整体资金使用情况,动态调整每个策略单元的下单仓位。
pascal
复制
Vars:
Numeric totalMarginUsed(0); // 全局变量,记录已用保证金
Numeric maxMarginRatio(0.5); // 最大保证金使用比例(50%)
Numeric accountEquity(0); // 账户净值
Begin
// 获取账户净值
accountEquity = Portfolio_CurrentCapital();
// 计算当前可用保证金
Numeric availableMargin = accountEquity * maxMarginRatio - totalMarginUsed;
// 策略单元1下单逻辑
If (Condition1) Then
Begin
Numeric lotSize1 = IntPortion(availableMargin / RequiredMarginPerLot1); // 计算可下手数
If (lotSize1 > 0) Then
Begin
Buy(lotSize1, Open);
totalMarginUsed = totalMarginUsed + lotSize1 * RequiredMarginPerLot1; // 更新已用保证金
End;
End;
// 策略单元2下单逻辑
If (Condition2) Then
Begin
Numeric lotSize2 = IntPortion(availableMargin / RequiredMarginPerLot2); // 计算可下手数
If (lotSize2 > 0) Then
Begin
SellShort(lotSize2, Open);
totalMarginUsed = totalMarginUsed + lotSize2 * RequiredMarginPerLot2; // 更新已用保证金
End;
End;
End
设计一个集中式的风控模块,统一管理所有策略单元的下单请求。
pascal
复制
// 风控模块
Function Bool RiskControl(Numeric requiredMargin)
Begin
Numeric accountEquity = Portfolio_CurrentCapital();
Numeric maxMarginRatio = 0.5; // 最大保证金使用比例(50%)
Numeric availableMargin = accountEquity * maxMarginRatio - totalMarginUsed;
If (availableMargin >= requiredMargin) Then
Begin
totalMarginUsed = totalMarginUsed + requiredMargin; // 更新已用保证金
Return True;
End
Else
Begin
Return False;
End;
End
// 策略单元1下单逻辑
If (Condition1 And RiskControl(RequiredMargin1)) Then
Begin
Buy(1, Open);
End;
// 策略单元2下单逻辑
If (Condition2 And RiskControl(RequiredMargin2)) Then
Begin
SellShort(1, Open);
End;
定期检查账户整体资金使用情况,并根据实际情况动态调整策略单元的下单逻辑。
pascal
复制
Vars:
Numeric lastCheckTime(0); // 上次检查时间
Begin
// 每分钟检查一次
If (Time - lastCheckTime >= 60) Then
Begin
lastCheckTime = Time;
// 检查账户资金使用情况
Numeric accountEquity = Portfolio_CurrentCapital();
Numeric maxMarginRatio = 0.5; // 最大保证金使用比例(50%)
Numeric availableMargin = accountEquity * maxMarginRatio - totalMarginUsed;
// 如果超出安全范围,暂停部分策略单元
If (availableMargin <= 0) Then
Begin
// 暂停策略单元1
Condition1 = False;
End;
End;
End
通过以上方法,可以有效解决多个策略单元同时下单导致的整体资金使用超出安全范围的问题。具体实现时,可以根据实际需求选择适合的方法,或结合多种方法进行综合管理。
用DeepSeek AI 回答的。我只是转抄。老师看这个回到如何。
在开拓者量化软件(TradeBlazer)中,实现多个策略单元并行运行时,控制整体仓位风险的关键在于统一管理仓位和风险。以下是一些常见的方法和示例代码:
以下是一个简单的示例,展示如何在多个策略单元中控制整体仓位风险。
pascal
复制
// 全局变量,用于记录整体仓位
Vars
NumericSeries TotalPosition; // 记录整体仓位
Numeric MaxPositionLimit(5); // 最大仓位限制
Numeric RiskPerTrade(0.02); // 每笔交易的风险比例
// 初始化
Begin
TotalPosition = 0; // 初始化整体仓位为0
End
// 策略单元1
If (Condition1) Then
Begin
// 计算当前仓位
Numeric CurrentPosition = TotalPosition + MarketPosition;
// 检查是否超过仓位限制
If (CurrentPosition < MaxPositionLimit) Then
Begin
Buy(1, Open); // 开仓
TotalPosition = TotalPosition + 1; // 更新整体仓位
End
End
// 策略单元2
If (Condition2) Then
Begin
// 计算当前仓位
Numeric CurrentPosition = TotalPosition + MarketPosition;
// 检查是否超过仓位限制
If (CurrentPosition < MaxPositionLimit) Then
Begin
SellShort(1, Open); // 开仓
TotalPosition = TotalPosition - 1; // 更新整体仓位
End
End
// 风险控制:根据账户资金计算每笔交易的手数
Numeric CalculateLotSize()
Begin
Numeric AccountEquity = Portfolio_CurrentCapital(); // 获取当前账户资金
Numeric LotSize = IntPortion(AccountEquity * RiskPerTrade / (BigPointValue * ATR(14))); // 根据风险比例计算手数
Return LotSize;
End
// 策略单元3
If (Condition3) Then
Begin
// 计算当前仓位
Numeric CurrentPosition = TotalPosition + MarketPosition;
// 检查是否超过仓位限制
If (CurrentPosition < MaxPositionLimit) Then
Begin
Numeric LotSize = CalculateLotSize(); // 计算手数
Buy(LotSize, Open); // 开仓
TotalPosition = TotalPosition + LotSize; // 更新整体仓位
End
End
通过这些方法,你可以在多个策略单元并行运行时有效控制整体仓位风险。
唉