Почему thinkcript выбрасывает эти проблемы, когда я пытаюсь создать счетчик? - PullRequest
0 голосов
/ 09 октября 2019

Когда я пытаюсь создать счетчик и увеличивать его в операторе if-else, компилятор thinkcript выдает сбивающие с толку ошибки, которые говорят мне, что это не разрешено, но я видел это в нескольких примерах. У них даже есть зарезервированное слово: 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);

Ответы [ 2 ]

1 голос
/ 27 октября 2019

После того, как вы определили переменную в 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 оценивается как истинное в любом из последних пяти баров, затем вы добавляете 'while p = 0' выше с, и оно возвращает единицу в SCORE, как толькоон встречает первый истинный экземпляр.

0 голосов
/ 09 октября 2019

Ответ в том, что переменные в thinkcript не могут быть изменены.

...