LOADING...
LOADING...
LOADING...
当前位置: 玩币族首页 > 行情分析 > Pine语言入门(十四)一种趋势交易策略——ATR通道突破策略的编写逻辑

Pine语言入门(十四)一种趋势交易策略——ATR通道突破策略的编写逻辑

2020-11-24 金金 来源:区块链网络

本篇文章主要内容:

步骤1:定义策略设置和输入选项
步骤2:计算交易策略值
步骤3:输出策略的数据并可视化信号
步骤4:编写做多交易规则
步骤5:编写卖空交易规则
步骤6:用开单命令建立交易头寸
步骤7:用退出订单关闭市场头寸

趋势跟随TradingView的ATR渠道突破策略

在海龟交易法则中,ATR通道突破策略是一种终于的趋势跟踪策略。

此策略是基于波动率的系统,使用平均真实范围(ATR)作为价格波动的度量。今天的策略编写是根据最近的波动率绘制了一个上限和下限。这些波段使识别超出正常交易范围的价格变动并标记新趋势的开始变得容易。

ATR通道突围策略的具体规则

开多规则:
当收盘价高于通道顶部时,打开多头头寸,其计算如下:350天移动平均线+ 7 x 20条平均真实距离(ATR)。
平多规则:
当价格跌破350天移动均线时,关闭多头头寸。
开空规则:
当收盘价低于通道底部时,打开一个空头头寸,计算如下:350天移动平均线-3 x ATR。
平空规则:
当价格超过350天移动平均线时,平仓。
头寸规模:
对于多头和空头头寸,通过将0.5%的权益除以市场上20柱平均真实区间(ATR)的美元价值来确定头寸规模。
该策略还缺止损指令。但是,有一个隐含的止损:当价格逆着该头寸移动时,在某个时候,它们将越过350天移动平均线。然后将触发该策略的退出信号。这样,虽然控制了损失,但这不是预先确定价格的固定止损。

编写ATR通道突破交易策略代码

根据以上分析过程,将编码过程分几个模块:

//@version=4
//步骤1:定义策略设置和输入选项
//步骤2:计算交易策略值
//步骤3:输出策略的数据并可视化信号
//步骤4:编写做多交易规则
//步骤5:编写卖空交易规则
//步骤6:用开单命令建立交易头寸
//步骤7:用退出订单关闭市场头寸

步骤1:定义策略设置和输入选项

我们首先定义策略的设置及其输入选项。如下:

//@version=4
// 步骤1. 定义策略设置和输入选项
strategy(title=”ATR Channel Breakout”, overlay=true,
pyramiding=0, initial_capital=100000,
commission_type=strategy.commission.cash_per_order,
commission_value=4, slippage=2)

smaLength = input(title=”SMA Length”, type=integer, defval=350)
atrLength = input(title=”ATR Length”, type=integer, defval=20)

ubOffset = input(title=”Upperband Offset”, type=float, defval=7, step=0.50)
lbOffset = input(title=”Lowerband Offset”, type=float, defval=3, step=0.50)

usePosSize = input(title=”Use Position Sizing?”, type=bool, defval=true)
riskPerc = input(title=”Risk %”, type=float, defval=0.5, step=0.25)

我们使用strategy()函数设置脚本的设置。除了典型的选项之外,我们还用于pyramiding关闭缩放到位置的功能。随着initial_capital我们设置了战略的首发基金100,000。我们将commission_value每笔交易(commission_type)的佣金设置为4 ()。将slippage参数设置为2时,止损和市场定单的价格降低了2个报价。(由于佣金和滑点悲观,该策略确实必须证明其价值。)

接下来,我们添加策略的输入选项。我们通过input()函数来做到这一点。前两个输入选项“ SMA Length”和“ ATR Length”是我们用于ATR通道的整数输入。我们给这些默认值分别为350和20。

接下来的两个是浮点输入选项:“上限偏移”和“下限偏移”。这些将确定将ATR乘以平均带宽的上限和下限。它们的默认值为7和3。

接下来是布尔值true / false输入选项:“使用排名调整?”。使用此设置,我们可以轻松打开或关闭策略的排名算法。我们从使用该算法(defval=true)开始,但是如果关闭此设置,该策略将只为每笔交易交易一个合约。

“风险%”是最后一个输入选项。这定义了仓位定单代码每笔交易使用多少权益。默认风险为0.5%。

每个输入选项的值存储在变量中。这样一来,我们稍后就可以通过使用变量来引用输入选项的当前值。

步骤2:计算交易策略值

smaValue = sma(close, smaLength)
atrValue = atr(atrLength)

upperBand = smaValue + (ubOffset atrValue)
lowerBand = smaValue - (lbOffset atrValue)

riskEquity = (riskPerc / 100) strategy.equity
atrCurrency = (atrValue syminfo.pointvalue)
posSize = usePosSize ? floor(riskEquity / atrCurrency) : 1

首先,我们使用TradingView的sma()功能确定SMA 。我们close针对smaLength输入变量设置的柱线数量在收盘价()上运行该函数。然后,我们使用atr()函数和atrLength输入变量来计算ATR 。我们将这两个计算值存储在smaValue和atrValue变量中。

接下来,我们计算ATR通道的上限和下限。对于上限频段,我们将SMA乘以ATR值乘以ubOffset,将输入变量设为默认值7。为达到频段上限,我们将SMA乘以ATR乘以lbOffset。我们将这些band值存储在upperBand和lowerBand变量中。

然后我们计算仓位大小。Faith(2007)使用的算法有两个组成部分:权益百分比和货币价值的ATR。第一部分将我们除以riskPerc100。这会将基于百分比的输入选项转换为十进制值(因此0.5%变为0.005)。然后,将乘以strategy.equity一个变量,该变量返回该策略的当前权益(即初始资本+累计净利润+未平仓头寸利润)(TradingView,nd)。

为了确定ATR的货币的价值,我们乘atrValue用syminfo.pointvalue。该TradingView变量返回当前工具的点值(TradingView,nd)。例如,对于E-mini S&P,此变量返回50,因为ES中价格变动的一个点价值$ 50。基础原油为1,000桶的原油期货的syminfo.pointvalue回报为1,000。

posSize我们接下来创建的变量将保留策略的头寸规模。这里我们有条件运算符(?:)检查usePosSize输入变量是否为true。在这种情况下,我们将风险权益除以ATR货币价值。然后我们使用的floor()功能圆头寸规模下降到最近的整数。false但是,如果该输入变量posSize为1 ,我们只需将其设置为1。这使我们总是在关闭头寸调整输入时交易一张合约。

步骤3:输出策略的数据并显示在图表上

plot(series=smaValue, title=”SMA”, color=orange)
plot(series=upperBand, title=”UB”, color=green,
linewidth=2)
plot(series=lowerBand, title=”LB”, color=red,
linewidth=2)

我们使用TradingView的plot()功能在图表上显示策略的值。第一条plot()语句显示了350天移动平均线(smaValue)。我们将该图命名为“ SMA”并为其着色orange。

接下来的两个plot()函数调用在图表上显示ATR通道的上限和下限。我们发现upperBand在值的green颜色,并有lowerBand值显示用的red颜色值。将linewidth参数设置为2时,这些折线图比正常粗一些。

步骤4:编写多头交易规则

接下来是确定何时开空和凭空的条件。从上面的交易规则我们知道,当收盘价突破通道的上限时,该策略就会持续做多。当价格低于简单移动平均线时,就会平空。

enterLong = crossover(close, upperBand)
exitLong = crossunder(close, smaValue)

我们在此处创建的第一个布尔变量从enterLong获得其真/假值crossover()。true当其第一个参数的值超过第二个参数的值时,该内置函数将返回。在这里,有函数检查K线收盘价(close)是否超过ATR通道的上沿(upperBand)。这使得enterLong true价格何时可以突破通道,false何时无法突破。

该exitLong布尔变量被其价值的crossunder()功能。true当其第一个参数的值降到第二个参数(TradingView,nd)的值以下时,该函数返回。我们以收盘价和350 bar SMA(smaValue)运行该功能。当价格突破移动平均线时,exitLong就是true。如果没有突破,则exitLong为false。

步骤5:设定开空条件

如交易规则所述,当价格收于较低的ATR通道以下时,我们做空。当价格高于SMA时,我们平空。

enterShort = crossunder(close, lowerBand)
exitShort = crossover(close, smaValue)

我们将enterShort布尔变量设置为crossunder()。有函数检查收盘价(close)是否跌至ATR通道(lowerBand)以下。若跌破,变量为true。否则,为false。

然后是编写exitShort变量,判断收盘价是否高于SMA(smaValue)。当高于,变量值为true,否则其为false。

步骤6:用开单命令建立交易头寸

接下来,依据前面步骤中的true / false变量打开多头和空头头寸:

if (enterLong)
strategy.entry(id=”EL”, long=true, qty=posSize)
if (enterShort)
strategy.entry(id=”ES”, long=false, qty=posSize)

第一个if语句检查是否enterLong为true。启用时,strategy.entry()函数打开一个多头头寸(long=true)。我们为该订单指定“ EL”标识符。并使用posSize变量定义订单数量。根据之前编写的变量,它要么持有基于ATR的0.5%权益,要么具有默认的单张合约。

另一个if语句求值enterShort。当变量为true时,strategy.entry()提交输入短订单(long=false)。将该订单命名为“ ES”,并将其提交给posSize头寸。

步骤7:用退出订单关闭市场头寸

然后,需要指定策略何时退出头寸。如下:

strategy.close(id=”EL”, when=exitLong)
strategy.close(id=”ES”, when=exitShort)

第一个strategy.close()函数调用是关闭开多命令(id=”EL”)。该函数提交市场订单。当退出做多的条件为真时,就提交此条命令。

同理,第二条是关闭开空命令。

现在,我们已经对策略的所有部分进行了编码,接下来让我们快速了解一下策略的性能。

在ATR通道突破策略在比特币走势中的应用

在日K线中,可以看出,此策略抓住了2016-2017年的超级大牛,并且在今年的下半年趋势中,在10900的位置开多直到现在。

但该策略也有很大的缺点。当价格横盘整理时,ATR通道突破策略多是止损交易,不过这也是很多趋势跟踪策略共有的特点,不过今天主要是先理解此策略的使用逻辑和方法,明天会分享一个改良过的趋势交易策略。

完整代码如下:

//@version=4
//步骤1:定义策略设置和输入选项
strategy(title=”ATR Channel Breakout”, overlay=true,
pyramiding=0, initial_capital=100000,
commission_type=strategy.commission.cash_per_order,
commission_value=4, slippage=2)

smaLength = input(title=”SMA Length”, type=input.integer, defval=350)
atrLength = input(title=”ATR Length”, type=input.integer, defval=20)

ubOffset = input(title=”Upperband Offset”, type=input.float, defval=7, step=0.50)
lbOffset = input(title=”Lowerband Offset”, type=input.float, defval=3, step=0.50)

usePosSize = input(title=”Use Position Sizing?”, type=input.bool, defval=true)
riskPerc = input(title=”Risk %”, type=input.float, defval=0.5, step=0.25)

// //步骤2:计算交易策略值
smaValue = sma(close, smaLength)
atrValue = atr(atrLength)
upperBand = smaValue + (ubOffset atrValue)
lowerBand = smaValue - (lbOffset atrValue)
riskEquity = (riskPerc / 100) strategy.equity
atrCurrency = (atrValue syminfo.pointvalue)
posSize = usePosSize ? floor(riskEquity / atrCurrency) : 1

//步骤3:输出策略的数据并可视化信号
plot(series=smaValue, title=”SMA”, color=color.orange)
plot(series=upperBand, title=”UB”, color=color.green,
linewidth=2)
plot(series=lowerBand, title=”LB”, color=color.red,
linewidth=2)

//步骤4:编写做多交易规则
enterLong = crossover(close, upperBand)
exitLong = crossunder(close, smaValue)

//步骤5:编写卖空交易规则
enterShort = crossunder(close, lowerBand)
exitShort = crossover(close, smaValue)

//步骤6:用开单命令建立交易头寸
if (enterLong)
strategy.entry(id=”EL”, long=true, qty=posSize)
if (enterShort)
strategy.entry(id=”ES”, long=false, qty=posSize)

//步骤7:用退出订单关闭市场头寸
strategy.close(id=”EL”, when=exitLong)
strategy.close(id=”ES”, when=exitShort)

有兴趣的可以复制脚本进行试验。

有想制定自己的指标和交易策略的伙伴,欢迎大家添加微信jinvlog交流。

注册Tradingview平台,点击Tradingview。

—-

编译者/作者:金金

玩币族申明:玩币族作为开放的资讯翻译/分享平台,所提供的所有资讯仅代表作者个人观点,与玩币族平台立场无关,且不构成任何投资理财建议。文章版权归原作者所有。

LOADING...
LOADING...