Индикаторы - совместный проект
Atom Ответить
31.05.2011


Приветствую всех участников!

Месяц назад я публиковал призыв о совместной разработке индикаторов на базе C#. Прошел месяц, мною было сделано 3 стандартных индикатора SMA, EMA и WMA. И ни строчки кода ни от одного пользователя S#. Каждый день задают вопросы (причем, большинство явно не относящиеся к S# как таковому), получают ответы, но свою помощь предложить не хотят. Стесняются, наверное.

Я понимаю, что дело в мотивации. Зачем помогать делать что-то, если можно подождать пару месяцев (пол года) или сделать самому, а потом пересесть на стандартное. Поэтому я решил найти мотивацию. И я ее нашел. Это лето объявляется летом "Ты мне - я тебе".

Схема простая. Вы делаете индикатор - я отвечаю на три любых вопроса. Вопросы по глюкам S# остаются как есть и раньше - ответ всегда получите. Но вопросы по C#, WFP, примерам, документации, Квику и всему прочему - только за индикатор.Smile Я думаю честно.

Сделав 5 индикаторов, вы получается бонус - кружку с символикой S#.

Репозитарий с исходниками расположен по адресу http://stocksharpconnectors.codeplex.com Чтобы получить доступ на запись регистрируйтесь на сайте, пишите в эту тему свой логин и какие индюки хотите сделать. Стиль кодирование указывается через R#. Настройки в репозитарии.

Что сделано сейчас:

  1. Acceleration
  2. Alligator
  3. AwesomeOscillator
  4. Fractals
  5. GatorOscillator
  6. MarketFacilitationIndex
  7. BollingerBands
  8. ExponentialMovingAverage
  9. Macd
  10. ParabolicSar
  11. RAVI
  12. SimpleMovingAverage
  13. SmoothedMovingAverage
  14. StandartDeviation
  15. VolumeWeightedMovingAverage
  16. WeightedMovingAverage
  17. WilderMovingAverage
  18. Adx
  19. Atr
  20. ChandeMomentumOscillator
  21. CommodityChannelIndex
  22. DiMinus
  23. DiPlus
  24. Dx
  25. Ichimoku
  26. Momentum
  27. RateOfChange
  28. RelativeStrengthIndex
  29. RVI
  30. TrueRange
  31. DetrendedPriceOscillator
  32. Highest
  33. LinearReg
  34. LinearRegression
  35. LinearRegSlope
  36. Lowest
  37. MeanDeviation
  38. MedianPrice
  39. Peak
  40. PeakBar
  41. QStick
  42. RSquared
  43. StandardError
  44. StochK
  45. Sum
  46. Trix
  47. Trough
  48. TroughBar
  49. UltimateOsc
  50. VerticalHorizontalFilter
  51. Vidya
  52. Volatility
  53. WilliamsR

Теги:


Спасибо:




340 Ответов
< 1 2 3 4 5  > >>
esper

Фотография
Программист
Дата: 08.06.2011
Ответить


maze9a Перейти
esper Перейти

Тестирую на данных из Quik-а, там строю график и сохраняю его в файл, после, на базе полученных данных, делаю тест.

Велса у меня нет, у вас есть возможность выгрузить данные по Полосам Боллинджера, чтобы можно было проверить?


Вот, данные из велса. Описание можно посмотреть здесь.

Посмотрел описание, протестировал на данных из велса - легче не сталоSad Значение Ema теперь совпадает, а верхняя и нижняя граница - нет. Дело в стандартном отклонении, алгоритмы тут и тут отличаются (в первом случае сумма квадратов делится на N, во-втором на N-1), сейчас считаю по первому варианту, значения отклонения совпадают с Quik и Metastock.
Спасибо:

Sergey Masyura

Фотография
Автор статей
Дата: 08.06.2011
Ответить


Уважаемые коллеги, указывайте, пожалуйста, commit message.
Спасибо:

artemox

Фотография
Дата: 08.06.2011
Ответить


Набросал тестирование индикаторов из файла, хранящего рассчитанный результат. Пример в MomentumTest.
Конечно в TextTestReader нужно будет красоту навести.

Правда я не знаю как в тесте сослаться на относительный путь файла, т.к. рабочей директорией назначается временная папка.
Но при указании абсолютного пути все работает :)
Спасибо:

Maxim

Фотография
Дата: 09.06.2011
Ответить


Взял себе:

VHF
VMA
WilliamsR
Volatility
UltimateOsc
Vidya

Если кто то уже их делает, прошу сообщить.
Спасибо:

esper

Фотография
Программист
Дата: 09.06.2011
Ответить


Maxim Перейти
Взял себе:

VHF
VMA
WilliamsR
Volatility
UltimateOsc
Vidya

Если кто то уже их делает, прошу сообщить.


Maxim, для чего делать Check Out полностью для всего проекта? Confused
Если в кратце, то перед началом работ получаем последнюю версию (Get Latest Version), после чего добавляем новые файлы или правим уже существующие, после правки делаем либо Check In - если необходимо залить изменения в репозиторий, либо Undo Pending Changes - если необходимо отменить изменения. Если были добавлены новые файлы в проект, то Check In надо делать на весь проект, а не только на добавленные файлы.
Спасибо:

Maxim

Фотография
Дата: 09.06.2011
Ответить


esper Перейти
[quote=Maxim;8730]
Maxim, для чего делать Check Out полностью для всего проекта? Confused


Я еще не очень разбираюсь в системах колективной работы.
Использовал сабвершен в своих нуждах локально.

ChechOut может повредить репозиторий?
Насколько я понимаю, ChechOut это и есть способ первый раз залить себе исходники?


Так же интересно, чем пользоваться: Subversion клиентом или Visual Studio Team Explorer?
Или дело вкуса?



Спасибо:

esper

Фотография
Программист
Дата: 09.06.2011
Ответить


Maxim Перейти
ChechOut может повредить репозиторий?

Именно Check Out наврятли, возможно будут трудности, когда будет Check In, хотя это во многом зависит от системы контроля версий. Вообще, Check Out означает что я редактирую этот файл, и другим пока лучше воздержаться от его редактирования, чтобы не было проблем с мержджем изменений.
Maxim Перейти
Насколько я понимаю, ChechOut это и есть способ первый раз залить себе исходники?

Исходники скачиваем так же с помощью Get Latest Version
Maxim Перейти
Так же интересно, чем пользоваться: Subversion клиентом или Visual Studio Team Explorer?
Или дело вкуса?

В этом проекте не принципиально, но у tfs есть много допольнительного функционала
Спасибо:

Mikhail Sukhov

Фотография
Автор статей Программист Трейдер
Дата: 09.06.2011
Ответить


Maxim Перейти

ChechOut может повредить репозиторий?


Главное, не чекинить все подряд. А только то, что действительно изменилось.
Автор топика
Спасибо:

maze9a

Фотография
Дата: 09.06.2011
Ответить


esper Перейти
maze9a Перейти
esper Перейти

Тестирую на данных из Quik-а, там строю график и сохраняю его в файл, после, на базе полученных данных, делаю тест.

Велса у меня нет, у вас есть возможность выгрузить данные по Полосам Боллинджера, чтобы можно было проверить?


Вот, данные из велса. Описание можно посмотреть здесь.

Посмотрел описание, протестировал на данных из велса - легче не сталоSad Значение Ema теперь совпадает, а верхняя и нижняя граница - нет. Дело в стандартном отклонении, алгоритмы тут и тут отличаются (в первом случае сумма квадратов делится на N, во-втором на N-1), сейчас считаю по первому варианту, значения отклонения совпадают с Quik и Metastock.


Понятно, а насколько большее расхождение получается с данными из Велса? У меня например так и не получилось посчитать значения для ADX точно такие же как в Велсе, расхождение порядка 1.5. И еще, многие индикаторы строятся с использованием других индикаторов, поэтому вопрос тестирования того, что мы написали, мне кажется важный и идея использовать тестовые файлы мне нравится.
Спасибо:

maze9a

Фотография
Дата: 09.06.2011
Ответить


Mikhail Sukhov Перейти
artemox Перейти
Mikhail Sukhov Перейти
Хорошая идея. Если у кого-нибудь есть под рукой такая прога - заливайте в репозитарий файлы.

У меня такая прога amibroker :) Завтра попробую что нибудь выгрузить и тестик написать.


Если будут лить из Велса, формат txt такой же будет? И да, интересно узнать, из разных программ данные будут одинаковые или как?Smile


Формат можно сделать любой, а вот данные думаю будут разные, но сильно они отличаться не должны иначе это будет просто смешно.
Спасибо:

maze9a

Фотография
Дата: 09.06.2011
Ответить


Maxim Перейти
Взял себе:

VHF
VMA
WilliamsR
Volatility
UltimateOsc
Vidya

Если кто то уже их делает, прошу сообщить.


Maxim что вы понимаете под Volatility? Я уже делаю HV (Historical Volatility of the selected Price Series) если это оно то уже занято.
Спасибо:

InsiderHSE

Фотография
Дата: 09.06.2011
Ответить


Прошу включить меня в проект, ник InsiderHSE.
И если не сложно, вкратце объяснить чем и как пользоваться для совместного редактирования проекта, у меня в этом никакого опыта нет.
Сделал индикаторы, касающиеся линейной регрессии - LinearReg, LinearRegSlope, RSquared и StdError. Не знаю как залить...
Спасибо:

Maxim

Фотография
Дата: 09.06.2011
Ответить


maze9a Перейти

Maxim что вы понимаете под Volatility? Я уже делаю HV (Historical Volatility of the selected Price Series) если это оно то уже занято.


Нет. Не HV.

Volatility
http://www2.wealth-lab.com/WL5Wiki/Volatility.ashx
Спасибо:

artemox

Фотография
Дата: 09.06.2011
Ответить


maze9a Перейти

Формат можно сделать любой, а вот данные думаю будут разные, но сильно они отличаться не должны иначе это будет просто смешно.

На самом деле я бы очень не хотел разные расчеты на истории и в реале.
Поэтому для неоднозначных индикаторов можно сделать режимы расчета, напр: AmiBrokerMode, WealthLabMode ...

Оффтоп, а я так понимаю, что большинство на ВЛ тестит историю?
Спасибо:

Maxim

Фотография
Дата: 09.06.2011
Ответить


Из форума не совсем понял, кто делал EMA.
Мне кажется в реализации есть ошибка.

Код

public override void Add(decimal newValue)
{
    Buffer.Add(newValue);

    if (Buffer.Count < Length)
        return;

    if (Buffer.Count == Length)
    {
        base.Value = Buffer.Sum() / Length;
    }
    else
    {
        base.Value = (newValue - base.Value) * _multiplier + base.Value;
        Buffer.RemoveAt(0);
    }

    base.RaiseChangedEvent();
}


При последовательном вызове Add с определенного момента значение Value будет равно (Buffer.Sum() / Length),
потом ((newValue - base.Value) * _multiplier + base.Value),
потом опять (Buffer.Sum() / Length),
и так далее поочередно.


Вот такой вариант будет более верным:
Код

if (Buffer.Count > Length - 1)
{
    Value = (newValue - Value) * multiplier + Value;            
}
else if (Buffer.Count < Length - 1)
{
    Buffer.Add(newValue);
    return;
}
else
{
    Buffer.Add(newValue);
    Value = Buffer.Sum() / Length;
}

Спасибо:

Maxim

Фотография
Дата: 09.06.2011
Ответить


1)Хотелось бы определится, в каком случае вызывается Changed?

а) Когда отработал метод Add? Если да, то некоторые индикаторы не соответсвуют этому критерию.

б) Или когда значение Value изменилось? Если да, то аналогично многие индикаторы не соответсвуют критерию.
Так как нет проверки, что новое значение Value не равно старому значению.

в) Вызывается ли это событие, если IsFormed false?


2) Какое значение Value, пока IsFormed равно false?






Спасибо:

esper

Фотография
Программист
Дата: 09.06.2011
Ответить


maze9a Перейти
Понятно, а насколько большее расхождение получается с данными из Велса? У меня например так и не получилось посчитать значения для ADX точно такие же как в Велсе, расхождение порядка 1.5. И еще, многие индикаторы строятся с использованием других индикаторов, поэтому вопрос тестирования того, что мы написали, мне кажется важный и идея использовать тестовые файлы мне нравится.

Конкретные цифры я сказать не могу, надо тесты писать, если примерно, то для сбера (значение цены в районе 100 рублей) где-то сотые отличаются, иногда десятые, но общая направленность индикатора совпадает
Спасибо:

Mikhail Sukhov

Фотография
Автор статей Программист Трейдер
Дата: 09.06.2011
Ответить


InsiderHSE Перейти
Прошу включить меня в проект, ник InsiderHSE.
И если не сложно, вкратце объяснить чем и как пользоваться для совместного редактирования проекта, у меня в этом никакого опыта нет.
Сделал индикаторы, касающиеся линейной регрессии - LinearReg, LinearRegSlope, RSquared и StdError. Не знаю как залить...


Пользуемся Visual Studio Team Explorer http://stocksharpconnect...eControl/list/changesets и http://help.teamprise.co...xplorerdoc/index_ba.html
Автор топика
Спасибо:

esper

Фотография
Программист
Дата: 09.06.2011
Ответить


Maxim Перейти
Из форума не совсем понял, кто делал EMA.
Мне кажется в реализации есть ошибка.

Код

public override void Add(decimal newValue)
{
    Buffer.Add(newValue);

    if (Buffer.Count < Length)
        return;

    if (Buffer.Count == Length)
    {
        base.Value = Buffer.Sum() / Length;
    }
    else
    {
        base.Value = (newValue - base.Value) * _multiplier + base.Value;
        Buffer.RemoveAt(0);
    }

    base.RaiseChangedEvent();
}


При последовательном вызове Add с определенного момента значение Value будет равно (Buffer.Sum() / Length),
потом ((newValue - base.Value) * _multiplier + base.Value),
потом опять (Buffer.Sum() / Length),
и так далее поочередно.

Да вроде верно все, когда достигли макс. размер буфера первый раз, сработает условие
Код
if (Buffer.Count == Length)

в следующий раз добавится новый элемент и размер списка будет Length+1 и попадем в блок else
Спасибо:

esper

Фотография
Программист
Дата: 09.06.2011
Ответить


Maxim Перейти
1)Хотелось бы определится, в каком случае вызывается Changed?

а) Когда отработал метод Add? Если да, то некоторые индикаторы не соответсвуют этому критерию.

б) Или когда значение Value изменилось? Если да, то аналогично многие индикаторы не соответсвуют критерию.
Так как нет проверки, что новое значение Value не равно старому значению.

в) Вызывается ли это событие, если IsFormed false?


2) Какое значение Value, пока IsFormed равно false?


Тут ранее поступало предложение
maze9a
В моей реализации значение индикатора равно нулю до тех пор пока он полностью не сформирован (в велсе индикатор расчитывается таким же образом), поэтому нет смысла рисовать кривую пока она не сформированна. Если вызывать событие Changed до того как индикатор сформировался то скорей всего некоторым подписчикам придется проверять IsFormed, а это мне кажется лишнее.

Спасибо:

Maxim

Фотография
Дата: 09.06.2011
Ответить


esper Перейти

Да вроде верно все, когда достигли макс. размер буфера первый раз, сработает условие
Код
if (Buffer.Count == Length)

в следующий раз добавится новый элемент и размер списка будет Length+1 и попадем в блок else


Сори. Вы правы.
Все верно.

Но все равно мой вариант краше :)
Так как нет лишнего добавления и удаления из буфера
Спасибо:

Maxim

Фотография
Дата: 09.06.2011
Ответить


esper Перейти

Тут ранее поступало предложение
maze9a
В моей реализации значение индикатора равно нулю до тех пор пока он полностью не сформирован (в велсе индикатор расчитывается таким же образом), поэтому нет смысла рисовать кривую пока она не сформированна. Если вызывать событие Changed до того как индикатор сформировался то скорей всего некоторым подписчикам придется проверять IsFormed, а это мне кажется лишнее.



Я это читал.
Поддерживаю Ваш вариант.

Но.

1)Нужен кто то, кто примит окончательное решение. Подозреваю, это должен быть Михаил.
2)Ваше предложение не отвечает на вопрос "б". Вызывать ли Change, если значение добавили, но Value не изменилось?

Спасибо:

esper

Фотография
Программист
Дата: 09.06.2011
Ответить


Maxim Перейти
2)Ваше предложение не отвечает на вопрос "б". Вызывать ли Change, если значение добавили, но Value не изменилось?

Зачем? Значение индикатора не изменилось.
Спасибо:

Maxim

Фотография
Дата: 09.06.2011
Ответить


esper Перейти
Maxim Перейти
2)Ваше предложение не отвечает на вопрос "б". Вызывать ли Change, если значение добавили, но Value не изменилось?

Зачем? Значение индикатора не изменилось.


Нужно или не нужно — это вопрос договоренностей.
Я вот и призываю договорится.

Потому что нигде в индикаторах я не видел перед вызовом метода Change проверки на то,
что новое значение Value отличается от старого.
Спасибо:

esper

Фотография
Программист
Дата: 09.06.2011
Ответить


Maxim
Нужно или не нужно — это вопрос договоренностей.
Я вот и призываю договорится.

Потому что нигде в индикаторах я не видел перед вызовом метода Change проверки на то,
что новое значение Value отличается от старого.

Я вопрос неверно понял... действтельно интересный момент, считаю, что при добавлении нового значения, если индикатор сформировался, то необходимо вызывать это событие, т.к. по событию может рисоваться график и т.д.
Спасибо:
< 1 2 3 4 5  > >>

Добавить файлы через драг-н-дроп, , или вставить из буфера обмена.

loading
clippy