Я пытаюсь написать конечное значение, которое настраивается на новое значение только при выполнении условия в ThinkScript.

Подобно PreDefined Study PriceChannel, который изменяет свое значение только в том случае, если есть новый минимум или новый максимум, я хочу, чтобы он менял свое значение только при выполнении условия, а затем сохранял это значение до тех пор, пока оно не будет выполнено снова.

Это код, который у меня есть до сих пор, прямо сейчас он проверяет значение b последнего бара, если оно › 0, то он строит b, если нет, он пытается снова со 2-го самого последнего бара, затем 3-го и т. д., пока он находит значение b, равное 0.

Код работает, но мне нужно добавить новый оператор else if для каждого n-го бара в прошлом, 300 баров будет достаточно, однако это будет означать, что мне придется вводить одну и ту же строку 300 раз и просто менять число каждый раз. время, я хочу избежать этого, плюс, это намного чище, если он проверяет n=n+1 количество раз.

Любые рекомендации о том, что я должен делать?

plot b = if SMA30 crosses below 0 or
SZO crosses below 7 and SMA30 < SMA30[1]
then open
else 0;

plot g = if b>0
then b
else if b[1]>0
then b[1]
else if b[2]>0
then b[2]
else if b[3]>0
then b[3]
else 0;

person Griffin Collins    schedule 25.03.2021    source источник


Ответы (1)


Вы можете использовать рекурсивную переменную. Есть два способа сделать это:

  • простая рекурсивная переменная:
def gVal = if b > 0 then b else gVal[1];
plot g = gVal;
  • Рекурсивная переменная CompoundValue:
def gVal = 
    CompoundValue(
      1, 
      if GetValue(b, 0) > 0 then GetValue(b, 0) else GetValue(gVal, 1),
      GetValue(b, 0)
    );
plot g = gVal;

Обычно рекурсивная переменная работает нормально. CompoundValue необходим, если в вашем коде используются различные длины или смещения (см. мой ответ здесь, чтобы понять, как это работает).


Код, который я использовал для тестирования:

  • обычная рекурсивная переменная
#hint: SO q: https://stackoverflow.com/q/66805478/1107226

def price_to_beat = 2.06;

declare lower;

# b could also be a plot; I had a separate plot, so I `def`d it here
def b =
    if open > price_to_beat
    then open
    else 0;

def gVal = if b > 0 then b else gVal[1];
plot g = gVal;

AddChartBubble(yes, gVal, "gVal:" + gVal, Color.YELLOW, no);

AddLabel(yes, "RecursiveVariable", Color.CYAN);

  • Составное значение
#hint: SO q: https://stackoverflow.com/q/66805478/1107226

def price_to_beat = 2.06;

declare lower;

# b could also be a plot; I had a separate plot, so I `def`d it here
def b = if open > price_to_beat
        then open
        else 0;

def gVal = 
    CompoundValue(
      1, 
      if GetValue(b, 0) > 0 then GetValue(b, 0) else GetValue(gVal, 1),
      GetValue(b, 0)
    );
plot g = gVal;
g.SetDefaultColor(Color.CYAN);

AddChartBubble(yes, g, "b: " + b + ", g: " + g, Color.YELLOW, yes);

AddLabel(yes, "CompoundValue", Color.CYAN);

Изображение результатов теста на 6-гистограмме:

6-гистограмма, показывающая результаты тестового кода для сравнения

person leanne    schedule 29.03.2021