Pine script TradeView中的策略测试人员:数量和退货问题

Pine script TradeView中的策略测试人员:数量和退货问题,pine-script,Pine Script,我是新来的松树脚本 目前我正在玩一些现有的脚本 我想知道战略测试人员是否被窃听了 正如评论者所建议的那样,我已经编辑了这个问题,将脚本简化了很多,只是为了关注我的问题 1) 我对数量有问题。我写了这个脚本,它接受一个简单的信号(2毫安的交叉点),并试图翻转一个大小始终相同的多头/空头头寸[100000美元] 这就是我定义的原因 strategy("Debug Qty and Returns ", default_qty_type=strategy.cash, default_qty_value=

我是新来的松树脚本 目前我正在玩一些现有的脚本

我想知道战略测试人员是否被窃听了

正如评论者所建议的那样,我已经编辑了这个问题,将脚本简化了很多,只是为了关注我的问题

1) 我对数量有问题。我写了这个脚本,它接受一个简单的信号(2毫安的交叉点),并试图翻转一个大小始终相同的多头/空头头寸[100000美元]

这就是我定义的原因

strategy("Debug Qty and Returns ", default_qty_type=strategy.cash, default_qty_value=100000,overlay=true, precision=5)
我在股票代码BITMEX上尝试了以下脚本:XBTUSD interval DAILY

//@version=3
strategy("Debug Qty and Returns ", default_qty_type=strategy.cash, default_qty_value=100000,overlay=true, precision=5)

// Upon execution, why are some short trades with a notional of 200,000 USD equivalent ?

tradeType   = input("BOTH", title="Trade Type ", options=["LONG", "SHORT", "BOTH"])

// === BACKTEST RANGE ===
FromMonth = input(defval = 1, title = "From Month", minval = 1)
FromDay   = input(defval = 1, title = "From Day", minval = 1)
FromYear  = input(defval = 2019, title = "From Year", minval = 2014)
ToMonth   = input(defval = 1, title = "To Month", minval = 1)
ToDay     = input(defval = 1, title = "To Day", minval = 1)
ToYear    = input(defval = 9999, title = "To Year", minval = 2014) 

testPeriod() =>
    (time > timestamp(FromYear, FromMonth, FromDay, 00, 00)) and (time < timestamp(ToYear, ToMonth, ToDay, 23, 59))


//////////////////////////////

isLongOpen = false
isShortOpen = false

//Order open on previous ticker?
isLongOpen := nz(isLongOpen[1])
isShortOpen := nz(isShortOpen[1])

////////////
//Somes EMAs to trigger trades
ema7Avg = ema(ohlc4, 7)
ema30Avg = ema(ohlc4, 30)

plot(ema7Avg)
plot(ema30Avg)


//Entry Conditions
shortEntry= (tradeType=="SHORT" or tradeType=="BOTH") and crossunder(ema7Avg,ema30Avg )
longEntry = (tradeType=="LONG" or tradeType=="BOTH") and crossover(ema7Avg,ema30Avg )



///////////////////

shortExit = isShortOpen[1] and longEntry
longExit = isLongOpen[1] and shortEntry


if(testPeriod() and (tradeType == "LONG" or tradeType == "BOTH" ))
    strategy.entry("long", strategy.long, when=longEntry)
    strategy.close("long", when = longExit)

if(testPeriod() and (tradeType == "SHORT" or tradeType == "BOTH" ))
    strategy.entry("short", strategy.short, when=shortEntry)
    strategy.close("short", when = shortExit)


//If the value changed to invoke a buy, lets set it before we leave
isLongOpen := longEntry  ? true : (longExit == true ? false : isLongOpen)
isShortOpen := shortEntry ? true : (shortExit == true ? false : isShortOpen)

plotshape(isShortOpen,  title= "Short Open", color=red, style=shape.circle, location=location.bottom)
plotshape(isLongOpen,  title= "Long Open", color=green, style=shape.circle, location=location.bottom)
/@version=3
策略(“调试数量和返回”,默认数量类型=strategy.cash,默认数量值=100000,叠加值=true,精度=5)
//在执行时,为什么一些空头交易的名义价值为200000美元?
交易类型=输入(“两者”,title=“交易类型”,选项=[“长”、“短”、“两者”])
//==回测范围===
FromMonth=输入(defval=1,title=“From Month”,minval=1)
FromDay=输入(defval=1,title=“From Day”,minval=1)
FromYear=输入(defval=2019,title=“From Year”,minval=2014)
ToMonth=输入(defval=1,title=“To Month”,minval=1)
今天=输入(defval=1,title=“今天”,minval=1)
ToYear=输入(defval=9999,title=“To Year”,minval=2014)
testPeriod()=>
(时间>时间戳(FromYear,FromMonth,FromDay,00,00))和(时间<时间戳(ToYear,ToMonth,ToDay,23,59))
//////////////////////////////
isLongOpen=false
isShortOpen=假
//在上一个股票行情中打开的订单?
isLongOpen:=nz(isLongOpen[1])
isShortOpen:=nz(isShortOpen[1])
////////////
//一些股票市场将引发交易
ema7Avg=ema(ohlc4,7)
ema30Avg=ema(ohlc4,30)
绘图(ema7Avg)
绘图(ema30Avg)
//入境条件
shortEntry=(tradeType=“SHORT”或tradeType=“BOTH”)和crossunder(ema7Avg、ema30Avg)
longEntry=(tradeType=“LONG”或tradeType=“BOTH”)和crossover(ema7Avg、ema30Avg)
///////////////////
shortExit=isShortOpen[1]和longEntry
longExit=isLongOpen[1]和shortEntry
if(testPeriod()和(tradeType==“LONG”或tradeType==“两者”))
strategy.entry(“long”,strategy.long,when=longtentry)
策略关闭(“长”,当=长退出)
if(testPeriod()和(tradeType==“SHORT”或tradeType==“两者”))
strategy.entry(“short”,strategy.short,when=shortEntry)
策略关闭(“短”,当=短退出)
//如果该值更改为调用buy,那么让我们在离开之前设置它
isLongOpen:=longEntry?真:(longExit==真?假:isLongOpen)
isShortOpen:=短记?true:(shortExit==true?false:isShortOpen)
plotshape(isShortOpen,title=“Short Open”,颜色=红色,样式=shape.circle,位置=位置.bottom)
plotshape(isLongOpen,title=“Long Open”,颜色=绿色,样式=shape.circle,位置=位置.bottom)
使用选定的图表和时间间隔,只有3个信号

它于1月8日为24.96份合同(BTC)开了一个多头合约,价格为4005,价值为24.96,因此所花费的总价值为4005*24.96=100000美元

然后,策略测试人员显示,当策略在1月12日翻转时,它确实以3631.5的价格关闭(亏损)多头头寸,并以相同的价格做空,但空头头寸的数量为52.5055个合同(BTC),对应于(3631.5*52.5055)=200000美元的总价值

这不是我所期望的行为


2) 我注意到strategy.entry命令以与满足进入条件后的下一支蜡烛打开的价格打开交易。这是正常的行为吗

这里介绍了您的两个问题:
broker emulator
主题介绍了您的第二个问题,
下单命令
介绍了第一个问题

简言之(很抱歉双关语),您在相同条件下下下了两个订单,每个订单都在一个栏中填写。所以这是在模拟一种情况,这种情况有时发生在真实的经纪人身上。首先,多头仓位被填满,所以你以10万美元的价格得到BTC,然后第二个订单说:“我希望在10万美元的时候出现BTC赤字”,因为战略测试人员以10万美元的价格出售你的BTC,然后再出售10万美元以获得“空头”仓位。

谢谢米歇尔

如果我更改
策略。关闭
进入
策略。退出


问题消失了

这是TradingView backtester中的一个巨大且众所周知的错误。每当strategy.close条件与strategy.entry条件一致时(因此一个交易在下一个交易打开的同时关闭),一些非常难看的条目就会添加到交易列表中-一个交易是以信号“close entry(s)order…”输入的???这根本没有道理

这样的条目包含在回溯测试计算中,因此会完全破坏它。有时他们在改进回溯测试结果,有时他们在使结果变得更糟——但一直以来他们都不正确


解决方案:导出整个交易列表,粘贴到Excel中,手动删除那些丑陋的交易。导出功能由ProvitView或AutoView Chrome插件提供。

编写一个小的、可读的脚本,无需所有这些不必要的输入、复杂的条件和数百万个变量。我想这会帮助你理解它是如何工作的,并找到问题所在。@Michel\u T。谢谢你的建议。我确实简化了很多脚本来关注这个问题。它是持久的。这不是我在阅读文档时所期望的行为。