Jump to content

Blog solandr

  • entries
    107
  • comments
    542
  • views
    182,133

Уменьшение влияния спреда и проскальзываний на торговую стратегию

solandr

6,474 views

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

 

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

 

Система "Пробой канала"

Рассмотрим влияние спреда на торговую стратегию "Пробой канала". Действия торгового алгоритма состоят в следующем.

1. На основе анализа изменений цены на заданном интервале времени выбирается горизонтальный канал. Анализ проводится как по ценам Bid, так и по ценам Ask. Цену Ask принимаем равной сумме цены Bid и спреда.

2. Выставляются стоповые ордера на границах канала. При этом ордер SELLSTOP ставится по цене Bid на нижней границе канала, а ордер BUYSTOP ставится по цене Ask, или что то же самое по цене Bid+spread, на верхней границе канала. (Поскольку в реальности спред является величиной, способной меняться на каждом тике, то можно использовать его среднее округлённое значение например за последний час/сутки, организовав автоматический подсчёт спреда в самом советнике).

3. После пробоя канала открытая позиция может быть закрыта либо по стоплоссу, установленному сразу при выставлении ордера, либо при достижении заданной прибыли. При анализе текущей прибыли используются такие параметры счёта как баланс (AccountBalance) и эквити (AccountEquity).

 

Ниже представлены результаты тестирования такой системы при разном спреде: 1, 35 и 80 пунктов в пятизнаке. Тест проводился на лоте 0.1.

blogentry-422792-0-95232500-1410282973_thumb.gifblogentry-422792-0-30789700-1410282982_thumb.gifblogentry-422792-0-02651600-1410282990_thumb.gif

Для удобства визуального и цифрового сравнения результатов тестирования графики кривой доходности размещены на одной диаграмме, а наиболее существенные цифровые данные сведены в Таблицу 1.

blogentry-422792-0-21223500-1410282999.gif

 

blogentry-422792-0-80573500-1410283012.gif

 

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

 

Модификация

Так что же можно предпринять, чтобы ликвидировать наблюдаемое расхождение хотя бы в тестере МТ4?

 

Для того, чтобы попытаться ликвидировать расхождение в торговом алгоритме можно попытаться подсунуть ему для анализа некий искусственный источник данных, который давал бы одинаковые показания при любом значении установленного спреда. Мы знаем, что от спреда никак не зависит цена Bid, но зависит цена Ask. Поэтому модифицируем торговый советник так, чтобы он выставлял ордера и закрывал открытые позиции, предполагая, что он работает в неких идеальных торговых условиях, для которых спред равен 1 пункту. То есть система должна выполнять такие же торговые действия, что и при неизменном спреде в 1 пункт. Хотя сами числовые значения стоплоссов, тейков и цен открытия должны рассчитываться на основе реальных условий.

 

Модификации, которые были проведены над представленной выше системой, заключались в следующем:

 

1. Для анализа изменения цены вместо цены Ask была взята цена Ask1. Это цена Ask при спреде в 1 пункт в пятизнаке (см. диаграмму ниже).

blogentry-422792-0-98557000-1410283020.gif

В коде советника это выглядит как Ask1=Bid+0.00001

 

2. Второй пункт торговой стратегии остаётся без изменений. Единственное, на что следует обратить внимание, - это если в процессе определения цены для выставления ордера BUYSTOP уже была учтена цена Ask1. Тогда правильная цена для установки ордера BUYSTOP будет отличаться на величину delta=Ask-Bid-0.00001 (см. диаграмму выше).

 

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

double _AccountBalance(string sym){    double temp_account_balance=0;    int i,closed_orders_number=0;    int orderticket_to_remember=OrderTicket();    for(i=0;i<OrdersHistoryTotal();i++)    {        if(OrderSelect(i,SELECT_BY_POS,MODE_HISTORY)==true)        {        if(OrderType()==OP_BUY || OrderType()==OP_SELL) closed_orders_number++;        }    }    temp_account_balance=AccountBalance()+closed_orders_number*(delta/0.00001)*MarketInfo(sym,MODE_TICKVALUE)*initial_lot;    OrderSelect(orderticket_to_remember,SELECT_BY_TICKET);    return(temp_account_balance);}double _AccountEquity(string sym){    double temp_account_equity=0,open_orders_money=0;    int i,total_orders_number=0;    int orderticket_to_remember=OrderTicket();    for(i=0;i<OrdersTotal();i++)    {        if(OrderSelect(i,SELECT_BY_POS)==true)        {            if(OrderType()==OP_BUY || OrderType()==OP_SELL)            {                open_orders_money=open_orders_money+OrderProfit()+OrderCommission()+OrderSwap();                total_orders_number++;            }        }    }    temp_account_equity=_AccountBalance(sym)+open_orders_money+total_orders_number*(delta/0.00001)*MarketInfo(sym,MODE_TICKVALUE)*initial_lot;        OrderSelect(orderticket_to_remember,SELECT_BY_TICKET);        return(temp_account_equity);}

Здесь переменная orderticket_to_remember хранит номер тикета, на котором находился курсор перед входом в функцию. Это полезно, так как функции вызываются при переборе ордеров в главном цикле в программе советника.

Не забудьте вставить в функции проверку MagicNumber(), если используете его.

 

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

 

Модифицированная система

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

blogentry-422792-0-52197900-1410283029_thumb.gifblogentry-422792-0-80139800-1410283035_thumb.gifblogentry-422792-0-98150700-1410283041_thumb.gif

Для удобства визуального и цифрового сравнения результатов тестирования системы графики кривой доходности размещены на одной диаграмме, а наиболее существенные цифровые данные сведены в Таблицу 2.

blogentry-422792-0-32923500-1410283052.gif

 

blogentry-422792-0-51029200-1410283061.gif

 

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

 

То есть можно говорить о том, что для модифицированной системы величина спреда не оказала влияния на торговый алгоритм. Таким образом в случае внезапного увеличения жадности со стороны "партнёров" по ту сторону терминала торговая система не свалится в глубокое пике, которое отчётливо наблюдается у начальной системы при спреде 80, для которой формально случился маржинколл, так как абсолютная просадка превысила сумму первоначального баланса в 1000 USD.

 

Сравнение систем

В обоих таблицах зелёным и красным цветом выделены параметры, которые имеют лучшие/худшие значения по отношению к другой системе.

 

Сравнивая полученную прибыль у обоих вариантов системы видно, что оригинальная система зарабатывает большую прибыль по сравнению с модифицированной. Однако ничего бесплатно не бывает! И повышенная прибыль оригинальной системой достигается за счёт того, что она просто дожидается, когда прибыль открытой позиции достигнет заданной. В итоге иногда система может и не дождаться целевых уровней цены. В такие моменты трейдеры обычно говорят: "Всего пару пипсов не дошла до тейка!" Хотя с точки зрения идеальной системы она тейк уже на несколько пунктов даже "перешла". ;)

 

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

 

Средняя прибыль на 1 сделку и профит фактор у оригинальной системы выше. Это прежде всего вызвано пересидкой-ожиданием заданной прибыли, как это уже отмечалось выше.

 

Абсолютная просадка у модифицированной системы значительно меньше. И даже при спреде в 80 пунктов абсолютная просадка меньше размера первоначального депозита в 1000 USD, что позволило системе по итогам тестирования показать даже некоторую прибыль. В противоположность оригинальная система при 80 пунктах спреда должна была получить маржинколл.

 

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

 

Очень важно обратить внимание на количество прибыльных и убыточных сделок. Если у оригинальной системы происходит заметное изменение соотношения между прибыльными и убыточными сделками в худшую сторону, то у модифицированной системы это изменение не превышает всего лишь 0,5%(!). Это служит ещё одним доказательством повышения устойчивости торгового алгоритма по отношению к спреду.

 

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

 

Оценка наклона кривых доходности

Оценку "правильности" наклона кривых доходности из-за спреда будем проводить следующим образом. Подсчитаем сколько убытка приносит каждый дополнительный пункт спреда. Для этого возьмём разницу в прибыли между идеальной системой со спредом 1 и системами со спредом 35 и 80 и разделим её на разницу в пунктах спреда.

 

Тогда для оригинальной системы получим, что для спреда в 35 пунктов каждый дополнительный пункт спреда обошёлся потерей итоговой прибыли в размере 135,95$, а для спреда в 80 пунктов этот же убыток составил 97,66$. Разница оказалась равной 28%, что является весьма существенным отличием, так как в соответствии с постулатом, приведённым в начале статьи, эти величины должны были бы совпасть.

 

Для модифицированной системы эти же величины составили191,62$ для спреда в 35 пунктов и 191,58$ для спреда в 80 пунктов. То есть оба значения практически полностью совпали! Таким образом для модифицированной системы оказалось верным предположение, что спред всего лишь только пропорционально наклоняет кривую доходности.

 

Проскальзывания

Формально проскальзывания при открытии ордеров можно считать дополнительным непредусмотренным спредом, который оплачивается за счёт уменьшения прибыли сделок. Поэтому все рекомендации, изложенные выше, вполне можно применить и к проскальзываниям. То есть для модифицированного торгового алгоритма совершенно неважно с каким проскальзыванием и спредом открылась позиция, так как он в своём анализе пользуется данными идеальной торговой среды со спредом 1. Разумеется речь здесь идёт о стандартных проскальзываниях, которые обычно не превышают размер ожидаемой прибыли. Если же при ожидаемой прибыли в 200 пунктов случилось проскальзывание на 500, то такую сделку лучше всего по возможности закрыть (и чем скорее, тем лучше!), так как она уже выпала из зоны ответственности торгового алгоритма и способна привести к непредсказуемым последствиям.

 

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

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

б) глобальные переменные терминала (GlobalVariables). В принципе это достаточно надёжно, за исключением вероятности потери информации о цене уже открытых позиций в случае поломки компьютера и отсутствия какого-либо дополнительного механизма бэкапа глобальных переменных налету. Насколько такой риск допустим каждый решает для себя лично на основании среднего времени нахождения открытых позиций в рынке. Например если позиции в рынке находятся менее 5% времени, то таким риском наверное можно просто пренебречь.

в) "Магический" идентификатор ордера (MagicNumber). Пожалуй самый надёжный вариант, так как не требует организации каких-либо специальных мер по организации бэкапа дополнительной информации как в предыдущем пункте.

 

Для определения цены открытия позиции я лично использую комбинацию методов определения цены по глобальным переменным и комментариям (туда цена открытия записывается при выставлении отложенного ордера). В случае невозможности по каким-либо причинам получения цены открытия описанным выше образом я просто беру реальную цену открытия, таким образом теряя информацию о проскальзывании. В принципе такая комбинация делает теоретически возможные последствия неучёта проскальзывания пренебрежимо малыми. Ниже приводится текст функции, возвращающей цену открытия ордера в соответствии с торговой стратегией.

double _OrderOpenPrice(){   string temp_comment;   double ord_o_p,temp_price;      temp_comment=StringConcatenate(prefix,OrderTicket(),"_op");   if(GlobalVariableCheck(temp_comment)) ord_o_p=GlobalVariableGet(temp_comment);   else       if(StringLen(OrderComment())==7)      {          if(StringFind(OrderComment(),".")==1)         {            temp_price=StrToDouble(OrderComment());            if(temp_price>0 && temp_price<5)            ord_o_p=temp_price;         }      }      else ord_o_p=OrderOpenPrice();   return(ord_o_p);}

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

 

Оптимизация

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

 

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

 

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

 

ПАММ счета

Контроль спреда и проскальзываний на ПАММ счетах является нетривиальной задачей из-за переменного объёма средств в управлении, постоянно меняющегося из-за ввода/вывода средств инвесторами. В данном случае в торговом советнике необходимо группировать корректирующие цепочки в единые сделки для подсчёта прибыли. И далее производить расчёт баланса и эквити идеальной системы считая, что все сделки были проведены с одним и тем же размером лота. То есть советник необходимо обеспечить данными, которые он получает в тестере МТ4 на тесте с фиксированным лотом.

 

 

 

Таким образом в статье проиллюстрирован факт возможного влияния спреда на торговый алгоритм и предложена методика уменьшения негативных влияний спреда/проскальзываний на торговую систему.

  • Thanks 1


2 Comments


Recommended Comments

18.09.2014 сделано дополнение к статье.

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

Share this comment


Link to comment

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now
×