IList<double> high = ctx.GetData("Highest", new[] {HighPeriod.ToString()},
          delegate { return Series.Highest(source.HighPrices, HighPeriod); });
как я понимаю работу GetData:
1. в процессе оптимизации перед выполнением расчетов (в данном случае метода Series.Highest) создается некий "ключ" или "индекс" (в данном случае он будет равен HighPeriod.ToString).
2. Если такой индекс до этого не был сохранен в кэш, то выполняются вычисления, их результат сохраняется в кэш и маркируется "индексом".
3. Если индекс в кэше находится, то расчетов не производится и результаты берутся из кэша. Это дает ускорение оптимизации - ради этого все и затевалось.

Для того чтобы это работало корректно, нужно чтобы каждому уникальному расчету соответствовал уникальный "индекс". Например если вы хотите закэшировать результаты работы метода с двумя параметрами (a и b), а в индекс запишете только один параметр (допустим a) то в процессе оптимизации по параметрам a и b для каждого а закэшируется результат с каким то случайным b и в дальнейшем при переборе b вместо расчетов будут подсовываться результаты с одним и тем же b. Это приведет к неправильным цифрам во вкладке "оптимизация". Когда же Вы подставите выбранные параметры и запустите скрипт он отработает корректно и вы увидите реальные результаты.