Библиотека функций для трейлинга TrailingAll

  • Автор темы Автор темы FXWizard
  • Дата начала Дата начала

FXWizard

Гуру форума
Библиотека функций для трейлинга TrailingAll



Функции:
void TrailingByShadows(int ticket, int tmfrm, int bars_n, int indent)

void TrailingByFractals(int ticket, int tmfrm, int frktl_bars, int indent)

void TrailingStairs(int ticket, int trldistance, int trlstep)

void TrailingUdavka(int ticket, int trl_dist_1, int level_1, int trl_dist_2, int level_2, int trl_dist_3)

void TrailingByTime(int ticket, int interval, int trlstep, bool trlinloss)

void TrailingByATR(int ticket,int atr_timeframe,int atr1_period,int atr1_shift,int atr2_period,int atr2_shift,double coeff,bool trlinloss)

void TrailingRatchetB(int ticket,int pf_level_1,int pf_level_2,int pf_level_3,int ls_level_1,int ls_level_2,int ls_level_3,bool trlinloss)

void TrailingByPriceChannel(int iTicket, int iBars_n, int iIndent)

void TrailingByMA(int iTicket, int iTmFrme, int iMAPeriod, int iMAShift, int MAMethod, int iApplPrice, int iShift, int iIndent)

void TrailingFiftyFifty(int iTicket,int iTmFrme,double dCoeff,bool trlinloss)

Описание: библиотека функций, осуществляющих трейлинг по различным алгоритмам:
TrailingByShadows() - по теням N последних свечей (на текущем или других таймфреймах);
TrailingByFractals() - по фракталам, образованным заданным количеством баров (на текущем или других таймфреймах).
TrailingStairs() - аналогичный стандартному трейлинг, который, однако, переносится "скачкообразно", с определённым, задаваемым шагом.
TrailingUdavka() - производный от стандартного трейлинга, но при прохождении заданных уровней профита дистанцию трейлинга сокращаем.
TrailingByTime() - через заданный интервал времени переносим стоплосс (при возможности и независимо от результатов по позиции) на заданный шаг.
TrailingByATR() - тралим на расстоянии в N x ATR.
Более подробное описание - см. в описании соответствующих функций.
TrailingRatchetB() - система быстрого поджатия в безубыток и "ступеньками" на начальном этапе роста профита, поджатие на "лоссовом" участке для предупреждения роста убытков после их "отката".
TrailingByPriceChannel() - трейлинг по противоположной границе ценового канала.
TrailingByMA() - трейлинг по скользящему среднему.
TrailingFiftyFifty() - по закрытии очередного бара расстояние между текущим курсом и стоплоссом уменьшаем в заданное кол-во раз.

Как использовать:
- скачать библиотеку (TrailingAll);
- поместить её в папку [директория MetaTrader'a]/experts/libraries;
- подключить её в вашем советнике;
- в соответствующем участке кода Вашего советника, в соответствующее время, выбрав предварительно конкретный ордер открытой позиции (функция OrderSelect()), вызвать необходимую функцию, указав её параметры;
 

Вложения

FXWizard

Гуру форума
Расширеное описание функций

Расширеное описание

Функция:
void TrailingByShadows(int ticket, int tmfrm, int bars_n, int indent,bool trlinloss)

Описание: для позиции с номером ticket трейлингует (передвигает в сторону профита) стоплосс по теням последних bars_n (условие: bars_n>0) баров на таймфрейме tmfrm (варианты: 1, 5, 15, 30, 60, 240, 1440, 10080, 43200); при изменении стоплосс размещается с отступом в indent (условие: indent не меньше 0) пунктов от минимума (при трейлинге длинных) или максимума (коротких позиций) соответствующего бара; trlinloss - следует ли тралить на "лоссовом" участке (до курса открытия) - true - тралим, false - трейлинг начинается только когда новый стоплосс "лучше" курса открытия.


Пример: TrailingByShadows(OrderTicket(),60,3,4), где OrderTicket() - номер ордера, 60 - период графика (1 час), по барам которого необходимо "трелинговать", 3 - количество баров, по теням которых осуществляется трейлинг, 4 - отступ от теней (пунктов), на котором размещается стоплосс.

=======================================================

Функция:
void TrailingByFractals(int ticket, int tmfrm, int frktl_bars, int indent,bool trlinloss)

Описание: для позиции с номером ticket трейлингует (передвигает в сторону профита) стоплосс по экстремумам frktl_bars-барных фракталов (условие: frktl_bars>3) на таймфрейме tmfrm (варианты: 1, 5, 15, 30, 60, 240, 1440, 10080, 43200); при изменении стоплосс размещается с отступом в indent (условие: indent не меньше 0) пунктов от минимума (при трейлинге длинных) или максимума (коротких позиций) экстремума соответствующего фрактала; trlinloss - следует ли трейлинговать стоплосс на лоссовом участке (от исходного стоплосса до курса открытия) - false - стоплосс начинает "двигаться", только когда он "лучше" курса открытия, true - тралим всё время, сначала передвигая стоплосс от его начального положения к курсу открытия ("лоссовая" зона), а потом в профите.


Пример: TrailingByFractals(OrderTicket(),1440,7,3), где OrderTicket() - номер ордера, 1440 - период графика (1 день), по фракталам которого необходимо "трелинговать", 7 - количество баров в составе фрактала, 3 - отступ от теней (пунктов), на котором размещается стоплосс.

==========================================================

Функция:
void TrailingStairs(int ticket, int trldistance, int trlstep)

Описание: для позиции с номером ticket трейлингует (передвигает в сторону профита) стоплосс "ступеньками" размером в trlstep пунктов на расстоянии trldistance от курса. Если при стандартном трейлинге, встроенном в МТ, при достижении профитом размера трейлинга стоплосс начинает "подтягиваться" попунктово (т.е., например, если трейлинг 25 п., то при +26 стоплосс будет перенесен в +1, при +27 - в +2 и т.д.), то при "ступенчатом" при достижении размера трейлинга (trldistance) стоплосс переносится на определённый, заданный шаг (trldistance; который может быть = 1, и тогда трейлинг будет аналогичен стандартному, или любым другим), после чего опять ожидаем, пока курс "пробежит" на расстояние в trldistance теперь уже от текущего стоплосса (например, при trldistance = 30 и trlstep = 10 при достижении +30 стоплосс будет перенесен в +10, далее до +40 никаких изменений не будет, а при +40 стоплосс переместится на +20, при +50 - на +30 п. и т.д.). Размер trldistance не может быть меньше минимального расстояния, на котором можно устанавливать стоплосс/тейкпрофит (MarketInfo(Symbol(),MODE_STOPLEVEL)), trlstep не может быть больше trldistance.


Пример: TrailingStairs(OrderTicket(),40,10), где OrderTicket() - номер ордера, 40 - значение трейлинга, 10 - "шаг" трейлинга.

==========================================================

Функция:
void TrailingUdavka(int ticket, int trl_dist_1, int level_1, int trl_dist_2, int level_2, int trl_dist_3)

Описание: вариант стандартного трейлинга; от последнего отличается тем, что предоставляет возоможность указать уровни профита (пунктов), при прохождении которых дистанция трейлинга сокращается; ticket - номер позиции, trl_dist_1 - исходное расстояние трейлинга, level_1 - первый уровень профита (пунктов), при прохождении которого расстояние трейлинга сокращается с trl_dist_1 до trl_dist_2, level_2 - второй уровень профита (пунктов), при прохождении которого дистанция трейлинга сокращается с trl_dist_2 до trl_dist_3 (пунктов). Как известно, направленные движения курса ("рывки" после новостей, например, или пробоя важных исторических уровней), не могут быть бесконечными - в определённый момент наступает откат или консолидация. Автоматическое "затягивание" трейлинга с соответствующим образом подобранными параметрами может позволить, не слишком "зажимая" курс на начальной стадии его "пробега", и "затягивая" трейлинг по мере увеличения профита, взять большую часть движения.


Пример: TrailingUdavka(OrderTicket(),40,60,30,90,10), где OrderTicket() - номер ордера, 40 - исходный трейлинг (на расстоянии 40 п.), 60 - первый уровень профита, т.е. при достижении профитом 60-ти пунктов трейлинг с 40 п. будет сокращен до 30 (4-й аргумент), 90 - второй уровень профита, при преодолении которого трейлинг сократится до 10 п. (последнее значение).

==========================================================

Функция:
void TrailingByTime(int ticket, int interval, int trlstep, bool trlinloss)

Описание: для позиции с номером ticket через заданный интервал времени interval (минут, >0) передвигает стоплосс (независимо от текущего результата, при наличии возможности) на шаг trlstep (пунктов, >0); trlinloss - следует ли тралить в зоне лоссов (на промежутке исходный стоплосс - курс открытия позиции).

Пример: TrailingByTime(OrderTicket(),240,20,false), где OrderTicket() - номер ордера, 240 - (минут, 3 часа) временной интервал, с которым должен передвигаться стоплосс, 20 - (пунктов) шаг, на который передвигается стоплосс, false - в зоне убытков не тралим. Если на момент завершения очередного интервала interval перевести стоплосс не представляется возможным, это будет осуществлено в ближайший момент, как только курс станет лучше от курса нового планируемого стоплосса на минимальное расстояние, на котором можно размещать стоплоссы/тейкпрофиты от текущего курса. Если перенос невозможен на протяжении нескольких интервалов interval, расстояние, на которое должен (был) быть перенесен стоплосс, "накапливается" (т.е. при первой возможности стоплосс будет перенесен на то значение, на котором должен быть по истечении полных interval-ов с момента открытия позиции).

==========================================================
 

FXWizard

Гуру форума
Функция:
void TrailingByATR(int ticket,int atr_timeframe,int atr1_period,int atr1_shift,int atr2_period,int atr2_shift,double coeff,bool trlinloss)

Описание: ATR - (Average True Range, Средний Истинный Диапазон) - один из индикаторов волатильности; чем больше значение, тем, соответсвенно, выше средняя волатильность за заданный период (индикатора) времени; измерятеся в пунктах. Трейлинг по ATR в большинстве случаев позволяет изменять стоплосс соответственно к характеру поведения курса - при высокой волатильности (выраженных рывках) курс "отпускаем", при "топтании на месте" поджимаем более "плотно". В трейлинге используется 2 ATR, которым предлагается задавать отличные периоды - один короткий (напр., 5), другой - длинный (напр., 20). Какому из них - atr1_period или atr2_period - без разницы. Для расчета стоплосса используется всегда большее из значений 2 ATR - это сделано для того, чтобы несколько низковолатильных дней подряд (например, перед выходом новостей) не сделали наш стоплосс слишком близким к текущему курсу (т.е. обычно большим будет более "короткий" ATR, но если имеем несколько баров с низкой волатильностью, то "переходим" на более длиннопериодный ATR). atr_timeframe - период графика, минут (5, 15, 30, 60, 240, 1440 и т.д.), на котором рассчитываются ATR (одинаков для обоих ATR). atr1_shift и atr2_shift - на каком баре (текущем, 0, предыдущем - 1 или дальше "в прошлое") считать соответственно первый и второй ATR. coeff - коэффициент, на который множим ATR, чтобы получить стоплосс (при coeff=1 стоп будер размещен на расстоянии в 1 ATR, при coeff=1.5 - на расстоянии в полтора ATR и т.д.). trlinloss - указатель того, следует ли тралить на участке лоссов (от исходного стоплосса, при наличии такового, до курса открытия).

Пример: TrailingByATR(OrderTicket(),1440,5,1,36,1,1,false), где OrderTicket() - номер ордера, 1440 - (минут, 1 сутки) таймфрейм, на котоором рассчитываются значения ATR, 5 - период "короткого" ATR, 1 - ATR с периодом 5 считаем на предыдущем баре (№1), 36 - период "длинного" ATR, 1 - второй ATR также рассчитываем на предыдущем баре, 1 - коэффициент, на который множим ATR - в данном случае стоплосс будет размещаться на расстоянии в один ATR, false - на "лоссовом" участке не тралим.

==========================================================

Функция:
void TrailingRatchetB(int ticket,int pf_level_1,int pf_level_2,int pf_level_3,int ls_level_1,int ls_level_2,int ls_level_3,bool trlinloss)

Описание: Ratchet - англ. "храповик", "храповый" (тормоз, колесо и т.д. - тип механизмов, вращающихся, работающих лишь в одном направлении). Название выбрано, чтобы передать основную особенности алгоритма - не упустить профит, если он образовался (а на "лоссовом" участке - если размер убытка сокращается, поджимаем его, чтобы в случае повторного увеличения лосса закрыться (по возможности) с небольшим лоссом). В основе данного трейлинга - алгоритм, описанный В. Баришпольцем в одной из своих рассылок году этак в 2004 (точно не вспомню), на форумах также называемый как "вторая" система выходов Баришпольца ("первая" - "обычная" система сопровождения позиций, с выставлением "далеких" стоплоссов). ticket - номер позиции, которую будем тралить; (пример описан для длинной позиции): pf_level_1 - первый (из трех) уровень профита (пунктов), после достижения которого (курс равен или больше) стоплосс переносится в +1 п.; при достижении/превышении pf_level_2 стоплосс переносится на pf_level_1 пунктов от курса открытия; после достижения/превышения pf_level_3 стоплосс переносится на pf_level_2 пунктов от курса открытия и далее может тралиться одним из других видов трейлинга. Для "лоссового" участка: если курс снижается ниже уровня ls_level_2 пунктов от курса открытия, а потом поднимается выше него, устанавливаем стоплосс на следующем более "глубоком" уровне - ls_level_3 пунктов от открытия; если курс опускался ниже ls_level_1, и потом поднимается выше него, устанавливаем стоплосс на расстоянии ls_level_2 пунктов от курса открытия; если курс проходит расстояние спрэда в сторону профита (т.е. экьюти = 0), стоплосс переносится (если был определён) на первый уровень лосса (ls_level_1 пунктов от курса открытия). Общая идея сопровождения на "лоссовом" участке - "если уж был лосс, и он уменьшается, поджимаем стоплосс (по возможности до безубытка или даже дальше "в профит"), чтобы не допустить повторного "ухода" в лосс". Параметр trlinloss указывает, следует ли тралить на "лоссовом" участке (true) или нет (false). Функция создаёт и использует 2 глобальные переменные терминала (список этой категории переменных можно вызвать нажатием F3 в терминале). В текущем виде предназначена для одновременного сопровождения только одной открытой позиции.

Пример: TrailingRatchetB(OrderTicket(),10,20,30,15,25,35,true), где OrderTicket() - номер ордера, 10 - первый уровень профита (пунктов; при его достижении стоплосс переносится в +1 п.), 20 - второй уровень профита (пунктов; при его достижении стоплосс переносится на расстояние в 10 (первый уровень) п. от курса открытия); 30 - третий уровень профита (пунктов) (при его достижении стоплосс устанавливается на второй уровень профита, +20 п.); 15 - первый уровень лосса (т.е., если спрэд = 3 п., то первый уровень лосса будет достигнуть при значении экьюти -18 п.) (на него устанавливается стоплосс, если курс опускался ниже него, а потом поднялся выше курса открытия позиции); 25 - второй уровень лосса, пунктов (на него устанавливается стоплосс, если курс опускался ниже него, т.е. лосс достигал (25+спрэд) пунктов, а потом поднялся выше первого уровня лосса; т.е. если было, например, -29 п., а потом -15 п., стоплосс - на -25 п.), 35 - третий уровень лосса, пунктов (на него устанавливаем стоплосс, если курс опускался ниже второго уровня лосса, а потом поднялся выше), true - тралим и на лоссовом участке.

==========================================================

Функция:
void TrailingByPriceChannel(int iTicket, int iBars_n, int iIndent)

Описание: для позиции с номером iTicket трейлингует стоплосс по противоположной (для длинных позиций - нижней, коротких - соотв. верхней) границе канала, построенного на интервале в iBars_n баров, с отступом в iIndent пунктов от границы.

Пример: TrailingByPriceChannel(OrderTicket(),20,3), где OrderTicket() - номер ордера, 20 - кол-во баров, среди которых определяем наибольший high (верхняя граница ценового канала) и наименьший low (нижняя граница), 3 - кол-во пунктов, на которые отступаем от границы канала при установке стоплосса.

=============================================================

Функция:
void TrailingByMA(int iTicket, int iTmFrme, int iMAPeriod, int iMAShift, int MAMethod, int iApplPrice, int iShift, int iIndent)

Описание: функции передается тикет позиции (iTicket), параметры построения скользящего среднего (iTmFrme - таймфрейм, на котором строим МА, iMAPeriod - период мувинга; iMAShift - сдвиг индикатора относительно ценового графика; MAMethod - метод усреднения; iApplPrice - используемая цена; iShift - сдвиг относительно текущего бара на указанное количество периодов назад) и величина отступа от среднего (iIndent), пунктов. Все параметры среднего вводятся в числовом виде, подробней - см. в комментариях функции.

Пример: TrailingByMA(OrderTicket(),60,13,0,0,0,1,3), где OrderTicket() - номер ордера; 60 - таймфрейм (1 час); 13 - период средней равен 13; 0 - среднее не сдвигаем относительно графика; 0 - метод усреднения MODE_SMA, простое скользящее среднее; 0 - по ценам закрытия баров; 1 - трейлингуем по значениям МА на предыдущем (сформировавшемся) баре; 3 - стоплосс устанавливаем с отступом в 3 пункта от МА.

=============================================================
 

FXWizard

Гуру форума
Функция:
void TrailingFiftyFifty(int iTicket,int iTmFrme,double dCoeff,bool trlinloss)

Описание: по закрытию очередного бара уменьшаем расстояние между стоплоссом и текущим курсом в dCoeff раз (исходно я взял 0,5, т.е. наполовину, откуда и название). Т.е., допустим, открыта покупка со стоплоссом в 40 пунктов. По закрытию бара, на котором был совершен вход в рынок, Bid оказался выше курса открытия на 42 пункта. Если мы выбрали вариант трала только "в профите" (bTrlinloss==true), то берем расстояние от курса открытия до текущего курса - 42 п., множим его на dCoeff (например, 0.5), и получив 21 п., переносим стоплосс в +21. Пусть при закрытии следующего бара профит составил +71 п. Тогда разница между текущим стоплоссом и курсом: 71-21=50, половина от найденного значения - 50*0.5=25, и новый стоплосс должен быть установлен на 25 п. выше предыдущего (21+25=46 п. от курса открытия).

При описанном вариант трейлинга, "в профите" (bTrlinloss==true), стоплосс переносится лишь при условии, что новый стоплосс будет "лучше" курса открытия. Если же установить bTrlinloss равным false, то трал будет осуществляться и на "лоссовом" участке (т.е. интервале между курсом открытия и стоплоссом, который, кстати, должен быть обязательно определён (не равен 0), чтобы данный элемент сработал). Т.е., если взять вышеописанный вариант, то по закрытии первого бара стоплосс будет перемещен на 0.5 дистанции не между открытием и текущим курсом, а между стоплоссом и текущим курсом (при стоплоссе в 40 п. и профите в 42 п. это расстояние составит (40+42)/2 = 82/2 = 41 п., стоплосс будет установлен в +1 п. от курса открытия. На втором баре, при профите в 71 п.: а) 71 - 1 = 70, б) 70*0.5 = 35, в) 1 + 35 = 36 п. Как видим, такой вариант будет стартовать с большей "дистанции" и несколько отставать от первого. Его основная функция - поджатие стоплосса при негативном развитии событий. Например, если по закрытию первого бара профит составил -10 п., то при bTrlinloss==true мы: а) найдем расстояние от курса до стоплосса, |-40 + (-10)| = 30 п., б) рассчитаем половину этого значения - 30*0.5 = 15 п. и в) переместим стоплосс в сторону профита на это расстояние: -40 + 15 = -25.

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

Параметры:
iTicket - уникальный порядковый номер ордера (выбранный перед вызовом функции с помощью OrderSelect());
iTmFrme - период чарта, по барам которого будет осуществляться трейлинг; допустимые варианты ввода: 1 (M1), 5 (M5), 15 (M15), 30 (M30), 60 (H1), 240 (H4), 1440 (D), 10080 (W), 43200 (MN);
dCoeff - коэффициент, определяющий то, в сколько раз будет сокращено расстояние между курсом на момент закрытия бара и текущим стоплоссом;
bTrlinloss - указатель того, следует ли осуществлять трейлинг на лоссовом участке.

Пример: TrailingFiftyFifty(OrderTicket(),1440,0.5,false), где OrderTicket() - номер ордера; 1440 - (минут, 1 сутки) таймфрейм, по закрытии баров которого тралим; 0.5 - по закрытии очередного бара расстояние от стоплосса до текущего курса уменьшаем вдвое; false - на "лоссовом" участке не тралим.
 
Верх