Блог им. Crazy_Trading

Вопрос программистам

Всем привет друзья.

пишу робота под америку и столкнулся вот с такой проблемой: 

писал всегда на СИ подобном языке )) МКЛ это усеченный до нельзя СИ. и тем не менее все хорошо писалось.. 

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

как писал на МКЛ: 

создаю структуру:
//--------------------------------------------------------------------------------------------
struct sDataBar     { ... };
//--------------------------------------------------------------------------------------------    

создаю 2 экземпляра стуктуры:
sDataBar     OsnDataBar;       // Структура с ДАННЫМИ на баре для основного ТФ
sDataBar     HlpDataBar;       // Структура с ДАННЫМИ на баре для вспомогательного ТФ

далее в теле программы:
передаю в цикле на каждый бар обе структуры 

MathDataForBar(OsnDataBar, i, 1);
MathDataForBar(HlpDataBar, i, 2);

в самой функции принимаю структуру так: 
void MathDataForBar(sDataBar &DataBar,int i, int variant)
{
...
//делаю с данными шпили вили ))
...
}

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

но блин не тут то было в СИ ШАРПЕ (( заветная & нифига не работает (( 
а читать пруфы не могу ибо туп (( мне надо на пальцах (( 

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

★5
48 комментариев

Если вам нужно менять структуру в методе, передавая её как параметр, то есть ключевые слова ref и out.

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

Кроме того, в C# есть разница между Value и Reference type сущностями.

Вторые всегда передаются по ссылке, поэтому & не требуется.

Но Struct — это value type.

Тарас Громницкий, 
Спасибо ОГРОМНОЕ!!!

public struct Book
{
public string Name;
}

Book b;

protected override void OnBarUpdate()

{
b.Name = «b»; Print(b.Name);
func(ref b, «BookName»); Print(b.Name);
}

public void func(ref Book Tek, string txt)
{
Tek.Name = txt;
}

и все работает
выводит:

b
BookName

avatar
Тарас Громницкий, 
вот этого 

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

Кроме того, в C# есть разница между Value и Reference type сущностями.

Вторые всегда передаются по ссылке, поэтому & не требуется.

Но Struct — это value type.
 

вообще не понял )) 
avatar

Тихая Гавань, тогда определяйте метод так

void MathDataForBar(ref sDataBar DataBar,int i, int variant)
{
...
//делаю с данными шпили вили ))
...
}

А вызывайте его так

MathDataForBar(ref OsnDataBar, i, 1);
MathDataForBar(ref HlpDataBar, i, 2);

Для внеклассного чтения

docs.microsoft.com/ru-ru/dotnet/csharp/language-reference/keywords/ref
docs.microsoft.com/ru-ru/dotnet/csharp/language-reference/keywords/out
stackoverflow.com/questions/1516876/when-to-use-in-vs-ref-vs-out

Тарас Громницкий, ага )) я так и сделал в примере выше, и все работает, еще раз благодарствую… а то уже руки опускались.

доки не могу читать… ибо туп )) 
avatar

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

Со временем мозг привыкнет к докам.

Если нужен качественный софт, то ищите разработчика.

Он вас ещё и поднатаскает.

Тарас Громницкий, 

это вы зря предложили )) я же замучаю вопросами )) 

по поводу качественного софта — согласен, но до него еще достаточно далеко, необходимо все еще формализовать для робота. 

ибо то что видно глазу не совсем понятно как объяснить программе.
на данный момент я столкнулся с проблемой как научить программу думать «примерно», тоесть обобщать некоторые неточности, и округлять понятия формаций.
блин я даже не знаю как это по научному сказать)) 
в общем есть некая формация которая по сути видна глазу, но есть ДОПУСКИ и обобщения — +-несколько тиков тут, несколько тиков там, мозг человека допускает и пропускает как сформировавшийся паттерн. 

а вот как программу научить «думать» не четко алгоритмически, а с допусками на некоторый +- придется попотеть… )) 

avatar

Тихая Гавань, пожалуйста.

Касательно формализации я вас прекрасно понимаю.

Потому как почти каждый день сталкиваюсь с подобным.

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

Но и сильно заморачиваться тоже не стоит.

Довольно часто случается так, что некоторыми элементами(не формализуемыми) можно пожертвовать без особого урона для стратегии.

Тарас Громницкий, у меня всеголишь один вопрос в формализации стоит: проторговка уровня. 

если она есть — то можно входить в рынок, если отсутствует то ничего не делаем.

так вот сама проторговка зачастую выглядит иначе чем в предыдущийраз..

то чуть не дойдет до уровня, то чуть залезет на него, причем некоторые бары выбиваются из строя, какойто посредине может выскочить из диаппазона проторговки, и все, робот считает что тут нет никакой формации, а она как тот суслик — ЕСТЬ )) 
avatar

Тихая Гавань, а уровни кто строит ?

Человек или программа ?

Тарас Громницкий, уровни строит программа, и там все автоматически происходит.. 
весь мой «затык» это формализовать поведение цены около автоматически вычисленного уровня.
avatar
Тихая Гавань, ну тогда вопрос в том, что является допустимым отклонением от нормы(идеального паттерна).
Тарас Громницкий, именно так, да не так )) 

вопрос в ДОПУСКАХ и ОБОБЩЕНИЯХ стоит очень насущно.
очень часто бывает так, что прописывая допуск в каком то математическом выражении — на выходе получаешь отказ рассматривать ситуацию как торговый паттерн всеголишь из за того что допуск превышен всеголишь на ОДИН ТИК
avatar
Тихая Гавань, приветствую, помогите в mql 5 сову написать, только я полный 0, а стратегия простая как соленый огурец))
avatar
ANt0sh, я писал под МКЛ4 так что 5й не знаю

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

учите самостоятельно МКЛ — он достаточно легкий
avatar
Тихая Гавань, ) найти кто бы на пальцах показал, что зачем вставляется и все) когда на форумы заходишь, там как будто люди с другой планеты, на непонятом языке разговаривают))
avatar

ANt0sh, есть такое дело.

Хороший программист с человеческим языком — это золото.

А со знанием трейдинга вообще алмаз.

ANt0sh, зайдите на сайт разработчиков МКЛ
там море примеров, море нубских вопросов и ответов )) 
avatar
ANt0sh, дак ведь так оно и есть! )) Язык надо изучать.
А можно ТСЛаб освоить, если есть хоть какое-то знание информатики школьного уровня. Если в Лабе получится — любой программист порадуется возможности переписать на MQL и сделает это за 1 день.

Только вот не всё простое в ручном трейдинге
так же просто при объяснении роботу…
avatar
Если коротко и без прелюдий, то вместо структуры используй класс и создай объект этого класса. Структуры в шарпе используются для специфических случаев
avatar
Cheshirscy, вы будете смеяться, но я ноль в ООП, и пока не понял зачем мне нужны классы.
avatar
Тихая Гавань, представляете каждый элемент как объект, наследуете общее и переносите логику в класс. с ооп код более логичным получается, на мой взгляд.

самое простое это заявки и сделки, которые так и просятся объединить. создаёте базовый класс с общими свойствами и функциями от него наследуете классы ордер и трейд, а дальше уже сам код подскажет как с этим добром жить :)
avatar
Алексей, я с наследованием вообще не разобрался еще..
я по природе своей тугодум, мне крайне сложно читать теорию если я сразу же не вижу как это может быть воплощено на практике. причем голый код меня не впечатлит, нужен переводчик с кода на человеческий язык… пока таких книжек не придумали, а потому я иду от обратного — не изучаю теорию и потом практикую, а ставлю практическую задачу и копаюсь в теории в поисках что поможет для ее решения — путь гораздо более трудо и ресурсоемкий, однако я только так и могу что то изучить — через непосредственную практику.
avatar
Тихая Гавань, тогда подход ооп вам в помощь. это как из лего кубиков что то строить, с одной лишь разницей что кубики придумываете тоже вы.
в программировании вообще ничего сложного нет, музыку написать или картину в разы сложней.

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

и вообще новичкам я бы сейчас рекомендовал, что то попроще чем шарп, он слишком гибкий. если софт с gui то я бы выбрал angular.
avatar
Алексей, да, вы правы, слишком гибкий язык сложен для новичка.
avatar
Тихая Гавань, я бы Вам посоветовал посмотреть курсы Александра Шевчука, все подробно разжевывает и кладет в рот, почти на всё приводит аналогии из жизни. Не реклама, есть бесплатные уроки, да и при желании все можно и бесплатно нарыть сами знаете где).
avatar
Андрей, пасиб, гляну
avatar
А пока и не надо понимать просто вместо ключевого слова struct используй class. И когда в первый раз обращаешься к классу используй слово new. Остальное все тоже самое что и со структурами
avatar
Cheshirscy, а если все тоже самое чтои со структурами — то зачем мне классы? 
avatar

Тихая Гавань, классы понадобятся, когда будете реализовывать более сложные и функциональные сущности.

Содержащие/ссылающиеся на другие классы.

Тарас Громницкий, Тарас, вы сейчас на марсианском со мной заговорили )) 
я честно не совсем понимаю о чем вы, но постараюсь перевести для себя таким образом: 

пока я научился использовать структуры дабы избежать повторяющегося кода. 

у меня есть структура и есть методы в отдельной функции.

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

в русскоязычном сегменте поддержки Нинзи — все идет лишь — заплати денег и мы тебе напишем, а англоязычный сегмент поддержки не доступен по причине капитального баранизма в английском языке ))

PS от слова СУЩНОСТИ меня сразу бросает в легкую панику )) ибо последний раз когда мне попадалось это слово — это когда читал Блаватскую )) 
avatar

Тихая Гавань, примерно так.

Класс в котором набор свойств и методов.

А почему выбор пал на ниндзю ?

IB предоставляет хорошие условия, как по комиссиям, так и по спектру рынков ?

API достаточно стройный, функциональный и гибкий.

Тарас Громницкий, насколько я знаю в IB есть открытый АПИ, тоесть там не просто программульку надо написать которую в терминал включил и готово, а свой полнофункциональный так сказать терминал который сам подключается к серверам IB
вы же понимаете мой уровень )) я такого ни в жизть не напишу )) 

к томуже мне совершенно не нравится тех поддержка в IB, зимой они меня можно сказать обманули на 400 долларов, потом признали свою ошибку, но деньги не вернули под предлогом — САМ ДУРАК. 

в нинзе я хорошо знаком с Ланой Орловской, на мой взгляд это самая лучшая тех поддержка вообще во всем мире среди вообще ВСЕХ брокеров!
avatar

Тихая Гавань, API у них, как и везде.

Подключаешься, посылаешь команды, получаешь результат.

Он менее интегрирован с визуальной частью терминала, чем Ninja, но это плюс, а не минус.

Потому как лишних зависимостей нет, а значит и потенциальных проблем.

Для контроля работы робота есть масса других вариантов.

От логов до таблиц в программе(графиков при необходимости).

Это не сложно.

А по комиссиям кто выгоднее IB или Ninja ?

Тарас Громницкий, согласен с АПИ круче )) но это для меня высший пилотаж.
так как необходим не просто код робота, но и оболочка. 
с нинзей проще — в качестве оболочки выступает сама нинзя )) 

комиссии в принципе одинаковы что там что там…
avatar

Тихая Гавань, ну ок.

В IB я значительно сильнее, чем в Ninja.

Хотя при необходимости разобраться не проблема.

Принципы везде едины.

Спрашивайте в случае чего.

Тарас Громницкий, спасибо )) вопросов состав и маленькая тележка )) 
avatar
Вот реально приятно смотреть когда люди общаются по делу, без срача и троллинга. 
Алексей Васильев, 
avatar

Алексей Васильев, это проблеск параллельной реальности.

Исключение так сказать.

Тарас Громницкий, ну это понятно, в том, что это исключение даже и не сомневается никто, но если хотя бы 1/3 смартлаба так общалась, то от него пользы было бы в сотни раз больше. 
SECRET, можно и так, но код будет слишком растянутым… у меня функция обработки данных будет дважды прописана для разных «структур»
а зачем нагромождать? 


avatar

Тихая Гавань, если нужна скорость, то имеет смысл сбивать всё в кучу, уменьшая количество команд и переходов.

Если нет, то гораздо ценнее модульная структура программы с понятными, взаимозаменяемыми элементами.

Т.е. гибкость.

Тарас Громницкий, скорость не важна, у меня не HFT, важен порядок в коде и его читабельность ))
avatar

Тихая Гавань, вот и я о том же.

HFT — это вообще жуткий, дорогой головняк.

SECRET, вот сразу видно пипсовика-оптимизиратора.

теги блога Тихая Гавань

....все тэги



UPDONW
Новый дизайн