将策略 Pine 脚本从 v2 转换为 v4,做到了,但得到了不同的错误结果
Convert strategy Pine script from v2 to v4 , did it, but got different and wrong results
我的原始脚本基于具有特定条件的 HeikinAshi 策略。
//@version=2
//Heikin Ashi Strategy V2 by breizh29
strategy("Heikin Ashi Strategy V2",shorttitle="HAS V2",overlay=true,default_qty_type=strategy.percent_of_equity, default_qty_value=100,initial_capital=100,currency=currency.GBP)
res = input(title="Heikin Ashi Candle Time Frame", type=resolution, defval="60")
hshift = input(1,title="Heikin Ashi Candle Time Frame Shift")
res1 = input(title="Heikin Ashi EMA Time Frame", type=resolution, defval="180")
mhshift = input(0,title="Heikin Ashi EMA Time Frame Shift")
fama = input(1,"Heikin Ashi EMA Period")
test = input(1,"Heikin Ashi EMA Shift")
sloma = input(30,"Slow EMA Period")
slomas = input(1,"Slow EMA Shift")
macdf = input(false,title="With MACD filter")
res2 = input(title="MACD Time Frame", type=resolution, defval="15")
macds = input(1,title="MACD Shift")
//Heikin Ashi Open/Close Price
ha_t = heikinashi(tickerid)
ha_open = security(ha_t, res, open[hshift])
ha_close = security(ha_t, res, close[hshift])
mha_close = security(ha_t, res1, close[mhshift])
//macd
[macdLine, signalLine, histLine] = macd(close, 12, 26, 9)
macdl = security(ha_t,res2,macdLine[macds])
macdsl= security(ha_t,res2,signalLine[macds])
//Moving Average
fma = ema(mha_close[test],fama)
sma = ema(ha_close[slomas],sloma)
plot(fma,title="MA",color=lime,linewidth=2,style=line)
plot(sma,title="SMA",color=red,linewidth=2,style=line)
//Strategy
golong = crossover(fma,sma) and (macdl > macdsl or macdf == false )
goshort = crossunder(fma,sma) and (macdl < macdsl or macdf == false )
strategy.entry("Buy",strategy.long,when = golong)
if (goshort)
strategy.close("Buy")
我编译的 v4 脚本是
// This source code is subject to the terms of the Mozilla Public License 2.0 at https://mozilla.org/MPL/2.0/
// © Stopperbg
//@version=4
strategy("HAS V3",shorttitle="HAS V3",overlay=true,default_qty_type=strategy.percent_of_equity, default_qty_value=100,initial_capital=1000,currency=currency.USD)
res = input(title="Heikin Ashi Candle Time Frame", type=input.resolution, defval="60")
hshift = input(1,title="Heikin Ashi Candle Time Frame Shift")
res1 = input(title="Heikin Ashi EMA Time Frame", type=input.resolution, defval="180")
mhshift = input(0,title="Heikin Ashi EMA Time Frame Shift")
fama = input(1,"Heikin Ashi EMA Period")
test = input(1,"Heikin Ashi EMA Shift")
sloma = input(30,"Slow EMA Period")
slomas = input(1,"Slow EMA Shift")
macdf = input(false,title="With MACD filter")
res2 = input(title="MACD Time Frame", type=input.resolution, defval="15")
macds = input(1,title="MACD Shift")
//Heikin Ashi Open/Close Price
t = tickerid(syminfo.prefix, syminfo.ticker, session.regular)
ha_t = heikinashi(t)
ha_open = security(ha_t, res, open[hshift])
ha_close = security(ha_t, res, close[hshift])
mha_close = security(ha_t, res1, close[mhshift])
//macd
[macdLine, signalLine, histLine] = macd(close, 12, 26, 9)
macdl = security(ha_t,res2,macdLine[macds])
macdsl= security(ha_t,res2,signalLine[macds])
//Moving Average
fma = ema(mha_close[test],fama)
sma = ema(ha_close[slomas],sloma)
plot(fma,title="MA",color=color.lime,linewidth=2,style=plot.style_line)
plot(sma,title="SMA",color=color.red,linewidth=2,style=plot.style_line)
//Strategy
golong = crossover(fma,sma) and (macdl > macdsl or macdf == false )
goshort = crossunder(fma,sma) and (macdl < macdsl or macdf == false )
strategy.entry("Buy",strategy.long,when = golong)
if (goshort)
strategy.close("Buy")
我按照教程进行操作,我的脚本没有错误。
我进行此转换,因为我想添加 alertcondition
以在满足条件时发出警报。
在 v2 上没有添加买入或卖出信号的警报,请注意,在 Pine v4 中,alertcondition
调用会生成额外的绘图。当我们计算每个脚本的输出序列数时,所有此类调用都会被考虑在内。
但是我得到了不同的结果。有什么问题吗?
所以我设法修复了它。
添加前瞻=barmerge.lookahead_on
ha_open = security(ha_t, res, open[hshift], lookahead=barmerge.lookahead_on)
ha_close = security(ha_t, res, close[hshift], lookahead=barmerge.lookahead_on)
mha_close = security(ha_t, res1, close[mhshift], lookahead=barmerge.lookahead_on)
他们将前瞻更改为默认关闭
该脚本具有误导性并产生不切实际的结果。
使用默认设置,代码通过使用未来数据来计算用于触发 Buy/Sell 订单的 fma
变量来作弊。如果 hshift == 0
或 mhshift == 0
(默认值),那么您的脚本将使用未来数据,从而误导交易者或您。
为避免这种情况,您应该更改这些行:
hshift = input(1,title="Heikin Ashi Candle Time Frame Shift")
mhshift = input(0,title="Heikin Ashi EMA Time Frame Shift")
至:
hshift = input(1,title="Heikin Ashi Candle Time Frame Shift", minval = 1)
mhshift = input(1,title="Heikin Ashi EMA Time Frame Shift", minval = 1)
有关详细信息,请参阅 How to avoid repainting when using security() - PineCoders FAQ。
Note that the scripts using the source code you reused have been moderated a while back for the exact reason that they were misleading.
我的原始脚本基于具有特定条件的 HeikinAshi 策略。
//@version=2
//Heikin Ashi Strategy V2 by breizh29
strategy("Heikin Ashi Strategy V2",shorttitle="HAS V2",overlay=true,default_qty_type=strategy.percent_of_equity, default_qty_value=100,initial_capital=100,currency=currency.GBP)
res = input(title="Heikin Ashi Candle Time Frame", type=resolution, defval="60")
hshift = input(1,title="Heikin Ashi Candle Time Frame Shift")
res1 = input(title="Heikin Ashi EMA Time Frame", type=resolution, defval="180")
mhshift = input(0,title="Heikin Ashi EMA Time Frame Shift")
fama = input(1,"Heikin Ashi EMA Period")
test = input(1,"Heikin Ashi EMA Shift")
sloma = input(30,"Slow EMA Period")
slomas = input(1,"Slow EMA Shift")
macdf = input(false,title="With MACD filter")
res2 = input(title="MACD Time Frame", type=resolution, defval="15")
macds = input(1,title="MACD Shift")
//Heikin Ashi Open/Close Price
ha_t = heikinashi(tickerid)
ha_open = security(ha_t, res, open[hshift])
ha_close = security(ha_t, res, close[hshift])
mha_close = security(ha_t, res1, close[mhshift])
//macd
[macdLine, signalLine, histLine] = macd(close, 12, 26, 9)
macdl = security(ha_t,res2,macdLine[macds])
macdsl= security(ha_t,res2,signalLine[macds])
//Moving Average
fma = ema(mha_close[test],fama)
sma = ema(ha_close[slomas],sloma)
plot(fma,title="MA",color=lime,linewidth=2,style=line)
plot(sma,title="SMA",color=red,linewidth=2,style=line)
//Strategy
golong = crossover(fma,sma) and (macdl > macdsl or macdf == false )
goshort = crossunder(fma,sma) and (macdl < macdsl or macdf == false )
strategy.entry("Buy",strategy.long,when = golong)
if (goshort)
strategy.close("Buy")
我编译的 v4 脚本是
// This source code is subject to the terms of the Mozilla Public License 2.0 at https://mozilla.org/MPL/2.0/
// © Stopperbg
//@version=4
strategy("HAS V3",shorttitle="HAS V3",overlay=true,default_qty_type=strategy.percent_of_equity, default_qty_value=100,initial_capital=1000,currency=currency.USD)
res = input(title="Heikin Ashi Candle Time Frame", type=input.resolution, defval="60")
hshift = input(1,title="Heikin Ashi Candle Time Frame Shift")
res1 = input(title="Heikin Ashi EMA Time Frame", type=input.resolution, defval="180")
mhshift = input(0,title="Heikin Ashi EMA Time Frame Shift")
fama = input(1,"Heikin Ashi EMA Period")
test = input(1,"Heikin Ashi EMA Shift")
sloma = input(30,"Slow EMA Period")
slomas = input(1,"Slow EMA Shift")
macdf = input(false,title="With MACD filter")
res2 = input(title="MACD Time Frame", type=input.resolution, defval="15")
macds = input(1,title="MACD Shift")
//Heikin Ashi Open/Close Price
t = tickerid(syminfo.prefix, syminfo.ticker, session.regular)
ha_t = heikinashi(t)
ha_open = security(ha_t, res, open[hshift])
ha_close = security(ha_t, res, close[hshift])
mha_close = security(ha_t, res1, close[mhshift])
//macd
[macdLine, signalLine, histLine] = macd(close, 12, 26, 9)
macdl = security(ha_t,res2,macdLine[macds])
macdsl= security(ha_t,res2,signalLine[macds])
//Moving Average
fma = ema(mha_close[test],fama)
sma = ema(ha_close[slomas],sloma)
plot(fma,title="MA",color=color.lime,linewidth=2,style=plot.style_line)
plot(sma,title="SMA",color=color.red,linewidth=2,style=plot.style_line)
//Strategy
golong = crossover(fma,sma) and (macdl > macdsl or macdf == false )
goshort = crossunder(fma,sma) and (macdl < macdsl or macdf == false )
strategy.entry("Buy",strategy.long,when = golong)
if (goshort)
strategy.close("Buy")
我按照教程进行操作,我的脚本没有错误。
我进行此转换,因为我想添加 alertcondition
以在满足条件时发出警报。
在 v2 上没有添加买入或卖出信号的警报,请注意,在 Pine v4 中,alertcondition
调用会生成额外的绘图。当我们计算每个脚本的输出序列数时,所有此类调用都会被考虑在内。
但是我得到了不同的结果。有什么问题吗?
所以我设法修复了它。 添加前瞻=barmerge.lookahead_on
ha_open = security(ha_t, res, open[hshift], lookahead=barmerge.lookahead_on)
ha_close = security(ha_t, res, close[hshift], lookahead=barmerge.lookahead_on)
mha_close = security(ha_t, res1, close[mhshift], lookahead=barmerge.lookahead_on)
他们将前瞻更改为默认关闭
该脚本具有误导性并产生不切实际的结果。
使用默认设置,代码通过使用未来数据来计算用于触发 Buy/Sell 订单的 fma
变量来作弊。如果 hshift == 0
或 mhshift == 0
(默认值),那么您的脚本将使用未来数据,从而误导交易者或您。
为避免这种情况,您应该更改这些行:
hshift = input(1,title="Heikin Ashi Candle Time Frame Shift")
mhshift = input(0,title="Heikin Ashi EMA Time Frame Shift")
至:
hshift = input(1,title="Heikin Ashi Candle Time Frame Shift", minval = 1)
mhshift = input(1,title="Heikin Ashi EMA Time Frame Shift", minval = 1)
有关详细信息,请参阅 How to avoid repainting when using security() - PineCoders FAQ。
Note that the scripts using the source code you reused have been moderated a while back for the exact reason that they were misleading.