← Zurück

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

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

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

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

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

Сделав 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

Kommentare (340)

Anmelden oder Konto erstellen, Melden Sie sich an oder registrieren Sie sich, um einen Kommentar zu hinterlassen

Sergey Masyura
Sergey Masyura

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

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

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

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

Архив с кодом сделанных индюков прилагается в архиве. Это можно рассматривать как пример.

Предлагаю работать с кодом через репозиторий stocksharp connectors на codeplex.

http://stocksharpconnectors.codeplex.com/SourceControl/changeset/changes/3952

Залил туда начальную версию.

aspirant
aspirant

sergey.masyura: Предлагаю работать с кодом через репозиторий stocksharp connectors на codeplex.

http://stocksharpconnectors.codeplex.com/SourceControl/changeset/changes/3952

Залил туда начальную версию.

А как можно подключиться. Просит логин и пароль?

Mikhail Sukhov
Mikhail Sukhov Autor

aspirant:

sergey.masyura: Предлагаю работать с кодом через репозиторий stocksharp connectors на codeplex.

http://stocksharpconnectors.codeplex.com/SourceControl/changeset/changes/3952

Залил туда начальную версию.

А как можно подключиться. Просит логин и пароль?

Завел логин на сайте?

esper
esper

Посмотрел исходники средних, возник такой вот вопрос. Например, для индикатора стандартного отклонения нужна средняя, сделать можно двумя вариантами: наследованием и композицией. Если использовать композицию, то у нас получится два массива входящих значений. Если же унаследоваться от средней, то только один, просто вызываем сначала Add для базового класса, после считаем отклонение, но там ни к месту будет вызов base.RaiseChangedEvent(), может его куда-то перенести?

Mikhail Sukhov
Mikhail Sukhov Autor

esper: Посмотрел исходники средних, возник такой вот вопрос. Например, для индикатора стандартного отклонения нужна средняя, сделать можно двумя вариантами: наследованием и композицией. Если использовать композицию, то у нас получится два массива входящих значений. Если же унаследоваться от средней, то только один, просто вызываем сначала Add для базового класса, после считаем отклонение, но там ни к месту будет вызов base.RaiseChangedEvent(), может его куда-то перенести?

Наверное стоит перенести RaiseChangedEvent в Ma.Value, и наследоваться уже от Ma со своей реализацией Add.

esper
esper

Что-то тоже не выходит подключиться, пишет:

Microsoft Visual Studio

ОК

Пробовал ввести esper_cp, esper_cp@SND, SND\esper_cp, в общем как правильно вводить логин?

Mikhail Sukhov
Mikhail Sukhov Autor

esper: Что-то тоже не выходит подключиться, пишет:

Microsoft Visual Studio

ОК

Пробовал ввести esper_cp, esper_cp@SND, SND\esper_cp, в общем как правильно вводить логин?

Добавил в список участников проекта.

esper
esper

Mikhail Sukhov: Добавил в список участников проекта. Ага, есть коннект🙂

Кто какими индикаторами будет заниматься? У меня есть Стандартное отклонение, Полосы Боллинджера и RSI, правда интерфейсы у них немного отличаются, придется поправить. В текущем проекте их еще никто не реализовал?

Mikhail Sukhov
Mikhail Sukhov Autor

esper:

Mikhail Sukhov: Добавил в список участников проекта. Ага, есть коннект🙂

Кто какими индикаторами будет заниматься? У меня есть Стандартное отклонение, Полосы Боллинджера и RSI, правда интерфейсы у них немного отличаются, придется поправить. В текущем проекте их еще никто не реализовал?

Пока никто не изъявлял желание.

artemox
artemox

Добрый день! Для индикаторов очень важна гарантия правильности расчетов. Поэтому хорошо бы чтобы помимо кода индикатора разработчик указывал на каких данных проверено. Например для себя выгружал за один период значения OHLCV+Индикатор в файл из ami и из S#, полученные файлы не должны отличаться. У меня есть простые HHV, LLV, если получится присоединиться к репозитарию - выгружу :)

Mikhail Sukhov
Mikhail Sukhov Autor

artemox: Добрый день! Для индикаторов очень важна гарантия правильности расчетов. Поэтому хорошо бы чтобы помимо кода индикатора разработчик указывал на каких данных проверено. Например для себя выгружал за один период значения OHLCV+Индикатор в файл из ami и из S#, полученные файлы не должны отличаться. У меня есть простые HHV, LLV, если получится присоединиться к репозитарию - выгружу :)

Для этого есть юнит тесты. В репозитарии уже есть код проверки для скользящих средних.

artemox
artemox

Дык юнит тесты обычно пишутся тем же человеком и баги не исключены

Mikhail Sukhov
Mikhail Sukhov Autor

artemox: Дык юнит тесты обычно пишутся тем же человеком и баги не исключены

Я имел ввиду что расчеты, произведенные сторонней программой, можно проверять в юнит тестах. Для автоматизации.

maze9a
maze9a

Здравствуйте, есть желание написать следующие индикаторы: HV, ADX, ATR. Если они уже заняты, дайте знать. Хорошо бы иметь табличку с теми, которые уже сделаны или уже кем-то заняты.

esper
esper

Эти вроде пока никто не брался делать. Я делаю Стандартное отклонение, Полосы Боллинлжера, RSI.

2Mikhail Sukhov, я сделал комит с тестом для стандартного отклонения, хотелось бы краткую рецензию на него, т.к. с юнит тестированием у меня все плохо

Mikhail Sukhov
Mikhail Sukhov Autor

esper: 2Mikhail Sukhov, я сделал комит с тестом для стандартного отклонения, хотелось бы краткую рецензию на него, т.к. с юнит тестированием у меня все плохо

В студии настройки измените, чтобы использовать табы вместо пробелов. А так нормально.

maze9a
maze9a

Добавил индикатор ATR, попутно написал еще два вспомогательных TrueRange и WilderMA формулы взяты из wiki велса http://www2.wealth-lab.com/WL5Wiki/ATR.ashx?HL=atr. Кстати, на мой взгляд, реализация для EMA содержить ошибки: свойство IsFormed не выставляется и похоже что само значение тоже не верно считается, т.е. формула верная, но не учитывается что количество элементов не сразу равно периоду.

Mikhail Sukhov
Mikhail Sukhov Autor

maze9a: Добавил индикатор ATR, попутно написал еще два вспомогательных TrueRange и WilderMA формулы взяты из wiki велса http://www2.wealth-lab.com/WL5Wiki/ATR.ashx?HL=atr. Кстати, на мой взгляд, реализация для EMA содержить ошибки: свойство IsFormed не выставляется и похоже что само значение тоже не верно считается, т.е. формула верная, но не учитывается что количество элементов не сразу равно периоду.

  1. Так же как и к эсперу, табы вместо пробелов.
  2. ... Я думаю это не совсем верно. Событие Changed слушают сторонние компоненты. Например, график со свечками. Ему нужно отображать кривую, пока она не сформировалась? Почему бы нет.
  3. Заливая новые файлы, нужно заливать и измененный csproj. Иначе, новые файлы не видны.

По Ema - IsFormed автоматически рассчитывается. А насчет не учитывания элементов, то я не понял.

maze9a
maze9a

Mikhail Sukhov:

  1. Так же как и к эсперу, табы вместо пробелов.
  1. ...

Я думаю это не совсем верно. Событие Changed слушают сторонние компоненты. Например, график со свечками. Ему нужно отображать кривую, пока она не сформировалась? Почему бы нет.

  1. Заливая новые файлы, нужно заливать и измененный csproj. Иначе, новые файлы не видны.

По Ema - IsFormed автоматически рассчитывается. А насчет не учитывания элементов, то я не понял.

  1. поменял
  2. В моей реализации значение индикатора равно нулю до тех пор пока он полностью не сформирован (в велсе индикатор расчитывается таким же образом), поэтому нет смысла рисовать кривую пока она не сформированна. Если вызывать событие Changed до того как индикатор сформировался то скорей всего некоторым подписчикам придется проверять IsFormed, а это мне кажется лишнее.
  3. понятно Я посчитал Ema в велсе и сравнил с тем что получилось в вашей реализации, значения получились разные. Для расчета Ema на текущем шаге используется значение из предыдущего шага таким образом если первое значение расчитано не верно то и все последующие так же будут не корректные. Из описания Ema в велсе:

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 и после этого значения стали совпадать с теми которые получились в велсе.


		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();
		}


Я мог бы сдать эти изменения. Вы ничего не имеете против?

Mikhail Sukhov
Mikhail Sukhov Autor

maze9a: Я мог бы сдать эти изменения. Вы ничего не имеете против?

Посмотрел код. Думаю, вы правильнее поняли формулу чем я. Согласен насчет события для IsFormed == false и для Ema.

artemox
artemox

Михаил, добавьте логин artemox в список участников проекта.

Mikhail Sukhov
Mikhail Sukhov Autor

artemox: Михаил, добавьте логин artemox в список участников проекта.

The user artemox cannot be added because the account has not been activated. Please instruct the user to go to https://www.codeplex.com/site/reconfirmEmail to request another activation email.

artemox
artemox

Исправился

maze9a
maze9a

Добавил реализацию для ADX. Юнит тест не добавлял потому что значения посчитаные в велсе не совпадают с теми которые получаются в моей реализации, разница не большая но все же есть. Если будут какие-нибудь замечания по коду или самой реализации пишите.

esper
esper

Смотрю, что число индикаторов растет, может есть смысл их сгруппировать?

Mikhail Sukhov
Mikhail Sukhov Autor

esper: Смотрю, что число индикаторов растет, может есть смысл их сгруппировать?

По какому признаку?

Я думаю, нужно начать уже вести список сделанных и планируемых индюков. Предлагаю в отдельном топике с редактированием сообщения (добавили новый индюк - отредактировали).

esper
esper

Mikhail Sukhov: По какому признаку? Трендовые, осциляторы, объема

Mikhail Sukhov: Я думаю, нужно начать уже вести список сделанных и планируемых индюков. Предлагаю в отдельном топике с редактированием сообщения (добавили новый индюк - отредактировали). Хорошая идея🙂

Mikhail Sukhov
Mikhail Sukhov Autor

esper: Хорошая идея🙂

Еще предлагаю список индюков для TODO. Где их взять - вопрос. Полез по ссылкам на сайт Велса, увидел это и это. Пойдет?

esper
esper

Mikhail Sukhov:

esper: Хорошая идея🙂

Еще предлагаю список индюков для TODO. Где их взять - вопрос. Полез по ссылкам на сайт Велса, увидел это и это. Пойдет? Было бы хорошо поинтересоваться у народа, какие индикаторы им нужны, тут голосование можно сделать?

Mikhail Sukhov
Mikhail Sukhov Autor

esper: тут голосование можно сделать?

Можно. В окне новой темы есть галка, опрос.

esper
esper

Mikhail Sukhov: Можно. В окне новой темы есть галка, опрос. На этом сайте и других опросниках есть ограничение на число вариантов, поэтому опрос по полному списку индикаторов сделать не вышло

Mikhail Sukhov
Mikhail Sukhov Autor

esper:

Mikhail Sukhov: Можно. В окне новой темы есть галка, опрос. На этом сайте и других опросниках есть ограничение на число вариантов, поэтому опрос по полному списку индикаторов сделать не вышло

Подумалось. Список индюков из Велса не спроста такой, какой он есть сейчас. Стоит ли устраивать опросник, если ребята из той команды годами набирали то, что у них сейчас в дистрибутиве? Может пройдет проторенной дорожкой и сделаем все, что у них есть? Мы уже 1/5 сделали за эти пару недель. Начали быстро.

esper
esper

Mikhail Sukhov: Подумалось. Список индюков из Велса не спроста такой, какой он есть сейчас. Стоит ли устраивать опросник, если ребята из той команды годами набирали то, что у них сейчас в дистрибутиве? Может пройдет проторенной дорожкой и сделаем все, что у них есть? Мы уже 1/5 сделали за эти пару недель. Начали быстро. Опрос хотел сделать не для того, чтобы выяснить что делать, а что нет, а с целью выяснить наиболее часто используемые индюки, т.е. что делать в первую очередь.

Mikhail Sukhov: Если будут лить из Велса, формат txt такой же будет? И да, интересно узнать, из разных программ данные будут одинаковые или как?🙂 Далеко не факт, что данные будут совпадать, например, у меня не сходится EMA с данными из QUIK.

Maxim
Maxim

Михаил, добавьте пожалуйста логин goricap. Также прошу указать пять индикаторов, которые необходимо реализовать.

Евгений
Евгений

Михаил, добавьте пожалуйста логин neuro

esper
esper

Евгений: Михаил, добавьте пожалуйста логин neuro Как писалось ранее Mikhail Sukhov: Заливая новые файлы, нужно заливать и измененный csproj. Иначе, новые файлы не видны.

esper
esper

maze9a, что-то у меня не сходится тест для Полос Боллинджера с использованием Ema(14) на исторических данных по сберу, в частности отличается именно средняя линия

P.s. так же не сходится Smma на исторических данных, хотя в RSI оно работает нормально🤨 P.P.s. Не заметил, что WilderMa и Smma одно и тоже, позже удалю Smma

maze9a
maze9a

esper: maze9a, что-то у меня не сходится тест для Полос Боллинджера с использованием Ema(14) на исторических данных по сберу, в частности отличается именно средняя линия

P.s. так же не сходится Smma на исторических данных, хотя в RSI оно работает нормально🤨 P.P.s. Не заметил, что WilderMa и Smma одно и тоже, позже удалю Smma

В велсе есть две формы для Ema modern и legacy (wiki). У нас реализована форма modern. Значения Ema, расчитаные с использованием нашей реализации, совпадают с теми которые получаются в велсе, это отражено в юнит тесте. Возможно для Полос Боллинджера нужна форма legacy? И еще, каким образом вы расчитываете значения для вашего теста?

esper
esper

maze9a: В велсе есть две формы для Ema modern и legacy (wiki). У нас реализована форма modern. Значения Ema, расчитаные с использованием нашей реализации, совпадают с теми которые получаются в велсе, это отражено в юнит тесте. Возможно для Полос Боллинджера нужна форма legacy? И еще, каким образом вы расчитываете значения для вашего теста? Тестирую на данных из Quik-а, там строю график и сохраняю его в файл, после, на базе полученных данных, делаю тест.

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

maze9a
maze9a

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

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

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

esper
esper

maze9a:

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

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

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

maze9a
maze9a

esper:

maze9a:

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

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

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

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

esper
esper

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

Maxim
Maxim

Mikhail Sukhov: Тем более, сделав 5 индикаторов, вы получается доступ к репозитарию навсегда, а так же майку с символикой S#.

Уточню. Доступ к репозиторию индикаторов? Или доступ к репозиторию S#?

esper
esper

Попробовал в Ema считать коэффициент по original method, но все-равно, значения Ema не совпадают с данными из Quik.

artemox
artemox

Тут уже немало писателей индикаторов. Поэтому большинство популярных и общеизвестных индюков покроем. А дальше можно и по запросу делать.

Mikhail Sukhov
Mikhail Sukhov Autor

artemox: А дальше можно и по запросу делать.

А дальше все развивается по текущему сценарию. Есть вопросы и нужна помощь в программировании - пускай "платит" коллегам своей помощью.

artemox
artemox

Mikhail Sukhov: А дальше все развивается по текущему сценарию. Есть вопросы и нужна помощь в программировании - пускай "платит" коллегам своей помощью. А как платить - под заказ по маркету шарашить? :)

StochasticK RoC SUM (сам по себе может и не быть полезен, но для использования в других индикаторах пригодится)

А насчет тестирования какие идеи? Проект IndicatorsTest явно отстает от своего товарища. Мне кажется что проще будет сделать так:

  1. Создаем файлик вида а или б 1.а Price,Value 1.б Open,Hi,Lo,Close,Volume,Value
  2. В юнит тесте прогоняем индикатор по этому файлу, и когда IsFormed - сверяем значение из файла с расчетным

Наименования файлов соответственно сделать по формату IndicatorName#Parameters#TestDesription.txt

А ежели Reflection прикрутить, для автоматического запуска индикаторов по своим файлам, то это будет очень хорошо.

Mikhail Sukhov
Mikhail Sukhov Autor

artemox: Наименования файлов соответственно сделать по формату IndicatorName#Parameters#TestDesription.txt

А ежели Reflection прикрутить, для автоматического запуска индикаторов по своим файлам, то это будет очень хорошо.

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

Насчет автоматического Reflection не совсем уверен. Делать я думаю будет дольше, чем понатыкать методы. Тем более потеряем "юнит тестовость", когда можно будет запустить конкретный юнит тест, а не ждать прогона через Reflection всех индюков. Лучше наверное будет сделать какой-то вспомогательный класс, который бы содержал максимум логики, а ему на вход индюка. Тогда бы каждый метод юнит теста занимал бы не более строчки.

artemox
artemox

Mikhail Sukhov: Хорошая идея. Если у кого-нибудь есть под рукой такая прога - заливайте в репозитарий файлы. У меня такая прога amibroker :) Завтра попробую что нибудь выгрузить и тестик написать.

Mikhail Sukhov: Насчет автоматического Reflection не совсем уверен. Делать я думаю будет дольше, чем понатыкать методы. Тем более потеряем "юнит тестовость", когда можно будет запустить конкретный юнит тест, а не ждать прогона через Reflection всех индюков. Лучше наверное будет сделать какой-то вспомогательный класс, который бы содержал максимум логики, а ему на вход индюка. Тогда бы каждый метод юнит теста занимал бы не более строчки. По всякому начнем с конкретных юнитов.

Mikhail Sukhov
Mikhail Sukhov Autor

artemox:

Mikhail Sukhov: Хорошая идея. Если у кого-нибудь есть под рукой такая прога - заливайте в репозитарий файлы. У меня такая прога amibroker :) Завтра попробую что нибудь выгрузить и тестик написать.

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

maze9a
maze9a

Mikhail Sukhov:

artemox:

Mikhail Sukhov: Хорошая идея. Если у кого-нибудь есть под рукой такая прога - заливайте в репозитарий файлы. У меня такая прога amibroker :) Завтра попробую что нибудь выгрузить и тестик написать.

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

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

artemox
artemox

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

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

artemox
artemox

А вот список с описанием формул http://stockcharts.com/school/doku.php?id=chart_school:technical_indicators

artemox
artemox

В ами формат задается программно (fopen и вперед...) А так файлы можно разные погонять, например: SMA#50#AMI_RIM1_1MIN_CLOSE и SMA#30#WL_SBER03_1MIN_OHLCV

Sergey Masyura
Sergey Masyura

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

artemox
artemox

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

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

Maxim
Maxim

Взял себе:

VHF VMA WilliamsR Volatility UltimateOsc Vidya

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

esper
esper

Maxim: Взял себе:

VHF VMA WilliamsR Volatility UltimateOsc Vidya

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

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

Maxim
Maxim

Maxim: Maxim, для чего делать Check Out полностью для всего проекта? 🤨

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

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

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

esper
esper

Maxim: ChechOut может повредить репозиторий? Именно Check Out наврятли, возможно будут трудности, когда будет Check In, хотя это во многом зависит от системы контроля версий. Вообще, Check Out означает что я редактирую этот файл, и другим пока лучше воздержаться от его редактирования, чтобы не было проблем с мержджем изменений. Maxim: Насколько я понимаю, ChechOut это и есть способ первый раз залить себе исходники? Исходники скачиваем так же с помощью Get Latest Version Maxim: Так же интересно, чем пользоваться: Subversion клиентом или Visual Studio Team Explorer? Или дело вкуса? В этом проекте не принципиально, но у tfs есть много допольнительного функционала

Mikhail Sukhov
Mikhail Sukhov Autor

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

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

maze9a
maze9a

Maxim: Взял себе:

VHF VMA WilliamsR Volatility UltimateOsc Vidya

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

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

Maxim
Maxim

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

Нет. Не HV.

Volatility http://www2.wealth-lab.com/WL5Wiki/Volatility.ashx

InsiderHSE
InsiderHSE

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

Mikhail Sukhov
Mikhail Sukhov Autor

InsiderHSE: Прошу включить меня в проект, ник 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

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


esper
esper

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*
Maxim
Maxim

esper: Да вроде верно все, когда достигли макс. размер буфера первый раз, сработает условие

if (Buffer.Count == Length)

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

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

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

Maxim:

esper: Да вроде верно все, когда достигли макс. размер буфера первый раз, сработает условие

if (Buffer.Count == Length)

> > в следующий раз добавится новый элемент и размер списка будет Length+1 и попадем в блок *else*
> 
> Сори. Вы правы.
> Все верно.
> 
> Но все равно мой вариант краше :)
> Так как нет лишнего добавления и удаления из буфера

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

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

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

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

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

  1. Какое значение Value, пока IsFormed равно false?
esper
esper

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

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

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

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

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

Тут ранее поступало предложение

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

Maxim
Maxim

esper;8772: Тут ранее поступало предложение

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

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

Но.

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

esper
esper

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

Maxim
Maxim

esper:

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

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

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

esper
esper

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

Потому что нигде в индикаторах я не видел перед вызовом метода Change проверки на то, что новое значение Value отличается от старого. Я вопрос неверно понял... действтельно интересный момент, считаю, что при добавлении нового значения, если индикатор сформировался, то необходимо вызывать это событие, т.к. по событию может рисоваться график и т.д.

maze9a
maze9a

esper;8779:

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

Потому что нигде в индикаторах я не видел перед вызовом метода Change проверки на то, что новое значение Value отличается от старого. Я вопрос неверно понял... действтельно интересный момент, считаю, что при добавлении нового значения, если индикатор сформировался, то необходимо вызывать это событие, т.к. по событию может рисоваться график и т.д.

Поддерживаю такой подход.

InsiderHSE
InsiderHSE

Здравствуйте! Открываю солюшн Indicators, ссылки на сборки Ecng не находятся... Это только у меня так? Если я удалю их и снова добавлю на сборки из папки references, это не повлияет на работу других пользователей?

Mikhail Sukhov
Mikhail Sukhov Autor

InsiderHSE: Здравствуйте! Открываю солюшн Indicators, ссылки на сборки Ecng не находятся... Это только у меня так? Если я удалю их и снова добавлю на сборки из папки references, это не повлияет на работу других пользователей?

Get Latest version делайте не из Solution Explorer, а из Source Control Explorer. У вас не все файлы скачались.

Maxim
Maxim

Mikhail Sukhov:

InsiderHSE: Здравствуйте! Открываю солюшн Indicators, ссылки на сборки Ecng не находятся... Это только у меня так? Если я удалю их и снова добавлю на сборки из папки references, это не повлияет на работу других пользователей?

Get Latest version делайте не из Solution Explorer, а из Source Control Explorer. У вас не все файлы скачались.

У меня был аналогичный случай. Я сделал CheckOut только одного Indicators.sln. И у меня не хватало двух библиотек Ecng в референсах. Они были, но были помечены предупреждением.

Если посмотреть код файла Indicators.csproj, то там есть такие строки


<ItemGroup>
    <Reference Include="Ecng.Common">
      <HintPath>..\References\Ecng.Common.dll</HintPath>
    </Reference>
    <Reference Include="Ecng.Trading.Algo">
      <HintPath>..\..\References\Ecng.Trading.Algo.dll</HintPath>
    </Reference>
    <Reference Include="System" />
    <Reference Include="System.Core" />
  </ItemGroup>

Что говорит, что два файла лежат где-то выше.

Я просто добавил вручную эти два файла в референс. Но после этого откатил изменение в файле Indicators.csproj назад, что бы не влиять на основной код.

InsiderHSE
InsiderHSE

Mikhail Sukhov:

InsiderHSE: Здравствуйте! Открываю солюшн Indicators, ссылки на сборки Ecng не находятся... Это только у меня так? Если я удалю их и снова добавлю на сборки из папки references, это не повлияет на работу других пользователей?

Get Latest version делайте не из Solution Explorer, а из Source Control Explorer. У вас не все файлы скачались. Я даже когда с сайта скачиваю последнюю сборку, ссылки в референсе проекта присутствуют, но с восклицательныйм знаком, сами сборки не находятся. Я на 100% не уверен, сейчас нет возможности посмотреть, но вроде из Source Control Explorer и закачиваю последнюю версию. Maxim: У меня был аналогичный случай. Я сделал CheckOut только одного Indicators.sln. И у меня не хватало двух библиотек Ecng в референсах. Они были, но были помечены предупреждением.

Если посмотреть код файла Indicators.csproj, то там есть такие строки

Код:

<ItemGroup> <Reference Include="Ecng.Common"> <HintPath>..\References\Ecng.Common.dll</HintPath> </Reference> <Reference Include="Ecng.Trading.Algo"> <HintPath>....\References\Ecng.Trading.Algo.dll</HintPath> </Reference> <Reference Include="System" /> <Reference Include="System.Core" /> </ItemGroup>

Что говорит, что два файла лежат где-то выше.

Я просто добавил вручную эти два файла в референс. Но после этого откатил изменение в файле Indicators.csproj назад, что бы не влиять на основной код.

То есть вы поправили код Indicators.csproj вручную или через add new reference? Вам каждый раз приходится это делать?

esper
esper

InsiderHSE: Я даже когда с сайта скачиваю последнюю сборку, ссылки в референсе проекта присутствуют, но с восклицательныйм знаком, сами сборки не находятся. Я на 100% не уверен, сейчас нет возможности посмотреть, но вроде из Source Control Explorer и закачиваю последнюю версию. Идем в Team Explorer - Source Control, там есть Indicators, а еще есть References, вот их тоже скачиваем и все должно работать, можно скачать не полностью References, а только нужные зависимости.

Вообще суть в том, чтобы нужные зависимости лежали по адресу Indicators..\References, т.е. рядом с директорией проекта Indicators, должна быть директория References с нужными зависимостями

Maxim
Maxim

InsiderHSE: То есть вы поправили код Indicators.csproj вручную или через add new reference? Вам каждый раз приходится это делать? Вручную не правил. Добавил библиотеки в референс. И после этого откатил изменения в файле Indicators.csproj назад. Сделал это один раз. Каждый раз не нужно делать.

По какой причине после того, как сделал откат Студия видит библиотеки не знаю. По идее не должна. Но работает. Возможно я просто чего то не знаю.

Возможно стоит сделать по совету esper и скачать References.

Mikhail Sukhov
Mikhail Sukhov Autor

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

Возможно стоит сделать по совету esper и скачать References.

Схема такая. Это репозитарий коннекторов. Они все и используют S# сборки. Так же как и проект с индикаторами. Соответственно структура проекта (файловая) должна быть как она есть в TFS. Даже если у кого-то S# был до этого скачал и распакован в какую-то директорию другую, ссылки у проекта с индикаторами не должны вести туда. Используется только локальная копия сборок.

Я думаю надо отпустить файлы. А то сейчас вы все файлы пометили как редактируемые. Еще заметил, что checkin идет с пометкой не просто edit, но и branch. Схема работы следующая:

  1. Запустили студию. Открытие Source Control Explorer. Сделали на проект Connectors Get Latest Version.
  2. Редактируем файл в студии. Все изменения автоматически подхватываются TFS (в отличие от SVN).
  3. Хотим залить изменения. Делаем еще раз Get Latest Version. Если кто-то уже залил свои изменения, и у нас произошел конфликт, то эти конфликты правим из окна Pending Changes.
  4. Идем опять в Source Control Explorer, делаем Check In. Появляется окно, где пишет обязательно комментарий и проверяем свои изменения. Иногда бывает так, что студия (или мы сами) поменяли лишнее количество файлов. Лишнее откатываем (в случае сомнений делаем diff чтобы проверить отличия). По идее, в check in должны попасть только cs и csproj файлы. Все лишнее - это уже повод для сомнений.
esper
esper

Сейчас посмотрел исходный код индикатора Vidya, судя по всему, в нем используется индикатор CMO, который у нас уже есть в проекте, может стоит использовать его, а не считать значения самим? Т.е. комбинировать индикаторы, чтобы не было дублирования кода.

Maxim
Maxim

esper: Сейчас посмотрел исходный код индикатора Vidya, судя по всему, в нем используется индикатор CMO, который у нас уже есть в проекте, может стоит использовать его, а не считать значения самим? Т.е. комбинировать индикаторы, чтобы не было дублирования кода.

Сделал реализацию внутри сугубо для ускорения работы. Так же CMO умножается на 100 в реализации, тогда как в Vidya этого не нужно. Если кто желает переделать, то я не против.

UPD Неверно написал последнее предложение. Так как я делаю этот индикатор, то я за него в ответе. Если Михаил скажет, что надо переделать с использованием CMO класса, то я переделаю. Если не скажет, то пределывать ничего не буду.

esper
esper

Maxim: Сделал реализацию внутри сугубо для ускорения работы. Так же CMO умножается на 100 в реализации, тогда как в Vidya этого не нужно. Если кто желает переделать, то я не против. Предлагаю всем вместе решить как будем поступать в таких случаях, каждый раз изобретать велосипед или использовать готовое🙂

Maxim, goricap это ваш логин? Сейчас вытянул последнюю версию проекта, там добавлен индикатор Volatility, у метода Add стоит override, хотя в базовом классе такого метода вообще нет, и проект не компилируется, вы перед Check In проект компилируете?

P.s. CCI вроде никто еще не брал?

Maxim
Maxim

esper:

Maxim: Сделал реализацию внутри сугубо для ускорения работы. Так же CMO умножается на 100 в реализации, тогда как в Vidya этого не нужно. Если кто желает переделать, то я не против. Предлагаю всем вместе решить как будем поступать в таких случаях, каждый раз изобретать велосипед или использовать готовое🙂

Мое личное мнение: Изобретать велосипед по возможности не стоит. У проекта должен быть куратор, который должен решать политику партии. Всем вместе решать не стоит. Демократия говно :). Надо всем вместе обсуждать, а решение должен принимать один человек.

esper: Maxim, goricap это ваш логин? Сейчас вытянул последнюю версию проекта, там добавлен индикатор Volatility, у метода Add стоит override, хотя в базовом классе такого метода вообще нет, и проект не компилируется, вы перед Check In проект компилируете? Мой логин. Обычно компилирую. В последний раз забыл проверить на компиляцию.

Sergey Masyura
Sergey Masyura

Maxim:

esper:

Maxim: Сделал реализацию внутри сугубо для ускорения работы. Так же CMO умножается на 100 в реализации, тогда как в Vidya этого не нужно. Если кто желает переделать, то я не против. Предлагаю всем вместе решить как будем поступать в таких случаях, каждый раз изобретать велосипед или использовать готовое🙂

Мое личное мнение: Изобретать велосипед по возможности не стоит. У проекта должен быть куратор, который должен решать политику партии. Всем вместе решать не стоит. Демократия говно :). Надо всем вместе обсуждать, а решение должен принимать один человек.

esper: Maxim, goricap это ваш логин? Сейчас вытянул последнюю версию проекта, там добавлен индикатор Volatility, у метода Add стоит override, хотя в базовом классе такого метода вообще нет, и проект не компилируется, вы перед Check In проект компилируете? Мой логин. Обычно компилирую. В последний раз забыл проверить на компиляцию.

Если кто-то что-то поломал немного или сильно, то это в принципе херня. Особенности командной работы. Поэтому давайте относится с пониманием друг к другу, опыт у всех разный.

Всем спасибо за огромный вклад в проект!

artemox
artemox

sergey.masyura: Всем спасибо за огромный вклад в проект! Давно хотелось что-то сделать для проекта, но не было таких задач, которыми можно заниматься эпизодически. Так что будем постепенно покрывать весь набор индикаторов, обгоняя всех и вся :)

artemox
artemox

Maxim: UPD Неверно написал последнее предложение. Так как я делаю этот индикатор, то я за него в ответе. Если Михаил скажет, что надо переделать с использованием CMO класса, то я переделаю. Если не скажет, то пределывать ничего не буду.

Maxim, давайте все-таки переиспользовать другие индикаторы. ООП как никак. К примеру сравните WilliamsR и StochasticK, теоретически расчеты очень похожы, а разница в реализации колосальная.

Maxim
Maxim

artemox:

Maxim: UPD Неверно написал последнее предложение. Так как я делаю этот индикатор, то я за него в ответе. Если Михаил скажет, что надо переделать с использованием CMO класса, то я переделаю. Если не скажет, то пределывать ничего не буду.

Maxim, давайте все-таки переиспользовать другие индикаторы. ООП как никак. К примеру сравните WilliamsR и StochasticK, теоретически расчеты очень похожы, а разница в реализации колосальная.

Ок. Не обратил внимание на существование LLV и HHV.

Mikhail Sukhov
Mikhail Sukhov Autor

artemox:

sergey.masyura: Всем спасибо за огромный вклад в проект! Давно хотелось что-то сделать для проекта, но не было таких задач, которыми можно заниматься эпизодически. Так что будем постепенно покрывать весь набор индикаторов, обгоняя всех и вся :)

40 индюков! Это уже больше чем у ТСЛаб. Такими темпами из до лидеров ТА рынка добежим до осени.

esper
esper

Mikhail Sukhov: 40 индюков! Это уже больше чем у ТСЛаб. Такими темпами из до лидеров ТА рынка добежим до осени. Пора начинать думать над разработкой визуализатора🙂

artemox
artemox

Mikhail Sukhov: 40 индюков! Это уже больше чем у ТСЛаб. Такими темпами из до лидеров ТА рынка добежим до осени. 😱 8 маек! На самом деле, сейчас индюки пишутся на раз два. Например DPO с тестом нарисовал за 20 минут, + отладка 40 минут :)

Вот только нужен ли этот DPO кому-нибудь? :)

Mikhail Sukhov
Mikhail Sukhov Autor

esper:

Mikhail Sukhov: 40 индюков! Это уже больше чем у ТСЛаб. Такими темпами из до лидеров ТА рынка добежим до осени. Пора начинать думать над разработкой визуализатора🙂

Это точно. Вот думаю, а не залить ли сырцы Ecng.Trading.Xaml да и сделать на основе CandleChart рисовалку всех этих индюков. Примеры Chart из .NET меня удивили по хорошему, особенно раздел финансы (приложил к сообщению). Я так прикинул, что большинство индюков имею одинаковый вид отрисовки. А значит и работа будет значительно меньше, чем я предполагал в самом начале.

Mikhail Sukhov
Mikhail Sukhov Autor

artemox:

Mikhail Sukhov: 40 индюков! Это уже больше чем у ТСЛаб. Такими темпами из до лидеров ТА рынка добежим до осени. 😱 8 маек!

У нас уже 8 человек сделали по 5 индюков?

Но за намек спасибо, действительно пора уже печатать. Отсылать буду почтой. С москвичами можно сделать проще - очная встреча.

artemox
artemox

Mikhail Sukhov:

esper:

Mikhail Sukhov: 40 индюков! Это уже больше чем у ТСЛаб. Такими темпами из до лидеров ТА рынка добежим до осени. Пора начинать думать над разработкой визуализатора🙂

Это точно. Вот думаю, а не залить ли сырцы Ecng.Trading.Xaml да и сделать на основе CandleChart рисовалку всех этих индюков. Примеры Chart из .NET меня удивили по хорошему, особенно раздел финансы (приложил к сообщению). Я так прикинул, что большинство индюков имею одинаковый вид отрисовки. А значит и работа будет значительно меньше, чем я предполагал в самом начале.

А заливайте, дело то затягивающее :)

artemox
artemox

Mikhail Sukhov:

artemox:

Mikhail Sukhov: 40 индюков! Это уже больше чем у ТСЛаб. Такими темпами из до лидеров ТА рынка добежим до осени. 😱 8 маек!

У нас уже 8 человек сделали по 5 индюков?

Но за намек спасибо, действительно пора уже печатать. Отсылать буду почтой. С москвичами можно сделать проще - очная встреча.

Это больше шутка, чем намек :) Подождите релиза, а там и плюшки можно раздавать

esper
esper

Думаю, что окончательное решение будет принимать Михаил, как основатель проекта, либо выберем другого ответственного.

Пока выскажу некоторые предложения по проекту:

  1. Как уже писал выше, предлагаю использовать уже готовые индикаторы повторно, а не писать каждый раз все под себя, во-первых, не будет лишнего дублирования кода, во-вторых, код индикаторов становится более компактным и понятным, в-третьих, это позволит лишний раз протестировать уже написанные индикаторы.

  2. Давайте по возможности писать не только индикаторы, но и тесты к ним, индикаторов сейчас куча, а какие реально работают - не ясно, т.к. тестов всего несколько. Сомневаюсь, что нам нужна куча неработающих индикаторов и предлагаю считать, что индикатор написан только тогда, когда он покрыт тестами.

  3. По поведению индикаторов:

    • если индикатор еще не сформировался, то его значение равно 0
    • пока индикатор не сформировался, событие Changed не вызывается
    • после того как индикатор сформировался, событие Changed вызывается при каждом добавлении нового значения
    • функция Add принимает или decimal или Candle
  4. При коммите указывать какие изменения были внесены, коммиты делать только для работающих версий (по минимуму проект должен собираться)

  5. Xml комментарии писать на одном языке

Пока все, если что-то вспомню, добавлю🙂

artemox
artemox

esper: выскажу некоторые предложения по проекту:

  1. Как уже писал выше, предлагаю использовать уже готовые индикаторы повторно, а не писать каждый раз все под себя, во-первых, не будет лишнего дублирования кода, во-вторых, код индикаторов становится более компактным и понятным, в-третьих, это позволит лишний раз протестировать уже написанные индикаторы.

  2. Давайте по возможности писать не только индикаторы, но и тесты к ним, индикаторов сейчас куча, а какие реально работают - не ясно, т.к. тестов всего несколько. Сомневаюсь, что нам нужна куча неработающих индикаторов и предлагаю считать, что индикатор написан только тогда, когда он покрыт тестами.

  3. По поведению индикаторов:

  • если индикатор еще не сформировался, то его значение равно 0
  • пока индикатор не сформировался, событие Changed не вызывается
  • после того как индикатор сформировался, событие Changed вызывается при каждом добавлении нового значения
  • функция Add принимает или decimal или Candle
  1. При коммите указывать какие изменения были внесены, коммиты делать только для работающих версий (по минимуму проект должен собираться)

  2. Xml комментарии писать на одном языке

Коллеги, все согласны с esper? Предагаю это в первый пост перенести (Михаил, это только Вы сможете сделать?) Также как и файл "Таблица индикаторов.xls" от Maxim-а (55 пост).

Насчет тестирования предлагаю всем использовать TextTestReader (пример в MomentumTest). Тест делается быстро и надежно.

maze9a
maze9a

artemox: Коллеги, все согласны с esper? Предагаю это в первый пост перенести (Михаил, это только Вы сможете сделать?) Также как и файл "Таблица индикаторов.xls" от Maxim-а (55 пост).

Насчет тестирования предлагаю всем использовать TextTestReader (пример в MomentumTest). Тест делается быстро и надежно.

Я с предложениями от esper согласен. Еще есть предложения: не называть файлы для юнит тестов громозкими именами, а называть их просто по имени индикатора, а в самом файле первой строчкой сделать коментарий где описать формат данных и всю необходимую инфу по тесту и индикатору. Уверен, что пропуск коментария не сложно сделать в TextTestReader.

artemox
artemox

maze9a: Я с предложениями от esper согласен. Еще есть предложения: не называть файлы для юнит тестов громозкими именами, а называть их просто по имени индикатора, а в самом файле первой строчкой сделать коментарий где описать формат данных и всю необходимую инфу по тесту и индикатору. Уверен, что пропуск коментария не сложно сделать в TextTestReader.

Вобщем здравая мысль. Переделаю :)

artemox
artemox

artemox:

maze9a: Еще есть предложения: не называть файлы для юнит тестов громозкими именами, а называть их просто по имени индикатора, а в самом файле первой строчкой сделать коментарий где описать формат данных и всю необходимую инфу по тесту и индикатору. Уверен, что пропуск коментария не сложно сделать в TextTestReader.

Вобщем здравая мысль. Переделаю :)

TextTestReader теперь игнорирует строки-комментарии, начинающиеся с символа "#". Соответственно все свои тест-файлы назвал по имени индикатора и внутри снабдил строчкой с описанием.

Maxim
Maxim

esper: 2. Давайте по возможности писать не только индикаторы, но и тесты к ним, индикаторов сейчас куча, а какие реально работают - не ясно, т.к. тестов всего несколько. Сомневаюсь, что нам нужна куча неработающих индикаторов и предлагаю считать, что индикатор написан только тогда, когда он покрыт тестами.

  1. Лучше конечно определится со способо тестирования. На данный момент где-то данные просто генерятся внутри теста, где-то используются массивы, где-то используются внешние данные из файла.

    Считаю, что лучше не генерировать данные внутри теста, а использовать внешние данные. И, повторюсь, лучше унифицировать этот способ.

    MomentumTest мне нравится. Только надо ввсети погрешность — плюс-минус дельта величину, когда мы будем считать, что значение верно.

  2. Возможно, тесты стоит сделать одному человеку. В этом случае будет все более унифицировано. Методом копипаст не очень трудно сделать тесты для каждого индикатора из MomentumTest.

  3. Я не могу делать юнит тесты, так как у меня нет возможности создавать файлы. Не пользуюсь я сторонними программами.

Оффтоп: а) В список правил стоит добавить пункт-напоминание, что бы все делали проверку на деление на ноль где это возможно. б) Что насчет потокобезопасности? Стоит ли ее реализовывать в индикаторах или нет?

esper
esper

sergey.masyura, какой смысл несет замена

decimal[] data = new decimal[]

на

var data = new[]

Конструкция тут не трехэтажная, сильно проще она не стала🤨

Sergey Masyura
Sergey Masyura

esper: sergey.masyura, какой смысл несет замена

decimal[] data = new decimal[]

> на
> ```
var data = new[]

Конструкция тут не трехэтажная, сильно проще она не стала🤨

Конструкция стала проще. Это не С++, поэтому разумно использовать возможности языка С# полностью.

esper
esper

sergey.masyura: Конструкция стала проще. Это не С++, поэтому разумно использовать возможности языка С# полностью. var действительно очень классная штука, особенно там где приходится использовать анонимные типы, конструкции вида IEnumerable<IGrouping<string, int>>, я даже согласен с тем, чтобы первый decimal заменить на var🙂 , но второй decimal говорит о типе, а тут получается конструкция, о типе данных в которой можно только догадываться, поэтому я не вижу здесь никакого упрощения.

ddsfx
ddsfx

можно занять индикаторы на будущее?

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

стохастик, пайвот пойнтс, сглаженный впр - после НЧ фильтра.

Насколько сложно реализовать профиль рынка?

код на mq4 есть.

artemox
artemox

ddsfx, обращайся сюда, думаю будет наиболее эффективно. Профиль необычный индикатор, сейчас интерфейс на него не заточен. Имхо он сам по себе.

InsiderHSE
InsiderHSE

Сделал индикаторы из WealthLab - LinearReg, LinearRegSlope, RSquared, StdError плюс Unit тесты к ним. Также добавил для производительности индикатор LinearRegression, который содержит все 4 предыдущих в соответствующих свойствах (только для LinearReg св-во называется Forecast), чтобы по несколько раз не гонять регрессию если нужны несколько индикаторов.

maze9a
maze9a

artemox я посмотрел твой комент в MomentumTest, у меня тоже вылезает такая ошибка, поэтому я не стал использовать Assert из Ecng.UnitTesting. Если разберешся в чем тут проблема напиши пожалуйста.

artemox
artemox

maze9a: artemox я посмотрел твой комент в MomentumTest, у меня тоже вылезает такая ошибка, поэтому я не стал использовать Assert из Ecng.UnitTesting. Если разберешся в чем тут проблема напиши пожалуйста. Я думаю тут нам быстрее помогут создатели Ecng.UnitTesting

artemox
artemox

Появилась идея сделать класс TestTestExecuter. Но тогда необходимо создать базовый класс с методами Add(Candle), Add(decimal), Value, IsFormed. Понятно, что не все индикаторы укладываются в один Value, но большинство индюков будут приобщены к одному интерфейсу.

Тогда тестирование можно будет оформлять в виде строчки: TextTestExecuter.ByClosePrice(new Momentum(20), _dataUri);

esper
esper

artemox, данные для тестов выгружаются из AmiBroker? Можете вкратце объяснить как это сделать?

artemox
artemox

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));

esper
esper
esper

А каким образом указывается бумага для которой экспортируем данные?

artemox
artemox

Текущая бумага (выбранная в выпадающем списке) и будет экспортироваться. Если инд считается по одному значению, а не по всей свече, то указывается так: ROC( Close, 30)

esper
esper

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

artemox
artemox

Сори, это моя ошибка. Формат заточен под РИ. 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 ); } }

esper
esper

artemox: Думаю так будет универсально:

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 ); } } Спасибо, теперь все нормально.

Maxim
Maxim

Предложение. Что бы не было путаницы, называть индикаторы согласно тому, как их называют здесь: http://www2.wealth-lab.com/WL5Wiki/AllPages.aspx?Cat=Standard%20Indicators

Насколько я понял: StochK = StochasticK Highest = HHV Lowest = LLV

Првильно? Может переименовать?

Нужно ли делать отдельныне BBandLower и BBandUpper, если уже сделан BollingerBands общий?

artemox
artemox

Maxim: Предложение. Что бы не было путаницы, называть индикаторы согласно тому, как их называют здесь: 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 переименовал

Maxim
Maxim

artemox: Да правильно, но HHV и LLV это имена из амиброкера, т.к. Highest и Lowest там имеют другое предназначение Может в таблицу алтернативные имена добавить?

В этом случае можно составить экселик, где будут три столбика "Как у нас называется", "Как в амиброкере", "Как в лабе".

artemox
artemox

я за. кстати могу выгрузить тесты для индикаторов, только скажите - какие?

Maxim
Maxim

artemox: я за. кстати могу выгрузить тесты для индикаторов, только скажите - какие?

Peak, PeakBar, QStick, TRIX, Trough, TroughBar, UltimateOsc, VHF, Vidya, VMA, Volatility, WilliamsR

artemox
artemox

Maxim: 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 ) ));

Sergey Masyura
Sergey Masyura

BB фейлится, потому что первое значение EMA считается как SMA, а когда экспортировали данные оно, видимо, строилось на основе предыдущих значений.

esper
esper

sergey.masyura: BB фейлится, потому что первое значение EMA считается как SMA, а когда экспортировали данные оно, видимо, строилось на основе предыдущих значений. Для BB еще не переписывал тест с использованием файлов, пусть пока фейлится, на днях разберусь.

Кстати, у меня и MACD не сходится, видимо тоже из-за Ema

Sergey Masyura
Sergey Masyura

esper:

sergey.masyura: BB фейлится, потому что первое значение EMA считается как SMA, а когда экспортировали данные оно, видимо, строилось на основе предыдущих значений. Для BB еще не переписывал тест с использованием файлов, пусть пока фейлится, на днях разберусь.

Кстати, у меня и MACD не сходится, видимо тоже из-за Ema

На такие тесты можно просто ставить аттрибут [Ignore], тогда они будут пропускаться при выполнении.

artemox
artemox

Посмотрел VMA, оказывается это Volume Weighted Moving Averages, а я искал Variable Moving Average

Выгрузил: SaveValues(folder+"VMA.txt", Sum(V*C,20)/Sum(V,20));

Кстати реализацию можно переделать используя индикатор SUM :)

artemox
artemox

sergey.masyura, как победить ошибку "Невозможно загрузить файл или сборку "Microsoft.VisualStudio.QualityTools.UnitTestFramework, Version=9.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a" или один из зависимых от них компонентов. Не удается найти указанный файл." возникающую например при вызове sma.Value.AssertEqual((decimal)data.Average()); ?

Не у одного меня такая ерунда :(

Sergey Masyura
Sergey Masyura

artemox: 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.

artemox
artemox

sergey.masyura:

artemox: 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 осталась. Никто не против?

Sergey Masyura
Sergey Masyura

artemox:

sergey.masyura:

artemox: 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 подумать?

Mikhail Sukhov
Mikhail Sukhov Autor

artemox: У меня 2010 проф. Папки PublicAssemblies не было. Создал папку и добавил файлы. При добавлении ссылки в проект файлы из PublicAssemblies в списке появились. Добавил в IndicatorsTest ссылку на Microsoft.VisualStudio.QualityTools.UnitTestFramework.dll, ошибка все равно не исчезла.

Ошибка у меня. Я проект скомпилировал под 3.5, и сам проект с тестами написан на .NET 4. Я бы залил новую версию Ecng.UnitTesting под 4.0, но юзер goricap залочил все файлы.

Ау, goricap, отпустите файлы!🙄

esper
esper

sergey.masyura: SingleValueIndicator и MultiValueIndicator вполне разумно. Для них я так понимаю еще будет базовый класс BaseIndicator, где, например, IsFormed будет. Так может MultiValueIndicator унаследовать от SingleValueIndicator?

Mikhail Sukhov:

artemox: У меня 2010 проф. Папки PublicAssemblies не было. Создал папку и добавил файлы. При добавлении ссылки в проект файлы из PublicAssemblies в списке появились. Добавил в IndicatorsTest ссылку на Microsoft.VisualStudio.QualityTools.UnitTestFramework.dll, ошибка все равно не исчезла.

Ошибка у меня. Я проект скомпилировал под 3.5, и сам проект с тестами написан на .NET 4. Я бы залил новую версию Ecng.UnitTesting под 4.0, но юзер goricap залочил все файлы.

Ау, goricap, отпустите файлы!🙄 Может проект с тестами тоже сделаем под 3.5?

Maxim
Maxim

Mikhail Sukhov:

artemox: У меня 2010 проф. Папки PublicAssemblies не было. Создал папку и добавил файлы. При добавлении ссылки в проект файлы из PublicAssemblies в списке появились. Добавил в IndicatorsTest ссылку на Microsoft.VisualStudio.QualityTools.UnitTestFramework.dll, ошибка все равно не исчезла.

Ошибка у меня. Я проект скомпилировал под 3.5, и сам проект с тестами написан на .NET 4. Я бы залил новую версию Ecng.UnitTesting под 4.0, но юзер goricap залочил все файлы.

Ау, goricap, отпустите файлы!🙄

Как их отпустить? Вроде ничего не делал необычного.

esper
esper

Maxim: Как их отпустить? Вроде ничего не делал необычного. Если все нужные изменения залиты в репозиторий, то Undo pending changes на всё, иначе заливаем нужные изменения и потом Undo pending changes, в крайнем случае Check in на всё

Maxim
Maxim

esper:

Maxim: Как их отпустить? Вроде ничего не делал необычного. Если все нужные изменения залиты в репозиторий, то Undo pending changes на всё, иначе заливаем нужные изменения и потом Undo pending changes, в крайнем случае Check in на всё

Это все сделано давно. Единственное подозрение на файл macd.cs С какого то момента времени с ним произошел какой то косяк. Его нет в локальном проекте, но сабвершен его не хочет закачивать с репозитория.

Хотя возможно и не в нем проблема.

А можно как нить разлочить со стороны репозитория?

Sergey Masyura
Sergey Masyura

Maxim:

esper:

Maxim: Как их отпустить? Вроде ничего не делал необычного. Если все нужные изменения залиты в репозиторий, то Undo pending changes на всё, иначе заливаем нужные изменения и потом Undo pending changes, в крайнем случае Check in на всё

Это все сделано давно. Единственное подозрение на файл macd.cs С какого то момента времени с ним произошел какой то косяк. Его нет в локальном проекте, но сабвершен его не хочет закачивать с репозитория.

Хотя возможно и не в нем проблема.

А можно как нить разлочить со стороны репозитория?

Зачем использовать svn, если репозиторий под team foundation server?

Mikhail Sukhov
Mikhail Sukhov Autor

Maxim: Его нет в локальном проекте, но сабвершен его не хочет закачивать с репозитория.

Хотя возможно и не в нем проблема.

А можно как нить разлочить со стороны репозитория?

Можно по скайпу, можно телефоном. Думаю, объяснить будет проще, там разговора минут на 10.

Maxim
Maxim

sergey.masyura:

Maxim:

esper:

Maxim: Как их отпустить? Вроде ничего не делал необычного. Если все нужные изменения залиты в репозиторий, то Undo pending changes на всё, иначе заливаем нужные изменения и потом Undo pending changes, в крайнем случае Check in на всё

Это все сделано давно. Единственное подозрение на файл macd.cs С какого то момента времени с ним произошел какой то косяк. Его нет в локальном проекте, но сабвершен его не хочет закачивать с репозитория.

Хотя возможно и не в нем проблема.

А можно как нить разлочить со стороны репозитория?

Зачем использовать svn, если репозиторий под team foundation server?

На мой вопрос чем лучше пользоваться ответили, что нет разницы.

SVN я пользовался раньше, а TFS нет. Просто выбрал, что привычней.

Mikhail Sukhov
Mikhail Sukhov Autor

Maxim: SVN я пользовался раньше, а TFS нет. Просто выбрал, что привычней.

Максим, вопрос с локом еще актуальный. Можете отпустить файлы, хотя бы References?

Maxim
Maxim

Mikhail Sukhov:

Maxim: SVN я пользовался раньше, а TFS нет. Просто выбрал, что привычней.

Максим, вопрос с локом еще актуальный. Можете отпустить файлы, хотя бы References?

Да я бы с радостью. Только вот не знаю, что делать. Утром звонил Вам в скайп. Щас тоже в скайпе. Жду помощи.

esper
esper

artemox: Появилась идея сделать класс TestTestExecuter. Но тогда необходимо создать базовый класс с методами Add(Candle), Add(decimal), Value, IsFormed. Понятно, что не все индикаторы укладываются в один Value, но большинство индюков будут приобщены к одному интерфейсу. Здравая идея, думаю в визуализаторе это тоже пригодится

Maxim:

  1. Лучше конечно определится со способо тестирования. На данный момент где-то данные просто генерятся внутри теста, где-то используются массивы, где-то используются внешние данные из файла.

    Считаю, что лучше не генерировать данные внутри теста, а использовать внешние данные. И, повторюсь, лучше унифицировать этот способ.

    MomentumTest мне нравится. Только надо ввсети погрешность — плюс-минус дельта величину, когда мы будем считать, что значение верно. поддерживаю

Maxim: 2) Возможно, тесты стоит сделать одному человеку. В этом случае будет все более унифицировано. Методом копипаст не очень трудно сделать тесты для каждого индикатора из MomentumTest. при написания теста часто выявляются ошибки, а искать их проще тому, кто писал индикатор

Maxim: Оффтоп: а) В список правил стоит добавить пункт-напоминание, что бы все делали проверку на деление на ноль где это возможно. б) Что насчет потокобезопасности? Стоит ли ее реализовывать в индикаторах или нет? а)согласен б)мне кажется, не стоит усложнять индикаторы, есть ли такие ситуации, где это было бы оправдано?

artemox: На самом деле, сейчас индюки пишутся на раз два. Например DPO с тестом нарисовал за 20 минут, + отладка 40 минут :)

Вот только нужен ли этот DPO кому-нибудь? :) Лишним не будет🙂 Так понимаю, что наиболее используемые индикаторы уже сделали? Может добьем тесты и Михаил соберет первую бету?

Maxim:

artemox: Да правильно, но HHV и LLV это имена из амиброкера, т.к. Highest и Lowest там имеют другое предназначение Может в таблицу алтернативные имена добавить?

В этом случае можно составить экселик, где будут три столбика "Как у нас называется", "Как в амиброкере", "Как в лабе". Поддерживаю, заодно обновим что сделано, а что нет:)

sergey.masyura: На такие тесты можно просто ставить аттрибут [Ignore], тогда они будут пропускаться при выполнении. Хорошо, учтем. Смотрю на частые Coding style fixes, есть документ, где представлен Coding style?

Mikhail Sukhov: Это точно. Вот думаю, а не залить ли сырцы Ecng.Trading.Xaml да и сделать на основе CandleChart рисовалку всех этих индюков. Примеры Chart из .NET меня удивили по хорошему, особенно раздел финансы (приложил к сообщению). Я так прикинул, что большинство индюков имею одинаковый вид отрисовки. А значит и работа будет значительно меньше, чем я предполагал в самом начале. Надо подумать над индикаторами, у которых несколько значений, как вариант, пусть каждый индикатор умеет рисовать себя сам.

Евгений
Евгений

artemox: На самом деле, сейчас индюки пишутся на раз два. Например DPO с тестом нарисовал за 20 минут, + отладка 40 минут :)

Вот только нужен ли этот DPO кому-нибудь? :)

Эх... Не успел вылить... Напишу тогда, что делаю: Fractals, Ichimoku, Parabolic SAR, что ведет за собой реализацию Acceleration Oscillator, Awesome Oscillator и Median Price.

Sergey Masyura
Sergey Masyura

artemox: Появилась идея сделать класс TestTestExecuter.

sergey.masyura: На такие тесты можно просто ставить аттрибут [Ignore], тогда они будут пропускаться при выполнении. Хорошо, учтем. Смотрю на частые Coding style fixes, есть документ, где представлен Coding style?

В шапке топика написано - "Стиль кодирование указывается через R#. Настройки в репозитарии."

Настройки можно включить через плагин http://rsm.codeplex.com/

Maxim
Maxim

Евгений:

artemox: На самом деле, сейчас индюки пишутся на раз два. Например DPO с тестом нарисовал за 20 минут, + отладка 40 минут :)

Вот только нужен ли этот DPO кому-нибудь? :)

Эх... Не успел вылить... Напишу тогда, что делаю: Fractals, Ichimoku, Parabolic SAR, что ведет за собой реализацию Acceleration Oscillator, Awesome Oscillator и Median Price.

Печально.

Предложение. Можно придерживаться следующего правила, что бы не делать индикатор, который уже делают. Как только выбрали индикатор для реализации, обновляете проект до последней версии. Проверяете есть ли уже данный индикатор в проекте. Если нет, создаете пустой класс с этим индикатором. Комитите этот файл в репозиторий, что бы все видели, что этот индикатор уже в производстве. Ну и как он сделан, комитить уже готовый файл с индикатором.

esper
esper

esper:

artemox: Появилась идея сделать класс TestTestExecuter.

sergey.masyura: На такие тесты можно просто ставить аттрибут [Ignore], тогда они будут пропускаться при выполнении. Хорошо, учтем. Смотрю на частые Coding style fixes, есть документ, где представлен Coding style?

В шапке топика написано - "Стиль кодирование указывается через R#. Настройки в репозитарии."

Настройки можно включить через плагин http://rsm.codeplex.com/ Не у всех есть решарпер или возможность его поставить

artemox
artemox

esper:

artemox: Появилась идея сделать класс TestTestExecuter. Но тогда необходимо создать базовый класс с методами Add(Candle), Add(decimal), Value, IsFormed. Понятно, что не все индикаторы укладываются в один Value, но большинство индюков будут приобщены к одному интерфейсу. Здравая идея, думаю в визуализаторе это тоже пригодится

Коллеги, на ваш суд SimpleIndicator. Может быть устраним базовый Ma? и все пронаследуем от SimpleIndicator?

Sergey Masyura
Sergey Masyura

artemox:

esper:

artemox: Появилась идея сделать класс TestTestExecuter. Но тогда необходимо создать базовый класс с методами Add(Candle), Add(decimal), Value, IsFormed. Понятно, что не все индикаторы укладываются в один Value, но большинство индюков будут приобщены к одному интерфейсу. Здравая идея, думаю в визуализаторе это тоже пригодится

Коллеги, на ваш суд SimpleIndicator. Может быть устраним базовый Ma? и все пронаследуем от SimpleIndicator?

Само название SimpleIndicator уже не очень подходит для базового класса.

artemox
artemox

sergey.masyura: Само название SimpleIndicator уже не очень подходит для базового класса.

Предлагайте как лучше, я исходил из того что это базовый класс для всех простых(однозначных) индикаторов.

Mikhail Sukhov
Mikhail Sukhov Autor

artemox:

sergey.masyura: Само название SimpleIndicator уже не очень подходит для базового класса.

Предлагайте как лучше, я исходил из того что это базовый класс для всех простых(однозначных) индикаторов.

Мне так же кажется, что настал момент для очередного рефакторинга. Класс Ma, который я сделал для только скользящих, оказался пригоден и для других индикаторов (IsFormed Buffer - это все и другим относиться). Поэтому, есть предложение ввести два супер класса: SingleValueIndicator и MultiValueIndicator. И все текущие индикаторы (кроме наверное Болингера) отнаследовать от SingleValueIndicator.

Насчет названий. У нас сейчас фактически 2 стиля. Первый с именами, второй через аббревиатуры. Какой лучше?

Sergey Masyura
Sergey Masyura

Mikhail Sukhov:

artemox:

sergey.masyura: Само название SimpleIndicator уже не очень подходит для базового класса.

Предлагайте как лучше, я исходил из того что это базовый класс для всех простых(однозначных) индикаторов.

Мне так же кажется, что настал момент для очередного рефакторинга. Класс Ma, который я сделал для только скользящих, оказался пригоден и для других индикаторов (IsFormed Buffer - это все и другим относиться). Поэтому, есть предложение ввести два супер класса: SingleValueIndicator и MultiValueIndicator. И все текущие индикаторы (кроме наверное Болингера) отнаследовать от SingleValueIndicator.

Насчет названий. У нас сейчас фактически 2 стиля. Первый с именами, второй через аббревиатуры. Какой лучше?

SingleValueIndicator и MultiValueIndicator вполне разумно. Для них я так понимаю еще будет базовый класс BaseIndicator, где, например, IsFormed будет.

По названиям думаю лучше через имена.

artemox
artemox

sergey.masyura:

Mikhail Sukhov: Насчет названий. У нас сейчас фактически 2 стиля. Первый с именами, второй через аббревиатуры. Какой лучше? По названиям думаю лучше через имена.

С одной стороны удобно оставить имена такими, какими их привыкли видеть в инструментах теханализа. С другой стороны аббревиатуры иногда неоднозначно расшифровываются, даже у нас уже была такая ситуация. Давайте полные имена.

esper
esper

Mikhail Sukhov: Мне так же кажется, что настал момент для очередного рефакторинга. Класс Ma, который я сделал для только скользящих, оказался пригоден и для других индикаторов (IsFormed Buffer - это все и другим относиться). Поэтому, есть предложение ввести два супер класса: SingleValueIndicator и MultiValueIndicator. И все текущие индикаторы (кроме наверное Болингера) отнаследовать от SingleValueIndicator. Не только Боллинджера, еще у MACD, RVI по два значения

Mikhail Sukhov: Насчет названий. У нас сейчас фактически 2 стиля. Первый с именами, второй через аббревиатуры. Какой лучше? Не смотря на то, что аббревиатуры понятней, видимо по именам, чтобы не было путаницы

Maxim
Maxim

Mikhail Sukhov: Мне так же кажется, что настал момент для очередного рефакторинга. Класс Ma, который я сделал для только скользящих, оказался пригоден и для других индикаторов (IsFormed Buffer - это все и другим относиться). Поэтому, есть предложение ввести два супер класса: SingleValueIndicator и MultiValueIndicator. И все текущие индикаторы (кроме наверное Болингера) отнаследовать от SingleValueIndicator.

Насчет названий. У нас сейчас фактически 2 стиля. Первый с именами, второй через аббревиатуры. Какой лучше?

Еще есть индикаторы, которые принимают не один параметр в Add, а два. Но их, наверно, не много. И следовательно можно их делать отдельно.

Насчет названия согласен с artemox. Если мы путаемся в аббривеатурах, то нужно делать полные названия.

maze9a
maze9a

Всем доброго времени суток. Я застрял с реализацией индикатора HV (http://www2.wealth-lab.com/WL5Wiki/HV.ashx?HL=hv), может кто-нибудь подскажет более понятную формулу для расчета этого индикотора?

esper
esper

maze9a: Всем доброго времени суток. Я застрял с реализацией индикатора HV (http://www2.wealth-lab.com/WL5Wiki/HV.ashx?HL=hv), может кто-нибудь подскажет более понятную формулу для расчета этого индикотора? Возможно это поможет

maze9a
maze9a

esper:

maze9a: Всем доброго времени суток. Я застрял с реализацией индикатора HV (http://www2.wealth-lab.com/WL5Wiki/HV.ashx?HL=hv), может кто-нибудь подскажет более понятную формулу для расчета этого индикотора? Возможно это поможет Спасибо.

Maxim
Maxim

А как в S# задается параметр метода или конструктора, если этот параметр «проценты»?

Сорок пять процентов — 45 или 0.45?

InsiderHSE
InsiderHSE

Maxim: А как в S# задается параметр метода или конструктора, если этот параметр «проценты»?

Сорок пять процентов — 45 или 0.45?

new Unit()

Думаю лучше принимать в качестве параметра Юнит, и если нужно чтобы были именно проценты, то проверять тип в конструкторе и выбрасывать эксепшен если это не так.

Maxim
Maxim

По тестам наблюдение.

Есть данные из Ами.

SaveValues(folder+"VMA.txt", Sum(V*C,20)/Sum(V,20));


179060,179395,178505,179240,76663,178174.53125000
179245,179995,178855,179695,59589,178212.98437500
180910,181810,180910,181535,45414,178285.53125000
181555,181690,181110,181135,66098,178421.76562500
181135,181935,180935,181860,108430,178829.85937500
181850,182115,181355,181695,88335,179129.93750000
181700,181770,179740,179890,141672,179345.32812500
179885,180240,179560,179615,70581,179444.46875000
179625,179725,178955,179170,100643,179531.73437500
179170,180200,179055,180000,57874,179622.51562500
179965,180590,179620,180365,49886,179658.54687500
180340,180840,179700,179865,67803,179673.57812500
179850,180450,179730,180345,46388,179703.79687500
180340,180600,179960,180450,45855,179827.32812500
180445,180690,180275,180420,30355,179892.65625000
180410,180445,179320,180000,117375,179929.85937500
180015,180030,179180,179530,73419,179948.39062500
179525,180870,179360,179490,121644,179997.76562500
179490,180120,179100,179850,113072,180077.23437500
179840,180030,179300,179735,43616,180148.73437500

Согласно этим данным VMA = 180148.734375 Если посчитать эти же данные в экселе, то VMA = 180148.741408213 Если посчитать в S#, то VMA = 180148.74140821348556317520948

Это что получается? Что ами не надежный источник для тестирования? Какая-то адская погрешность (0.01) для такого несложного индикатора.

esper
esper

Maxim: Согласно этим данным VMA = 180148.734375 Если посчитать эти же данные в экселе, то VMA = 180148.741408213 Если посчитать в S#, то VMA = 180148.74140821348556317520948

Это что получается? Что ами не надежный источник для тестирования? Какая-то адская погрешность (0.01) для такого несложного индикатора. В процентном соотношении это совсем немного, где-то 1e-6

artemox
artemox

esper:

Maxim: Согласно этим данным VMA = 180148.734375 Если посчитать эти же данные в экселе, то VMA = 180148.741408213 Если посчитать в S#, то VMA = 180148.74140821348556317520948

Это что получается? Что ами не надежный источник для тестирования? Какая-то адская погрешность (0.01) для такого несложного индикатора. В процентном соотношении это совсем немного, где-то 1e-6

Вот оно как! Я кстати тоже заметил на стохастике увеличенную погрешность (если ориентироваться на количество знаков после запятой), т.к. было умножение результата на 100.

Получается что проверку нужно делать таким образом : Assert.IsTrue(Math.Max(indicator.Value, item.Value1) / Math.Min(indicator.Value, item.Value1) - 1 < 0.000001m);

Или искать более точный источник (хотя правильность расчетов будет подтверждена и данными из ами)

Maxim
Maxim

Индикаторы Peak и Trough.

Столкнулся с тем, что мое понимание этих индикаторов отличается от того, которое в Ами. Прошу помочь разобраться, какая интерпретация верная.

  1. Описание в Лабе: http://www2.wealth-lab.com/WL5Wiki/Trough.ashx

  2. Первое различие. В описании ясно сказано, что «During these bars the Trough function will not return $20, but will instead return the value of the previous trough.»

    В ами же значение индикатора становится равным $20 раньше. Как будто они уже знают будущее. Пример данных из ами.


191090,191250,191060,191150,7066,187400.00000000
191150,191205,190445,190585,16283,187400.00000000
190575,190960,190450,190935,12038,187400.00000000
190935,191050,190775,190955,9648,187400.00000000
190970,190970,190320,190400,12287,187400.00000000
190400,190470,190150,190220,18255,190220.00000000
190220,190740,190155,190665,12442,190220.00000000
190680,190860,190505,190640,11811,190220.00000000
190640,190850,190425,190800,10218,190220.00000000
190800,191100,190675,191100,10841,190220.00000000

Считаю, что реализация в Ами этого индикатора неверная. Так как их реализация годится только для уже существующих данных, расчет постфактум. Если данные добавляются онлайн динамически, то их индикатор использовать нельзя.

Если остановимся на моем варианте, то данные из ами для тестов не подходят.

Вопрос: какой вариант реализуем в S#?

  1. Второе различие. Второе различие более неопределенное. Так как в описании оно не рассматривается.

    Мое понимаение: график индикатора представляет из себя лестницу вверх(peak), или вниз (trough). Тоесть график показывает глобальный максимум или минимум на всем пройденном интервале.

    Если посмотреть на данные Trough из Ами:


188395,188435,188080,188125,13367,182985.00000000
188130,188140,187650,187750,20700,182985.00000000
187775,187775,187460,187615,20565,182985.00000000
187615,187630,187280,187400,15589,187400.00000000
187415,187740,187275,187610,14105,187400.00000000
187625,187765,187530,187760,7779,187400.00000000
187745,187850,187545,187560,10627,187400.00000000
187550,187715,187380,187605,9178,187400.00000000
187620,187970,187565,187860,8184,187400.00000000

................................................

191090,191250,191060,191150,7066,187400.00000000
191150,191205,190445,190585,16283,187400.00000000
190575,190960,190450,190935,12038,187400.00000000
190935,191050,190775,190955,9648,187400.00000000
190970,190970,190320,190400,12287,187400.00000000
190400,190470,190150,190220,18255,190220.00000000
190220,190740,190155,190665,12442,190220.00000000
190680,190860,190505,190640,11811,190220.00000000
190640,190850,190425,190800,10218,190220.00000000

то график индикатора Trough будет представлять собой ступеньки то вверх, то вниз.
Могу предположить, что они считают локальный минимум, а не глобальный. Тоесть, если после локального минимума был локальный максимум, а после этого опять локальный минимум, то они берут для индикатора значения этих минимумов. Правильно ли я понял? Или они делают по другому?

Вопрос: какой вариант верный и что реалиуем в S#?

artemox
artemox

Maxim: Индикаторы Peak и Trough.

Столкнулся с тем, что мое понимание этих индикаторов отличается от того, которое в Ами.

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)

Судя по всему на данных из ами эти индикаторы лучше не тестировать.

freelancer
freelancer

Maxim: Индикаторы Peak и Trough.

Вопрос: какой вариант реализуем в S#? Михаил, есть ответ на этот вопрос ?

http://stocksharp.com/posts/m/8891/

Mikhail Sukhov
Mikhail Sukhov Autor

freelancer:

Maxim: Индикаторы Peak и Trough.

Вопрос: какой вариант реализуем в S#? Михаил, есть ответ на этот вопрос ?

http://stocksharp.com/posts/m/8891/

Насчет реализации? Предлагаю так, как оно описано в книжках, по формуле.

freelancer
freelancer

Mikhail Sukhov: Предлагаю так, как оно описано в книжках, по формуле. Это хорошо. Меня конкретно интересует: как в Wealth-Lab 5 или нет ?

Maxim
Maxim

Mikhail Sukhov: Насчет реализации? Предлагаю так, как оно описано в книжках, по формуле.

По какой формуле? Какой из вариантов: глобальный или локальный максимум (минимум)?

Mikhail Sukhov
Mikhail Sukhov Autor

Maxim:

Mikhail Sukhov: Насчет реализации? Предлагаю так, как оно описано в книжках, по формуле.

По какой формуле? Какой из вариантов: глобальный или локальный максимум (минимум)?

Я просто разместил объяву. Сам то я ни про какую формулу идет речь, ни как реализован индикатор понятия не имею.

Sergey Masyura
Sergey Masyura

Maxim: Индикаторы Peak и Trough.

Столкнулся с тем, что мое понимание этих индикаторов отличается от того, которое в Ами. Прошу помочь разобраться, какая интерпретация верная.

...

то график индикатора Trough будет представлять собой ступеньки то вверх, то вниз. Могу предположить, что они считают локальный минимум, а не глобальный. Тоесть, если после локального минимума был локальный максимум, а после этого опять локальный минимум, то они берут для индикатора значения этих минимумов. Правильно ли я понял? Или они делают по другому?

Вопрос: какой вариант верный и что реалиуем в S#?

Переделал на ступеньки, заодно пофиксил баг с использованием Unit. Получилось как на рисунке в аттаче.

artemox
artemox

Благодаря 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));

esper
esper

Добавил тест для BollingerBands с использованием Sma, т.к. с использованием Ema не совпадает значение средней ни с Ami, ни с Metastock, данные по Ema выгружал начиная с первой свечки, т.е. зависимости от предыдущих данных быть не должно.Кто делал тест для Ema с использованием файла, можете так же выгрузить данные для BollingerBands? Или оставим тест на базе Sma?

По поводу атрибута Ignore для нерабочих тестов, а нужно ли оно? Когда есть нерабочий тест и он проваливается - видно что необходимо поправить, а если стоит Ignore - создается иллюзия что все работает.

artemox
artemox

esper: Кто делал тест для Ema с использованием файла, можете так же выгрузить данные для BollingerBands? Или оставим тест на базе Sma? Попробую вечером.

artemox
artemox

artemox:

esper: Кто делал тест для Ema с использованием файла, можете так же выгрузить данные для BollingerBands? Или оставим тест на базе Sma? Попробую вечером. Вроде получилось. Стоит ли два теста ББ оставлять ЕМА и SMA?

maze9a
maze9a

Михаил может проще Вам зайти под логином Maxim и разлочить из студии эти файлы?

Mikhail Sukhov
Mikhail Sukhov Autor

maze9a: Михаил может проще Вам зайти под логином Maxim и разлочить из студии эти файлы?

Забыл написать - все разлочили.

artemox
artemox

Михаил, когда Вы зальете SingleValueIndicator и MultiValueIndicator?

Mikhail Sukhov
Mikhail Sukhov Autor

artemox: Михаил, когда Вы зальете SingleValueIndicator и MultiValueIndicator?

Предлагаю Simple переименовать в SingleValueIndicator. А MultiValueIndicator пока не знаю как должен выглядеть.

artemox
artemox

Конечно, я его вообще думал удалить.

MultiValueIndicator возможно как массив значений. А обращение к элементам массива через перечисление, объявленное в каждом классе.

Mikhail Sukhov
Mikhail Sukhov Autor

Те, кто пока не уехал в отпуск, может продолжим? После чистки кода предлагаю еще раз список переделать и понять, что осталось, а что уже сделано.

freelancer
freelancer

Интересует только Peak и Trough

Mikhail Sukhov
Mikhail Sukhov Autor

freelancer: Интересует только Peak и Trough

Вы их делать хотите? Они же уже сделаны.

freelancer
freelancer

Mikhail Sukhov: Они же уже сделаны. Вот ! Я и хочу спросить как они сделаны и работают ? Как в Wealth-Lab или как-то по своему ?

artemox
artemox

freelancer:

Mikhail Sukhov: Они же уже сделаны. Вот ! Я и хочу спросить как они сделаны и работают ? Как в Wealth-Lab или как-то по своему ? Человек который их делал брал за основу описание из WL. Но тестирование по данным WL не провели, поэтому пока не гарантированно.

Maxim
Maxim

artemox:

freelancer:

Mikhail Sukhov: Они же уже сделаны. Вот ! Я и хочу спросить как они сделаны и работают ? Как в Wealth-Lab или как-то по своему ? Человек который их делал брал за основу описание из WL. Но тестирование по данным WL не провели, поэтому пока не гарантированно.

День добрый. Эти индикаторы делал я. Я уже вернулся из отпуска и могу доделать все что нужно по индикаторам, которые я начинал. Что нужно сделать?

freelancer
freelancer

Maxim: Эти индикаторы делал я Здравствуйте. Так Peak и Trough работают как в WL ?

Maxim
Maxim

freelancer:

Maxim: Эти индикаторы делал я Здравствуйте. Так Peak и Trough работают как в WL ?

Да. http://www2.wealth-lab.com/WL5Wiki/Peak.ashx

Совсем забыл. С этими индикаторами был вопрос, который не знаю, закрыли или нет: http://stocksharp.com/posts/m/8891/

Mikhail Sukhov
Mikhail Sukhov Autor

Maxim:

freelancer:

Maxim: Эти индикаторы делал я Здравствуйте. Так Peak и Trough работают как в WL ?

Да. http://www2.wealth-lab.com/WL5Wiki/Peak.ashx

Совсем забыл. С этими индикаторами был вопрос, который не знаю, закрыли или нет: http://stocksharp.com/posts/m/8891/

Я так понимаю об этом как раз и спрашивали.

President
President

просьба дать права моему логину: ktrunin

спасибо.

Sergey Masyura
Sergey Masyura

President: просьба дать права моему логину: ktrunin

спасибо.

готово. welcome 😎

President
President

sergey.masyura:

President: просьба дать права моему логину: ktrunin

спасибо.

готово. welcome 😎 thanks!

freelancer
freelancer

У меня свой индикатор. Он строится по свечам. Но при открытии дня сделок нет, значит и свечей нет. Как быть ?

Sergey Masyura
Sergey Masyura

freelancer: У меня свой индикатор. Он строится по свечам. Но при открытии дня сделок нет, значит и свечей нет. Как быть ?

  • Если это какой-то нестандартный и не формализованный до этого индикатор зачем его добавлять в проект, если никто про него ничего не знает?
  • Есть флаг IsFormed которое показывает сформировано ли значение индиктора.
freelancer
freelancer

Я не про это. Можно ли как то сохранять свечи в базу данных ?

Sergey Masyura
Sergey Masyura

freelancer: Я не про это. Можно ли как то сохранять свечи в базу данных ?

Можно хранить список свечек в самом индикаторе. Зачем нужна бд?

freelancer
freelancer

А если робота на ночь закрыть ? Всё пропало ?

freewayrider
freewayrider

freelancer: А если робота на ночь закрыть ? Всё пропало ? я перед началом работы робота делаю загрузку истории свечей за последние сутки соответственно все индикаторы сразу заполняются значениями

Garic
Garic

С Амиброкером ATR немного расходится.

Для первой свечи Ами считает ATR = H-L поскольку клоуз предыдущего дня не определён. S# же считает TrueRange не определённым. А так как используется WMA - это влияет на всё последуещее.

Если параметры системы привязывать к дневному ATR - сильно заметно.

Евгений
Евгений

Просьба, помогите с выгрузкой данных для тестов.

Нужны по:

Acceleration Alligator AwesomeOscillator Fractals GatorOscillator MarketFacilitationIndex Ichimoku MedianPrice

artemox
artemox

Евгений: Просьба, помогите с выгрузкой данных для тестов.

Нужны по:

Acceleration Alligator AwesomeOscillator Fractals GatorOscillator MarketFacilitationIndex Ichimoku MedianPrice

MarketFacilitationIndex = ( High - Low )/Volume ?

Могу выгрузить. По остальным надо разбираться, но сейчас времени нет :( Если найдете формулы для ами то будет проще

Евгений
Евгений

artemox:

Евгений: Просьба, помогите с выгрузкой данных для тестов.

Нужны по:

Acceleration Alligator AwesomeOscillator Fractals GatorOscillator MarketFacilitationIndex Ichimoku MedianPrice

MarketFacilitationIndex = ( High - Low )/Volume ?

Могу выгрузить. По остальным надо разбираться, но сейчас времени нет :( Если найдете формулы для ами то будет проще

Acceleration - http://ta.mql4.com/ru/indicators/bills/acceleration_deceleration Alligator - http://ta.mql4.com/ru/indicators/bills/alligator AwesomeOscillator - http://ta.mql4.com/ru/indicators/bills/awesome Fractals - http://ta.mql4.com/ru/indicators/bills/fractal GatorOscillator - http://ta.mql4.com/ru/indicators/bills/gator MarketFacilitationIndex - http://ta.mql4.com/indicators/bills/market_facilitation_index Ichimoku - http://www.fxtrader.ru/techanalysis/389-indikator-ishimoku.html

artemox
artemox

Евгений: Acceleration - http://ta.mql4.com/ru/indicators/bills/acceleration_deceleration Alligator - http://ta.mql4.com/ru/indicators/bills/alligator AwesomeOscillator - http://ta.mql4.com/ru/indicators/bills/awesome Fractals - http://ta.mql4.com/ru/indicators/bills/fractal GatorOscillator - http://ta.mql4.com/ru/indicators/bjavascript:__doPostBack('forum$ctl03$PostReply','')ills/gator MarketFacilitationIndex - http://ta.mql4.com/indicators/bills/market_facilitation_index Ichimoku - http://www.fxtrader.ru/techanalysis/389-indikator-ishimoku.html Евгений, это для метатрейдера. Я обещал выгрузить готовые формулы для ами (это файлы с расширением afl)

Евгений
Евгений

artemox:

Евгений: Acceleration - http://ta.mql4.com/ru/indicators/bills/acceleration_deceleration Alligator - http://ta.mql4.com/ru/indicators/bills/alligator AwesomeOscillator - http://ta.mql4.com/ru/indicators/bills/awesome Fractals - http://ta.mql4.com/ru/indicators/bills/fractal GatorOscillator - http://ta.mql4.com/ru/indicators/bjavascript:__doPostBack('forum$ctl03$PostReply','')ills/gator MarketFacilitationIndex - http://ta.mql4.com/indicators/bills/market_facilitation_index Ichimoku - http://www.fxtrader.ru/techanalysis/389-indikator-ishimoku.html Евгений, это для метатрейдера. Я обещал выгрузить готовые формулы для ами (это файлы с расширением afl)

Неверно вас понял, я думал формулы как рассчитываются индикаторы нужны. Так мне поискать исходный код расчета индикаторов для ами? Я просто не знаком с ним.

Mikhail Sukhov
Mikhail Sukhov Autor

Евгений:

artemox: Евгений, это для метатрейдера. Я обещал выгрузить готовые формулы для ами (это файлы с расширением afl)

Неверно вас понял, я думал формулы как рассчитываются индикаторы нужны. Так мне поискать исходный код расчета индикаторов для ами? Я просто не знаком с ним.

А зачем нам формулы? Нам разве не готовые данные нужны, чтобы по ним в юнит тестах сверяться?

Евгений
Евгений

Mikhail Sukhov:

Евгений:

artemox: Евгений, это для метатрейдера. Я обещал выгрузить готовые формулы для ами (это файлы с расширением afl)

Неверно вас понял, я думал формулы как рассчитываются индикаторы нужны. Так мне поискать исходный код расчета индикаторов для ами? Я просто не знаком с ним.

А зачем нам формулы? Нам разве не готовые данные нужны, чтобы по ним в юнит тестах сверяться?

Именно так, нужны данные. Откуда их выгрузить и как?

Mikhail Sukhov
Mikhail Sukhov Autor

Евгений: Именно так, нужны данные. Откуда их выгрузить и как?

Оттуда, откуда до этого выгружали. Откуда из выгружали?

Евгений
Евгений

Mikhail Sukhov:

Евгений: Именно так, нужны данные. Откуда их выгрузить и как?

Оттуда, откуда до этого выгружали. Откуда из выгружали?

Не знаю, поэтому и спрашиваю

Mikhail Sukhov
Mikhail Sukhov Autor

Евгений:

Mikhail Sukhov:

Евгений: Именно так, нужны данные. Откуда их выгрузить и как?

Оттуда, откуда до этого выгружали. Откуда из выгружали?

Не знаю, поэтому и спрашиваю

Тоже не знаю. Вот те на, потеряли незаменимого помощника, кто нам данные поставлял.

esper
esper

Mikhail Sukhov: Тоже не знаю. Вот те на, потеряли незаменимого помощника, кто нам данные поставлял.

Мне кажется, никого мы не потеряли :) Просто данные выгружали из AmiBroker, но этих индикаторов там нет, поэтому чтобы выгрузить данные нужны формулы этих индикаторов для Ami. Можно еще в Metastock-е посмотреть, возможно там есть эти индикаторы.

Mikhail Sukhov
Mikhail Sukhov Autor

esper:

Mikhail Sukhov: Тоже не знаю. Вот те на, потеряли незаменимого помощника, кто нам данные поставлял.

Мне кажется, никого мы не потеряли :) Просто данные выгружали из AmiBroker, но этих индикаторов там нет, поэтому чтобы выгрузить данные нужны формулы этих индикаторов для Ami. Можно еще в Metastock-е посмотреть, возможно там есть эти индикаторы.

Вопрос, а зачем юнит тесты разнесли по разным классам, один как индюк. Мне кажется, что правильнее было бы разделять не по индюкам, а по сценариям тестирование: сценарий по проверочным данным, сценарий нагрузки, сценарий неправильных данных. Лицезреть 100 классов с одним методом не в айс.

Den
Den

Уважаемые авторы!

Заметил что ни в одном индикаторе Indicators\Indicators\Trend*MovingAverage, StandartDeviation, Macd не вызывается событие Changed. Во всех расчетах явно проверяется IsFormed() и нужно только добавить вызов RaiseChangedEvent();

Поправьте, пожалуйста, у кого есть право на запись.

Mikhail Sukhov
Mikhail Sukhov Autor

Den: у кого есть право на запись.

Давайте свой логин на КодеПлекс, дам такое право. Проект общий и опен-сорс, поэтому авторов может быть много.

esper
esper

Den: Уважаемые авторы!

Заметил что ни в одном индикаторе Indicators\Indicators\Trend*MovingAverage, StandartDeviation, Macd не вызывается событие Changed. Во всех расчетах явно проверяется IsFormed() и нужно только добавить вызов RaiseChangedEvent();

Поправьте, пожалуйста, у кого есть право на запись.

Для индикаторов, которые наследуются от SingleValueIndicator<T> и LengthIndicator<T>, вызов события выполняется при установке нового значения индикатора.

Den
Den

esper: Для индикаторов, которые наследуются от SingleValueIndicator<T> и LengthIndicator<T>, вызов события выполняется при установке нового значения индикатора.

Да, все правильно. Поправил только порядок присвоения в Macd: сначала signalValue, потом Value.

Tester
Tester

Проверьте пожайлуста, возможно для SimpleMovingAverage такой код лучше.

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

            if (!IsFormed)
                return;
		    
            Value = Buffer.Sum() / Length;
		    Buffer.RemoveAt(0);
}
Den
Den

Tester: Проверьте пожайлуста, возможно для SimpleMovingAverage такой код лучше.

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

        if (!IsFormed)
            return;
	    
        Value = Buffer.Sum() / Length;
	    Buffer.RemoveAt(0);

}

Это неверный код, т.к. при удалении первого элемента буффера, нужно также вычитать из Value его вклад.
Mikhail Sukhov
Mikhail Sukhov Autor

Den: Это неверный код, т.к. при удалении первого элемента буффера, нужно также вычитать из Value его вклад.

Плюс еще Sum каждый раз будет весь массив пробегать.

artemox
artemox

Данные может выгрузить любой, формула выгрузки на форуме есть. Основная проблема найти правльную формулу, т.к. таких встроенных индикаторов нет.

По поводу юнит тестов - так исторически сложилось. Ведь изначально каждый писал "ручной" юнит тест под свой индикатор. А потом все универсализировалось. Конечно сейчас все файловые тесты проще в одном классе разместить

Mikhail Sukhov
Mikhail Sukhov Autor

artemox: Данные может выгрузить любой, формула выгрузки на форуме есть. Основная проблема найти правльную формулу, т.к. таких встроенных индикаторов нет.

Хех, мы уже опередили попсовые программы.😎

artemox: По поводу юнит тестов - так исторически сложилось. Ведь изначально каждый писал "ручной" юнит тест под свой индикатор. А потом все универсализировалось. Конечно сейчас все файловые тесты проще в одном классе разместить

Поможете их в один файл перенести + поправить на использование TestRunner?

artemox
artemox

Mikhail Sukhov: Поможете их в один файл перенести + поправить на использование TestRunner? Те тесты, которые с файлами работают, перенесу в один юнит без проблем. А с индивидуальными тестами придется повозиться...

Mikhail Sukhov
Mikhail Sukhov Autor

artemox:

Mikhail Sukhov: Поможете их в один файл перенести + поправить на использование TestRunner? Те тесты, которые с файлами работают, перенесу в один юнит без проблем. А с индивидуальными тестами придется повозиться...

Переделали, и не отписались. Я только сейчас увидел изменения. С Unit неправильно идет работа. Unit - это величина (абсолютная или в процентах). Поэтому использовать Unit.Value не совсем корректно. Нужно работать именно с самим объектом Unit будто это обычное число.

JackSparrow
JackSparrow

Давайте я тоже что нибудь напишу. Предлагаю Optimal Tracking и LaGuerra

Mikhail Sukhov
Mikhail Sukhov Autor

JackSparrow: Давайте я тоже что нибудь напишу. Предлагаю Optimal Tracking и LaGuerra

Логин на кодеплексе какой?

JackSparrow
JackSparrow

NonPeriodic

Mikhail Sukhov
Mikhail Sukhov Autor

JackSparrow: NonPeriodic

Доступ дал.

artemox
artemox

Что то много проваленых тестов. Часть тестов без файлов с тестовыми данными.

Вся регрессия сломалась, вроде работала раньше?

Mikhail Sukhov
Mikhail Sukhov Autor

artemox: Что то много проваленых тестов. Часть тестов без файлов с тестовыми данными.

Вся регрессия сломалась, вроде работала раньше?

Тут нужно с каждый тестом отдельно разбираться. Может и я что нахимичил.

artemox
artemox

Возможно это я накосячил, у меня не компилировалось без ".Value", пока не обновил библиотеку. А потом видимо забыл почистить Сейчас поудалял индивидуальные юнит тесты для всех валидных тестов.

Не хватает файлов для тестов: Acceleration, Alligator, Fractals, GatorOscillator, Ichimoku, MedianPrice, Macd, MedianPrice

Просьба авторам уточнить - файлы не залиты не сервер или их не было?

esper
esper

artemox: Не хватает файлов для тестов: Acceleration, Alligator, Fractals, GatorOscillator, Ichimoku, MedianPrice, Macd, MedianPrice

Просьба авторам уточнить - файлы не залиты не сервер или их не было?

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

Еще возник вопрос по Trough и Peak, для них сейчас тесты не проходят, они раньше работали?

artemox
artemox

esper: Для MACD файл не заливал, т.к. не получалось выгрузить данные, чтобы совпал EMA. Если ручками поправить первое расчетное значение не проходит тест?

esper: Еще возник вопрос по Trough и Peak, для них сейчас тесты не проходят, они раньше работали? Вроде нет http://stocksharp.com/posts/m/8891/

Евгений
Евгений

artemox: Возможно это я накосячил, у меня не компилировалось без ".Value", пока не обновил библиотеку. А потом видимо забыл почистить Сейчас поудалял индивидуальные юнит тесты для всех валидных тестов.

Не хватает файлов для тестов: Acceleration, Alligator, Fractals, GatorOscillator, Ichimoku, MedianPrice, Macd, MedianPrice

Просьба авторам уточнить - файлы не залиты не сервер или их не было?

Файлов не было. В ближайшее время постараюсь залить. Сформировал из Квика пока только для AwesomeOscillator, по остальным по той же схеме попробую

artemox
artemox

Пришлось отредактировать файл ExponentialMovingAverage.txt руками, что отразил в коменте внутри файла: #artemox, Первое расчетное значение "90007.75" венесено руками, т.к. AmiBriker для EMA дает расчетное значение на одну свечу позже чем S#

Такая же история будет вылазить во всех индюках, использующих EMA, например Volatility, который пришлось аналогично подправить.

freelancer
freelancer

А что за компонент используете для отрисовки ?

esper
esper

freelancer: А что за компонент используете для отрисовки ? Это стандартный Microsoft Chart Control

worldexplorer
worldexplorer

очень хочу присоединиться. пожалуйста добавьте пользователя codeplex worldexplorer (меня), и скажите какие индикаторы остались не разобранными? хочу кружку за пять индикаторов!! и авось втянусь в S#, хочу цепляться к квику, возможно из wealth-lab 5... это будет один из моих "трёх вопросов которые я могу задать", а может вопрос уже и отпадёт по мере написания индикатора :)) жду!!! :)

Sergey Masyura
Sergey Masyura

worldexplorer: очень хочу присоединиться. пожалуйста добавьте пользователя codeplex worldexplorer (меня), и скажите какие индикаторы остались не разобранными? хочу кружку за пять индикаторов!! и авось втянусь в S#, хочу цепляться к квику, возможно из wealth-lab 5... это будет один из моих "трёх вопросов которые я могу задать", а может вопрос уже и отпадёт по мере написания индикатора :)) жду!!! :)

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

PS: Конкурс с кружками уже закончен :) Любой вклад в проект не останется незамеченным с нашей стороны.

Mikhail Sukhov
Mikhail Sukhov Autor

worldexplorer: очень хочу присоединиться. пожалуйста добавьте пользователя codeplex worldexplorer (меня), и скажите какие индикаторы остались не разобранными? хочу кружку за пять индикаторов!! и авось втянусь в S#, хочу цепляться к квику, возможно из wealth-lab 5... это будет один из моих "трёх вопросов которые я могу задать", а может вопрос уже и отпадёт по мере написания индикатора :)) жду!!! :)

Нет кружки - нечем черпать желание.😂

Провел рефакторинг по индюкам. Преследуемые цели и фичи:

  1. Сделать единого наследника.
  2. Выделить комплексные индикаторы.
  3. Сделать универсальный объект Значение (который бы работал как с decimal, так и со свечкой).
  4. Более простое использование IndicatorManager.

Возможно что-то поломал (вернее, скорее всего). Просьба к авторам проверить на предмет работоспособности.

danl
danl

Mikhail Sukhov: Провел рефакторинг по индюкам. Преследуемые цели и фичи:

  1. Сделать единого наследника.
  2. Выделить комплексные индикаторы.
  3. Сделать универсальный объект Значение (который бы работал как с decimal, так и со свечкой).
  4. Более простое использование IndicatorManager.

Возможно что-то поломал (вернее, скорее всего). Просьба к авторам проверить на предмет работоспособности.

Добрый день.

Михаил, посмотрел последние изменения в индикаторах. Есть несколько мыслей по развитию.

Существенный момент в том, что источник данных для индикаторов BaseCandleManagerSource подписывается на событие менеджера формирования всех свечей. Таким образом, в каждый индикатор будут попадать данные всех свечей, то есть от всех инструментов, и всех тайм фрэймов (если TimeFrameCanles). Так как сами индикаторы ни на различение инструментов, ни параметров свечей не рассчитаны, то данные которые они вычисляют, не будут иметь смысла. Либо придется создавать по отдельному CandleManager для каждого инструмента и каждого типа свечей и отдавать соответствующий Manager в источник, что не удобно. В связи с этим предлагаю немного развить концепцию IndicatorManager’а, сделать его чем-то похожим на CandleManager. А именно:

  1. Сделать класс CandleTokenIndocatorSource, который будет передавать в индикатор только события пришедшие по определенному CandleToken, так же добавить метод InitIndicator, который будет прогонять исторические свечи имеющиеся в CandleManager через индикатор.
  2. Сделать класс IndicatorToken, который будет хранить индикатор и источник, который ассоциирован с ним, переопределить ему процедуру сравнения так, что бы равными считались токены не с полностью одинаковым состоянием, а те которые содержат одинакоые индикаторы и источники (текущее значение индикатора не сравнивается).
  3. Переработать IndicatorManager, так что бы он позволял регистрировать индикаторы в связке с источниками, возвращая при этом IndicatorToken.
  4. При регистрации нового индикатора, не добавлять его, а возвращать существующй, если такой индикатор, с таким источником, уже имеется. Реализовать подсчет количество вызовов регистраци индикатора, что бы прекращать рассчет индикатора, после того, как все кому он был необходим от него отказались.
  5. Что бы все это корректно работало, в каждом индикаторе потребуется реализовать метод, который проверяет равенство индикаторов не по полному текущему состоянию, а только по параметрам влияющим на рассчет.

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

Михаил, посмотри, пожалуйста, на предлагаемую концепцию IndicatorManager, если ты согласуешь такой подход, то я бы взялся за его реализацию (в любом случае, для себя буду что-то подобное делать, считаю, что и для остальных это может быть полезно).

Маленькое замечаени. В классе LengthIndicator создан буфер типа List<TResult>. В наследниках, обычно, происходит удаление первого элементо буфера, каждый раз, когда приходит новое значение для рассчета. Мне кажется, что в данном случае имеет смысл использовать какую-нибудь другую коллекцию, которая обеспечивает константное время удаления первого элемента, а не копирует все последующие элементы при каждой такой операции. На сколько я понимаю в StockSharp есть ряд своих разработанных коллекций, к сожалению документацию к ним я не нашел, поэтому на что корректно заменить List не знаю. Из сторонних могу привести пример Wintellect.PowerCollections.Deque (видил PowerCollections.dll в папке References, видимо где-то в StockSharp эти коллекции уже используются).

Прошу добавить меня к проекту разработкаи индикаторов, логин на codeplex: danl8

Mikhail Sukhov
Mikhail Sukhov Autor

Добавил в группу.

По IndicatorManager абсолютно верное замечания. Я забыл поправить этот момент. Буду очень рад, если поможете.

По коллекции тоже правы, но я думаю имеет смысл прогнать построение индикаторов комплексно и посмотреть все узкие места. Кто касается типа коллекции, то думаю очередь не очень удачное решение, так как там работа только с одним концом. Лучше наверное LinkedList.

danl
danl

Выложил изменения по IndicatorManager, с реализацией того, о чем писал раньше. Сегодя-завтра вечером еще потестирую, поправлю баги.

Михаил, метод IIndicatorContainer.GetValues в Вашей реализации возвращает обеъкт Dictionary, хотел узнать почему именно Dictionary? Боюсь с этим могут быть проблемы, так как в Dictionary нельзя добавить 2 одинаковых ключа, если строить индикатор от чего-нибудь вроде decimal, то при вызове данного метода будет exception. Может пока не поздно поменять на IList<RefPair>?

Mikhail Sukhov: очередь не очень удачное решение, так как там работа только с одним концом. Лучше наверное LinkedList. Почему его привел в пример, потому что там очередь реализована как круговой буфер, то есть добавление, как и удаление, элементов в начале и в конце это просто изменение начального или конечного индекса на 1, в остальном то же что и стандартный List<> (то есть доступ к произвольному элементу по индексу быстрый: O(1)). Можно и LinkedList, но у него доступ к произвольпому элементу меделенный.

Mikhail Sukhov
Mikhail Sukhov Autor

danl: Михаил, метод IIndicatorContainer.GetValues в Вашей реализации возвращает обеъкт Dictionary, хотел узнать почему именно Dictionary? Боюсь с этим могут быть проблемы, так как в Dictionary нельзя добавить 2 одинаковых ключа, если строить индикатор от чего-нибудь вроде decimal, то при вызове данного метода будет exception. Может пока не поздно поменять на IList?

Поэтому и существует такая вещь как IIndicatorValue, которая разруливает проблему с одинаковым входным значением. Неправильно ассоциировать с одним входящим значением несколько исходящих. Они (входящие) могут быть совершенно из разного диапазона времени.

Другой вопрос, нужен ли именно словарь для последующей работы. Возможно, доступ по ключу тут как раз бесполезен. Тогда да, лучше IEnumerable (лист предполагает динамическое добавление, лучше следовать LINQ традициям).

danl: Почему его привел в пример, потому что там очередь реализована как круговой буфер, то есть добавление, как и удаление, элементов в начале и в конце это просто изменение начального или конечного индекса на 1, в остальном то же что и стандартный List<> (то есть доступ к произвольному элементу по индексу быстрый: O(1)). Можно и LinkedList, но у него доступ к произвольпому элементу меделенный.

Очередь вроде вообще не дает по индексу. Может создать свою уникальную коллекцию для организации автоматического удаления хвостовых значений?

По коммиту ряд замечания.

  1. Ставьте знаки препинания и точки в конце предложения.
  2. Прописывайте все пункты в xml комментариях (некоторые ноды пустые).
  3. this._privateField лучше заменять на _privateField
  4. Устраняйте предупреждения через R#.

RefPair<IndicatorToken, int> inDict; if (_indicatorUsages.TryGetValue(indicatorToken, out inDict))

Заменяется на:
```csharp
var inDict = _indicatorUsages.TryGetValue(indicatorToken);
				if (inDict != null)
  1. IIndicator.IndicatorEquals выглядит лишним.

В отличии от стандартного Equals не проверяет полное состояние индикатора Вот как стандартное проверяет просто ссылочную эквивалентность. Лучше IIndicator отнаследовать от IEquatable, а класс BaseIndicator от Equatable.

  1. Если в xml комментарии написано с разделами, то можно использовать ноду para.
  2. Рефакторинг решил одну проблему, но добавил другую (как всегда😀). Не нравится тот момент, что теперь прикладной код само должен выбирать, по какому источнику строить индикатор. А такую работу предполагалось нагрузить на IndicatorManager. Тоесть, он должен решать, откуда и куда передавать данные (предотвращать дублирование, склеивать при пробелах и т.д.). Мне кажется, тут лучше сделать как сделано в последней версии CandleManager, который оперирует с коллекцией источников ICandleSource. Соответственно, при регистрации индикатора мне кажется имеет смысл передавать туда object. Object будет или CandleToken, или MarketDepth (или Security). А уж IndicatorManager будет дальше смотреть, откуда по запрашиваемым признакам брать данные (из какого IIndicatorSource).
esper
esper

Mikhail Sukhov: 3) this._privateField лучше заменять на _privateField так решарпер при рефакторинге this сам добавляет, возможно это в настройках где-то задается

Mikhail Sukhov
Mikhail Sukhov Autor

esper:

Mikhail Sukhov: 3) this._privateField лучше заменять на _privateField так решарпер при рефакторинге this сам добавляет, возможно это в настройках где-то задается

Да, это в настройках.

danl
danl

Mikhail Sukhov: Другой вопрос, нужен ли именно словарь для последующей работы. Возможно, доступ по ключу тут как раз бесполезен. Тогда да, лучше IEnumerable (лист предполагает динамическое добавление, лучше следовать LINQ традициям). На мой взгляд IEnumerable првильнее.

Mikhail Sukhov: Очередь вроде вообще не дает по индексу. Может создать свою уникальную коллекцию для организации автоматического удаления хвостовых значений? Честно говорю Deque реализует интерфейс IList<> и поддерживает доступ по индексу 🙂 А что, кстати, за коллекция Ecng.Collections.FixedSynchronizedList, она, случайно, не подойдет?

Mikhail Sukhov: По коммиту ряд замечания. ... Ок. Замечания 1-7 поправлю, в следующий раз буду внимательнее.

Mikhail Sukhov: 8) Рефакторинг решил одну проблему, но добавил другую (как всегдаBigGrin). Не нравится тот момент, что теперь прикладной код само должен выбирать, по какому источнику строить индикатор. А такую работу предполагалось нагрузить на IndicatorManager. Тоесть, он должен решать, откуда и куда передавать данные (предотвращать дублирование, склеивать при пробелах и т.д.). Мне кажется, тут лучше сделать как сделано в последней версии CandleManager, который оперирует с коллекцией источников ICandleSource. Соответственно, при регистрации индикатора мне кажется имеет смысл передавать туда object. Object будет или CandleToken, или MarketDepth (или Security). А уж IndicatorManager будет дальше смотреть, откуда по запрашиваемым признакам брать данные (из какого IIndicatorSource).

Да, вопрос интересный. Мысль о том, что нужно разнести регистрацию источников данных и самих индикаторов была, но имеет это смысл или нет, пока не осознал... Если есть понимание того, что это нужно, давайте делать.

Если я провильно понял идею, то даем возможность пользователю регистрировать источники. Коллекцию источников в IndicatorManager я уже добавлял, просто делаем к ней public методы доступа. В методе регистрации индикатора просто добавляем поиск зарегистрированного источника по аргументу (методы для сравнения object'a и источников выносим в IndicatorSource, что бы все было расширяемо). И, собственно, всё. Клиентский код будет выглядить примерно так:

var candleToken = candleManager.RegisterTimeFrameCandles(security, timeFrame);
indicatorManager.RegisterSource(new CandleTokenIndicatorSource(candleToken));
...

var indicatorToken = indicatorManager.RegisterIndicator(new SimpleMovingAverage { Length = 80 }, candleToken);

Я правильно понял? Делать так?

danl
danl

Mikhail Sukhov: Лучше IIndicator отнаследовать от IEquatable, а класс BaseIndicator от Equatable. Сейчас посмотрел класс Equatable<T>, он, помимо всего прочего, реализует интерфейс IClonable, который потом придется тащить через всех наследников. Он нам точно нужен в BaseIndicator? Пока оставляю его с NotImplementedException, если что, потом поправим.

Mikhail Sukhov
Mikhail Sukhov Autor

danl: Сейчас посмотрел класс Equatable, он, помимо всего прочего, реализует интерфейс IClonable, который потом придется тащить через всех наследников. Он нам точно нужен в BaseIndicator?

Еще как. Клон - это такой метод, который лучше иметь, чем не иметь. Вот например сейчас делаю редактирование индюков в проп Гриде. Приходится править на живом. Соответственно, Undo операция невозможно.

Mikhail Sukhov
Mikhail Sukhov Autor

danl: Да, вопрос интересный. Мысль о том, что нужно разнести регистрацию источников данных и самих индикаторов была, но имеет это смысл или нет, пока не осознал... Если есть понимание того, что это нужно, давайте делать.

Если я провильно понял идею, то даем возможность пользователю регистрировать источники. Коллекцию источников в IndicatorManager я уже добавлял, просто делаем к ней public методы доступа. В методе регистрации индикатора просто добавляем поиск зарегистрированного источника по аргументу (методы для сравнения object'a и источников выносим в IndicatorSource, что бы все было расширяемо). И, собственно, всё. Клиентский код будет выглядить примерно так:

var candleToken = candleManager.RegisterTimeFrameCandles(security, timeFrame); indicatorManager.RegisterSource(new CandleTokenIndicatorSource(candleToken)); ...

var indicatorToken = indicatorManager.RegisterIndicator(new SimpleMovingAverage , candleToken);

> Я правильно понял? Делать так?

Уже явно лучше, что при формировании индюка не нужно указывать источник и следовательно их хранить (сейчас я храню в словаре). Но надо еще помозговать над этой темой. Метод IIndicator.IsSupport был создан для проверки, поддерживает ли данные индикатор передаваемое значение. Если делать привязку индюк-источник, то такой метод отпадает сам собой. Но при регистрации я думаю нужно проверить, а есть ли вообще источники для регистрируемого индюка.
danl
danl

Mikhail Sukhov: Уже явно лучше, что при формировании индюка не нужно указывать источник и следовательно их хранить (сейчас я храню в словаре). Но надо еще помозговать над этой темой. Метод IIndicator.IsSupport был создан для проверки, поддерживает ли данные индикатор передаваемое значение. Если делать привязку индюк-источник, то такой метод отпадает сам собой. Но при регистрации я думаю нужно проверить, а есть ли вообще источники для регистрируемого индюка. При регистрации проверять наличие источника это само сабой. В принципе, можно, сделать фабрику источников и научить IndicatorManager создавать источники самому, например по CandleToken источник создается однозначно, вся необходимоя информация есть. При этом ручная регистрация источников все равно остается, для экзотических случаев.

Если до вечера новых идей не будет, то пока сделаю так, потом посмотрим на готовый код, может поправим.

Mikhail Sukhov: Еще как. Клон - это такой метод, который лучше иметь, чем не иметь. Вот например сейчас делаю редактирование индюков в проп Гриде. Приходится править на живом. Соответственно, Undo операция невозможно. Ок, делаем клонирование.

danl
danl

Mikhail Sukhov: Соответственно, при регистрации индикатора мне кажется имеет смысл передавать туда object. Object будет или CandleToken, или MarketDepth (или Security).

Начал я реализовывать это дело и понял, что не клеется. Дело в том, что одного объекта не достаточно для однозначной идентификации источника. Так как очень много индикаторов строится не на свечах, а просто на числовом ряде, то нужно из свечей уметь делать числа. По текущей концепции эта задача ложится на BaseCandleIndicatorSource, от которого унаследован CandleTokenIndicatorSource. Таким образом, получаем, что клиентский код должен сообщить менеджеру 3 параметра: индикатор, токен свечи, функцию преобразования. Если же индикатор строится целиком на свече, то 2 параметра. Может есть случаи, когда нужно и больше параметров для однозначной идентификации источника. Получается передавать object не достаточно. Вижу следующие варианты решения: Вариант 1. Передавать не object, а массив object[]. Все остальное как и было. Единственный минус - коряво это как-то. Из сигнатуры метода не ясно как им пользоваться, проверка корректности только во время выполнения, нужно знать как заполнять этот массив для каждого типа индикаторов. Пытались упростить использование менеджера, а получилась совершенно не прозрачная структура. Вариант 2. Ввести новую абстракцию IIndicatorSourceIdentifier, сделать несколько реализаций для свечей, частей свечей и т.д. По сути, для каждого источника своя реализация IIndicatorSourceIdentifier. Клиентский код будет создавать соответствующий класс, заполнять параметрами и вперед. Вариант 3. Помыслив над вторым вариантом не увидил большой разницы с тем что уже есть. Клиентский код передает IIndicatorSource. Если посмотреть на вариант 2, то абстракция IIndicatorSourceIdentifier служит только для одной функции: идентифицировать источник, для создания этого идентификатора нужны те же параметры, что и для самого источника. Соответственно, если аккуратно переопределить Equals у источников, то клиентский код останется одинаковым. Отсюда вопрос стоит ли плодить новые сущности в данном случае? Хочу еще заметить, что для 3его варианта не нужно хранить список источников в клиентском коде. Можно просто при регистрации индикатора создавать новый источник, IndicatorManager сам найдет соответсвующий ему источник в своей коллекции и будет использовать его. Предварительная регистрация источников не нужна как в том так и в другом случае.

Для этих вариантов клиентский код будет выглядеть примерно так (на мой взгляд это где-то в инициализации стратегии): Вариант 1.

var candleToken = candleManager.RegisterTimeFrameCandles(security, timeFrame);
var indicatorToken = indicatorManager.RegisterIndicator(new SimpleMovingAverage { Length = 80 },
                     new object[] {candleToken, BaseCandleIndicatorSource.ByOpen});

Вариант 2.

var candleToken = candleManager.RegisterTimeFrameCandles(security, timeFrame);
var indicatorToken = indicatorManager.RegisterIndicator(new SimpleMovingAverage { Length = 80 },
                     new CandleTokenSourceIdentifier (candleToken, BaseCandleIndicatorSource.ByOpen));

Вариант 3.

var candleToken = candleManager.RegisterTimeFrameCandles(security, timeFrame);
var indicatorToken = indicatorManager.RegisterIndicator(new SimpleMovingAverage { Length = 80 },
                     new CandleTokenIndicatorSource (candleToken, BaseCandleIndicatorSource.ByOpen));

Вариант 1 мне не нравится. Варианты 2 и 3 считаю приемлемыми, пока наиболее склоняюсь к варианту 3, так как сущность IIndicatorSourceIdentifier не несет большой нагрузки и вполне может быть объеденина с сущностью IIndicatorSource.

Оставляем 3й варианта, может есть новые идеи?

Mikhail Sukhov
Mikhail Sukhov Autor

danl: Вариант 1 мне не нравится. Варианты 2 и 3 считаю приемлемыми, пока наиболее склоняюсь к варианту 3, так как сущность IIndicatorSourceIdentifier не несет большой нагрузки и вполне может быть объеденина с сущностью IIndicatorSource.

Оставляем 3й варианта, может есть новые идеи?

Какова вероятность, что трейдер будет использовать для один индикаторов цену закрытия, а для других открытия? Я думаю для индюков выбираю что-то одно. Для пункта 3 придется регистрировать каждый раз новые источник для каждого индюка. Но этот пункт мне тоже больше других нравится.

Mikhail Sukhov
Mikhail Sukhov Autor

Залил небольшие изменения. Если будут вопросы, можно обсудить.

danl
danl

Mikhail Sukhov: Залил небольшие изменения. Если будут вопросы, можно обсудить.

Изменения видел, все понятно, у меня возражений нет 🙂. Так же сделал ряд изменений. Добавил Equals в источники индикаторов, теперь при регистрации одного источника несколько раз отрабатывает корректно, берет уже зарегистрированный, новый не регистрирует. Добавил тесты для класса IndicatorManager (конечно, не 100% покрытие, но основные ситуации рассмотрел). Удалось отловить ряд багов, теперь вроде даже работает 🙂.

Daenur
Daenur

Прошу добавить в группу Daenur Попробую сваять JMA

Mikhail Sukhov
Mikhail Sukhov Autor

Daenur: Прошу добавить в группу Daenur Попробую сваять JMA

Сделал. Большая просьба. Перед добавлением посмотрите, как делаются другие индикаторы. Есть свои нюансы.

Daenur
Daenur

Спасибо. Обязательно!

esper
esper

Хотелось бы обсудить несколько вопросов относительно IIndicatorValue.

  1. Возможно стоит добавить свойство IsEmpty для значений индикаторов. Есть индикаторы, в которых не для каждого входного значения есть выходное, к тому же для индикаторов, которые еще не сформированы, сейчас выставляется значение по умолчанию равное default(T), что тоже неправильно.

  2. Сейчас событие Changed у индюка вызывается при каждом добавлении значения в индикатор, даже если значение индикатора не меняется, правильнее вызывать его только при изменении значения. Предлагаю для IIndicatorValue реализовать IEquitable.

  3. У комплексного значения индикатора не ясно какое значение что представляет. Так же комплексное значение может хранить несколько значений индикаторов, типы которых могут совпадать, не ясно как получить нужное нам значение. Для тестов это особой роли не играет, а вот при выводе индикаторов на график необходимо делать подписи для серий, или при возникновении события Changed как-то определять какое значение нам необходимо.

  4. Сейчас могут строится цепочки индикаторов, когда один индикатор возвращает комплексное значение и оно передается на вход другому, то не понятно как оттуда достать нужное значение.

По пунктам 3 и 4 как изначально предполагалось действовать в таких ситуациях?

Mikhail Sukhov
Mikhail Sukhov Autor
  1. А как этот индикатор будет отображаться графически? Будет разрыв в линии? Можно пример индюка.
  2. Не согласен. Если индюк на следующей свечке приобрел тоже значение, что и на предыдущей (например, индикатор объема), то он должен сообщать о том, что он изменился. Потому что он приобрел новое состояние.
  3. Посмотри в студии класс CandleChartIndicatorCollection.
  4. Комплексный индюк может быть последовательным, а может быть и параллельным (частое значение). Я в аллигаторе и Ишимоку проделал такое, можно посмотреть как сделано.
esper
esper

Mikhail Sukhov:

  1. А как этот индикатор будет отображаться графически? Будет разрыв в линии? Можно пример индюка. Как сказали выше, это фрактал, который рисуется только точками в соответствующих вершинах. Сюда можно отнести зигзаг, который рисуется ломаными линиями, где известны только вершины, а не промежуточные значения. Сейчас возвращается предыдущее сформированное значение индикатора с соответствующим смещением, но это не совсем корректно.

Mikhail Sukhov: 2. Не согласен. Если индюк на следующей свечке приобрел тоже значение, что и на предыдущей (например, индикатор объема), то он должен сообщать о том, что он изменился. Потому что он приобрел новое состояние. Да, видимо для некоторых индюков это имеет смысл. Т.к. это связано с первым пунктом, то "пустое значение" решит эту проблему.

Mikhail Sukhov: 4. Комплексный индюк может быть последовательным, а может быть и параллельным (частое значение). Я в аллигаторе и Ишимоку проделал такое, можно посмотреть как сделано. С параллельными пока проблем не было, несколько таких индикаторов поправил и они нормально проходят тесты. Ишимоку и аллигатором тесты не проходят, почему пока не разобрался. Но вот с ADX возникла сложность, он строится на базе WilderMovingAverage, который должен быть построен на базе Dx, при этом Dx тоже возвращает комплексное значение, а WilderMovingAverage на входе требуется только одно decimal значение, какое из 3-х значений возвращаемых Dx взять не понятно. Тип у этих 3-х значений тоже может совпадать. Если честно, я бы просто упростил этот индикатор, чтобы он возвращал только свое значение. Действительно ли надо чтобы Dx выдавал еще DiPlus и DiMinus, на базе которых он считается?

Mikhail Sukhov
Mikhail Sukhov Autor

esper: С параллельными пока проблем не было, несколько таких индикаторов поправил и они нормально проходят тесты. Ишимоку и аллигатором тесты не проходят, почему пока не разобрался. Но вот с ADX возникла сложность, он строится на базе WilderMovingAverage, который должен быть построен на базе Dx, при этом Dx тоже возвращает комплексное значение, а WilderMovingAverage на входе требуется только одно decimal значение, какое из 3-х значений возвращаемых Dx взять не понятно. Тип у этих 3-х значений тоже может совпадать. Если честно, я бы просто упростил этот индикатор, чтобы он возвращал только свое значение. Действительно ли надо чтобы Dx выдавал еще DiPlus и DiMinus, на базе которых он считается?

ADX - это три значения в моменте. Это сложный индикатор.

Supervisor
Supervisor
  1. Фракталы например
Mikhail Sukhov
esper
esper

Посмотрел CandleChartIndicatorCollection, сейчас не обрабатывается ситуация когда вложенный индикатор так же сложный, собственно про это я и говорю.

Mikhail Sukhov
Mikhail Sukhov Autor

esper: Посмотрел CandleChartIndicatorCollection, сейчас не обрабатывается ситуация когда вложенный индикатор так же сложный, собственно про это я и говорю.

Понял, спасибо... Ну да, надо это сделать.

Daenur
Daenur

Написал JMA. По-сути, за основу взял SMA и в функцию расчета перенес код индикатора на C#, найденный на просторах интернета. Поскольку официальной версии от Юрика у меня нет, то и сравнивать его результаты не с чем. Работает, результаты меня устраивают. Как правильно его выложить?

Mikhail Sukhov
Mikhail Sukhov Autor

Daenur: Написал JMA. По-сути, за основу взял SMA и в функцию расчета перенес код индикатора на C#, найденный на просторах интернета. Поскольку официальной версии от Юрика у меня нет, то и сравнивать его результаты не с чем. Работает, результаты меня устраивают. Как правильно его выложить?

Через CodePlex. Логин уже есть?

Daenur
Daenur

Да, есть, Daenur. Использую TortoiseSVN, с ее помощью залил себе весь проект. Могу обратно выкладывать файл с индикатором?

Mikhail Sukhov
Mikhail Sukhov Autor

Daenur: Да, есть, Daenur. Использую TortoiseSVN, с ее помощью залил себе весь проект. Могу обратно выкладывать файл с индикатором?

Я не знаю как работать с SVN. Я работаю через TFS.

Daenur
Daenur

Подключился через VS2010, выложил JurikMovingAverage в папку Trend. В проект не добавлял, т.к. мой проект несколько отличается от того, что есть на сервере, не хочется портить общую работу. Добавьте этот файл в общий проект.

Mikhail Sukhov
Mikhail Sukhov Autor

Daenur: Подключился через VS2010, выложил JurikMovingAverage в папку Trend. В проект не добавлял, т.к. мой проект несколько отличается от того, что есть на сервере, не хочется портить общую работу. Добавьте этот файл в общий проект.

Один вопрос, а почему такой код страшный?🙄 Можете дать ссылку на описание алго?

Daenur
Daenur

Страшный - в смысле непонятных расчетов? Просто не имеется в открытом доступе его кода, Jurik продает его в виде DLL. То, что есть в интернете - результат дизассемблирования.

Mikhail Sukhov
Mikhail Sukhov Autor

Daenur: Страшный - в смысле непонятных расчетов? Просто не имеется в открытом доступе его кода, Jurik продает его в виде DLL. То, что есть в интернете - результат дизассемблирования.

Я так и подумал. А разве это не нарушение прав?

Daenur
Daenur

А в чем? Дизассемблированием уж точно не я занимался. А какой угодно код никто писать не запрещает. Ради интереса посмотрел сайт Юрика - никаких слов о запатентованности алгоритма и т.п. не увидел.

JackSparrow
JackSparrow

Daenur: А в чем? Дизассемблированием уж точно не я занимался. А какой угодно код никто писать не запрещает. Ради интереса посмотрел сайт Юрика - никаких слов о запатентованности алгоритма и т.п. не увидел. Думаю что название отличное от обсуждаемого решает вопрос с авторскими правами, т.к. формально есть "имя" продукта.

Mikhail Sukhov
Mikhail Sukhov Autor

JackSparrow: Думаю что название отличное от обсуждаемого решает вопрос с авторскими правами, т.к. формально есть "имя" продукта.

Название у чего? У класса индикатор? Его можно как угодно назвать - это право автора кода, Даэнура.

DT
DT

Насколько знаю, Jurik не является автором алгоритма. У меня где-то был исходник алгоритма на EasyLanguage ( ~Паскаль). Автор - какой-то португалец.

Mikhail Sukhov
Mikhail Sukhov Autor

DT: Насколько знаю, Jurik не является автором алгоритма. У меня где-то был исходник алгоритма на EasyLanguage ( ~Паскаль). Автор - какой-то португалец.

А Юрик указывал источник? Если нет, то получается он плагиатор.

DT
DT

Вряд ли - у них так не принято. Может, купил, как Билл Гейтс MS DOS. Может, усовершенствовал - в исходнике не было параметра - сдвига по фазе.

danl
danl

Для информации. Вчера вечером сделал коммит с небольшим исправлением: индикаторам из папки Williams добавил корректное переопределение методов Equatable<IIndicator>.

Mikhail Sukhov
Dmitriy Klimov
Dmitriy Klimov

Всем добрый день.

Есть ли рекомендации по типу, возвращаемому индикатором? У индикатора AverageTrueRange смутило вот что:

public override IIndicatorValue OnProcess(IIndicatorValue input)
{
	return MovingAverage.Process(TrueRange.Process(input));
}

Возвращаемый тип - IIndicatorValue, - хотя MovingAverage возвращает decimal. Что правильнее возвращать - конкретный тип, или универсальный IIndicatorValue?

Supervisor
Supervisor

Прошу добавить, ник Zy, подправлю фракталы для начала

Mikhail Sukhov
Mikhail Sukhov Autor

Supervisor: Прошу добавить, ник Zy, подправлю фракталы для начала

Добавил. А что у нас не так с практалами?

esper
esper

Mikhail Sukhov: Добавил. А что у нас не так с практалами? Видимо, после очередного рефакторинга работы с комплексными значениями, что-то опять сломалось.

Supervisor
Supervisor

Mikhail Sukhov: Добавил. А что у нас не так с практалами? Да вроде мелочь - вываливалась ошибка при создании индикатора версией конструктора без параметров. Подправил этот момент. Пока только начал разбираться с индюками.

Supervisor
Supervisor

Плюс сделал так:

esper
esper

Supervisor: Плюс сделал так: Ага, все верно. Получается раньше еще смещение не верно рассчитывалось? Или рисовалось без учета смещения?

Supervisor
Supervisor

esper:

Supervisor: Плюс сделал так: Ага, все верно. Получается раньше еще смещение не верно рассчитывалось? Или рисовалось без учета смещения? Они и сейчас со смещением рассчитываются равным половине периода, это я отрисовку фракталов сдвинул на n баров влево чтобы это смещение исправить. То есть сейчас получается фракталы фактически строятся так:

Только не знаю можно ли сейчас это смещение пробовать исправлять? То есть нормально будет если индикатор меняется где-то в истории, но его последнее значение остается Empty?

esper
esper

Так ShiftedValue для этого и задумывалось, когда при расчетах меняется значение индикатора в прошлом. Ведь то, что на текущем баре есть фрактал, становится известно только несколько баров спустя. При отрисовке, если к нам пришло именно ShiftedValue, рисуем значение не для текущего бара цены, а смещенное на ShiftedValue.Shift.

Supervisor
Supervisor

esper: Так ShiftedValue для этого и задумывалось, когда при расчетах меняется значение индикатора в прошлом. Ведь то, что на текущем баре есть фрактал, становится известно только несколько баров спустя. При отрисовке, если к нам пришло именно ShiftedValue, рисуем значение не для текущего бара цены, а смещенное на ShiftedValue.Shift. Значит сейчас все считает правильно, только нужно учитывать Shift при прорисовке.

Daenur
Daenur

Добавлен индикатор NRTR (Nick Rypock Trailing reverse). Нужно его добавить в проект.

Mikhail Sukhov
Mikhail Sukhov Autor

Daenur: Добавлен индикатор NRTR (Nick Rypock Trailing reverse). Нужно его добавить в проект.

  1. Предлагаю давать нормальные имена для классов.
  2. private поля у нас именуются с подчеркиванием и без this.
  3. Индюки судя по описанию использует Highest и Lowest. И то и другое уже есть у нас. Переиспользование и ООП рулит.
  4. Добавляет в проектный файл самостоятельно. Если нет уверенности в качестве кода, то для этого в TFS есть Shelve фича.
OvcharenkoVI
OvcharenkoVI

нужен кому нибудь индикатор планиметрия? он вроде модный стал сейчас=)

Собственно интересует есть ли смысл в его реализации на s#, пока время есть, так как он представляет собой ни что иное как 100 sma-шек...

Mikhail Sukhov
Mikhail Sukhov Autor

OvcharenkoVI: нужен кому нибудь индикатор планиметрия? он вроде модный стал сейчас=)

Собственно интересует есть ли смысл в его реализации на s#, пока время есть, так как он представляет собой ни что иное как 100 sma-шек...

Это вот это? Интересно, потянут ли наши графики такое.

OvcharenkoVI
OvcharenkoVI

Да, именно это, я вообще не сторонник тех анализа) просто есть люди, которые уверены, что чем больше линий на графике, тем лучше их торговая система)))))))))) вы сейчас какие графики используете? Amcharts насколько я понял ушел в прошлое.

Mikhail Sukhov
Mikhail Sukhov Autor

OvcharenkoVI: Да, именно это, я вообще не сторонник тех анализа) просто есть люди, которые уверены, что чем больше линий на графике, тем лучше их торговая система)))))))))) вы сейчас какие графики используете? Amcharts насколько я понял ушел в прошлое.

MSChart... Ну тут не массовостью берется, как я понял. Смысл планиметрии в отображении плоскости. Один индюк де факто.

Daenur
Daenur

Немного поправил и добавил в проект NRTR (Nick Rypock Trailing Reverse).

freelancer
freelancer

Здравствуйте. Хочу немного подредактировать Peak и Trough. Сделать их как в Wealth-Lab. Я проверил - мой вариант совпадает по значениям с Wealth-Lab. Логин на CodePlex - Stenk

Mikhail Sukhov
Mikhail Sukhov Autor

freelancer: Здравствуйте. Хочу немного подредактировать Peak и Trough. Сделать их как в Wealth-Lab. Я проверил - мой вариант совпадает по значениям с Wealth-Lab. Логин на CodePlex - Stenk

Доступ дал. Редактировать не нужно. Сейчас они как в Метасе. Лучше создать отдельные классы рядом. Можете отнаследоваться от существующих.

Weitere Kommentare laden