Здравствуйте Уважаемые Форумчане.
Сопровождение ордеров это один из столпов всех советников. И, зачастую, достаточность и правильность сопровождения отделяет хороший советник от плохого. На форуме представлены множество советников и тем по ТЗ к ним. В каждой из них данный вопрос обстоит остро и поднимается чуть ли не с каждым обновлением версии. А если учитывать темы по ручной торговле, то тактик по сопровождению позиций можно и не счесть.
Итак представляю Вашему вниманию третью версию библиотеки.
Я постараюсь составить наиболее полную инструкцию по применению.
Составил чистые и несколько пресетов настройки для примера.
Что сделано:
Есть функция БУ;
функция трала:
стандартный Трал;
АТР трал;
трал по фракталам;
функция многоуровневого сопровождения;
функция получения Цены открытия;
функция получения ТП;
функция получения СЛ;
функция получения Лота;
функция открытия ордера;
функция закрытия ордеров;
функция частичного закрытия;
функция счетчика ордеров;
функция логгирования;
функция определения нового бара.
Провел отладку всего этого добра, решено много вопросов по техническим решениям. Библиотека сохраняет состояние наблюдаемых ордеров в файл. Библиотека подхватывает ордера с магическим номером по текущей паре, так что необязательно пользоваться встроенной функцией. Библиотека ведет независимый лог работы.
Многоуровневое сопровождение может одновременно обрабатывать множество ордеров. Может одновременно использовать любые комбинации блоков сопровождения.
Дребезга по СЛ и многократного закрытия по одному уровню быть недолжно.
Постарался по максимуму комментировать код, но кое где мог и пропустить.
Я так понимаю делаю не совсем то что ожидают, но зато то что хотелось бы видеть.
В планах: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
На этом проект можно назвать готовым.
Остальные настройки в том числе сопровождения изменить По вкусу и Убеждениям =)
