Есть ли готовая функция частичного закрытия позиции

 
Интересно мнение, может кто занимался этим вопросом, может это лучше трала ? Известно ведь что если сделать TP в несколько пипсов то колличество выигрышных сделок возрастет, но прибыль скорее всего не будет перекрывать редкие, но большие лоси. Трал тоже вещь такая, приходится ловить цену стопом на откате. А вариант с частичным закрытием..., дпустим открыта позиция 0.1 лота предполагаемый профит 100 пунктов, закрывать по 0.01 лота через 10 пунктов, поставить безубыток на общую позу пунктов через 20 (чтоб не пролететь если развернется), и получается что ловим цену уже не на откате а на импульсах. Сколько соберет, а остальное, если развернет, закроет по безубытку.

Может кто тестировал подобные алгоритмы ? Стоит ли заниматься ?
 
vladevgeniy:
Интересно мнение, может кто занимался этим вопросом, может это лучше трала ? Известно ведь что если сделать TP в несколько пипсов то колличество выигрышных сделок возрастет, но прибыль скорее всего не будет перекрывать редкие, но большие лоси. Трал тоже вещь такая, приходится ловить цену стопом на откате. А вариант с частичным закрытием..., дпустим открыта позиция 0.1 лота предполагаемый профит 100 пунктов, закрывать по 0.01 лота через 10 пунктов, поставить безубыток на общую позу пунктов через 20 (чтоб не пролететь если развернется), и получается что ловим цену уже не на откате а на импульсах. Сколько соберет, а остальное, если развернет, закроет по безубытку.

Может кто тестировал подобные алгоритмы ? Стоит ли заниматься ?
//+------------------------------------------------------------------+
//| Закрытие одной трети позиции                                     |
//+------------------------------------------------------------------+
void CloseOneThird() {
  bool   fc=False;
  double Lots=MathCeil(OrderLots()/3*10)/10;
 
  if (Lots>0) {
    if (OrderType()==OP_BUY)
      fc=OrderClose(OrderTicket(), Lots, Bid, Slippage, CLR_NONE);
    if (OrderType()==OP_SELL)
      fc=OrderClose(OrderTicket(), Lots, Ask, Slippage, CLR_NONE);
    if (fc && UseSound) PlaySound(NameFileSound);
  }
}
Функция Кимова непроверял как работает у него и трал тройной есть с частичным закрытием
 
Это то да, но эта функция выполняет само закрытие и не ведет контроля. А нужно например разбить лот позиции на минимальные и закрывать когда цена доходит до нужного уровня, например лот 0.1, минимальный 0.01, следовательно за весь путь позиция закроется 0.1/0.01=10 раз. Как это сделать в MQL ? В лоб не получается, нужно городить массивы с уровнями. Кое что я попробовал написать, но текст не маленький получается, и велика вероятность ошибок в будущем. Интересны мысли людей кто занимался этим, на сколько меняется прибыльность эксперта? Как вариант можно открывать сразу кучу мелких позиций, эт конечно намного проще но каша с ордерами и прочее. Спасибо за наводку, Трал Кима где-то лежит посмотрю может чего и позаимствую.
 

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

Результативность и прибыльность меняется очень незначительно +/- 5%

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

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

double LotsForFix(double OrderLot,double ClosePercent)
   {
    double OverPart;
    double OverStep;
    double FixLots;
   
      if (OrderLot*ClosePercent>MarketMinLot)
         {
            OverPart=OrderLot*ClosePercent-MarketMinLot;
            OverStep=NormalizeDouble(OverPart/MarketLotStep,0)*MarketLotStep;
            FixLots=MarketMinLot+OverStep;         
         }
      else FixLots=OrderLot-MarketMinLot;
      if(FixLots<MarketMinLot)FixLots=MarketMinLot;
 
   return(FixLots);
   }

Переменные MarketMinLot и MarketLotStep являются глобальными переменными среды для конкретного инструмента из серии

MarketMinLot=MarketInfo(Symbol(),MODE_MINLOT);
MarketLotStep=MarketInfo(Symbol(),MODE_LOTSTEP);

Но можно вставить в тело функции.

Здесь есть недостаток - как только все сводится к минимальному лоту позиция закрывается полностью.

 
vladevgeniy:
Это то да, но эта функция выполняет само закрытие и не ведет контроля. А нужно например разбить лот позиции на минимальные и закрывать когда цена доходит до нужного уровня, например лот 0.1, минимальный 0.01, следовательно за весь путь позиция закроется 0.1/0.01=10 раз. Как это сделать в MQL ? В лоб не получается, нужно городить массивы с уровнями. Кое что я попробовал написать, но текст не маленький получается, и велика вероятность ошибок в будущем. Интересны мысли людей кто занимался этим, на сколько меняется прибыльность эксперта? Как вариант можно открывать сразу кучу мелких позиций, эт конечно намного проще но каша с ордерами и прочее. Спасибо за наводку, Трал Кима где-то лежит посмотрю может чего и позаимствую.


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

 
Integer:



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


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


 
2 Cronex
Спокойствие это важно, при торговле руками сколько раз было что вроде правильно встал и идет туда куда надо, а в итоге сбор стопов в начале сессии, прибыль уже видел а тут разворот и собирает безубыток. Жаба давит. А так бы хоть часть скинул на балланс. В общем-то задумал этого советника сперва не как полный автомат а как помошника для рук (хотя автомат - мечта), так что использование magic номеров в коде невозможно, вариант integerа вобщем подходит.  Будем думать.
 
vladevgeniy:

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

А кто бы знал? За всю историю использования мной комментариев были проблемы только с одним ДЦ, но на нем запрещено использование экспертов, было персональное разрешение. Причем не уверен, что дело было в комментариях. А у остальных работает.
 
...
Файлы:
 
vladevgeniy:
Жаба давит....
Так собственно по этому поводу и я занялся этим вопросом, прибыль конечно падает незначительно , но если позиция верная то оставшаяся часть может с лихвой перекрыть недополучение прибыли и уж точно не даст лавинообразно закрыть вообще все позиции и вывалиться из рынка при ошибочной постановке вопроса. Тем более по моим наблюдениям сигналы по которым я сейчас работаю с точность почти 80% показывают предстоящий флэт/разворот и поэтому для меня это почти подарок когда появляется ложный сигнал, выставляется стоп и закрывается часть позиции. Продолжение движения в этом случае иногда раза в два превышает предыдущее движение и оставшая часть просто остается как залог большой прибыли до следующего сигнала разворта.
 
Integer, спасибо. Отличный пример работы с комментами и неплохо придумано задавать уровни через дробь. Видать эксп писался для себя. Возьму его за основу.  В общем СПАСИБО за отзывчивость.
Причина обращения: