Обсуждение статьи "Библиотека для простого и быстрого создания программ для MetaTrader (Часть XXV): Обработка ошибок, возвращаемых торговым сервером" - страница 2

 
Artyom Trishkin:

Про информацию, записанную в значение Magic Number:

вы можете для создания различных групп использовать для каждой группы свой собственный магик. Например, если магик советника 123, то магик первой группы будет 124, магик второй группы 125, третьей - 126, и т.д..
Библиотека предлагает иной способ создания различных групп - номер каждой подгруппы хранится прямо в значении Magic Number. ТОгда магик советника - это тоже идентификатор группы, но он вынесен в независимую группу, которая называется MagicID - идентификатор магика советника. И есть ещё две группы. В каждой из них есть 15 подгрупп. И каждой из подгрупп можно задать свой идентификатор.

Это даст большую гибкость при работе с группами.

Например: Мы хотим перемещать сетку отложенных ордеров за ценой - добавляем их в группу 1 в подгруппу 1. Группа 1 перемещается за ценой. Подгруппа 1 перемещается по МА. Теперь какие-то из тех ордеров, которые перемещаются за ценой (группа 1) мы хотим перемещать по Parabolic SAR. Даём им подгруппу 2. Тогда группа 1 - перемещается за ценой, но подгруппа 1 перемещается по МА, а подгруппа 2 - по Parabolic SAR.

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

В общем - полёт фантазии. Простым магиком тоже можно, но придётся самому придумывать логику отслеживания различных групп.

По второму вопросу:

Есть класс CSelect. Он доступен из программы, и предоставляет способы выбора и поиска, о которых вы пишете, из всех существующих коллекций: Account, Event, Order, Symbol.

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

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

Но пока - только посредством CSelect, и тогда, когда вам это нужно. Класс статический, поэтому доступ к к его методам через "::" Например, CSelect::ByOrderProperty().

Да, кстати, и пример использования в программе есть прямо в тестовом советнике - например, в его функциях трейлинга:

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

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

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

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

И пусть собирает простую статистику: количество ордеров, общий объем, общий профит... коллекция ордеров, кстати, раз уж мы ее отобрали уже.

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

 
rigal:

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

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

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

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

И пусть собирает простую статистику: количество ордеров, общий объем, общий профит... коллекция ордеров, кстати, раз уж мы ее отобрали уже.

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

А вы предлагаете утяжелить расчёты в самой библиотеке? Там и так много всего считается.

Почему бы не сделать предлагаемое прямо в советнике вместо библиотеки? Разницы-то нет где всё это считать. Но кому-то это нужно (вам), а кому-то - нет. И зачем ему лишние вычисления?

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

 
Artyom Trishkin:

А вы предлагаете утяжелить расчёты в самой библиотеке? Там и так много всего считается.

Почему бы не сделать предлагаемое прямо в советнике вместо библиотеки? Разницы-то нет где всё это считать. Но кому-то это нужно (вам), а кому-то - нет. И зачем ему лишние вычисления?

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

Ну я предлагаю считать опционально.

Заводить "подписку".

Но если Вам эта идея не кажется достойной внимания, я, конечно, сам напишу обертку.

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

 
rigal:

Ну я предлагаю считать опционально.

Заводить "подписку".

Но если Вам эта идея не кажется достойной внимания, я, конечно, сам напишу обертку.

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

В планах будет похожий функционал. И, да, планов ещё очень много - сделано меньше трети запланированного.
 
Я внимательно слежу :)
Причина обращения: