#26467 - Mon Apr 25 2011 01:22 PM
Как такое может быть???!!!
|
old hand
Registered: Thu Apr 22 2010
Записи: 1089
|
Я использую индюк CCI(2), на видео видно как он меняет своё значение в зависимости от длинны истории!!! Видео из двух частей, первое это бот где используется CCI(2) и там меняется значение!!! Вторая часть, это новый скрипт, там есть только блок CCI(2) там не меняются данные в зависимости от длинны истории. В обоих идёт соединение Close-CCI(2)-на график http://screencast.com/t/yzqJGkmkКак такое может быть???
|
|
Наверх
|
|
|
|
#26470 - Mon Apr 25 2011 01:59 PM
Re: Как такое может быть???!!!
[Re: ViL]
|
old hand
Registered: Thu Apr 22 2010
Записи: 1089
|
На другом периоде не искал, просто тут случайно заметил. Я вас чуть обманул, подключение вот как выглядит: 1. Это в боте: 2. Это новый скрипт:
Attachments
2011-04-25_1358.png (354 downloads)2011-04-25_1358_001.png (379 downloads)
Отредактировано SPLsd (Mon Apr 25 2011 02:01 PM)
|
|
Наверх
|
|
|
|
#26476 - Mon Apr 25 2011 02:56 PM
Re: Как такое может быть???!!!
[Re: Nektodron]
|
old hand
Registered: Thu Apr 22 2010
Записи: 1089
|
Так всё и останется? У меня тогда получаются разные входы в зависимости от истории! Что мне делать?
|
|
Наверх
|
|
|
|
#26480 - Mon Apr 25 2011 03:19 PM
Re: Как такое может быть???!!!
[Re: Nektodron]
|
old hand
Registered: Thu Apr 22 2010
Записи: 1089
|
|
|
Наверх
|
|
|
|
#26486 - Mon Apr 25 2011 03:38 PM
Re: Как такое может быть???!!!
[Re: Nektodron]
|
old hand
Registered: Thu Apr 22 2010
Записи: 1089
|
Спасибо, тогда наверно подожду.
|
|
Наверх
|
|
|
|
#26508 - Mon Apr 25 2011 08:09 PM
Re: Как такое может быть???!!!
[Re: Nektodron]
|
enthusiast
Registered: Mon Jan 10 2011
Записи: 251
|
Я в следующей сборке поменяю, чтобы SMA для периодов 3 и ниже считался без ускорителя, соответственно погрешности не будет. Только не забудьте анонсировать в release notes изменения, что вы меняете что-то в индикаторах, а то мало ли, у людей же на этом деньги вертятся.
|
|
Наверх
|
|
|
|
#26512 - Mon Apr 25 2011 09:23 PM
Re: Как такое может быть???!!!
[Re: Nektodron]
|
writer
Registered: Sun Nov 21 2010
Записи: 428
|
Хмм. Заинтриговали... Что ж это за ускоритель то такой? Расчет SMA совсем прост. Поясните, пожалуйста, желательно с примером кода. Может и мы чего подскажем или посоветуем. 
_________________________
Не пишите мне! Никому ничего делать не буду.
|
|
Наверх
|
|
|
|
#26515 - Mon Apr 25 2011 09:56 PM
Re: Как такое может быть???!!!
[Re: jhgjrht]
|
Carpal Tunnel
Registered: Thu Oct 23 2008
Записи: 5492
|
ускоритель очень простой, чтобы не гонять постоянно вложенный цикл мы вычитаем выбывающее значение.
double close = candles[i];
double prevClose = candles[i - period];
double prevSMA = SMA[i - 1];
SMA[i] = prevSMA + (close - prevClose)/period;
В итоге имеем лишнее деление, которое дает накпливающуюся погрешность. В зависимости от длинны историии она доходит до 10го знака после запятой, что, в целом, не должно ни на что влиять. Для CCI оказалось критично, что меня самого удивило. На самом деле удивительного ничего нет, т.к. в CCI используется формула расчета коэф. "Typical price - sma От Typical price". Если короткий интервал и короткий период SMA. То этот коэф. сдвигается как раз на значение порядка 10e-8, поэтому такие погрешности уже влияют на расчет.
Отредактировано Nektodron (Mon Apr 25 2011 10:04 PM)
|
|
Наверх
|
|
|
|
#26516 - Mon Apr 25 2011 11:09 PM
Re: Как такое может быть???!!!
[Re: Nektodron]
|
writer
Registered: Sun Nov 21 2010
Записи: 428
|
Ааа, ясно. Я тоже подобный прием использую. Большую точность вычислений даст переход от double к decimal (там фикс. точность +/-1E-28). Правда расчеты станут заметно (раз в 15 медленнее). При желании, оптимизировать расчет индикаторов по времени можно, но уже за счет меньшей наглядности кода, избавляясь от циклов и вызовов функций (в том числе геттеров/сеттеров порпертей). Вот например: using System.Collections; using System.Diagnostics; using System.Collections.Generic; using Microsoft.VisualStudio.TestTools.UnitTesting; using TSLab.Script.Helpers;
namespace TSLabTests { [TestClass] public class UnitTest1 { static IList<double> Sma(IList<double> source, int period) { var res = new double[source.Count]; var buffer = new double[period]; int j = 0, count = 0; double prev = 0; for (int i = 0; i < source.Count; i++) { double v = source[i]; if (count >= period) { prev += (v - buffer[j])/period; count++; } else prev = (count*prev + v)/++count; res[i] = prev;
buffer[j] = v; if (++j >= period) j = 0; } return res; }
[TestMethod] public void TestMethod1() { // Для разогрева var td = new double[] { 198500, 198515, 199600, 199740, 200000 }; var r1 = Series.SMA(td, 5); var r2 = Sma(td, 5); CollectionAssert.AreEqual(r1 as ICollection, r2 as ICollection);
// Сравнение длительности расчета var sw = new Stopwatch(); const int count = (int) 1e8;
sw.Start(); for (int i = 0; i < count; i++) Series.SMA(td, 5); sw.Stop(); var t1 = sw.Elapsed;
sw.Restart(); for (int i = 0; i < count; i++) Sma(td, 5); sw.Stop(); var t2 = sw.Elapsed;
Trace.WriteLine("Быстрее на " + (t1 - t2) + " или на " + ((float) (t1.Ticks - t2.Ticks) / t1.Ticks * 100) + "%"); } } }
_________________________
Не пишите мне! Никому ничего делать не буду.
|
|
Наверх
|
|
|
|
#26530 - Tue Apr 26 2011 09:42 AM
Re: Как такое может быть???!!!
[Re: jhgjrht]
|
old hand
Registered: Thu Apr 22 2010
Записи: 1089
|
Исправили? Можно обновить?
|
|
Наверх
|
|
|
|
|
|