我正在尝试编写代码,在 first 柱收盘时关闭每笔未平仓交易,其中该平仓将为该特定交易产生盈利结果。不允许在与发起交易的柱相同的柱上平仓,但这应该是不可能的,因为入场是在柱的收盘处。我正在启用金字塔交易,因此它需要将每一手判断为自己的交易,以便退出,而不是将它们混在一起并关闭整个头寸。 如果这个退出系统按其应有的方式运作,那么任何已平仓的交易都不可能出现亏损。 只有胜利才能结束。 如果尚未盈利,交易应保持开放状态直至盈利。
我不擅长编码,所以如果你回答,请像我是个白痴一样跟我说话,因为就编码而言,我就是。 感谢任何人可以提供的帮助!
为了使其发挥作用,您需要为您的交易提供唯一的 ID。
strategy.entry(id, direction, qty, limit, stop, oca_name, oca_type, comment, alert_message, disable_alert) → void
id(系列字符串)订单的标识符,对应 订单成交后策略交易中的入场 ID。如果 策略在填写订单后开新仓,订单 ID 成为strategy.position_entry_name值。策略命令可以 引用订单ID取消或修改挂单并生成 特定未平仓交易的退出订单。策略测试器和 图表显示订单 ID,除非命令指定注释 值。
做到这一点的一种方法是使用计数器系统。例如,
L-1, L-2, L-3
...用于多头交易。
然后,当您下平仓订单时,您将参考该条目 ID。
strategy.close(id, comment, qty, qty_percent, alert_message, immediately, disable_alert) → void
id(系列字符串) 要平仓的未平仓交易的入场标识符。
这是基本思想。实施由你决定。不知何故,您需要知道交易 ID 和利润。
您可以使用内置变量循环未平仓交易,获取利润和交易 ID。然后,如果该特定交易盈利,您可以致电
strategy.close()
。
一个重要的注意事项是,您需要设置
close_entries_rule="ANY"
。否则,最早的退出订单必须关闭最早的入场订单。
这里有一个例子:
//@version=6
strategy("My strategy", overlay=true, pyramiding=10, process_orders_on_close=true, close_entries_rule="ANY")
var long_cnt = 1
long_entry_cond = (bar_index % 3) == 0 // Enter a new trade every third bar
if (long_entry_cond)
long_id = "L-" + str.tostring(long_cnt) // Create the entry id
strategy.entry(long_id, strategy.long)
if (strategy.position_size > strategy.position_size[1]) // New trade
long_cnt := long_cnt + 1
for i = 0 to strategy.opentrades - 1
trade_id = strategy.opentrades.entry_id(i)
profit = strategy.opentrades.profit(i)
if (profit > 0) // In profit
strategy.close(trade_id, comment="C-" + trade_id)
s = "Trade: " + trade_id + "\nProfit: " + str.tostring(profit, format.price)
label.new(bar_index, high, s)