ThinkScript, если функция бесполезна в важном случае - PullRequest
0 голосов
/ 12 октября 2019

Сценарий ThinkScript, если функция не может выполнить ветвление, как ожидалось в важном случае. Следующий тестовый пример может быть использован для воспроизведения этой серьезной ошибки / дефекта.

В двух словах, оператор if может обычно использоваться для предотвращения выполнения вызова функции, если один из ее параметров функции недопустим. Покажем, что это не так. Фактически выполняются обе ветви, включая ветвь, не удовлетворяющую условию if.

Это полностью противоречит цели проверки условия if, проверки, которую имеет каждый оператор if на каждом языке.

Ниже приведен пример кода, который показывает проблему на графике. Результат можно увидеть, нажав на значок сообщения «i», мигающий в левом верхнем углу графика:

Складывание: «от» не может быть больше «до»: 1> -1.

# Get the current offset from the right edge from BarNumber()
# BarNumber(): The current bar number. On a chart, we can see that the number increases
# from left 1 to number of bars e.g. 140 at the right edge.
def barNumber = BarNumber();
def barCount = HighestAll(barNumber);
# rightOffset: 0 at the right edge, i.e. at the rightmost bar,
# increasing from right to left.
def rightOffset = barCount - barNumber;

# This script gets the minimum value from data in the offset range between startIndex
# and endIndex. It serves as a functional but not direct replacement for the
# GetMinValueOffset function where a dynamic range is required. Expect it to be slow.
script getMinValueBetween {
    input data = low;
    input startIndex = 0;
    input endIndex = 0;
    plot minValue = fold index = startIndex to endIndex with minRunning = Double.POSITIVE_INFINITY do Min(GetValue(data, index), minRunning);
}

# Call this only once at the last bar.
script buildConditions {
    input startIndex = 1;
    input endIndex = -1;
# Since endIndex < startIndex, getMinValueBetween() should never
# be executed. However it is executed nevertheless.
    plot minValue = if (endIndex > startIndex) then getMinValueBetween(low, startIndex, endIndex) else close[startIndex];
}
plot scan;
if (rightOffset == 0) {
    scan = buildConditions();
} else {
    scan = 0;
}
declare lower;

1 Ответ

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

Вопрос имеет ответ в первом предложении.

Можно подумать, используя выражение if (против функции if). Однако это не работает, как показано в

thinkcript, если оператор не выполнен

...