У вас не стоит Flash Player
Настройки
#26467 - Mon Apr 25 2011 01:22 PM Как такое может быть???!!!
SPLsd Offline
old hand

Registered: Thu Apr 22 2010
Записи: 1089
Я использую индюк CCI(2), на видео видно как он меняет своё значение в зависимости от длинны истории!!!
Видео из двух частей, первое это бот где используется CCI(2) и там меняется значение!!!
Вторая часть, это новый скрипт, там есть только блок CCI(2) там не меняются данные в зависимости от длинны истории.
В обоих идёт соединение Close-CCI(2)-на график
http://screencast.com/t/yzqJGkmk
Как такое может быть???

Наверх
#26469 - Mon Apr 25 2011 01:45 PM Re: Как такое может быть???!!! [Re: SPLsd]
ViL Offline
TSLab
Carpal Tunnel

Registered: Sun Oct 17 2010
Записи: 8143
Проблема только на малом периоде индикатора?
Можно еще уточнить, т.е. если написать формулу close-cci , то должно воспроизвестись?

Наверх
#26470 - Mon Apr 25 2011 01:59 PM Re: Как такое может быть???!!! [Re: ViL]
SPLsd Offline
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)

Наверх
#26471 - Mon Apr 25 2011 02:04 PM Re: Как такое может быть???!!! [Re: SPLsd]
Nektodron Offline

Carpal Tunnel

Registered: Thu Oct 23 2008
Записи: 5492
у меня воспроизвелось на смарткоме, щас посмотрю, что там считается

Наверх
#26475 - Mon Apr 25 2011 02:51 PM Re: Как такое может быть???!!! [Re: Nektodron]
Nektodron Offline

Carpal Tunnel

Registered: Thu Oct 23 2008
Записи: 5492
В общем проблема из-за накапливающейся ошибки в 8м знаке после запятой при вычислении SMA от Typical Price. В итоге это оказывает сильное значение на вычисление CCI.
Ошибки можно было бы избежать, если не применять ускоренное вычисление SMA, однако это заметно снизит скорость вычислений. Кроме того, ошибка в 8м знаке в обычной ситуации не имеет никакого влияния.
В целом, ориентироваться на такую погрешность больше напоминает на танцы с бубном...

Наверх
#26476 - Mon Apr 25 2011 02:56 PM Re: Как такое может быть???!!! [Re: Nektodron]
SPLsd Offline
old hand

Registered: Thu Apr 22 2010
Записи: 1089
Так всё и останется? У меня тогда получаются разные входы в зависимости от истории! Что мне делать?

Наверх
#26478 - Mon Apr 25 2011 03:07 PM Re: Как такое может быть???!!! [Re: SPLsd]
Nektodron Offline

Carpal Tunnel

Registered: Thu Oct 23 2008
Записи: 5492
воспользоваться расчетом CCI(2) вручную без использования SMA

первая блок Typical Price (tp)
f1 = tp - tp[i-1]
f2 = (f1 + f1[i-1])/2
cci = f2 == 0.0 ? 0.0 : f1/f2

Наверх
#26480 - Mon Apr 25 2011 03:19 PM Re: Как такое может быть???!!! [Re: Nektodron]
SPLsd Offline
old hand

Registered: Thu Apr 22 2010
Записи: 1089
Понял, попробую.

Наверх
#26484 - Mon Apr 25 2011 03:28 PM Re: Как такое может быть???!!! [Re: SPLsd]
Nektodron Offline

Carpal Tunnel

Registered: Thu Oct 23 2008
Записи: 5492
Я в следующей сборке поменяю, чтобы SMA для периодов 3 и ниже считался без ускорителя, соответственно погрешности не будет.

Наверх
#26486 - Mon Apr 25 2011 03:38 PM Re: Как такое может быть???!!! [Re: Nektodron]
SPLsd Offline
old hand

Registered: Thu Apr 22 2010
Записи: 1089
Спасибо, тогда наверно подожду.

Наверх
#26508 - Mon Apr 25 2011 08:09 PM Re: Как такое может быть???!!! [Re: Nektodron]
Sherman81 Offline
enthusiast

Registered: Mon Jan 10 2011
Записи: 251
Originally Posted By: Nektodron
Я в следующей сборке поменяю, чтобы SMA для периодов 3 и ниже считался без ускорителя, соответственно погрешности не будет.


Только не забудьте анонсировать в release notes изменения, что вы меняете что-то в индикаторах, а то мало ли, у людей же на этом деньги вертятся.

Наверх
#26512 - Mon Apr 25 2011 09:23 PM Re: Как такое может быть???!!! [Re: Nektodron]
jhgjrht Offline
writer

Registered: Sun Nov 21 2010
Записи: 428
Хмм. Заинтриговали... Что ж это за ускоритель то такой?
Расчет SMA совсем прост. Поясните, пожалуйста, желательно с примером кода. Может и мы чего подскажем или посоветуем. smile
_________________________
Не пишите мне! Никому ничего делать не буду.

Наверх
#26515 - Mon Apr 25 2011 09:56 PM Re: Как такое может быть???!!! [Re: jhgjrht]
Nektodron Offline

Carpal Tunnel

Registered: Thu Oct 23 2008
Записи: 5492
ускоритель очень простой, чтобы не гонять постоянно вложенный цикл мы вычитаем выбывающее значение.
Code:
                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]
jhgjrht Offline
writer

Registered: Sun Nov 21 2010
Записи: 428
Ааа, ясно. Я тоже подобный прием использую. smile
Большую точность вычислений даст переход от double к decimal (там фикс. точность +/-1E-28). Правда расчеты станут заметно (раз в 15 медленнее).
При желании, оптимизировать расчет индикаторов по времени можно, но уже за счет меньшей наглядности кода, избавляясь от циклов и вызовов функций (в том числе геттеров/сеттеров порпертей). Вот например:
Click to reveal..

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]
SPLsd Offline
old hand

Registered: Thu Apr 22 2010
Записи: 1089
Исправили? Можно обновить?

Наверх
#26551 - Tue Apr 26 2011 12:34 PM Re: Как такое может быть???!!! [Re: SPLsd]
Nektodron Offline

Carpal Tunnel

Registered: Thu Oct 23 2008
Записи: 5492
ну да, было же написано, что в следующей вечерней сборке.

Наверх


Moderator:  ViL, sar