Приветствую всех участников!
Месяц назад я публиковал призыв о совместной разработке индикаторов на базе C#. Прошел месяц, мною было сделано 3 стандартных индикатора SMA, EMA и WMA. И ни строчки кода ни от одного пользователя S#. Каждый день задают вопросы (причем, большинство явно не относящиеся к S# как таковому), получают ответы, но свою помощь предложить не хотят. Стесняются, наверное.
Я понимаю, что дело в мотивации. Зачем помогать делать что-то, если можно подождать пару месяцев (пол года) или сделать самому, а потом пересесть на стандартное. Поэтому я решил найти мотивацию. И я ее нашел. Это лето объявляется летом "Ты мне - я тебе".
Схема простая. Вы делаете индикатор - я отвечаю на три любых вопроса. Вопросы по глюкам S# остаются как есть и раньше - ответ всегда получите. Но вопросы по C#, WFP, примерам, документации, Квику и всему прочему - только за индикатор.🙂 Я думаю честно.
Сделав 5 индикаторов, вы получается бонус - кружку с символикой S#.
Репозитарий с исходниками расположен по адресу http://stocksharpconnectors.codeplex.com Чтобы получить доступ на запись регистрируйтесь на сайте, пишите в эту тему свой логин и какие индюки хотите сделать. Стиль кодирование указывается через R#. Настройки в репозитарии.
Что сделано сейчас:
- Acceleration
- Alligator
- AwesomeOscillator
- Fractals
- GatorOscillator
- MarketFacilitationIndex
- BollingerBands
- ExponentialMovingAverage
- Macd
- ParabolicSar
- RAVI
- SimpleMovingAverage
- SmoothedMovingAverage
- StandartDeviation
- VolumeWeightedMovingAverage
- WeightedMovingAverage
- WilderMovingAverage
- Adx
- Atr
- ChandeMomentumOscillator
- CommodityChannelIndex
- DiMinus
- DiPlus
- Dx
- Ichimoku
- Momentum
- RateOfChange
- RelativeStrengthIndex
- RVI
- TrueRange
- DetrendedPriceOscillator
- Highest
- LinearReg
- LinearRegression
- LinearRegSlope
- Lowest
- MeanDeviation
- MedianPrice
- Peak
- PeakBar
- QStick
- RSquared
- StandardError
- StochK
- Sum
- Trix
- Trough
- TroughBar
- UltimateOsc
- VerticalHorizontalFilter
- Vidya
- Volatility
- WilliamsR
Комментарии (340)
Вход или Создать аккаунт, Войдите или зарегистрируйтесь, чтобы оставить комментарий
Предлагаю работать с кодом через репозиторий stocksharp connectors на codeplex.
http://stocksharpconnectors.codeplex.com/SourceControl/changeset/changes/3952
Залил туда начальную версию.
А как можно подключиться. Просит логин и пароль?
Завел логин на сайте?
Посмотрел исходники средних, возник такой вот вопрос. Например, для индикатора стандартного отклонения нужна средняя, сделать можно двумя вариантами: наследованием и композицией. Если использовать композицию, то у нас получится два массива входящих значений. Если же унаследоваться от средней, то только один, просто вызываем сначала Add для базового класса, после считаем отклонение, но там ни к месту будет вызов base.RaiseChangedEvent(), может его куда-то перенести?
Наверное стоит перенести RaiseChangedEvent в Ma.Value, и наследоваться уже от Ma со своей реализацией Add.
Что-то тоже не выходит подключиться, пишет:
Microsoft Visual Studio
TF31003: Either you have not entered the necessary credentials or your user account does not have permission to connect to the Team Foundation Server at https://tfs.codeplex.com/tfs/tfs29. Click the Use different credentials link below, or ask your server administrator to add the appropriate permissions to your account.
ОК
Пробовал ввести esper_cp, esper_cp@SND, SND\esper_cp, в общем как правильно вводить логин?
Добавил в список участников проекта.
Кто какими индикаторами будет заниматься? У меня есть Стандартное отклонение, Полосы Боллинджера и RSI, правда интерфейсы у них немного отличаются, придется поправить. В текущем проекте их еще никто не реализовал?
Пока никто не изъявлял желание.
Добрый день! Для индикаторов очень важна гарантия правильности расчетов. Поэтому хорошо бы чтобы помимо кода индикатора разработчик указывал на каких данных проверено. Например для себя выгружал за один период значения OHLCV+Индикатор в файл из ami и из S#, полученные файлы не должны отличаться. У меня есть простые HHV, LLV, если получится присоединиться к репозитарию - выгружу :)
Для этого есть юнит тесты. В репозитарии уже есть код проверки для скользящих средних.
Дык юнит тесты обычно пишутся тем же человеком и баги не исключены
Я имел ввиду что расчеты, произведенные сторонней программой, можно проверять в юнит тестах. Для автоматизации.
Здравствуйте, есть желание написать следующие индикаторы: HV, ADX, ATR. Если они уже заняты, дайте знать. Хорошо бы иметь табличку с теми, которые уже сделаны или уже кем-то заняты.
Эти вроде пока никто не брался делать. Я делаю Стандартное отклонение, Полосы Боллинлжера, RSI.
2Mikhail Sukhov, я сделал комит с тестом для стандартного отклонения, хотелось бы краткую рецензию на него, т.к. с юнит тестированием у меня все плохо
В студии настройки измените, чтобы использовать табы вместо пробелов. А так нормально.
Добавил индикатор ATR, попутно написал еще два вспомогательных TrueRange и WilderMA формулы взяты из wiki велса http://www2.wealth-lab.com/WL5Wiki/ATR.ashx?HL=atr. Кстати, на мой взгляд, реализация для EMA содержить ошибки: свойство IsFormed не выставляется и похоже что само значение тоже не верно считается, т.е. формула верная, но не учитывается что количество элементов не сразу равно периоду.
...Я думаю это не совсем верно. Событие Changed слушают сторонние компоненты. Например, график со свечками. Ему нужно отображать кривую, пока она не сформировалась? Почему бы нет.По Ema - IsFormed автоматически рассчитывается. А насчет не учитывания элементов, то я не понял.
...EMA = ( K x ( C - EMA1 ) ) + EMA1
where, C = Current Price EMA1 = Previous bar's EMA value (A SMA is used for the first period's calculation) K = Exponential smoothing constant K = 2 / ( 1 + period )
http://www2.wealth-lab.com/WL5Wiki/EMA.ashx
Я поменял реализацию Ema и после этого значения стали совпадать с теми которые получились в велсе.
Я мог бы сдать эти изменения. Вы ничего не имеете против?
Посмотрел код. Думаю, вы правильнее поняли формулу чем я. Согласен насчет события для IsFormed == false и для Ema.
Михаил, добавьте логин artemox в список участников проекта.
Исправился
Добавил реализацию для ADX. Юнит тест не добавлял потому что значения посчитаные в велсе не совпадают с теми которые получаются в моей реализации, разница не большая но все же есть. Если будут какие-нибудь замечания по коду или самой реализации пишите.
Смотрю, что число индикаторов растет, может есть смысл их сгруппировать?
По какому признаку?
Я думаю, нужно начать уже вести список сделанных и планируемых индюков. Предлагаю в отдельном топике с редактированием сообщения (добавили новый индюк - отредактировали).
Еще предлагаю список индюков для TODO. Где их взять - вопрос. Полез по ссылкам на сайт Велса, увидел это и это. Пойдет?
Можно. В окне новой темы есть галка, опрос.
Подумалось. Список индюков из Велса не спроста такой, какой он есть сейчас. Стоит ли устраивать опросник, если ребята из той команды годами набирали то, что у них сейчас в дистрибутиве? Может пройдет проторенной дорожкой и сделаем все, что у них есть? Мы уже 1/5 сделали за эти пару недель. Начали быстро.
Михаил, добавьте пожалуйста логин goricap. Также прошу указать пять индикаторов, которые необходимо реализовать.
Михаил, добавьте пожалуйста логин neuro
maze9a, что-то у меня не сходится тест для Полос Боллинджера с использованием Ema(14) на исторических данных по сберу, в частности отличается именно средняя линия
P.s. так же не сходится Smma на исторических данных, хотя в RSI оно работает нормально🤨 P.P.s. Не заметил, что WilderMa и Smma одно и тоже, позже удалю Smma
В велсе есть две формы для Ema modern и legacy (wiki). У нас реализована форма modern. Значения Ema, расчитаные с использованием нашей реализации, совпадают с теми которые получаются в велсе, это отражено в юнит тесте. Возможно для Полос Боллинджера нужна форма legacy? И еще, каким образом вы расчитываете значения для вашего теста?
Велса у меня нет, у вас есть возможность выгрузить данные по Полосам Боллинджера, чтобы можно было проверить?
Вот, данные из велса. Описание можно посмотреть здесь.
Понятно, а насколько большее расхождение получается с данными из Велса? У меня например так и не получилось посчитать значения для ADX точно такие же как в Велсе, расхождение порядка 1.5. И еще, многие индикаторы строятся с использованием других индикаторов, поэтому вопрос тестирования того, что мы написали, мне кажется важный и идея использовать тестовые файлы мне нравится.
Уточню. Доступ к репозиторию индикаторов? Или доступ к репозиторию S#?
Попробовал в Ema считать коэффициент по original method, но все-равно, значения Ema не совпадают с данными из Quik.
Тут уже немало писателей индикаторов. Поэтому большинство популярных и общеизвестных индюков покроем. А дальше можно и по запросу делать.
А дальше все развивается по текущему сценарию. Есть вопросы и нужна помощь в программировании - пускай "платит" коллегам своей помощью.
StochasticK RoC SUM (сам по себе может и не быть полезен, но для использования в других индикаторах пригодится)
А насчет тестирования какие идеи? Проект IndicatorsTest явно отстает от своего товарища. Мне кажется что проще будет сделать так:
Наименования файлов соответственно сделать по формату IndicatorName#Parameters#TestDesription.txt
А ежели Reflection прикрутить, для автоматического запуска индикаторов по своим файлам, то это будет очень хорошо.
Хорошая идея. Если у кого-нибудь есть под рукой такая прога - заливайте в репозитарий файлы.
Насчет автоматического Reflection не совсем уверен. Делать я думаю будет дольше, чем понатыкать методы. Тем более потеряем "юнит тестовость", когда можно будет запустить конкретный юнит тест, а не ждать прогона через Reflection всех индюков. Лучше наверное будет сделать какой-то вспомогательный класс, который бы содержал максимум логики, а ему на вход индюка. Тогда бы каждый метод юнит теста занимал бы не более строчки.
Если будут лить из Велса, формат txt такой же будет? И да, интересно узнать, из разных программ данные будут одинаковые или как?🙂
Формат можно сделать любой, а вот данные думаю будут разные, но сильно они отличаться не должны иначе это будет просто смешно.
Оффтоп, а я так понимаю, что большинство на ВЛ тестит историю?
А вот список с описанием формул http://stockcharts.com/school/doku.php?id=chart_school:technical_indicators
В ами формат задается программно (fopen и вперед...) А так файлы можно разные погонять, например: SMA#50#AMI_RIM1_1MIN_CLOSE и SMA#30#WL_SBER03_1MIN_OHLCV
Уважаемые коллеги, указывайте, пожалуйста, commit message.
Набросал тестирование индикаторов из файла, хранящего рассчитанный результат. Пример в MomentumTest. Конечно в TextTestReader нужно будет красоту навести.
Правда я не знаю как в тесте сослаться на относительный путь файла, т.к. рабочей директорией назначается временная папка. Но при указании абсолютного пути все работает :)
Взял себе:
VHF VMA WilliamsR Volatility UltimateOsc Vidya
Если кто то уже их делает, прошу сообщить.
Maxim, для чего делать Check Out полностью для всего проекта? 🤨 Если в кратце, то перед началом работ получаем последнюю версию (Get Latest Version), после чего добавляем новые файлы или правим уже существующие, после правки делаем либо Check In - если необходимо залить изменения в репозиторий, либо Undo Pending Changes - если необходимо отменить изменения. Если были добавлены новые файлы в проект, то Check In надо делать на весь проект, а не только на добавленные файлы.
Я еще не очень разбираюсь в системах колективной работы. Использовал сабвершен в своих нуждах локально.
ChechOut может повредить репозиторий? Насколько я понимаю, ChechOut это и есть способ первый раз залить себе исходники?
Так же интересно, чем пользоваться: Subversion клиентом или Visual Studio Team Explorer? Или дело вкуса?
Главное, не чекинить все подряд. А только то, что действительно изменилось.
Maxim что вы понимаете под Volatility? Я уже делаю HV (Historical Volatility of the selected Price Series) если это оно то уже занято.
Нет. Не HV.
Volatility http://www2.wealth-lab.com/WL5Wiki/Volatility.ashx
Прошу включить меня в проект, ник InsiderHSE. И если не сложно, вкратце объяснить чем и как пользоваться для совместного редактирования проекта, у меня в этом никакого опыта нет. Сделал индикаторы, касающиеся линейной регрессии - LinearReg, LinearRegSlope, RSquared и StdError. Не знаю как залить...
Пользуемся Visual Studio Team Explorer http://stocksharpconnectors.codeplex.com/SourceControl/list/changesets и http://help.teamprise.com/3.1/index.jsp?topic=/com.teamprise.explorer.help/explorerdoc/index_ba.html
Из форума не совсем понял, кто делал EMA. Мне кажется в реализации есть ошибка.
При последовательном вызове Add с определенного момента значение Value будет равно (Buffer.Sum() / Length), потом ((newValue - base.Value) * _multiplier + base.Value), потом опять (Buffer.Sum() / Length), и так далее поочередно.
Вот такой вариант будет более верным:
public override void Add(decimal newValue) { Buffer.Add(newValue);
}
if (Buffer.Count == Length)
if (Buffer.Count == Length)
if (Buffer.Count == Length)
1)Хотелось бы определится, в каком случае вызывается Changed?
а) Когда отработал метод Add? Если да, то некоторые индикаторы не соответсвуют этому критерию.
б) Или когда значение Value изменилось? Если да, то аналогично многие индикаторы не соответсвуют критерию. Так как нет проверки, что новое значение Value не равно старому значению.
в) Вызывается ли это событие, если IsFormed false?
Тут ранее поступало предложение
Я это читал. Поддерживаю Ваш вариант.
Но.
1)Нужен кто то, кто примит окончательное решение. Подозреваю, это должен быть Михаил. 2)Ваше предложение не отвечает на вопрос "б". Вызывать ли Change, если значение добавили, но Value не изменилось?
Нужно или не нужно — это вопрос договоренностей. Я вот и призываю договорится.
Потому что нигде в индикаторах я не видел перед вызовом метода Change проверки на то, что новое значение Value отличается от старого.
Поддерживаю такой подход.
Здравствуйте! Открываю солюшн Indicators, ссылки на сборки Ecng не находятся... Это только у меня так? Если я удалю их и снова добавлю на сборки из папки references, это не повлияет на работу других пользователей?
Get Latest version делайте не из Solution Explorer, а из Source Control Explorer. У вас не все файлы скачались.
У меня был аналогичный случай. Я сделал CheckOut только одного Indicators.sln. И у меня не хватало двух библиотек Ecng в референсах. Они были, но были помечены предупреждением.
Если посмотреть код файла Indicators.csproj, то там есть такие строки
Что говорит, что два файла лежат где-то выше.
Я просто добавил вручную эти два файла в референс. Но после этого откатил изменение в файле Indicators.csproj назад, что бы не влиять на основной код.
То есть вы поправили код Indicators.csproj вручную или через add new reference? Вам каждый раз приходится это делать?
Вообще суть в том, чтобы нужные зависимости лежали по адресу Indicators..\References, т.е. рядом с директорией проекта Indicators, должна быть директория References с нужными зависимостями
По какой причине после того, как сделал откат Студия видит библиотеки не знаю. По идее не должна. Но работает. Возможно я просто чего то не знаю.
Возможно стоит сделать по совету esper и скачать References.
Схема такая. Это репозитарий коннекторов. Они все и используют S# сборки. Так же как и проект с индикаторами. Соответственно структура проекта (файловая) должна быть как она есть в TFS. Даже если у кого-то S# был до этого скачал и распакован в какую-то директорию другую, ссылки у проекта с индикаторами не должны вести туда. Используется только локальная копия сборок.
Я думаю надо отпустить файлы. А то сейчас вы все файлы пометили как редактируемые. Еще заметил, что checkin идет с пометкой не просто edit, но и branch. Схема работы следующая:
Сейчас посмотрел исходный код индикатора Vidya, судя по всему, в нем используется индикатор CMO, который у нас уже есть в проекте, может стоит использовать его, а не считать значения самим? Т.е. комбинировать индикаторы, чтобы не было дублирования кода.
Сделал реализацию внутри сугубо для ускорения работы. Так же CMO умножается на 100 в реализации, тогда как в Vidya этого не нужно. Если кто желает переделать, то я не против.
UPD Неверно написал последнее предложение. Так как я делаю этот индикатор, то я за него в ответе. Если Михаил скажет, что надо переделать с использованием CMO класса, то я переделаю. Если не скажет, то пределывать ничего не буду.
Maxim, goricap это ваш логин? Сейчас вытянул последнюю версию проекта, там добавлен индикатор Volatility, у метода Add стоит override, хотя в базовом классе такого метода вообще нет, и проект не компилируется, вы перед Check In проект компилируете?
P.s. CCI вроде никто еще не брал?
Мое личное мнение: Изобретать велосипед по возможности не стоит. У проекта должен быть куратор, который должен решать политику партии. Всем вместе решать не стоит. Демократия говно :). Надо всем вместе обсуждать, а решение должен принимать один человек.
Если кто-то что-то поломал немного или сильно, то это в принципе херня. Особенности командной работы. Поэтому давайте относится с пониманием друг к другу, опыт у всех разный.
Всем спасибо за огромный вклад в проект!
Maxim, давайте все-таки переиспользовать другие индикаторы. ООП как никак. К примеру сравните WilliamsR и StochasticK, теоретически расчеты очень похожы, а разница в реализации колосальная.
Ок. Не обратил внимание на существование LLV и HHV.
40 индюков! Это уже больше чем у ТСЛаб. Такими темпами из до лидеров ТА рынка добежим до осени.
Вот только нужен ли этот DPO кому-нибудь? :)
Это точно. Вот думаю, а не залить ли сырцы Ecng.Trading.Xaml да и сделать на основе CandleChart рисовалку всех этих индюков. Примеры Chart из .NET меня удивили по хорошему, особенно раздел финансы (приложил к сообщению). Я так прикинул, что большинство индюков имею одинаковый вид отрисовки. А значит и работа будет значительно меньше, чем я предполагал в самом начале.
У нас уже 8 человек сделали по 5 индюков?
Но за намек спасибо, действительно пора уже печатать. Отсылать буду почтой. С москвичами можно сделать проще - очная встреча.
А заливайте, дело то затягивающее :)
Это больше шутка, чем намек :) Подождите релиза, а там и плюшки можно раздавать
Думаю, что окончательное решение будет принимать Михаил, как основатель проекта, либо выберем другого ответственного.
Пока выскажу некоторые предложения по проекту:
Как уже писал выше, предлагаю использовать уже готовые индикаторы повторно, а не писать каждый раз все под себя, во-первых, не будет лишнего дублирования кода, во-вторых, код индикаторов становится более компактным и понятным, в-третьих, это позволит лишний раз протестировать уже написанные индикаторы.
Давайте по возможности писать не только индикаторы, но и тесты к ним, индикаторов сейчас куча, а какие реально работают - не ясно, т.к. тестов всего несколько. Сомневаюсь, что нам нужна куча неработающих индикаторов и предлагаю считать, что индикатор написан только тогда, когда он покрыт тестами.
По поведению индикаторов:
При коммите указывать какие изменения были внесены, коммиты делать только для работающих версий (по минимуму проект должен собираться)
Xml комментарии писать на одном языке
Пока все, если что-то вспомню, добавлю🙂
Коллеги, все согласны с esper? Предагаю это в первый пост перенести (Михаил, это только Вы сможете сделать?) Также как и файл "Таблица индикаторов.xls" от Maxim-а (55 пост).
Насчет тестирования предлагаю всем использовать TextTestReader (пример в MomentumTest). Тест делается быстро и надежно.
Я с предложениями от esper согласен. Еще есть предложения: не называть файлы для юнит тестов громозкими именами, а называть их просто по имени индикатора, а в самом файле первой строчкой сделать коментарий где описать формат данных и всю необходимую инфу по тесту и индикатору. Уверен, что пропуск коментария не сложно сделать в TextTestReader.
Вобщем здравая мысль. Переделаю :)
TextTestReader теперь игнорирует строки-комментарии, начинающиеся с символа "#". Соответственно все свои тест-файлы назвал по имени индикатора и внутри снабдил строчкой с описанием.
Лучше конечно определится со способо тестирования. На данный момент где-то данные просто генерятся внутри теста, где-то используются массивы, где-то используются внешние данные из файла.
Считаю, что лучше не генерировать данные внутри теста, а использовать внешние данные. И, повторюсь, лучше унифицировать этот способ.
MomentumTest мне нравится. Только надо ввсети погрешность — плюс-минус дельта величину, когда мы будем считать, что значение верно.
Возможно, тесты стоит сделать одному человеку. В этом случае будет все более унифицировано. Методом копипаст не очень трудно сделать тесты для каждого индикатора из MomentumTest.
Я не могу делать юнит тесты, так как у меня нет возможности создавать файлы. Не пользуюсь я сторонними программами.
Оффтоп: а) В список правил стоит добавить пункт-напоминание, что бы все делали проверку на деление на ноль где это возможно. б) Что насчет потокобезопасности? Стоит ли ее реализовывать в индикаторах или нет?
sergey.masyura, какой смысл несет замена
на
Конструкция тут не трехэтажная, сильно проще она не стала🤨
decimal[] data = new decimal[]
Конструкция стала проще. Это не С++, поэтому разумно использовать возможности языка С# полностью.
можно занять индикаторы на будущее?
только займусь ими после праздников, и буду просить помощь в освоении структуры кода - отпишите пож. в личку к кому обратиться.
стохастик, пайвот пойнтс, сглаженный впр - после НЧ фильтра.
Насколько сложно реализовать профиль рынка?
код на mq4 есть.
ddsfx, обращайся сюда, думаю будет наиболее эффективно. Профиль необычный индикатор, сейчас интерфейс на него не заточен. Имхо он сам по себе.
Сделал индикаторы из WealthLab - LinearReg, LinearRegSlope, RSquared, StdError плюс Unit тесты к ним. Также добавил для производительности индикатор LinearRegression, который содержит все 4 предыдущих в соответствующих свойствах (только для LinearReg св-во называется Forecast), чтобы по несколько раз не гонять регрессию если нужны несколько индикаторов.
artemox я посмотрел твой комент в MomentumTest, у меня тоже вылезает такая ошибка, поэтому я не стал использовать Assert из Ecng.UnitTesting. Если разберешся в чем тут проблема напиши пожалуйста.
Появилась идея сделать класс TestTestExecuter. Но тогда необходимо создать базовый класс с методами Add(Candle), Add(decimal), Value, IsFormed. Понятно, что не все индикаторы укладываются в один Value, но большинство индюков будут приобщены к одному интерфейсу.
Тогда тестирование можно будет оформлять в виде строчки: TextTestExecuter.ByClosePrice(new Momentum(20), _dataUri);
artemox, данные для тестов выгружаются из AmiBroker? Можете вкратце объяснить как это сделать?
function SaveValues(filename, values) { fh = fopen( filename, "w"); if( fh ) { StartBar = Max(0, BarCount-200); for (i = StartBar; i < BarCount; i++) { ds = StrFormat( "%.0f"+ ",%.0f"+ ",%.0f"+ ",%.0f"+ ",%.0f"+ ",%.8f"+ "\n", O, H, L, C, V, values); fputs( ds, fh ); } fclose( fh ); }
}
SaveValues("D:\StochK.txt",StochK(25, 1));
А каким образом указывается бумага для которой экспортируем данные?
Текущая бумага (выбранная в выпадающем списке) и будет экспортироваться. Если инд считается по одному значению, а не по всей свече, то указывается так: ROC( Close, 30)
Что-то не выходит выгрузить данные. В амиброкере импортирую данные из метастока, открывается график, добавляю новую формулу, после применения создается файл, но там данные левые, т.е. цена в свечках с дробной частью, а в файле все числа целые
Сори, это моя ошибка. Формат заточен под РИ. ds = StrFormat( "%.0f"+ ",%.0f"+ ",%.0f"+ ",%.0f"+ Вот здесь вместо нуля укажите количество знаков после запятой в вашем инструменте.
Думаю так будет универсально:
function SaveValues(filename, values) { fh = fopen( filename, "w"); if( fh ) { StartBar = Max(0, BarCount-200); for (i = StartBar; i < BarCount; i++) { ds = StrFormat( "%.4f"+ ",%.4f"+ ",%.4f"+ ",%.4f"+ ",%.0f"+ ",%.6f"+ "\n", O, H, L, C, V, values); fputs( ds, fh ); } fclose( fh ); } }
Предложение. Что бы не было путаницы, называть индикаторы согласно тому, как их называют здесь: http://www2.wealth-lab.com/WL5Wiki/AllPages.aspx?Cat=Standard%20Indicators
Насколько я понял: StochK = StochasticK Highest = HHV Lowest = LLV
Првильно? Может переименовать?
Нужно ли делать отдельныне BBandLower и BBandUpper, если уже сделан BollingerBands общий?
Да правильно, но HHV и LLV это имена из амиброкера, т.к. Highest и Lowest там имеют другое предназначение Может в таблицу алтернативные имена добавить? StochK переименовал
В этом случае можно составить экселик, где будут три столбика "Как у нас называется", "Как в амиброкере", "Как в лабе".
я за. кстати могу выгрузить тесты для индикаторов, только скажите - какие?
Peak, PeakBar, QStick, TRIX, Trough, TroughBar, UltimateOsc, VHF, Vidya, VMA, Volatility, WilliamsR
Выгрузил что есть в ами, или по быстрому получилось найти формулу. Соответсвенно закоментареные строчки не выгружены
SaveValues(folder+"Peak.txt", Peak(C,20)); //SaveValues(folder+"PeakBar.txt", PeakBar(C,20)); SaveValues(folder+"QStick.txt", MA(C-O,20)); SaveValues(folder+"Trix.txt", Trix(20)); SaveValues(folder+"Trough.txt", Trough(C,20)); //SaveValues(folder+"TroughBar.txt", TroughBar(C,20)); SaveValues(folder+"UltimateOSC.txt", Ultimate(7,14,28)); SaveValues(folder+"VHF.txt", (HHV(C,20)-LLV(C,20))/Sum(abs(C-Ref(C,-1)),20)); //SaveValues(folder+"Vidya.txt", Vidya(C,20)); //SaveValues(folder+"VMA.txt", VMA(C,20)); SaveValues(folder+"Volatility.txt", ROC( EMA( High - Low, 20 ), 20 )); SaveValues(folder+"WilliamsR.txt", -100 * ( HHV( H, 20 ) - C )/( HHV( H, 20 ) - LLV( L, 20 ) ));
BB фейлится, потому что первое значение EMA считается как SMA, а когда экспортировали данные оно, видимо, строилось на основе предыдущих значений.
Кстати, у меня и MACD не сходится, видимо тоже из-за Ema
На такие тесты можно просто ставить аттрибут [Ignore], тогда они будут пропускаться при выполнении.
Посмотрел VMA, оказывается это Volume Weighted Moving Averages, а я искал Variable Moving Average
Выгрузил: SaveValues(folder+"VMA.txt", Sum(V*C,20)/Sum(V,20));
Кстати реализацию можно переделать используя индикатор SUM :)
sergey.masyura, как победить ошибку "Невозможно загрузить файл или сборку "Microsoft.VisualStudio.QualityTools.UnitTestFramework, Version=9.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a" или один из зависимых от них компонентов. Не удается найти указанный файл." возникающую например при вызове sma.Value.AssertEqual((decimal)data.Average()); ?
Не у одного меня такая ерунда :(
Как вариант файлы из аттача распоковать в c:\Program Files\Microsoft Visual Studio 10.0\Common7\IDE\PublicAssemblies\
По идее все это ставится в VS 2010 Ultimate.
У меня 2010 проф. Папки PublicAssemblies не было. Создал папку и добавил файлы. При добавлении ссылки в проект файлы из PublicAssemblies в списке появились. Добавил в IndicatorsTest ссылку на Microsoft.VisualStudio.QualityTools.UnitTestFramework.dll, ошибка все равно не исчезла.
Заменю ка на Assert.IsTrue? Все равно эта ошибка только в sma осталась. Никто не против?
Если поможет - наздоровье. Раз такая большая проблема у всех с тестами, может вобще стоит про NUnit подумать?
Ошибка у меня. Я проект скомпилировал под 3.5, и сам проект с тестами написан на .NET 4. Я бы залил новую версию Ecng.UnitTesting под 4.0, но юзер goricap залочил все файлы.
Ау, goricap, отпустите файлы!🙄
Как их отпустить? Вроде ничего не делал необычного.
Это все сделано давно. Единственное подозрение на файл macd.cs С какого то момента времени с ним произошел какой то косяк. Его нет в локальном проекте, но сабвершен его не хочет закачивать с репозитория.
Хотя возможно и не в нем проблема.
А можно как нить разлочить со стороны репозитория?
Зачем использовать svn, если репозиторий под team foundation server?
Можно по скайпу, можно телефоном. Думаю, объяснить будет проще, там разговора минут на 10.
На мой вопрос чем лучше пользоваться ответили, что нет разницы.
SVN я пользовался раньше, а TFS нет. Просто выбрал, что привычней.
Максим, вопрос с локом еще актуальный. Можете отпустить файлы, хотя бы References?
Да я бы с радостью. Только вот не знаю, что делать. Утром звонил Вам в скайп. Щас тоже в скайпе. Жду помощи.
Эх... Не успел вылить... Напишу тогда, что делаю: Fractals, Ichimoku, Parabolic SAR, что ведет за собой реализацию Acceleration Oscillator, Awesome Oscillator и Median Price.
В шапке топика написано - "Стиль кодирование указывается через R#. Настройки в репозитарии."
Настройки можно включить через плагин http://rsm.codeplex.com/
Печально.
Предложение. Можно придерживаться следующего правила, что бы не делать индикатор, который уже делают. Как только выбрали индикатор для реализации, обновляете проект до последней версии. Проверяете есть ли уже данный индикатор в проекте. Если нет, создаете пустой класс с этим индикатором. Комитите этот файл в репозиторий, что бы все видели, что этот индикатор уже в производстве. Ну и как он сделан, комитить уже готовый файл с индикатором.
Коллеги, на ваш суд SimpleIndicator. Может быть устраним базовый Ma? и все пронаследуем от SimpleIndicator?
Само название SimpleIndicator уже не очень подходит для базового класса.
Предлагайте как лучше, я исходил из того что это базовый класс для всех простых(однозначных) индикаторов.
Мне так же кажется, что настал момент для очередного рефакторинга. Класс Ma, который я сделал для только скользящих, оказался пригоден и для других индикаторов (IsFormed Buffer - это все и другим относиться). Поэтому, есть предложение ввести два супер класса: SingleValueIndicator и MultiValueIndicator. И все текущие индикаторы (кроме наверное Болингера) отнаследовать от SingleValueIndicator.
Насчет названий. У нас сейчас фактически 2 стиля. Первый с именами, второй через аббревиатуры. Какой лучше?
SingleValueIndicator и MultiValueIndicator вполне разумно. Для них я так понимаю еще будет базовый класс BaseIndicator, где, например, IsFormed будет.
По названиям думаю лучше через имена.
С одной стороны удобно оставить имена такими, какими их привыкли видеть в инструментах теханализа. С другой стороны аббревиатуры иногда неоднозначно расшифровываются, даже у нас уже была такая ситуация. Давайте полные имена.
Еще есть индикаторы, которые принимают не один параметр в Add, а два. Но их, наверно, не много. И следовательно можно их делать отдельно.
Насчет названия согласен с artemox. Если мы путаемся в аббривеатурах, то нужно делать полные названия.
Всем доброго времени суток. Я застрял с реализацией индикатора HV (http://www2.wealth-lab.com/WL5Wiki/HV.ashx?HL=hv), может кто-нибудь подскажет более понятную формулу для расчета этого индикотора?
А как в S# задается параметр метода или конструктора, если этот параметр «проценты»?
Сорок пять процентов — 45 или 0.45?
new Unit()
Думаю лучше принимать в качестве параметра Юнит, и если нужно чтобы были именно проценты, то проверять тип в конструкторе и выбрасывать эксепшен если это не так.
По тестам наблюдение.
Есть данные из Ами.
SaveValues(folder+"VMA.txt", Sum(V*C,20)/Sum(V,20));
Согласно этим данным VMA = 180148.734375 Если посчитать эти же данные в экселе, то VMA = 180148.741408213 Если посчитать в S#, то VMA = 180148.74140821348556317520948
Это что получается? Что ами не надежный источник для тестирования? Какая-то адская погрешность (0.01) для такого несложного индикатора.
Вот оно как! Я кстати тоже заметил на стохастике увеличенную погрешность (если ориентироваться на количество знаков после запятой), т.к. было умножение результата на 100.
Получается что проверку нужно делать таким образом : Assert.IsTrue(Math.Max(indicator.Value, item.Value1) / Math.Min(indicator.Value, item.Value1) - 1 < 0.000001m);
Или искать более точный источник (хотя правильность расчетов будет подтверждена и данными из ами)
Индикаторы Peak и Trough.
Столкнулся с тем, что мое понимание этих индикаторов отличается от того, которое в Ами. Прошу помочь разобраться, какая интерпретация верная.
Описание в Лабе: http://www2.wealth-lab.com/WL5Wiki/Trough.ashx
Первое различие. В описании ясно сказано, что «During these bars the Trough function will not return $20, but will instead return the value of the previous trough.»
В ами же значение индикатора становится равным $20 раньше. Как будто они уже знают будущее. Пример данных из ами.
Считаю, что реализация в Ами этого индикатора неверная. Так как их реализация годится только для уже существующих данных, расчет постфактум. Если данные добавляются онлайн динамически, то их индикатор использовать нельзя.
Если остановимся на моем варианте, то данные из ами для тестов не подходят.
Вопрос: какой вариант реализуем в S#?
Второе различие. Второе различие более неопределенное. Так как в описании оно не рассматривается.
Мое понимаение: график индикатора представляет из себя лестницу вверх(peak), или вниз (trough). Тоесть график показывает глобальный максимум или минимум на всем пройденном интервале.
Если посмотреть на данные Trough из Ами:
то график индикатора Trough будет представлять собой ступеньки то вверх, то вниз.
Могу предположить, что они считают локальный минимум, а не глобальный. Тоесть, если после локального минимума был локальный максимум, а после этого опять локальный минимум, то они берут для индикатора значения этих минимумов. Правильно ли я понял? Или они делают по другому?
Вопрос: какой вариант верный и что реалиуем в S#?
SYNTAX trough(ARRAY, change, n = 1)
RETURNS ARRAY
FUNCTION Gives the value of ARRAY n-th trough(s) ago. This uses the Zig Zag function (see Zig Zag) to determine the troughs. Caveat: this function is based on Zig-Zag indicator and may look into the future. EXAMPLE trough(close,5,1)
Судя по всему на данных из ами эти индикаторы лучше не тестировать.
http://stocksharp.com/posts/m/8891/
Насчет реализации? Предлагаю так, как оно описано в книжках, по формуле.
По какой формуле? Какой из вариантов: глобальный или локальный максимум (минимум)?
Я просто разместил объяву. Сам то я ни про какую формулу идет речь, ни как реализован индикатор понятия не имею.
Благодаря Maxim-у выяснилось, что не всегда можно протестировать на данных без полной истории. Например ЕМА. Поэтому скрипт выгрузки теперь берет первые 200 баров, а не последние.
folder = "E:\";
function SaveValues(filename, values)//, values2, values3, values4) { fh = fopen( filename, "w"); if( fh ) { StartBar = Max(0, BarCount-200); // for (i = StartBar; i < BarCount; i++) for (i = 0; i < 200; i++) { ds = StrFormat("%.0f,%.0f,%.0f,%.0f,%.0f,%.8f"+ /",%.8f"+ ",%.8f"+ ",%.8f"+/ "\n", O, H, L, C, V, values //,values2,values3,values4 ); fputs( ds, fh ); } fclose( fh ); } }
SaveValues(folder+"Ema.txt", EMA(C,20));
Добавил тест для BollingerBands с использованием Sma, т.к. с использованием Ema не совпадает значение средней ни с Ami, ни с Metastock, данные по Ema выгружал начиная с первой свечки, т.е. зависимости от предыдущих данных быть не должно.Кто делал тест для Ema с использованием файла, можете так же выгрузить данные для BollingerBands? Или оставим тест на базе Sma?
По поводу атрибута Ignore для нерабочих тестов, а нужно ли оно? Когда есть нерабочий тест и он проваливается - видно что необходимо поправить, а если стоит Ignore - создается иллюзия что все работает.
Михаил может проще Вам зайти под логином Maxim и разлочить из студии эти файлы?
Забыл написать - все разлочили.
Михаил, когда Вы зальете SingleValueIndicator и MultiValueIndicator?
Предлагаю Simple переименовать в SingleValueIndicator. А MultiValueIndicator пока не знаю как должен выглядеть.
Конечно, я его вообще думал удалить.
MultiValueIndicator возможно как массив значений. А обращение к элементам массива через перечисление, объявленное в каждом классе.
Те, кто пока не уехал в отпуск, может продолжим? После чистки кода предлагаю еще раз список переделать и понять, что осталось, а что уже сделано.
Интересует только Peak и Trough
Вы их делать хотите? Они же уже сделаны.
День добрый. Эти индикаторы делал я. Я уже вернулся из отпуска и могу доделать все что нужно по индикаторам, которые я начинал. Что нужно сделать?
Да. http://www2.wealth-lab.com/WL5Wiki/Peak.ashx
Совсем забыл. С этими индикаторами был вопрос, который не знаю, закрыли или нет: http://stocksharp.com/posts/m/8891/
Я так понимаю об этом как раз и спрашивали.
просьба дать права моему логину: ktrunin
спасибо.
готово. welcome 😎
У меня свой индикатор. Он строится по свечам. Но при открытии дня сделок нет, значит и свечей нет. Как быть ?
Я не про это. Можно ли как то сохранять свечи в базу данных ?
Можно хранить список свечек в самом индикаторе. Зачем нужна бд?
А если робота на ночь закрыть ? Всё пропало ?