Как обратиться к массиву ThinkScript IDataHolder при сканировании - PullRequest
1 голос
/ 21 апреля 2019

Поскольку переменные не могут быть изменены, счетчики и т. Д. Реализуются массивами IDataHolder, где счетчик получает значение путем добавления значения к предыдущему значению, которое затем сохраняется в текущей позиции перед переходом к следующей позиции. Этот механизм частично ломается в следующем скрипте сканирования, где чтение переменной, кажется, меняет ее значение, и я хотел бы понять, почему:

# Sum Test

# Build sum starting at the left end
def sum;
if (BarNumber() < 5) {
    if (BarNumber() == 1) {
        sum = 1;
    } else {
        sum = sum[1] + 1;
    }
} else {
    sum = sum[1]; # This causes the problem.
    #sum = Double.NaN;# alternative: does not change previous value but useless.
}

# Test that the first sum entry is 1 as expected
plot scan = GetValue(sum, BarNumber() -1) == 1;

1 Ответ

0 голосов
/ 27 апреля 2019

Это ошибка, дефект в текущей версии thinkScript. Ссылка на исторические данные , то есть чтение их перезаписывает исторические данные в общем случае, который описан в вопросе, вызывая повреждение данных, потерю данных. Следует отметить, что в мощной, но ограниченной системе thinkScript можно использовать простое утверждение, как в вопросе, для проверки ячейки с фиксированным смещением в массиве IDataHolder var, содержащем исторические данные:

input offset = 0;
plot scan = GetValue(var, BarNumber() -1 + offset);
...