Закрытие части позиции

 

При закрытии половины позиции средствами MQL4 закрывается полностью позиция и тут же открывается с текущей рыночной цены новая позиция половиной объёма, что приводит вместо фиксации прибыли к потенциальному убытку. Тип счета Instant.

Так и должно быть или я что то делаю неправильно ? Раньше позиции закрывались половинным объёмом корректно. Терминал Build 509.

//+------------------------------------------------------------------+
//|                 Закрытие части позиции                           |
//+------------------------------------------------------------------+
double ClossSegmentProfitBuy ()

{
   int Profit1=MinTP;
   int col1=Lime;
   int ask1, bid1, open1;
   double point1;
   for (int i1=OrdersTotal()-1; i1>=0; i1--)
   {
      if (!OrderSelect(i1,SELECT_BY_POS,MODE_TRADES)) break;
      if ((OrderType()==OP_BUY) && (OrderMagicNumber()==mn))
      {
         point1=MarketInfo(Symbol(),MODE_POINT);
         if (point1==0) break;
         bid1=MathRound(MarketInfo(OrderSymbol(),MODE_BID)/point1);
         open1=MathRound(OrderOpenPrice()/point1);
         if (bid1-open1<Profit1) continue;
         OrderClose(OrderTicket(),(NormalizeLot((OrderLots()/2),True,NULL)),bid1*point1,Slippage,col1);
      }
   }
}
// End

double ClossSegmentProfitSell ()

{
   int Profit2=MinTP;
   int col2=Lime;
   int ask2, bid2, open2;
   double point2;
   for (int i2=OrdersTotal()-1; i2>=0; i2--)
   {
      if (!OrderSelect(i2,SELECT_BY_POS,MODE_TRADES)) break;
      if ((OrderType()==OP_SELL) && (OrderMagicNumber()==mn))
      {
         point2=MarketInfo(Symbol(),MODE_POINT);
         if (point2==0) break;
         ask2=MathRound(MarketInfo(OrderSymbol(),MODE_ASK)/point2);
         open2=MathRound(OrderOpenPrice()/point2);
         if (open2-ask2<Profit2) continue;
         OrderClose (OrderTicket(),(NormalizeLot((OrderLots()/2),True,NULL)),ask2*point2,Slippage,col2) ;
      }
   }
}
// End
//+----------------------------------------------------------------------------+
//|  Автор    : Ким Игорь В. aka KimIV,  http://www.kimiv.ru                   |
//+----------------------------------------------------------------------------+
//|  Версия   : 16.05.2008                                                     |
//|  Описание : Возвращает нормализованное значение торгуемого лота.           |
//+----------------------------------------------------------------------------+
//|  Параметры:                                                                |
//|    lo - нормализуемое значение лота.                                       |
//|    ro - способ округления          (   False    - в меньшую,               |
//|                                        True     - в большую сторону)       |
//|    sy - наименование инструмента   ("" или NULL - текущий символ)          |
//+----------------------------------------------------------------------------+
double NormalizeLot(double lo, bool ro=True, string sy="") {
  double l, k;
  if (sy=="" || sy=="0") sy=Symbol();
  double ls=MarketInfo(sy, MODE_LOTSTEP);
  double ml=MarketInfo(sy, MODE_MINLOT);
  double mx=MarketInfo(sy, MODE_MAXLOT);

  if (ml==0) ml=0.1;
  if (mx==0) mx=100;

  if (ls>0) k=1/ls; else k=1/ml;
  if (ro) l=MathCeil(lo*k)/k; else l=MathFloor(lo*k)/k;

  if (l<ml) l=ml;
  if (l>mx) l=mx;

  return(l);
}
//End

Код использую такой, в итоге ...

Подскажите как с этим бороться или так и должно быть ?

 
BeerGod:

При закрытии половины позиции средствами MQL4 закрывается полностью позиция и тут же открывается с текущей рыночной цены новая позиция половиной объёма, что приводит вместо фиксации прибыли к потенциальному убытку. Тип счета Instant.

Так и должно быть или я что то делаю неправильно ? Раньше позиции закрывались половинным объёмом корректно. Терминал Build 509.

Код использую такой, в итоге ...

Подскажите как с этим бороться или так и должно быть ?


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

 
chief2000:

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

Так дело в том что я не задумывал закрывать позицию полностью и сразу же открывать в том же направлении новую меньшим лотом. К примеру открыта позиция на продажу по Gold с 1400 на 0.02 лота, при прохождении 100пунктов в плюс (цена 1390) она переводится в безубыток и закрывается часть 0.01. Оставшеяся часть 0.01 ордера, открытая с 1400 продолжает оставаться в рынке. На практике по 1390 закрылась вся позиция и открылась половина 0.01. В скрипте и команд на открытие нет, он никак сам неможет ничего открывать, только сопровождать позицию.


https://docs.mql4.com/ru/trading/orderclose OrderClose позволяет закрывать лот частично, но не должен открывать новую позицию, только изменять оставшийся лот. Поэтому странный случай какой то, глюк кода или терминала ?

 

Реал...

На дэмо того же ДЦ всё корректно закрывается, остаток позиции остается по цене первоначального открытия.

Это как то лечится или нет ? ДЦ менять неохото ...

 
BeerGod:

Реал...

На дэмо того же ДЦ всё корректно закрывается, остаток позиции остается по цене первоначального открытия.

Это как то лечится или нет ? ДЦ менять неохото ...


Код не смотрел - некогда...

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

Например, в одном ДЦ наткнулся на то, что в МТ4 у них не работает ф-ция OrderCloseBy(). Выдает ошибку №3 "Неправильные торговые параметры". Оказывается, в торговых условиях этого ДЦ запрещено встречное закрытие.

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

 
BeerGod:

Так дело в том что я не задумывал закрывать позицию полностью и сразу же открывать в том же направлении новую меньшим лотом. К примеру открыта позиция на продажу по Gold с 1400 на 0.02 лота, при прохождении 100пунктов в плюс (цена 1390) она переводится в безубыток и закрывается часть 0.01. Оставшеяся часть 0.01 ордера, открытая с 1400 продолжает оставаться в рынке. На практике по 1390 закрылась вся позиция и открылась половина 0.01. В скрипте и команд на открытие нет, он никак сам неможет ничего открывать, только сопровождать позицию.


https://docs.mql4.com/ru/trading/orderclose OrderClose позволяет закрывать лот частично, но не должен открывать новую позицию, только изменять оставшийся лот. Поэтому странный случай какой то, глюк кода или терминала ?

На самом деле разница невелика, самое большее что вы можете потерять при переоткрытии - один дополнительный спред. Это если ДЦ при переоткрытии с вас этот спред берёт (проверьте, скорее всего это не так, но всё равно обязательно проверьте). Не считая этой "маленькой" детальки оба варианта абсолютно равноценны. Допускаю, что для вас это удивительно, но я не шучу. Можете тщательно проверить на калькуляторе все варианты, включая развитие ситуации в будущем. Разница только в балансе, для эквити разницы никакой нет.
 
MetaDriver:
Это если ДЦ при переоткрытии с вас этот спред берёт (проверьте, скорее всего это не так, но всё равно обязательно проверьте). Не считая этой "маленькой" детальки оба варианта абсолютно равноценны.

Суда по приведённой иллюстрации, доп. спред не снимается (закрытие по 1366.28 и открытие по 1366.28). Варианты идентичны.
 
может открывать сразу две половинки, а затем закрывать одну часть
 
MetaDriver:
На самом деле разница невелика, самое большее что вы можете потерять при переоткрытии - один дополнительный спред. Это если ДЦ при переоткрытии с вас этот спред берёт (проверьте, скорее всего это не так, но всё равно обязательно проверьте). Не считая этой "маленькой" детальки оба варианта абсолютно равноценны. Допускаю, что для вас это удивительно, но я не шучу. Можете тщательно проверить на калькуляторе все варианты, включая развитие ситуации в будущем. Разница только в балансе, для эквити разницы никакой нет.

Как это нет ? Чисто арифметически разницы может и нет, но мы же не в школе, чтобы проверять 2+2=4 или нет. Думайте как трейдер, пожалуйста, и тогда проблема автора ветки станет яснее. Половина позиции закрывается (=снимается часть прибыли), но изначальная точка входа имеет смысл (пусть даже только для самого трейдера) и именно там он хочет иметь свой стоп установленный на безубыток. При откате возможно он добавит к позиции. И где будет безубыток в таком случае? Правильно, посередине между первым входом и нынешней ценой, что также остается, так скажем, в положительной территории. При переоткрытии (во время закрытия половины позиции) ситуация получится совсем иная, при откате мы имеет убыточную позицию. Пусть даже и в совокупности с закрытой половиной она в плюсе, но в данный момент она висящая убыточная позиция и добавить к ней конечно можно, но стоп на безубыток уже не поставишь. Так что разница для трейдера есть, потому что прибыль он считает ТОЛЬКО в конце дня.
 
pro_:
MetaDriver:
На самом деле разница невелика, самое большее что вы можете потерять при переоткрытии - один дополнительный спред. Это если ДЦ при переоткрытии с вас этот спред берёт (проверьте, скорее всего это не так, но всё равно обязательно проверьте). Не считая этой "маленькой" детальки оба варианта абсолютно равноценны. Допускаю, что для вас это удивительно, но я не шучу. Можете тщательно проверить на калькуляторе все варианты, включая развитие ситуации в будущем. Разница только в балансе, для эквити разницы никакой нет.

Как это нет ? Чисто арифметически разницы может и нет, но мы же не в школе, чтобы проверять 2+2=4 или нет. Думайте как трейдер, пожалуйста, и тогда проблема автора ветки станет яснее. Половина позиции закрывается (=снимается часть прибыли), но изначальная точка входа имеет смысл (пусть даже только для самого трейдера) и именно там он хочет иметь свой стоп установленный на безубыток. При откате возможно он добавит к позиции. И где будет безубыток в таком случае? Правильно, посередине между первым входом и нынешней ценой, что также остается, так скажем, в положительной территории. При переоткрытии (во время закрытия половины позиции) ситуация получится совсем иная, при откате мы имеет убыточную позицию. Пусть даже и в совокупности с закрытой половиной она в плюсе, но в данный момент она висящая убыточная позиция и добавить к ней конечно можно, но стоп на безубыток уже не поставишь. Так что разница для трейдера есть, потому что прибыль он считает ТОЛЬКО в конце дня.
Выздоравливайте.
 

1. Открыта позиция Gold Sell с 1400, 0.02 лота

2. Прошло 100пп в плюс, цена 1390

3. Перевод 0.02 лота в безубыток на цене 1400

4. Запрос закрытия 0.01 лота

5. Закрытие 0.02 лота и автоматическое принудительное переоткрытие с 1390 стоп автоматом поставился на 1400 лот 0.01

6. Выбивание безубытка на 1400 ...

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

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

P.S. Я к примеру купил 1000 евро по 6грн (в году 2006м), сегодня пошел продал 100евро по 10грн. Цена моей покупки оставшихся 900евро у меня как была так и должна остаться по 6грн, но никак не стать 10грн.

Причина обращения: