Перейти к содержанию

Разработка библиотеки сопровождения одиночных ордеров


Рекомендуемые сообщения

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

Здравствуйте Уважаемые Форумчане.
Сопровождение ордеров это один из столпов всех советников. И, зачастую, достаточность и правильность сопровождения отделяет хороший советник от плохого. На форуме представлены множество советников и тем по ТЗ к ним. В каждой из них данный вопрос обстоит остро и поднимается чуть ли не с каждым обновлением версии. А если учитывать темы по ручной торговле, то тактик по сопровождению позиций можно и не счесть.
Итак представляю Вашему вниманию третью версию библиотеки.
Я постараюсь составить наиболее полную инструкцию по применению.
Составил чистые и несколько пресетов настройки для примера.

Что сделано:
Есть функция БУ;
функция трала:
стандартный Трал;
АТР трал;
трал по фракталам;
функция многоуровневого сопровождения;
функция получения Цены открытия;
функция получения ТП;
функция получения СЛ;
функция получения Лота;
функция открытия ордера;
функция закрытия ордеров;
функция частичного закрытия;
функция счетчика ордеров;
функция логгирования;
функция определения нового бара.

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

Я так понимаю делаю не совсем то что ожидают, но зато то что хотелось бы видеть.

В планах:
1 Сделать отдельное логирование в файл внутри библиотеки. Наверное с настройкой подробности логирования.
2 Сделать функцию получения цены для типовых решений размещения отложек
3 Добавить МБ пару тралов типо "Трал по Параболику" и "Трал по теням"
4 Продумать вариант работы В зоне СЛ.
5 Продумать вариант сопровождения по Времени.
6 Выслушать критику и предложения, обсудить их

Если у кого то появится желание кинуть в меня что то грязное (кроме денег) Прочитайте инструкцию еще раз |3=3

ОГРОМНАЯ просьба:
Поменьше флуда - Побольше конструктива, не хотелось бы раздувать топик на овер 100500 страниц, что бы потом никто не смог его осилить и тема заглохла без результата!
При цитировании кого-либо во время обсуждения скрывайте цитату под спойлер!
Хоть через силу, но ознакомиться и применять информацию из статьи. Хаос начинается с Нас!

Инструкция по эксплуатации:

Спойлер


Введение

Спойлер


Ни для кого не секрет что работа на финансовых рынках связана с рисками. При работе на них мы рискуем средствами своими или чужими, физическим и психологическим здоровьем, временем. Для того что бы их снизить или исключить совсем нам доступно множество инструментов. Одним из лучших является возможность написания собственных алгоритмов. Это позволило за долгую историю существования МТ4/5 создать просто невообразимое количество советников, индикаторов, скриптов. Часть из них уже потеряли актуальность, часть активно используется и обновляется. Но на разработку их всех затрачено огромное количество времени. А если учесть
все проекты которые были написаны и не опубликованы, то затраты времени можно исчислять миллионами человеко-часов.
Наверное, не следует напоминать, что каждая торговая система состоит из нескольких условных частей:
1) Сигнал на вход;
2) Сигнал на выход;
3) Манименеджмент;
4) Сопровождение.
И при написании почти любого советника реализуются все вышеперечисленные пункты, при отсутствии хотя бы одного из них или некачественном исполнении даже потенциально удачный проект может показывать отрицательный результат. Если сигнал на вход - это достаточно индивидуальный пункт для каждого проекта, то остальные во многом похожи. И использование одних и тех же приемов можно наблюдать во многих совах.
Если начать перечислять и придумывать все возможные комбинации, то цифра окажется очень большой. К примеру, в Микс Скальпере только 12кк комбинаций индикаторов не считая нескольких режимов и тактик работы.
Да бы не создавать еще один подобный проект и упростить себе и окружающим жизнь, я постарался объединить наиболее популярные тактики сопровождения, с которыми сталкиваюсь в одну библиотеку, при этом не распыляя внимание за пределы сопровождения 1 ордера.
Цели которые я преследую:
1) Упростить реализацию идей с 1 ордером;
2) Ускорить работу;
3) Сэкономить время;
4) И конечно же получить экономический эффект от прибыльных советников, которые появятся и возможно я о них узнаю или со мной поделятся v:).
По личному опыту немного обобщу, типов сов множество, тактик еще больше, но за многолетнюю работу на рынке, в целом на 100 реализованных проектов 1-5 можно назвать заслуживающими внимания из которых 1-2 неплохими. Хотя большинство выпадает на долю использующих сетки или мартингейл самыми устойчивыми являются проекты с одиночными входами. За такими можно следить, и не бояться что в один момент возникнет ситуация которая приведет к колоссальным потерям. Чтобы слить депо совом с одиночными ордерами и нормальными рисками нужно выявить сбой, застать крах экономической системы или мировую победу пролитариата… Поэтому для ускорения создания подобных советников я решил сконцентрировать свои наработки и опыт по данному направлению в одной библиотеке.
Вашему вниманию предоставляется универсальная библиотека для сопровождения одиночных ордеров SoloPositionManager.


1 Техническое описание
Спойлер


В состав данной версии библиотеки входят:
1) Функция перевода в безубыток.

Спойлер

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


2) Функция обычного трала.
Спойлер

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


3) Функция трала по АТР.
Спойлер

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


4) Функция трала по Фракталам.
Спойлер

После активации переносит СтопЛосс на определенное расстояние за сформировавшийся экстремум при
его образовании. Работает либо постоянно, либо для одного ордера при передаче ей его тикета.


5) Функция частичного закрытия.
Спойлер

Используется совместно с функцией многоуровнего сопровождения. Закрывает часть ордера объем которой передается вместе с тикетом.


6) Функция многоуровнего сопровождения.
Спойлер

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


7) Функция поиска точек Демарка.
Спойлер

В комплекте для обеспечения имеется 2 комплекта функций для поиска точек Демарка. Один для трала второй для ТП-СЛ-Цены Открытия.


8) Функция получения Цены открытия.
Спойлер

В библиотеке объединены типовые варианты получения цены открытия ордера, которые я применял. Имеется комплект альтернативных настроек.


9) Функция получения ТП.
Спойлер

В библиотеке объединены типовые варианты получения ТП, которые я применял. Имеется комплект альтернативных настроек.


10) Функция получения СЛ.
Спойлер

В библиотеке объединены типовые варианты получения СЛ и комплект альтернативных настроек.


11) Функция получения Лота.
Спойлер

Основные методики для манименеджмента представлены и реализованы в одной функции. Так же, с версии 0.3 имеется дополнительная тактика управления рисками.


12) Функция Счетчика ордеров.
Спойлер

Данная функция в зависимости от переданного аргумента возвращает количество ордеров попадающих под вариант аргумента.


13) Функция Закрытия ордеров.
Спойлер

Данная функция в зависимости от переданного аргумента Производит закрытие или удаление ордеров, возвращая количество закрытых\удаленных.


14) Функция Открытия Ордера.
Спойлер

Библиотека имеет свою функцию обработчик открытия ордера которая воспринимает как внешние параметры ордера так и частичные. При быстром вызове можно вместо аргументов передать -1 для автоматического получения ТП, СЛ, Лота, Цены открытия, типа ордера и направления сделки. Имеет несколько вариантов обработки исключительных состояний, и реакций на ошибки, в т.ч. изменение методики расчета тп и сл на альтернативные.


15) Функция сигнала о новом баре.
Спойлер

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


16) Функция Логгирования.
Спойлер

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


17) Служебная функция обработки ошибок.
Спойлер

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



2 Инструкция по применению
Спойлер


1) Для использования библиотеки необходимо скопировать файл библиотеки в каталог…MQL4/Include.
2) В тексте советника необходимо после Ваших параметров внести следующую строку:

//===== Начало параметров Библиотеки =====
#include

3) В функции деинициализации в самом начале следует добавить обработчик завершения функций библиотеки:
void OnDeinit(const int reason)
{
SoloPM_DeInit();
}

4) В теле советника следует вызвать главную функцию сопровождения, вне условий и тиков, желательно впереди обработки сигналов:
void OnTick()
{
SoloPositionManager();
// код советника

5) Теперь следует написать принцип взятия сигналов Вашего Советника и открыть ордер с помощью функции (описание и параметры рассмотрены далее):
     if (CountOrderInTrade(-5)==0)
{
if (MarketInfo(Symbol(),MODE_SPREAD) {
int c=MathRand();
if (c {
SPM_OpenOrder(-2,-1,-1,-1,-1,"",6*Period(),0);
}
if (c>16384)
{
SPM_OpenOrder(-3,-1,-1,-1,-1,"",6*Period(),0);
}
}
}

6) Блиц написание советника завершено. Далее необходимо скомпилировать советник, открыть Терминал, запустить Тестер стратегий. В настройках советника после ваших параметров начнутся параметры библиотеки. Их можно настроить вручную согласно ТЗ или использовать подготовленные сеты настроек. Сейчас их не особо много и они выполняют роль примеров. Но в дальнейшем будут подготовлены сеты отдельных тактик.
З.Ы.
Простота использования не должна поставить в тупик никого :)

3 Описание функций и настройки
Спойлер


3.1 Функция БУ

Спойлер

Данная функция переводит СЛ ордера на уровень открытия + пункты при достижении заданного количества пунктов в профит.
Настройки:
string SPM_c51="5.1 Включение БЕЗУБЫТКА";
bool WLMode=false; - активирует использование данной опции.
double WLStep=30; - количество пунктов на сколько должны пройти в + для перевода в БУ.
double WLPoint=5; - количество пунктов на сколько в + будет переведен СЛ от цены открытия ордера.
Параметры указываются в старых пунктах. Если счет 5значный то при первом вызове главной функции библиотеки произойдет инициализация и значения умножатся на 10.
Настройки данной опции едины как для постоянного вызова так и для вызова из функции многоуровневого сопровождения. Если работа модуля будет активироваться из нее, то значение WLStep и WLPoint нужно
выставить одинаковыми, что бы не было противоречий в логике.
На свой страх и риск значение допускается выставлять отрицательными.


3.2 Функция обычного трала
Спойлер

Данная функция при своей работе переносит СЛ на фиксированное расстояние от текущей цены с дискретным шагом.
Настройки:
string SPM_c52="5.2 Включение ТРАЛА";
bool TralMode=false; - включение опции трала.
TRAL_Type TralType=Use_SimplTral; - Выбор типа трала.
string SPM_c521="5.2.1 Настройки параметров стандартного ТРАЛА";
bool TralProfitOnly_S=false; - Разрешение на работу трала только в зоне профита.
double TralStart_S=35; - расстояние сколько должны пройти в + для активации трала.
double TralSize=30; - размер трала – расстояние на котором СЛ будет подтягиваться за ценой.
double TrailStep=1; - шаг через который допускается изменение СЛ.
Параметры указываются в старых пунктах. Если счет 5значный то при первом вызове главной функции библиотеки произойдет инициализация и значения умножатся на 10.
Настройки данной опции едины, как для постоянного вызова, так и для вызова из функции многоуровневого сопровождения. Если работа модуля будет активироваться из нее, то значение TralStart_S рекомендуется сделать
отрицательным, например -100, а так же TralProfitOnly_S должен быть = false, что бы не было противоречий в логике.


3.3 Функция трал по АТР
Спойлер

Данная функция при своей работе переносит СЛ на расстояние от текущей цены равное наибольшему значению показаний индикатора АТР для разных периодов помноженной на множитель.
Настройки:
string SPM_c52="5.2 Включение ТРАЛА";
bool TralMode=false; - включение опции трала.
TRAL_Type TralType=Use_TralByATR; - Выбор типа трала.
string SPM_522="5.2.2 Параметры трала по ATR";
bool TralProfitOnly_A=false; - Разрешение на работу трала только в зоне профита.
double TralStart_A=35; - расстояние сколько должны пройти в + для активации трала.
int ATR_T_1=5; - период для 1 значения АТР.
int ATR_Sh_1=1; - бар взятия значения 1 АТР.
int ATR_T_2=36; - период для 1 значения АТР.
int ATR_Sh_2=1; - бар взятия значения 1 АТР.
double ATR_X=1.0; - множитель для значений АТР.
int ATR_Step=1; - шаг через который допускается изменение СЛ.
Параметры указываются в старых пунктах. Если счет 5значный, то при первом вызове главной функции библиотеки произойдет инициализация и значения умножатся на 10.
Настройки данной опции едины, как для постоянного вызова, так и для вызова из функции многоуровневого сопровождения. Если работа модуля будет активироваться из нее, то значение TralStart_А рекомендуется сделать отрицательным, например -100, а так же TralProfitOnly_А должен быть = false, что бы не было противоречий в логике.


3.4 Функция трал по Фракталам.
Спойлер

Данная функция при своей работе переносит СЛ за ближайший найденный экстремум на заданное расстояние. Перемещение происходит при образовании нового экстремума заданного качества.
Настройки:
string SPM_c52="5.2 Включение ТРАЛА";
bool TralMode=false; - включение опции трала.
TRAL_Type TralType=Use_TralByFractal; - Выбор типа трала.
string SPM_c523="5.2.3 Параметры трала по фракталам";
bool TralProfitOnly_F=false; - Разрешение на работу трала только в зоне профита.
double TralStart_F=35; - расстояние сколько должны пройти в + для активации трала.
int Lvl=2; - Сколько соседних бар должны быть ниже\выше экстремума.
int Tf=0; - ТФ на котором производится поиск.
double FacDelt=5; - размер отступа от экстремума.
Параметры указываются в старых пунктах. Если счет 5значный, то при первом вызове главной функции библиотеки произойдет инициализация и значения умножатся на 10.
Настройки данной опции едины, как для постоянного вызова, так и для вызова из функции многоуровневого сопровождения. Если работа модуля будет активироваться из нее, то значение TralStart_F рекомендуется сделать отрицательным, например -100, а так же TralProfitOnly_А должен быть = false, что бы не было противоречий в логике.


3.5 Функция частичного закрытия
Спойлер

Данная функция предназначается для внутреннего обеспечения функционала многоуровневого сопровождения. При ее вызове следует передать тикет ордера и объем закрываемой части. Функция возвращает тикет нового ордера, -1 в случае если закрытие не произошло или 0 в случае если ордер закрылся полностью.
Настройки:
int PartialClosePercent_1=10; - часть ордера закрываемая на 1 уровне реакции
int PartialClosePercent_2=10; - часть ордера закрываемая на 2 уровне реакции
int PartialClosePercent_3=10; - часть ордера закрываемая на 3 уровне реакции
int PartialClosePercent_4=10; - часть ордера закрываемая на 4 уровне реакции
int PartialClosePercent_5=10; - часть ордера закрываемая на 5 уровне реакции
int PartialClosePercent_6=10; - часть ордера закрываемая на 6 уровне реакции
int PartialClosePercent_7=10; - часть ордера закрываемая на 7 уровне реакции
int PartialClosePercent_8=10; - часть ордера закрываемая на 8 уровне реакции
int PartialClosePercent_9=10; - часть ордера закрываемая на 9 уровне реакции
int PartialClosePercent_10=10; -часть ордера закрываемая на 10 уровне реакции
Все параметры указываются в %% от закрываемого ордера. Внутри библиотеки предусмотрен расчет части закрываемого ордера от изначального объема ордера. Все параметры привязаны к соответствующему уровню многоуровневого сопровождения. Если частичное закрытие не будет активировано в нем, то параметр будет незадействован.
Если необходимо закрыть определенный рыночный ордер с известным тиккетом, то можно воспользоваться следующей функцией ( если лот не известен можно отправить макс лот ордера биржи (больше чем есть не закроет)):


if (PartCloseBloc(OrderTicket(), OrderLots()) ==0)
{
Print ("Ордер закрыт");
}

PartCloseBloc может вернуть 3 состояния: 0 - ордер закрыт полностью, -1 ордер не закрыт, N - новый тиккет, если у ордера закрылась только часть.

3.6 Функция многоуровневого сопровождения.
Спойлер

Разработка библиотеки велась именно с целью создать такую функцию.
Данная функция работает по следующему принципу:
Имеется 10 уровней реакции. Каждый может быть настроен на произвольный уровень в %% от расстояния между Ценой открытия и ТП. На каждом уровне может быть выбран определенный алгоритм действия. При
достижении ценой заданного уровня выполняется действие и делается пометка в массиве статусов, что для заданного уровня активация выполнена.
Активация опций использует заданные настройки данной опции, следует ознакомиться с ними. Если действие является одной из опций сопровождения и у него выполнена активация, то при каждом тике будет вестись обработка при этом неважно, как после активации изменится ТП. Если трал был активирован на 50%, а цена опустилась ниже, и пользователь переместил ТП ближе, то трал продолжит работу (не противоречащую собственной логике).
Если была выбрана функция отключения какой-либо опции, то данный вид опции для данного ордера будет отключен. Например, бесполезно включать обычный трал на 40% и скажем еще раз на 60% если его отключить на 30%, тогда по достижению 30% уровням 40 и 60 будет запрещено использовать трал и это будет пустая трата 3 уровней сопровождения. Если отключить трал на 50%, то он будет вызываться пока не достигнет этого уровня, а затем отключится, соответственно уровень 60 будет использован впустую. Если на уровне выставлена опция частичного закрытия, то по достижению ценой данного уровня произойдет закрытие части ордера, которая соответствует указанному % для данного уровня. Например, если на 6 уровне установлено, что при 50% закрывается часть ордера, а на 6 параметре закрытия стоит 40%, то при достижении ценой 50% уровня будет закрыто 40% от объема ордера. При этом при расчете объема учитывается изначальный лот ордера. Т.Е если
будет 2 и больше закрытия и совокупный процент будет больше 100%, то ордер закроется полностью до достижения уровня ТП согласно установленным уровням закрытия.
Настройки:
string SPM_c6="Настройки многоуровневого сопровождения";
bool UseMultyLvlAction=false; - Включение опции многоуровневого сопровождения
enum IMPACT_TYPE - здесь перечисленны виды реакций
{
WL, //Вкл БУ
WL_Off, //Выкл БУ
Standart_Tral, //Вкл Обычный Трал
Standart_Tral_Off, //Выкл Обычный Трал
ATR_Tral, //Вкл Трал по АТР
ATR_Tral_Off, //Выкл Трал по АТР
Fractal_Tral, //Вкл Трал по Фракталам
Fractal_Tral_Off, //Выкл Трал по Фракталам
Partial_Close, //Частичное закрытие
None //Нет действия
};
int Impact_Lvl_1=0; - уровень 1 реакции в %%
IMPACT_TYPE Impact_1=None; - вид действия на 1 уровне
int Impact_Lvl_2=0; - уровень 2 реакции в %%
IMPACT_TYPE Impact_2=None; - вид действия на 2 уровне
int Impact_Lvl_3=0; - уровень 3 реакции в %%
IMPACT_TYPE Impact_3=None; - вид действия на 3 уровне
int Impact_Lvl_4=0; - уровень 4 реакции в %%
IMPACT_TYPE Impact_4=None; - вид действия на 4 уровне
int Impact_Lvl_5=0; - уровень 5 реакции в %%
IMPACT_TYPE Impact_5=None; - вид действия на 5 уровне
int Impact_Lvl_6=0; - уровень 6 реакции в %%
IMPACT_TYPE Impact_6=None; - вид действия на 6 уровне
int Impact_Lvl_7=0; - уровень 7 реакции в %%
IMPACT_TYPE Impact_7=None; - вид действия на 7 уровне
int Impact_Lvl_8=0; - уровень 8 реакции в %%
IMPACT_TYPE Impact_8=None; - вид действия на 8 уровне
int Impact_Lvl_9=0; - уровень 9 реакции в %%
IMPACT_TYPE Impact_9=None; д действия на 9 уровне
int Impact_Lvl_10=0; - уровень 10 реакции в %%
IMPACT_TYPE Impact_10=None; - вид действия на 10 уровне
Часть закрытия соответствует номеру уровня на котором активирована опция закрытия. Уровни считаются в %% расстояния от ТП до Цены.
На свой страх и риск допускается использование отрицательных значений уровня, будьте внимательный в настройке и уверены в результате, перед настройкой, дабы избежать ошибок работы проведите логическую
инсценировку противоречий в логике работы опции и ее вызовом на отрицательных уровнях. Например БУ при вызове на уровне -10% работать не будет! А частичное закрытие легко. Трал можно активировать, но опция
трала профита должна быть отключена, а уровень активации трала должен быть в отрицательной зоне!
Как разработчик я допускаю возможность такого альтернативного использования функции, но не одобряю.
Рассмотрение проблем связанных с альтернативным использованием уровней будет делаться в последнюю очередь.
Это базовая версия библиотеки, если в ходе обсуждения дальнейшей разработки будет предложена хорошая идея по работе в зоне СЛ - она появится.


3.7 Функция получения цены открытия.
Спойлер


Данная функция при своем вызове возвращает цену открытия ордера и имеет 2 параметра:

double GiveMeMyOpenPrice(int OrdType, OP_TYPE altOP)

OrdType - тип ордера цену которого необходимо вернуть
altOP - принудительный тип расчета цены открытия (если не используется альтернатива то передается -1)
В любом случае если передать тип 0 или 1 то функция вернет текущие Ask или Bid.
Блок настроек Цены открытия содержит следующие параметры:
Спойлер


enum OP_TYPE
{
OP_Fix, //Отложка на фикс отступе
OP_ByATR, //Отложка на АТР
OP_ByDiap, //Отложка от диапазона цен
OP_OnLastExrtem, //Отложка на экстремуме
OP_OnHL, //Отложка на Хае/Лое
NoOP //Не Отложка
};
extern OP_TYPE TypeOfOP=OP_Fix; // - Основной тип расчета цены открытия
extern double SizeOfOP=50; // - Размер для расчетов Основного типа
extern int PeriodOfOP=30; // - Период для расчетов Основного типа
extern int LvlOfOP=3; // - Уровень для расчетов Основного типа
extern OP_TYPE TypeOfAlternationOP=OP_OnHL; // - Альтернативный тип расчета цены открытия
extern double SizeOfAlternationOP=5; // - Размер для расчетов Альтернативного типа
extern int PeriodOfAlternationOP=30; // - Период для расчетов Альтернативного типа
extern int LvlOfAlternationOP=3; // - Уровень для расчетов Альтернативного типа
extern int Progress_Optimization_OP=0; // - в планах, зарезервировано


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


Отложка на фикс отступе.

Спойлер

Нужно настроить параметр на OP_Fix.
При данном типе цена будет расчитана как (Ask или Bid) + SizeOfOP для Стопового ордера на покупку или Лимитного ордера на Продажу
Или (Ask или Bid) - SizeOfOP для Стопового ордера на Продажу или Лимитного ордера на Покупку.
При вызове расчетов Альтернативного уровня цены открытия будет использоваться SizeOfAlternationOP.


Отложка на АТР
Спойлер

Нужно настроить параметр на OP_ByATR.
При данном типе цена будет расчитана как (Ask или Bid) + SizeOfOP*ATR(с периодом PeriodOfOP) для Стопового ордера на покупку или Лимитного ордера на Продажу
Или (Ask или Bid) - SizeOfOP*ATR(с периодом PeriodOfOP) для Стопового ордера на Продажу или Лимитного ордера на Покупку.
При вызове расчетов Альтернативного уровня цены открытия будет использоваться SizeOfAlternationOP и PeriodOfAlternationOP соответственно.


Отложка от диапазона цен
Спойлер

Нужно настроить параметр на OP_ByDiap.
При данном типе цена будет расчитана как (Ask или Bid) + SizeOfOP*(Максимальный High(за период PeriodOfOP)- Минимальный Low(за период PeriodOfOP)) для Стопового ордера на покупку или Лимитного ордера на Продажу
Или (Ask или Bid) - SizeOfOP*(Максимальный High(за период PeriodOfOP)- Минимальный Low(за период PeriodOfOP)) для Стопового ордера на Продажу или Лимитного ордера на Покупку.
При вызове расчетов Альтернативного уровня цены открытия будет использоваться SizeOfAlternationOP и PeriodOfAlternationOP соответственно.


Отложка на экстремуме
Спойлер

Нужно настроить параметр на OP_OnLastExrtem.
В данном случае будет произведен поиск в последних PeriodOfOP барах бар, High которого больше High LvlOfOP баров до и после него. При этом цена открытия будет расчитана как High( найденного бара) + SizeOfOP для Стопового ордера на покупку или Лимитного ордера на Продажу.
В данном случае будет произведен поиск в последних PeriodOfOP барах бар, Low которого меньше Low LvlOfOP баров до и после него. При этом цена открытия будет расчитана как Low ( найденного бара) - SizeOfOP для Стопового ордера на Продажу или Лимитного ордера на Покупку.
При вызове расчетов Альтернативного уровня цены открытия будет использоваться SizeOfAlternationOP, PeriodOfAlternationOP и LvlOfAlternationOP соответственно.


Отложка на Хае/Лое
Спойлер

Нужно настроить параметр на OP_OnHL.
В данном случае будет произведен поиск в последних PeriodOfOP барах максимального High. При этом цена открытия будет расчитана как High( найденного бара) + SizeOfOP для Стопового ордера на покупку или Лимитного ордера на Продажу.
В данном случае будет произведен поиск в последних PeriodOfOP барах Минимального Low. При этом цена открытия будет расчитана как Low ( найденного бара) - SizeOfOP для Стопового ордера на Продажу или Лимитного ордера на Покупку.
При вызове расчетов Альтернативного уровня цены открытия будет использоваться SizeOfAlternationOP и PeriodOfAlternationOP соответственно.


Не Отложка
Спойлер

Нужно настроить параметр на NoOP.
В случае такой настройки будет всегда возвращаться Ask или Bid поэтому передавать другие варианты смысле нет. Только для рыночных ордеров.




3.8 Функция получения ТП
Спойлер

Данная функция предназначена для получения значения уровня ТП. Она объединяет типовые решения по постановки ТП. Имеет несколько вариантов расчета и принципов вызова. Имеет альтернативный вариант настроек для решения проблемы с лимитами при открытии ордера через функцию библиотеки.

double GiveMeMyTP(double Cen,int OrdType,double g_Sl,TP_TYPE altTP)

Функция имеет 4 вводных параметра:
double Cen - цена открытия ордера от которого будет отложен ТП
int OrdType - Тип ордера для которого нужно найти ТП
double g_Sl - уровень СЛ, если равен -1 то будет вызвана функция получения СЛ
TP_TYPE altTP - альтернативный тип ТП. обычно имеет -1. Используется если нужно расчитать по альтернативному варианту
Настройки:
Спойлер

string SPM_c2="Блок настроек ТП";
enum TP_TYPE - здесь перечислены доступные виды ТП
{
TP_Fix, //Фикс ТП
TP_ByATR, //ТП по АТР
TP_BySL, //ТП от СЛ
TP_ByDiap, //ТП от диапазона цен
TP_OnLastExrtem, //ТП на экстремуме
TP_OnHL, //ТП на Хае/Лое
NoTP //Нет ТП
};
TP_TYPE TypeOfTP=TP_Fix; - тип основного ТП
double SizeOfTP=50; - Параметр для расчета основоного ТП
int PeriodOfTP=30; - Период для расчета основного ТП
int LvlOfTP=3; - Уровень для расчета основного ТП
TP_TYPE TypeOfAlternationTP=TP_BySL; - тип альтернативного ТП
double SizeOfAlternationTP=5; - Параметр для расчета альтернативного ТП
int PeriodOfAlternationTP=30; - Период для расчета альтернативного ТП
int LvlOfAlternationTP=3; - Уровень для расчета альтернативного ТП
int Progress_Optimization_TP=0; - зарезервировано для дальнейшей разработке в ключе оптимального использования оптимизации при работе с ТП


По умолчанию функция всегда использует ТП тип которого выбран основным. В случае возникновения конфликтов используется альтернативный тип ТП – например, при ошибке 130 после 2 попытки будут
комбинироваться применения альтернативных ТП и СЛ при открытии ордера.
Во всех режимах получения ТП учитывается Стоп уровень и Уровень заморозки и при получении числового значения ТП будет взят максимальный из трех этих значений.
Фиксированный ТП:
Спойлер

При TP_Fix. Параметр SizeOfTP будет отвечать за размер в пунктах. При 5знаке во время инициализации библиотеки будет проведено увеличение в 10 раз. При использовании альтернативного ТП все параметры будут
браться от альтернативных настроек.


ТП по АТР:
Спойлер

При TP_ByATR. Параметр SizeOfTP будет являться множителем для значений индикатора АТР с периодом PeriodOfTP. При использовании альтернативного ТП все параметры будут браться от альтернативных настроек.


ТП от СЛ:
Спойлер

При TP_BySL. Параметр SizeOfTP будет являться множителем для значений размера Стопа, где множитель 2 будет значить? что ТП в 2 раза больше СЛ. Если при этом функции не будет передано значение СЛ? то оно
будет получено вызовом из функции. При использовании альтернативного ТП все параметры будут браться от альтернативных настроек.


ТП от диапазона цен:
Спойлер

При TP_ByDiap. Параметр SizeOfTP будет являться множителем для числового значения диапазона цен между максимальным Хаем и минимальным Лоем за период PeriodOfTP. При использовании альтернативного ТП все параметры будут браться от альтернативных настроек.


ТП на экстремуме:
Спойлер

При TP_OnLastExrtem. Параметр SizeOfTP будет являться числовым значением на которое уменьшается полученный Хай экстремума или увеличивается полученный Лой экстремума. Экстремумы должны быть соответственно выше либо ниже цены открытия и быть выше/ниже LvlOfTP бар соседних баров. При использовании альтернативного ТП все параметры будут браться от альтернативных настроек.


ТП на Хае/Лое:
Спойлер

При TP_OnHL. Параметр SizeOfTP будет являться числовым значением на которое уменьшается Хай или увеличится Лой являющиеся максимальными\минимальными за период PeriodOfTP от 0 бара. При
использовании альтернативного ТП все параметры будут браться от альтернативных настроек.


Нет ТП:
Спойлер

При NoTP. Функция вернет 0.


3.9 Функция получения СЛ.
Спойлер

Данная функция предназначена для получения значения уровня СЛ. Она объединяет типовые решения по постановки СЛ. Имеет несколько вариантов расчета и принципов вызова. Имеет альтернативный вариант настроек для решения проблемы с лимитами при открытии ордера через функцию библиотеки.

double GiveMeMySL(double Cen,int OrdType,double g_TP,SL_TYPE altSL)

Функция имеет 4 вводных параметра:
double Cen - цена от которой будет откладываться СЛ
int OrdType - Тип ордера для которого нужно получить СЛ
double g_TP - уровень ТП ордера. Если передан -1 то будет вызвана функция получения ТП
SL_TYPE altSL - альтернативный тип СЛ. обычно имеет -1. Используется если нужно расчитать по альтернативному варианту
Настройки:
Спойлер

string SPM_c3="Блок настроек СЛ";
enum SL_TYPE - здесь перечислены доступные виды СЛ
{
SL_Fix, // Фикс СЛ
SL_ByATR, // СЛ по АТР
SL_ByTP, // СЛ от ТП
SL_ByDiap, // СЛ от диапазона цен
SL_OnLastExrtem, // СЛ на экстремуме
SL_OnHL, // СЛ на Хае/Лое
NoSL // Нет СЛ
};
SL_TYPE TypeOfSL= SL_Fix; - тип основного СЛ
double SizeOfSL=50; - Параметр для расчета основного СЛ
int PeriodOfSL =30; - Период для расчета основного СЛ
int LvlOfSL =3; - Уровень для расчета основного СЛ
SL_TYPE TypeOfAlternationSL= SL_ByTP; - тип альтернативного СЛ
double SizeOfAlternationSL=5; - Параметр для расчета альтернативного СЛ
int PeriodOfAlternationSL=30; - Период для расчета альтернативного СЛ
int LvlOfAlternationSL=3; - Уровень для расчета альтернативного СЛ
int Progress_Optimization_SL=0; - зарезервировано для дальнейшей разработке в ключе оптимального
использования оптимизации при работе с СЛ


По умолчанию функция всегда использует СЛ тип которого выбран основным. В случае возникновения конфликтов используется альтернативный тип СЛ – например, при ошибке 130 после 2 попытки будут
комбинироваться применения альтернативных СЛ и ТП при открытии ордера. При этом в случае конфликта когда СЛ выбран от ТП, а ТП выбран от СЛ будет использован СЛ на последнем экстремуме.
Во всех режимах получения СЛ учитывается Стоп уровень и Уровень заморозки и при получении числового значения СЛ будет взят максимальный из трех этих значений.
Фикс СЛ:
Спойлер

При SL_Fix. Параметр SizeOfSL будет отвечать за размер в пунктах.
При 5знаке во время инициализации библиотеки будет проведено увеличение в 10 раз. При использовании альтернативного СЛ все параметры будут браться от альтернативных настроек.


СЛ по АТР:
Спойлер

При SL_ByATR. Параметр SizeOfSL будет являться множителем для значений индикатора АТР с периодом PeriodOfSL. При использовании альтернативного СЛ все параметры будут браться от альтернативных настроек.


СЛ от ТП:
Спойлер

При SL_ByTP. Параметр SizeOfSL будет являться множителем для значений размера Тейка, где множитель 2 будет значить что СЛ в 2 раза больше ТП. Если при этом функции не будет передано значение ТП, то оно
будет получено вызовом из функции. При использовании альтернативного СЛ все параметры будут браться от альтернативных настроек.


СЛ от диапазона цен:
Спойлер

При SL_ByDiap. Параметр SizeOfSL будет являться множителем для числового значения диапазона цен между максимальным Хаем и минимальным Лоем за период PeriodOfSL. При использовании альтернативного СЛ все параметры будут браться от альтернативных настроек.


СЛ на экстремуме:
Спойлер

При SL_OnLastExrtem. Параметр SizeOfSL будет являться числовым значением на которое увеличивается полученный Хай экстремума или уменьшается полученный Лой экстремума. Экстремумы должны быть соответственно выше либо ниже цены открытия и быть выше/ниже LvlOfSL бар соседних баров. При использовании альтернативного СЛ все параметры будут браться от альтернативных настроек.


СЛ на Хае/Лое:
Спойлер

При SL_OnHL. Параметр SizeOfSL будет являться числовым значением на которое увеличивается Хай или уменьшается Лой являющиеся максимальными\минимальными за период PeriodOfSL от 0 бара. При использовании альтернативного СЛ все параметры будут браться от альтернативных настроек.


Нет СЛ:
Спойлер

При NoSL. Функция вернет 0.


3.10 Функция получения Лота
Спойлер

Данная функция объединяет в себе основные тактики ММ. Для работы требует передачи размера СЛ при использовании риска на депозит.

double GiveMeMyLot(double SLSize)

Требует передачи единственного параметра:
double SLSize - размер СЛ в пунктах
Настройки:
Спойлер

string SPM_c4="Блок настроек ММ";
enum MM_Type – перечислены основные доступные тактики ММ
{
MM_FixLot, //Фикс лот
MM_DepoForMinLot, //Депо на мин лот
MM_Risk //Риск от депозита
};
MM_Type MMswitch=MM_FixLot; - выбор используемой тактики
double FixLot=0.1; - размер рабочего лота при тактике Фикс Лот
int SizeDepoForMinLot=100; - размер депозита на минимальный лот при тактике Депо на мин лот
double RiskPerDepo=3; - Процент средств депозита которыми рискуем при тактике Риск от депозита
double RiskPerProfit=5; - Процент средств прибыли которыми рискуем при тактике Риск от депозита
double SaveBal=1.2; - множитель при каком балансе переводим средства прибыли в средства депозита.

bool UseProfRiskTactic=false; - Использовать Тактику риска Осциллятор по Итогу
double IncMult=1.5; - Множитель коэффициент при росте осциллятора
double DecMult=0.7; - Множитель коэффициент при падении осциллятора
double MaxMult=2; - Максимальное значение коэффициента
double MinMult=0.1; - Минимальное значение коэффициента
int OsciPeriod=14; - Период осциллятора (не ставить очень маленьким)


По умолчанию используется Фикс лот. В случае если выбрана какая нить левая тактика не из перечисленных будет использоваться фикс лот. Если Лот меньше минимального возвращает минимальный, Если лот больше
максимального возвращает максимальный, если нехватает маржи не позволит открыть ордер.
При MM_FixLot.
Спойлер

Функция всегда будет возвращать значение FixLot.


При MM_DepoForMinLot.
Спойлер

Функция будет возвращать значение AccountBalance() деленное на SizeDepoForMinLot.


При MM_Risk.
Спойлер

Функция записывает в глобальные переменные значение баланса при запуске советника. И распределяет риски так:
Если баланс меньше установленного в глобальных переменных то Лот будет расчитан от средств баланса на RiskPerDepo на размер СЛ.
Если баланс больше установленного в глобальных переменных то Лот будет расчитан как средства изначального баланса на RiskPerDepo на размер СЛ + разница между балансом и установленным в глобальных переменных
на RiskPerProfit на размер СЛ.
Если баланс станет больше чем установленный в глобальных переменных * SaveBal то в глобальные переменные будет занесено значение предыдущего установленного значения баланса * SaveBal.
Это частично реализованная тактика пирамидинга позиции из мастер группы. Когда каждый последующая сделка дополнительно рискует частью полученной прибыли.
Соответственно, если необходимо реализовать простой процент от депо то выставляем RiskPerDepo и RiskPerProfit необходимый нам риск.


Тактика риска Осциллятор по Итогу
Спойлер

Это небольшая изюминка на тортике от ленивого программиста.
Данная функция мной использовалась только при ее тестировании в этой библиотеке.
На суд выставляется функция рискменеджмента. Осциллятор по итогу.
Как работает: Поднимается вся история торговли советником по паре Magic и Symbol. Берется некое число пунктов я кажется миллион выбрал. и по ходу от самого дальнего к самому свежему к этому числу прибавляется число пунктов заработанное советником от открытия до закрытия.
Затем по вот этому изменению суммы пунктов строится осциллятор с настроенным периодом.
Так же имеется сохраняемый в глобальных переменных множетель.
При вызове функции мы загружаем значение множителя (если сохраненного нет то 1).
Если последнее движения осциллятора вниз(или вгрызается в дно, т.е. =0) то множитель умножается на параметр DecMult.
Если последнее движение осциллятора вверх (или вгрызается в потолок, т.е. =100) то умножается на параметр IncMult.
Дальше идут проверки:
И специально для Культа "Мартинопоклонников": если множитель равен 0, то примем его равным 1 v:)
Если новый множитель больше максимального то мы примем его равным максимальному.
Если новый множитель меньше минимального то примем его равным минимальному.
Затем сохраняем значение.
Передаем его в функцию получения лота.

Функция получения лота работает как и положено.
После расчета рабочего лота. Если активирована функция риск менеджмента. То лот умножается на полученный множитель. Отправляется на проверку валидности. После чего возвращает значение Лота.


Послание ордену "Мартинопоклонников"
Спойлер

Хотя и не на прямую, но сделать практически мартин при помощи средств библиотеки можно!
Для этого: Включаем Тактику риска Осциллятор по Итогу. IncMult =0. DecMult=Требуемый множитель мартина. MaxMult = очень очень много. OsciPeriod делаем в районе 10 (ниже можно но не меньше 3х и то возможны ошибки). Тогда после совершения OsciPeriod +1 сделок при каждом отрицательном итоге лот будет умножаться на множитель. А когда будет положительная сделка умножится на 0. И обрабатывая это исключение станет равным 1. Еще одним аспектом будет то что использовать нужно фиксированный лот. Но для проверки то сойдет=)



3.11 Функция получения количества ордеров
Спойлер

Данная функция возвращает количество ордеров по символу советника, к которому подключена библиотека и с ее магическим номером. Возвращает количество ордеров с заданным параметром.

int CountOrderInTrade(int Type)

Требует передачи 1 параметра.
int Type - может быть одним из следующих:
Спойлер

0 – возвращает количество Buy ордеров;
1 – возвращает количество Sell ордеров;
2 – возвращает количество BuyLimit ордеров;
3 – возвращает количество SellLimit ордеров;
4 – возвращает количество BuyStop ордеров;
5 – возвращает количество SellStop ордеров;
-1 – количество рыночных ордеров;
-2 – количество лимитных ордеров;
-3 – количество стоповых ордеров;
-4 – все отложенные ордера;
-5 - вообще все ордера с символом и магическим номером.



3.12 Функция закрытия ордеров
Спойлер

Данная функция закрывает или отменяет все ордера принадлежащие советнику на заданном символе с заданным Магическим номером. Возвращает количество закрытых ордеров.

int CloseOrders(int Type)

Требует передачи 1 параметра.
int Type - может быть одним из следующих:
Спойлер

5 - отменить все Стоповые ордера на продажу
4 - отменить все Стоповые ордера на покупку
3 - отменить все Лимитные ордера на продажу
2 - отменить все Лимитные ордера на покупку
1 - закрыть все Рыночные ордера на продажу
0 - закрыть все Рыночные ордера на покупку
-1 - закрыть все Рыночные ордера
-2 - отменить все Лимитные ордера
-3 - отменить все Стоповые ордера
-4 - отменить все Отложенные ордера
-5 - закрыть или отменить Все ордера



3.13 Функция Открытия Ордера
Спойлер

Библиотека имеет свою встроенную функцию для открытия ордера.
Которая может использоваться как для открытия, так и для модификации ордера.

bool SPM_OpenOrder(int _Type,double _Cen,double _SL,double _TP,double _Lot,string _comment,datetime time_limit,int tt)

Входные параметры:
int _Type, - тип ордера может быть следующим:
Спойлер


5 - Выставить Стоповый ордер на продажу
4 - Выставить Стоповый ордер на покупку
3 - Выставить Лимитный ордер на продажу
2 - Выставить Лимитный ордер на покупку
1 - Открыть рыночный ордер на продажу
0 - Открыть рыночный ордер на покупку
-1 - используется для модификации ордера
-2 - открыть неопределенный ордер на покупку
-3 - открыть неопределенный ордера на продажу


double _Cen, - цена открытия. Доступна блиц настройка при передаче -1
double _SL, - уровень СЛ. Доступна блиц настройка при передаче -1
double _TP, - уровень ТП. Доступна блиц настройка при передаче -1
double _Lot, - Объем ордера. Доступна блиц настройка при передаче -1
string _comment, - комментарий который необходимо выставить
datetime time_limit, - Время жизни ордера в секундах, при открытии рыночных может быть любым, если отложенному ордеру передать 0 то он не будет иметь времени истечения
int tt – тикет, если необходимо провести модификацию. Иначе нужно передать 0
Что такое Блиц настройка?
Быстрая настройка означает что значение данного параметра будет получено из функции открытия согласно внешних параметров.
Что такое неопределенный ордер?
Неопределенным ордер обозначается потому что в зависимости от внешних настроек он может быть открыт как на покупку так и на продажу (при активации реверса), а так же может быть Рыночным, Лимитным или Стоповым ордером.
За это отвечают 2 параметра в блоке настроек цены открытия:
Спойлер



enum Open_TYPE{
Open_Market, //Рыночные ордера
Open_Limit, //Лимитные ордера
Open_Stop //Стоповые ордера
};
extern Open_TYPE UseTypeOfOpen=Open_Market; // - тип ордера при неопределенном открытии
extern bool Rewerse_Open=false; // - Реверсирование входа

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

3.14 Функция сигнала о новом баре
Спойлер

Функция не имеет переменных при вызове на новом баре возвращает True, либо возвращает False если вызов на текущем баре осуществлялся.

bool fNewBar()



4 Замечания от разработчика
Спойлер

1 Данная библиотека находится в разработке (вечной разработке :d). Я уверен, что не всеобъемлюще провел тестирование всех комбинаций функционала, поэтому прошу при возникновении проблем полностью описывать проблему в деталях, делать скрины, предоставлять логи журналов тестера (или если это счет то журнала экспертов и лог терминала). Сет настроек эксперта. А так же внутренний лог файл библиотеки желательно с самым подробным логированием. В общем для решения проблемы я должен понять как ее воспроизвести.
2 При возникновении проблем с объявлением переменных не заменять их в библиотеке, иначе это будет уже персональная ее копия и решать проблемы в ней вы должны сами.
3 На этапе разработки не делать дубляжи со своими правками, сделайте ТЗ, замечания, записки пожелания и оставьте их в теме разработки на форуме.
4 Библиотека еще толком не обкатана и не проверена. Я провел первичные тесты работоспособности и комбинирования функционала, а так же отладки. Ну еще мб 5-10 сов для проверки идей написал. Но все равно внимательно наблюдайте за работой.
5 При создании своих сетов тактик сопровождения:
1) Все они должны храниться в папке с наименованием библиотеки в каталоге Presets;
2) В начале не следует указывать никаких спецсимволов;
3) Формат имени файла для многоуровневого сопровождения:
«SPM»«номер версии»«MLS»«название тактики» «номер уровня начала настроек такики + количество задействованных уровней» + Дабы себя увековечить Свой ник пишем в самом конце, что бы он не не мешал
группировке сетов по тактикам. Все пункты разделяем нижним подчеркиванием «_».
Например: SPM_0.3_MLS_Save_7_2lvl - значит что библиотека SPM версия 0.3 многоуровневая тактика Save начинается с 7 уровня, задействует 2 уровня.
SPM_0.3_MLS_Save_3_2lvl_Ttomas - значит что библиотека SPM версия 0.3 многоуровневая тактика Save начинается с 3 уровня, задействует 2 уровня подготовлена Ttomas’ом
Если тактика не касается многоуровневого сопровождения то формат должен быть следующий: «SPM» «номер версии» «блок которого касается (OP,SL,TP,MM)» «название тактики» + Дабы себя увековечить Свой ник пишем
в самом конце что бы он не не мешал группировке сетов по тактикам. Все пункты разделяем нижним подчеркиванием «_».
Например: SPM_0.3_MM_RiskAll_1% - значит что библиотека SPM версия 0.3 меняется ММ на полный риск 1% от депозита.
SPM_0.3_SL_Extr+ByTP0.5 - библиотека SPM версия 0.3 меняется СЛ Основной СЛ на последний экстремум + альтернативный СЛ от ТП в 2 раза меньше
SPM_0.3_TP_BySL2+Dia0.3^50. - библиотека SPM версия 0.3 меняется ТП основной :ТП от СЛ в 2 раза больше + альтернативный ТП 0.3 от диапазона цен за 50 период.
4) После указания имени и сохранения сета открываем файл в блокноте и удаляем все строки с параметрами которые не задействованы в тактике, это нужно чтобы при загрузке параметров не сбивались другие настройки библиотеки или советника где она применена.



Шпаргалка программиста
Спойлер


Тут приведены примеры использования библиотеки.
Типовой советник.
Код:

Спойлер


//===== Начало параметров Библиотеки =====
#include
int OnInit()
{
MathSrand(3234234124);
return(INIT_SUCCEEDED);
}
void OnDeinit(const int reason)
{
SoloPM_DeInit();
}
void OnTick()
{
SoloPositionManager();
if (fNewBar()==true)
{
if (CountOrderInTrade(-5)==0)
{
if (MarketInfo(Symbol(),MODE_SPREAD) {
int c=MathRand();
if (c {
SPM_OpenOrder(-2,-1,-1,-1,-1,"",6*Period(),0);
}
if (c>16384)
{
SPM_OpenOrder(-3,-1,-1,-1,-1,"",6*Period(),0);
}
}
}
}
}

Описание:
Спойлер

Производится первоначальное подключение советника согласно инструкции. На каждом новом баре мы проверяется отсутствие ордеров принадлежащих советнику. Если ордеров нет, то согласно сигналу стратегии открываются ордера. В данном случае сигналом служит ГСЧ. При открытии ордера использовались Type =-2 и -3 это значит что ордера откроются согласно внешних настроек. Время жизни ордера передано = 6*Period() что значит через 6 бар текущего графика если ордер будет отложенным и не активируется отложка будет удалена. Тикет = 0 так как это открытие нового ордера. Остальные параметры переданы -1 и будут получены из функции открытия ордера автоматически.


Советник лимитками по круглым уровням.
Код:
Спойлер

void OnTick()
{
SoloPositionManager();
if (fNewBar()==true)
{
if (CountOrderInTrade(-4)==1)
{
int l=CloseOrders(-4);
}
if (CountOrderInTrade(-5)==0)
{
if (MarketInfo(Symbol(),MODE_SPREAD) {
int C1=MathCeil(Ask/Point()/1000)*1000*Point();
int C2=MathFloor(Ask/Point()/1000)*1000*Point();

SPM_OpenOrder(2,C2,-1,-1,0.5,"",10*Period(),0);
SPM_OpenOrder(3,C1,-1,-1,0.5,"",10*Period(),0);
}
}
}
}

Описание:
Спойлер

Подключение библиотеки согласно инструкции. Привожу только функцию на тике. Сигнал получаем только на новом баре. Если в наличии только один отложенный ордер то удаляем его, параметр (-4 согласно инструкции). Если ордеров в торговле нет то расчитываем круглые уровень сверху и снизу от цены и выставляем на них лимитные ордера(Тип=2 и 3) при этом я передал в параметр лота 0.5. Время жизни установил 10 бар текущего графика. Остальные параметры согласно внешних настроек.


Позже потихоньку буду добавлять еще примеры использования

Пример реализации проекта с использованием библиотеки:
Спойлер


Тут будет приведен пример чуть более продвинутое использование библиотеки.
1 - Составляем техническое задание:

Спойлер

Есть 2 периода анализа цены следующие один за другим. Для каждого периода расчитывается среднеарифметическое изменение цены.
Если изменение цены для обоих периодов меньше установленного то считается что на рынке флет и следует выставить лимитные ордера по границе канала с СЛ = половине ширины канала.
Если среднеарифметическое изменение цены двух периодов больше установленного коэффициента, а знаки разнонаправлены то это значит что на рынке наблюдается коррекция тренда и следует выставить стоповый ордер в направлении 2 периода на Хае\Лое, который является самым высоким\низким за 1 период+2 бара.
При смене тенденции рынка все отложенные ордера удаляются.
При однонаправленном открытии противоположные ордера закрываются\удаляются.
ТП равен 2 размерам СЛ.


2 - Код советника:
Спойлер




extern int AnPer=6;
extern int AnPer2=10;
extern double Koef=2;
//===== Начало параметров Библиотеки =====
#include
int OnInit()
{
return(INIT_SUCCEEDED);
}
void OnDeinit(const int reason)
{
SoloPM_DeInit();
}
void OnTick()
{
SoloPositionManager();
if (fNewBar()==true)
{
double ma1[11];
ArrayFree(ma1);
ArrayResize(ma1,AnPer);
double maM[11];
ArrayFree(maM);
ArrayResize(maM,AnPer2);
double M1=0;
double m2=0;
for (int lo=1;lo {
ma1[lo-1]=(Close[lo]-Close[lo+1])/Point();
M1+=ma1[lo-1];
}
M1=M1/AnPer;
for (int l1=AnPer+1;l1 {
maM[l1-AnPer-1]=(Close[l1]-Close[l1+1])/Point();
m2+=maM[l1-AnPer-1];
}
m2=m2/AnPer2;
if (MathAbs(M1) {
Print ("11 "+M1+" "+m2);
if (CountOrderInTrade(-4)>0)
{
CloseOrders(-4);
}
UseTypeOfOpen=Open_Limit;
PeriodOfSL=AnPer+AnPer2;
PeriodOfOP=AnPer+AnPer2;
if (CountOrderInTrade(-5)==0)
{
SPM_OpenOrder(-2,-1,-1,-1,-1,"",0,0);
SPM_OpenOrder(-3,-1,-1,-1,-1,"",0,0);
}
}
if (M1>0 && m2=Koef && M1 {
Print ("22 "+M1+" "+m2);
if (CountOrderInTrade(3)>0)
{
CloseOrders(3);
}
if (CountOrderInTrade(5)>0)
{
CloseOrders(5);
}
if (CountOrderInTrade(1)>0)
{
CloseOrders(1);
}
UseTypeOfOpen=Open_Stop;
PeriodOfSL=AnPer+2;
PeriodOfOP=AnPer+2;
if (CountOrderInTrade(-5)==0)
{
SPM_OpenOrder(-2,-1,-1,-1,-1,"",0,0);
}
}
if (M10 && MathAbs(M1)>=Koef && MathAbs(M1) {
Print ("33 "+M1+" "+m2);
if (CountOrderInTrade(2)>0)
{
CloseOrders(2);
}
if (CountOrderInTrade(4)>0)
{
CloseOrders(4);
}
if (CountOrderInTrade(0)>0)
{
CloseOrders(0);
}
UseTypeOfOpen=Open_Stop;
PeriodOfSL=AnPer+2;
PeriodOfOP=AnPer+2;
if (CountOrderInTrade(-5)==0)
{
SPM_OpenOrder(-3,-1,-1,-1,-1,"",0,0);
}
}
}
}


3 - Настройка параметров:
Спойлер

Для упрощения оптимизации в ходе реализации ТЗ в зависимости от случая производится настройка внешних параметров внутри советника. То есть решение о выборе периода поиска диапазона для СЛ и Цены открытия зашито внутрь советника и это не позволяет оптимизировать их в нарушении логики (например если период флета 15 бар, а границу диапазона для открытия лимиток искать по 30 бар). Так же выбор типа ордера происходит переключением внутри советника. Но функция реверса будет доступна как и прежде.
Остальные параметры которые требуется настроить извне:
TypeOfSL= СЛ от диапазона цен
SizeOfSL = 0.5
TypeOfTP = ТП от СЛ
SizeOfTP= 2.0
Rewerse_Open=False
TypeOfOP = Отложка на Хае/Лое
SizeOfOP = 10
На этом проект можно назвать готовым.
Остальные настройки в том числе сопровождения изменить По вкусу и Убеждениям =)


SPM_v0.1.rar
SPM_v0.3.rar

Изменено пользователем Ttomas
  • Лайк 30
Ссылка на сообщение
Поделиться на другие сайты

Разработка библиотеки сопровождения одиночных ордеров Опубликовано

имхо, даже простая библиотека расчёта лота, открытия, изменения СЛ+ТП, и закрытия ордера, с обработкой ошибок, логированием событий, легко подключаемая к сове, уже будет сильно востребована.
Но хотел-бы обратить Ваше внимание на то, что кроме частичного закрытия будет и частичное открытие ордеров и на мой взгляд надо писать сразу для нетто позиции.
Реализовать как класс или структуру и если у кого-нибудь возникнет нужда в локировании, то всегда можно объявить пару экземпляров...

Успехов!

Ссылка на сообщение
Поделиться на другие сайты

Разработка библиотеки сопровождения одиночных ордеров Опубликовано

Подскажите пожалуйста вот в каком вопросе:
Сейчас все еще занимаюсь частичным закрытием ордеров. Дабы новые ордера наследовали состояния от старых с пометками о изначальном лоте и прочем нужно менять тикет в таблице состояния.
Судя по всему в в новом ордере после частичного закрытия меняется коммент на типовой формата "from #ХХХХХХ"
где ХХХХХ тикет изначального ордера. Будет ли достаточным проверять все ордера в терминале с целью поиска нового ордера с данным комментом чтобы заменить его в таблице состояния?

Ссылка на сообщение
Поделиться на другие сайты

Разработка библиотеки сопровождения одиночных ордеров Опубликовано

Судя по всему в в новом ордере после частичного закрытия меняется коммент на типовой формата "from #ХХХХХХ"
где ХХХХХ тикет изначального ордера. Будет ли достаточным проверять все ордера в терминале с целью поиска нового ордера с данным комментом чтобы заменить его в таблице состояния?



Такое поведение не регламентировано. Т.е. скорее да, комментарий будет иметь вид, "from #ХХХХХХ". Во многих библиотеках это используется. Но лучше идентифицировать ордера по другим признакам: время открытия, магик, символ, объем.
Ссылка на сообщение
Поделиться на другие сайты

Разработка библиотеки сопровождения одиночных ордеров Опубликовано
Спойлер


Судя по всему в в новом ордере после частичного закрытия меняется коммент на типовой формата "from #ХХХХХХ"
где ХХХХХ тикет изначального ордера. Будет ли достаточным проверять все ордера в терминале с целью поиска нового ордера с данным комментом чтобы заменить его в таблице состояния?



Такое поведение не регламентировано. Т.е. скорее да, комментарий будет иметь вид, "from #ХХХХХХ". Во многих библиотеках это используется. Но лучше идентифицировать ордера по другим признакам: время открытия, магик, символ, объем.


Спасибо.
Я априори использую фильтр магик + пара. Может тогда лучше искать Такое же время открытия как у изначального ордера + Расчитанный остаточный лот?
Ссылка на сообщение
Поделиться на другие сайты

Разработка библиотеки сопровождения одиночных ордеров Опубликовано

Может тогда лучше искать Такое же время открытия как у изначального ордера + Расчитанный остаточный лот?


Да, думаю, это хороший вариант.
Ссылка на сообщение
Поделиться на другие сайты

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

Частичное закрытие с комментариями в остаточном ордере from #xxx и закрытой части to #xxx СТАНДАРТНЫ и ничего мудрить тут не надо. Не надо "искать" и гадать какой ордер от какого отпал. Это стандартное поведение ордеров в мт4.
p.s. пожелание к библиотеке - закрытие встречным ордером не забудьте добавить

Изменено пользователем nixxer
  • Лайк 3
Ссылка на сообщение
Поделиться на другие сайты

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

Отчет о состоянии разработки:
Решил не мудрить и оставил отслеживание нового тикета по #XXX в комментарии ордера.
Закончил с сопровождением и сохранением массива состояния.

Прислушался к 0ll и nixxer, и изменил планы по библиотеке:
Объединю библиотеку что разрабатываю сейчас с той что использую в своих совах которая содержит функции открытия, закрытия, получения ТП, получения СЛ, получения Лота, получения количества ордеров, определения начала бара и тд. И доработаю функции попрактичней.
Обдумываю независимое логирование событий которые происходят в функциях библиотеки.


Добавлено: 13-01-2018 19:45:12

У меня возник вопрос.
Сейчас делаю более удобные и емкие функции получения ТП и СЛ.
Внедрил вот такие варианты ТП: Фикс, По АТР, По Диапазону, По СЛ, Нулевой.
Для СЛ аналогично: Фикс, По АТР, По Диапазону, По ТП, нулевой.
для настройки ТП, СЛ требуется по 3 параметра:
1) Выбор типа - определяем по какому принципу определяется тп или сл;
2)Некий коэффициент - если фикс то помножается на размер пункта и прибавляется к цене, если по АТР то значение атр умножается на него, если по диапазону то диапазон умножается на этот коэффициент, если от ТП/СЛ то их размер умножается на данный параметр;
3) период - при АТР является периодом, при Диапазоне является количеством бар на котором ищутся макс хай и мин лой их разница является шириной диапазона.
В любом режиме в случае получения тп\сл для рыночных ордеров проходит проверка на Стоп уровень и уровень заморозки. Выбирается наибольший.
Обработку случая когда ТП задействован от СЛ, а СЛ задействован от ТП уже сделал в этом случае будет автоматом выбран от АТР ( диапазон коэффициентов которые будут использоваться должны примерно совпасть)
Хочу ввести еще по одному виду цели: Локальный Экстремум - типо иметь возможность Тп или СЛ или все вместе спрятать за ближайшим соответствующим экстремумом. Но не хочется добавлять еще один параметр поэтому как смотрите на то что бы 2 параметр отвечал за количество бар справа и слева которые ниже/выше экстремума? Период будет скорее всего незадействован. Изменено пользователем Ttomas
  • Лайк 2
Ссылка на сообщение
Поделиться на другие сайты

  • 2 weeks later...
Разработка библиотеки сопровождения одиночных ордеров Опубликовано

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

  • Лайк 7
Ссылка на сообщение
Поделиться на другие сайты

  • 2 months later...
Разработка библиотеки сопровождения одиночных ордеров Опубликовано

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

  • Лайк 1
Ссылка на сообщение
Поделиться на другие сайты

Разработка библиотеки сопровождения одиночных ордеров Опубликовано

почему только одиночных? даешь всех ордеров!

  • Лайк 1
Ссылка на сообщение
Поделиться на другие сайты

  • 4 weeks later...
Разработка библиотеки сопровождения одиночных ордеров Опубликовано

Доброго времени суток!
Я в основном работаю с проектами которые требуют одиночного ордера, остальные мало интересуют, поэтому собрал то что мне нужно в одну библиотеку.
Никого не принуждаю ее использовать.
Да и по честному загруженность работой не позволяет даже эту довести до ума.
То что она работает с одиночными ордерами не значит 1 ордер на счет. Функции отлично обработают и 10 и 100 ордеров, но каждый по отдельности.

На днях решил проверить идею одного фильтра, 4 копипаста, сигнал с машек и 20 строк кода фильтра - совокупно ровно 30 минут работы для проверки совы с объемным сопровождением! Цель которую я преследовал вполне уже реализована.

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

  • Лайк 6
Ссылка на сообщение
Поделиться на другие сайты

Разработка библиотеки сопровождения одиночных ордеров Опубликовано

Возник еще вот такой вопрос.
Сделал полноценную работу с отложками.
Теперь пришла идея небольшой доработки:
Что если вызовом функции открытия ордера отправлять только направление сделки а в настройки вывести параметр используемого типа ордера и вторым параметром реверс.
Например:
В настройках пишем Использовать лимитные ордера
За ближайшим экстремумом
ТП = 2 СЛ
СЛ=3 АТР

В теле советника - просто вызываем функцию с параметром направления
и библиотека сама выставит лимитку за экстремум с ТП СЛ и лотом

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

Ссылка на сообщение
Поделиться на другие сайты

Разработка библиотеки сопровождения одиночных ордеров Опубликовано

Имхо, я бы не стал объединять выставление ордеров и экстремумы, атр и прочее, нужно отедельно:
- выставление ордера, туда входит проверка на корректность уровней СЛ/ТП, цены отложки, обработка ошибок.
- расчёт лотности ордера, с проверками на корректность и достаточность маржи
- расчёт атр, экстремумы, фракталы и прочее - это отдельно по вкусу, выпали условия, рассчитали параметры ордера, передали в библиотеку и больше не надо заморачиваться.

  • Лайк 2
Ссылка на сообщение
Поделиться на другие сайты

Разработка библиотеки сопровождения одиночных ордеров Опубликовано
0ll, полностью согласен.
Я все перечисленные пункты заложил в библиотеку.
И если при открытии ордера передавать ему параметры напрямую все будет работать как обычное открытие (ну только обрабатывая ошибки)
Но если передать вместо параметра -1 (за исключением типа ордера где в этом случае нужно передавать еще и тикет для совершения модификации) то параметр будет получен в библиотеке.

Например удобно настроить в ММ риск на депозит скажем 2% передать в функцию все параметры кроме лота передав вместо него -1 и библиотека вызовет функцию получения лота передав в нее размер СЛ и сама получит его размер.

То же самое касается случаев когда ТП зависит от СЛ или наоборот. Ведь часто такое бывает что в ТЗ сказано СЛ за экстремум а ТП в 2 раза больше СЛ. Тогда передаем в функцию открытия уровень СЛ, а вместо ТП передаем -1. Библиотека сама расчитает размер ТП получит его уровень и вернет обратно в функцию открытия.

Так же несмотря на огромнейшее разнообразие ТП и СЛ их все можно разделить на несколько групп. Получение самых очевидных я внес внутрь. Можно их получить вызовом соответствующей функции и прямой передачей в функцию открытия. А если они не нужны для внутренних расчетов сигнала то можно передавать -1.

Как и везде тут есть свои плюсы и минусы. Очевидным Плюсом можно назвать то что не все проблемы открытия можно решить с заранее известными значениями. Например если мы знаем что нам нужен СЛ =1 АТР и ТП =2 АТР. Но перед новостью чуть расширят Уровень Заморозки и ордер не откроется хотя все по правилам. Библиотека это обработает.
Тут рассматривается с 10ток самых типовых проблем, от неправильных ТП и СЛ до пропажи связи, блокировки счета, отсутствия цен и прочих. И это может сместить цену открытия, а при жесткой передачи уровня ТП и СЛ она может сместится нарушив соотношения.

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

Третья положительная сторона: Человекочасы.
Очень часто при разработке любой идеи от маленькой до большой возникает множество идей по улучшению которые хочется проверить. Но все мы люди занятые. А каждая идея требует времени и внимания программиста. Библиотека предлагает переложить эту нагрузку на пользователей.
Отрицательная сторона в том что любой проект будет более гибок и возникнет большее количество параллельных направлений тестирования и их систематизация станет настоящим кошмаром!

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

  • Лайк 1
Ссылка на сообщение
Поделиться на другие сайты

Разработка библиотеки сопровождения одиночных ордеров Опубликовано

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

1) Сделан полноценный логгер.

Спойлер


Лог представлен в виде текстового файла.
C именем ГГГГ.ММ.ДД_Symbol()_Magic.txt

В файле сообщения имеют формат:
ГГГГ.ММ.ДД ЧЧ:ММ Тип сообщения Текст Сообщения

Существует 4 типа сообщения : Error, Warning, Info, Default

Логгер имеет 2 параметра настройки:
bool LogPerDay
Если имеет параметр True то каждый день будет создаваться новый файл лога.
Если имеет параметр False файл будет создан при инициализации библиотеки и содержать сообщения за весь период работы (удобно при тестировании).

Int LoggerLvl
При значениях При значении 0 будут только несколько записей в основном при вызове главной функции (сделал так чтоб видеть циклы работы) с типом сообщения Default.
При значении 1 будут отображаться еще и Ошибки с типом сообщения Error.
При значении 2 будут отображаться еще и Предупреждения с типом сообщения Warning.
При значении >=3 будут отображаться еще и отладочные сообщения с типом сообщения Info.

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

Для отправки сообщения в лог нужно вызвать функцию логгера. И передать 2 параметра.
1 - тип сообщения (MESS_Normal - для отправки Default
MESS_Info - для отправки Info
MESS_Warning - для отправки Warning
MESS_Error - для отправки Error
2 - Текст сообщения
Как это выглядит в коде библиотеки:


if (LoggerLvl>=2)
{
Logger(MESS_Warning,"Запись неудалась, не создался файл");
}

или

if (LoggerLvl>=1)
{
Logger(MESS_Error,"Возникла непреодалимая ошибка : "+IntegerToString(err));
}


2) Добавлена функция закрытия ордеров
Спойлер


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

Спойлер

5 - отменить все Стоповые ордера на продажу
4 - отменить все Стоповые ордера на покупку
3 - отменить все Лимитные ордера на продажу
2 - отменить все Лимитные ордера на покупку
1 - закрыть все Рыночные ордера на продажу
0 - закрыть все Рыночные ордера на покупку
-1 - закрыть все Рыночные ордера
-2 - отменить все Лимитные ордера
-3 - отменить все Стоповые ордера
-4 - отменить все Отложенные ордера
-5 - закрыть или отменить Все ордера


Функция вернет количество закрыты/отмененных ордеров.
int co=CloseOrders(-5);

Если необходимо закрыть определенный рыночный ордер с известным тиккетом то можно воспользоваться следующей функцией ( если лот не известен можно отправить макс лот ордера биржи (больше чем есть не закроет)):

if (PartCloseBloc(OrderTicket(), OrderLots()) ==0)
{
Print ("Ордер закрыт");
}

PartCloseBloc может вернуть 3 состояния: 0 - ордер закрыт полностью, -1 ордер не закрыт, N - новый тиккет если у ордера закрылась только часть.
PartCloseBloc доступна и в первой версии библиотеки.


3) Функция получения цены открытия.
Спойлер


Данная функция при своем вызове возвращает цену открытия ордера и имеет 2 параметра:

double GiveMeMyOpenPrice(int OrdType, OP_TYPE altOP)

OrdType - тип ордера цену которого необходимо вернуть
altOP - принудительный тип расчета цены открытия (если не используется альтернатива то передается -1)
В любом случае если передать тип 0 или 1 то функция вернет текущие Ask или Bid.
Блок настроек Цены открытия содержит следующие параметры:
Спойлер


enum OP_TYPE
{
OP_Fix, //Отложка на фикс отступе
OP_ByATR, //Отложка на АТР
OP_ByDiap, //Отложка от диапазона цен
OP_OnLastExrtem, //Отложка на экстремуме
OP_OnHL, //Отложка на Хае/Лое
NoOP //Не Отложка
};
extern OP_TYPE TypeOfOP=OP_Fix; // - Основной тип расчета цены открытия
extern double SizeOfOP=50; // - Размер для расчетов Основного типа
extern int PeriodOfOP=30; // - Период для расчетов Основного типа
extern int LvlOfOP=3; // - Уровень для расчетов Основного типа
extern OP_TYPE TypeOfAlternationOP=OP_OnHL; // - Альтернативный тип расчета цены открытия
extern double SizeOfAlternationOP=5; // - Размер для расчетов Альтернативного типа
extern int PeriodOfAlternationOP=30; // - Период для расчетов Альтернативного типа
extern int LvlOfAlternationOP=3; // - Уровень для расчетов Альтернативного типа
extern int Progress_Optimization_OP=0; // - в планах, зарезервировано


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


Отложка на фикс отступе.

Спойлер

Нужно настроить параметр на OP_Fix.
При данном типе цена будет расчитана как (Ask или Bid) + SizeOfOP для Стопового ордера на покупку или Лимитного ордера на Продажу
Или (Ask или Bid) - SizeOfOP для Стопового ордера на Продажу или Лимитного ордера на Покупку.
При вызове расчетов Альтернативного уровня цены открытия будет использоваться SizeOfAlternationOP.


Отложка на АТР
Спойлер

Нужно настроить параметр на OP_ByATR.
При данном типе цена будет расчитана как (Ask или Bid) + SizeOfOP*ATR(с периодом PeriodOfOP) для Стопового ордера на покупку или Лимитного ордера на Продажу
Или (Ask или Bid) - SizeOfOP*ATR(с периодом PeriodOfOP) для Стопового ордера на Продажу или Лимитного ордера на Покупку.
При вызове расчетов Альтернативного уровня цены открытия будет использоваться SizeOfAlternationOP и PeriodOfAlternationOP соответственно.


Отложка от диапазона цен
Спойлер

Нужно настроить параметр на OP_ByDiap.
При данном типе цена будет расчитана как (Ask или Bid) + SizeOfOP*(Максимальный High(за период PeriodOfOP)- Минимальный Low(за период PeriodOfOP)) для Стопового ордера на покупку или Лимитного ордера на Продажу
Или (Ask или Bid) - SizeOfOP*(Максимальный High(за период PeriodOfOP)- Минимальный Low(за период PeriodOfOP)) для Стопового ордера на Продажу или Лимитного ордера на Покупку.
При вызове расчетов Альтернативного уровня цены открытия будет использоваться SizeOfAlternationOP и PeriodOfAlternationOP соответственно.


Отложка на экстремуме
Спойлер

Нужно настроить параметр на OP_OnLastExrtem.
В данном случае будет произведен поиск в последних PeriodOfOP барах бар, High которого больше High LvlOfOP баров до и после него. При этом цена открытия будет расчитана как High( найденного бара) + SizeOfOP для Стопового ордера на покупку или Лимитного ордера на Продажу.
В данном случае будет произведен поиск в последних PeriodOfOP барах бар, Low которого меньше Low LvlOfOP баров до и после него. При этом цена открытия будет расчитана как Low ( найденного бара) - SizeOfOP для Стопового ордера на Продажу или Лимитного ордера на Покупку.
При вызове расчетов Альтернативного уровня цены открытия будет использоваться SizeOfAlternationOP, PeriodOfAlternationOP и LvlOfAlternationOP соответственно.


Отложка на Хае/Лое
Спойлер

Нужно настроить параметр на OP_OnHL.
В данном случае будет произведен поиск в последних PeriodOfOP барах максимального High. При этом цена открытия будет расчитана как High( найденного бара) + SizeOfOP для Стопового ордера на покупку или Лимитного ордера на Продажу.
В данном случае будет произведен поиск в последних PeriodOfOP барах Минимального Low. При этом цена открытия будет расчитана как Low ( найденного бара) - SizeOfOP для Стопового ордера на Продажу или Лимитного ордера на Покупку.
При вызове расчетов Альтернативного уровня цены открытия будет использоваться SizeOfAlternationOP и PeriodOfAlternationOP соответственно.


Не Отложка
Спойлер

Нужно настроить параметр на NoOP.
В случае такой настройки будет всегда возвращаться Ask или Bid поэтому передавать другие варианты смысле нет. Только для рыночных ордеров.





4) Изменения в функции открытия
Спойлер


Функция открытия притерпела незначительные изменения.
При открытии ордера можно передать следующие типы открытия:

Спойлер


5 - Выставить Стоповый ордер на продажу
4 - Выставить Стоповый ордер на покупку
3 - Выставить Лимитный ордер на продажу
2 - Выставить Лимитный ордер на покупку
1 - Открыть рыночный ордер на продажу
0 - Открыть рыночный ордер на покупку
-1 - используется для модификации ордера
-2 - открыть неопределенный ордер на покупку
-3 - открыть неопределенный ордера на продажу


Что такое неопределенный ордер?
Неопределенным ордер обозначается потому что в зависимости от внешних настроек он может быть открыт как на покупку так и на продажу (при активации реверса), а так же может быть Рыночным, Лимитным или Стоповым ордером.
За это отвечают 2 параметра в блоке настроек цены открытия:
Спойлер



enum Open_TYPE{
Open_Market, //Рыночные ордера
Open_Limit, //Лимитные ордера
Open_Stop //Стоповые ордера
};
extern Open_TYPE UseTypeOfOpen=Open_Market; // - тип ордера при неопределенном открытии
extern bool Rewerse_Open=false; // - Реверсирование входа

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


5) Изменения в ММ.
Спойлер

Это небольшая изюминка на тортике от ленивого программиста.
Данная функция мной использовалась только при ее тестировании в этой библиотеке.
На суд выставляется функция рискменеджмента. Осциллятор по итогу.
Как работает: Поднимается вся история торговли советником по паре Magic и Symbol. Берется некое число пунктов я кажется миллион выбрал. и по ходу от самого дальнего к самому свежему к этому числу прибавляется число пунктов заработанное советником от открытия до закрытия.
Затем по вот этому изменению суммы пунктов строится осциллятор с настроенным периодом.
Так же имеется сохраняемый в глобальных переменных множитель.
При вызове функции мы загружаем значение множителя (если сохраненного нет то 1).
Если последнее движения осциллятора вниз(или вгрызается в дно, т.е. =0) то множитель умножается на параметр DecMult.
Если последнее движение осциллятора вверх (или вгрызается в потолок, т.е. =100) то умножается на параметр IncMult.
Дальше идут проверки:
И специально для Культа "Мартинопоклонников": если множитель равен 0, то примем его равным 1 v:)
Если новый множитель больше максимального то мы примем его равным максимальному.
Если новый множитель меньше минимального то примем его равным минимальному.
Затем сохраняем значение.
Передаем его в функцию получения лота.

Функция получения лота работает как и положено.
После расчета рабочего лота. Если активирована функция риск менеджмента. То лот умножается на полученный множитель. и отправляется на проверку валидности. После чего возвращается в место вызова.



Пост еще на оформлении, чуть позже закончу и выложу файлы
  • Лайк 5
Ссылка на сообщение
Поделиться на другие сайты

Разработка библиотеки сопровождения одиночных ордеров Опубликовано

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


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

Но без мануала по любому будет не о чем говорить...
Без мануала никак.
  • Лайк 2
Ссылка на сообщение
Поделиться на другие сайты

Разработка библиотеки сопровождения одиночных ордеров Опубликовано

Я когда начал оформлять правки наоборот подумал перенести мануал на форум, с спойлерами и кодовыми вставками очень удобно получается. Самому не удобно было искать в этом мануале раскиданные функции.
Ну еще будет 2-3 примера кода советников использующих библиотеку. Поэтому подумывал что лучше оформить весь мануал в 1 посте, а для скачивания сделать "Шпаргалку программиста".

  • Лайк 6
Ссылка на сообщение
Поделиться на другие сайты

Разработка библиотеки сопровождения одиночных ордеров Опубликовано

Я думаю эта тема будет более востребована в уголке программиста, чем в лаборатории.
Спасибо Ttomas за работу, примеры применения особенно понадобятся.

Ссылка на сообщение
Поделиться на другие сайты

Разработка библиотеки сопровождения одиночных ордеров Опубликовано
0ll, хотя мне тоже кажется, что актуальное место темы в уголке программистов, но если честно, я разрабатываю ее изначально для себя, ну и заодно решил поделиться с форумом. Закрытых разделов для гостей у нас не так и много. Поэтому считаю что пусть лучше тема будет тут, тогда для ее использования людям придется хотя бы зарегистрироваться и ну вообще малюсенький шанс, что они в ходе своей деятельности помогут форуму развиваться предоставляя свои идеи, выделяя время на тестирования разработок и тд.

Закончил править и переносить мануал, Сделал пару примеров, прикрепил библиотеку в 1 пост!
  • Лайк 9
Ссылка на сообщение
Поделиться на другие сайты

  • 9 months later...
Разработка библиотеки сопровождения одиночных ордеров Опубликовано

А как Вы думаете, будет интересен такой класс?
COrder (для МТ4, для МТ5 тоже есть костяк)
Конструктор (один из):
COrder(string mSymbol,int mType,double mPrice,int mSLDelta,int mTPDelta,int mDeviation, int mMagic, string mComment);
Публичные методы:
const int COrder::GetCount() - значение счетчика количества экземпляров класса.
ENUM_ORDER_STATE Control() - возвращает, после проверки и совершения торговых операций текущее состояние ордера (список приведен ниже).
bool Closing() - закрытие рыночного/удаление отложенного ордера.
void Modify(double mPrice,double mSL,double mTP) - модификация ордера
и т.д.

enum ENUM_ORDER_STATE
{
ORDER_NOT_INIT,
ORDER_INIT,
ORDER_PENDING,
ORDER_MUST_DEAL,
ORDER_DEAL,
ORDER_MUST_CLOSE,
ORDER_CLOSED,
ORDER_ERROR
};

Выглядит работа с ордером примерно так
COrder* order; - объявление ссылки на объект

order=new COrder(NULL,OP_BUY,0.0,sl_pips,tp_pips,-1,magic,NULL); -создание объекта.

if (order.Control()>ORDER_MUST_CLOSE) delete order; - контроль состояния ордера в процессе его "жизни".

Ссылка на сообщение
Поделиться на другие сайты

Разработка библиотеки сопровождения одиночных ордеров Опубликовано

А как Вы думаете, будет интересен такой класс?

Может и будет, особенно если с обработкой ошибок открытия и модификации, проверками корректности параметров, и состояние закрыт маловато - желательно добавить закрыт_СЛ, закрыт_ТП.
Ссылка на сообщение
Поделиться на другие сайты

Разработка библиотеки сопровождения одиночных ордеров Опубликовано

Может и будет, особенно если с обработкой ошибок открытия и модификации, проверками корректности параметров, и состояние закрыт маловато - желательно добавить закрыт_СЛ, закрыт_ТП.


Ага,
double GetProfit(bool mIsComissionInclude=true); - называется, для МТ4 невозможно (по крайней мере не придумал еще) достоверно определить произошло ли закрытие по TP/SL или вручную, в любом случае малый процент ошибки получится, а вот в МТ5 без проблем.
Класс уже с пол-года как эксплуатируется в реальных разработках.
Ссылка на сообщение
Поделиться на другие сайты

Разработка библиотеки сопровождения одиночных ордеров Опубликовано

в любом случае малый процент ошибки получится

Это нормально, проскальзывание на ТП/СЛ тоже возможно - так что большая точность не нужна, имхо.
Ссылка на сообщение
Поделиться на другие сайты

Разработка библиотеки сопровождения одиночных ордеров Опубликовано

Это нормально, проскальзывание на ТП/СЛ тоже возможно - так что большая точность не нужна, имхо.


А вот тут не соглашусь. Если разговор идет о библиотеке или фреймворке, то методы должны возвращать точную информацию, без неопределенности. Поэтому в МТ4 у меня таких методов не будет, пусть програмер сам оценивает тейкпрофит это был или ручное закрытие. Как вариант
ENUM_CLOSE_REASON GetCloseReason();

enum ENUM_CLOSE_REASON{
REASON_UNDEFINED,
REASON_TP, //если брокер в комменте поставил [tp]
REASON_SL //если брокер в комменте поставил [sl]
};
  • Лайк 1
Ссылка на сообщение
Поделиться на другие сайты

Для публикации сообщений создайте учётную запись или авторизуйтесь

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

Создать учетную запись

Зарегистрируйте новую учётную запись в нашем сообществе. Это очень просто!

Регистрация нового пользователя

Войти

Уже есть аккаунт? Войти в систему.

Войти
×
×
  • Создать...