为什么当我尝试创建计数器时,thinkscript会引发这些问题?

时间:2019-10-08 21:19:59

标签: thinkscript

当我尝试创建一个计数器并在if-else语句中增加它的数量时,thinkscript编译器会抛出令人困惑的错误,告诉我这是不允许的,但是我已经在几个示例中看到了这一点。它们甚至还有一个保留字:rec,以允许增加计数器。

score = score + 1;产生:#已经分配:得分为...

rec score = score + 1;产生:#已经使用的标识符:得分为...         #在IF / THEN / ELSE语句中不允许使用

#
# TD Ameritrade IP Company, Inc. (c) 2017-2019
#

input price = close;
input length = 9;
input displace = 0;

def score = 0;


def smavrgg = Average(price[-displace], length);
def expMvAvrg = ExpAverage(price[-displace], length);

plot SMA = smavrgg;
SMA.SetDefaultColor(GetColor(1));

plot AvgExp = expMvAvrg;
AvgExp.SetDefaultColor(GetColor(1));


# 1 if uptrend, 0 if downtrend
def lastTrendisUp = (close[0] - close[1]) > 0 ;
def secondLastTrendisUP = (close[1] - close[2]) > 0;
def thirdLastTrendisUP = (close[2] - close[3]) > 0;
def fourthLastTrendisUP = (close[3] - close[4]) > 0;


input lookback = 5;

# defines intBool (array) that indicates whether one or the other crossed. 

def bull_cross = SMA crosses above AvgExp;
def bear_cross = AvgExp crosses below SMA;

# returns the highest value in the data array for the lookback.  
# so [0, 1, 0, 0] means a cross happened within the last units. and 1 will be returned.  



if (bull_cross[0] or bear_cross[0]) then {
    if lastTrendisUp {
        # Already assigned: Score at...
          score = score + 1;


        # identifier already used: score at ...
        # not allowed inside an IF/THEN/ELSE statement
          rec score = score + 1;

    } else {

    }
} else if (bull_cross[1] or bear_cross[1])  {
    if secondLastTrendisUP {

    } else {

    }
} else if (bull_cross[2] or bear_cross[2]) {
    if thirdLastTrendisUP {

    } else {

    }
} else if (bull_cross[3] or bear_cross[3])  {
    if fourthLastTrendisUP {

    } else {

    }
} else if (bull_cross[4] or bear_cross[4])  {

} else {

}

# If most recent cross happened in the last 4
# and most recent cross occured on a green candle.

def bull_lookback = Highest(bull_cross, lookback);
def bear_lookback = Highest(bear_cross, lookback);






# def think = if bull_lookback or bear_lookback  

plot signal = if bull_lookback then 2 else if bear_lookback then 1 else 0;
signal.AssignValueColor(if signal == 2 then Color.DARK_GREEN else if signal == 1 then Color.DARK_RED else Color.DARK_ORANGE);
AssignBackgroundColor(if signal == 2 then Color.DARK_GREEN else if signal == 1 then Color.DARK_RED else Color.DARK_ORANGE);

3 个答案:

答案 0 :(得分:1)

一旦您在Thinkscript中定义了一个变量并对其进行了分配,则该变量仅对一个小节有效,它表现为常量,因此无法重新分配。我敢肯定,就像大多数代码一样,您甚至不能将Def命令放入条件中。为了创建“动态” SCORE,您需要在实例化的同一行中分配动态值。您不需要

def score = 0;

因为定义变量后,它的值始终为零。

对于'trendisup'占位符,您也不需要多余的变量,因为

secondLastTrendisUp 

和说

一样
lastTrendisUp[1]

因为它已经在最后一个栏中计算了。

您可以使用FOLD语句完成计数器,而无需使用额外的变量,如下所示:

def score= fold index=0 to 4 
with p=0 
do p + ((bearcross[index] or bullcross[index]) and lastTrendisUp[index]);

每当条件为真时,这会将分数加一,并将总计分配给SCORE变量。我想这是您要完成的事情,我无法告诉您,因为您以后再也不会展示您对score变量所做的事情...如果您只是想找出 Bullcross还是Bearcross 条件以及 lasttrendisup 条件在最后五个小节中的任何一个中均评估为true,然后在with上方添加“ while p = 0”,并将其作为SCORE返回遇到第一个真实实例后立即出现。

答案 1 :(得分:1)

在每个小节上将变量增加1的计数器 分数=分数[1] +1;

[1]的意思是,从1 bar前从该变量获取值。

答案 2 :(得分:0)

答案是,无法更改thinkscript中的变量。