Любые вопросы новичков по MQL4 и MQL5, помощь и обсуждение по алгоритмам и кодам - страница 1259

 
Yevhenii Levchenko:
Правильно ли понимаю, что в мт5 заместо времени закрытия позиции необходимо смотреть POSITION_TIME_UPDATE ?
Нет. Нужна закрывающая сделка.
 
Valerius:

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

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

Трейлинг - движение. Тралим стоп - передвигаем стоп по алгоритму. Тралим ТейкПрофит - передвигаем уровень по мере приближения к нему по какому либо алгоритму.

 
Artyom Trishkin:
Нет. Нужна закрывающая сделка.

Спасибо!

Вот есть функция для мартина, проверяющая на профит последнюю сделку. Если убыточная, то возвращает объем сделки. Насколько корректно это делать таким образом:

double lastDealVolume() {
   datetime lastDealTime = 0;
   double volume = 0;
   if(HistorySelect(TimeCurrent() - PeriodSeconds(PERIOD_D1) * 10, TimeCurrent())) {
      int historyDealsTotal = HistoryDealsTotal();
      for(int i = historyDealsTotal - 1; i >= 0; i--) {
         if(HistoryDealSelect(HistoryDealGetTicket(i))) {
            ulong dealTicket = HistoryDealGetTicket(i);
            ENUM_DEAL_TYPE dealType = (ENUM_DEAL_TYPE) HistoryDealGetInteger(dealTicket, DEAL_TYPE);
            if(HistoryDealGetString(dealTicket, DEAL_SYMBOL) == _Symbol && HistoryDealGetInteger(dealTicket, DEAL_MAGIC) == MagicNumber &&
                  (dealType == DEAL_TYPE_BUY || dealType == DEAL_TYPE_SELL) ) {
               if(HistoryDealGetInteger(dealTicket, DEAL_TIME) > lastDealTime) {
                  lastDealTime = (datetime) HistoryDealGetInteger(dealTicket, DEAL_TIME);
                  if(HistoryDealGetDouble(dealTicket, DEAL_PROFIT) < 0) {
                     volume = HistoryDealGetDouble(dealTicket, DEAL_VOLUME);
                  } else {
                     volume = 0;
                  }
               }
            }
         }
      }
   } else Print("HistorySelect() (lastOrderVolume) error! ");
   return volume;
}

Если нужно для всей позиции узнать профит, то необходимо:

-> Прошерстить все сделки и узнать DEAL_POSITION_ID последней сделки;
-> По DEAL_POSITION_ID опять шерстить и узнавать профит всей позиции?

Или есть путь короче?

 
Yevhenii Levchenko:

Спасибо!

Вот есть функция для мартина, проверяющая на профит последнюю сделку. Если убыточная, то возвращает объем сделки. Насколько корректно это делать таким образом:

Если нужно для всей позиции узнать профит, то необходимо:

-> Прошерстить все сделки и узнать DEAL_POSITION_ID последней сделки;
-> По DEAL_POSITION_ID опять шерстить и узнавать профит всей позиции?

Или есть путь короче?

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

 
Alexey Viktorov:

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

Дело в том, что это нужно проверять перед открытием сделки :(

Но если короткого нет, всегда можно и длинным путем пойти :)

 
Yevhenii Levchenko:

Дело в том, что это нужно проверять перед открытием сделки :(

Но если короткого нет, всегда можно и длинным путем пойти :)

Это надо только при перезапуске советника в OnInit так искать. А в процессе работы советника получать необходимые данные в момент закрытия позиции. Но всё это дело каждого. Кому-то нравится грузить процессор ненужными действиями………

 
Alexey Viktorov:

Это надо только при перезапуске советника в OnInit так искать. А в процессе работы советника получать необходимые данные в момент закрытия позиции. Но всё это дело каждого. Кому-то нравится грузить процессор ненужными действиями………

Немного не понял, а как отследить момент закрытия позиции, кроме как на каждом тике делая запрос по состоянию позиции? Это конечно не все позиции опрашивать, но все равно на каждом тике запрос.

 
Valerius:

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

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

Valeriy Yastremskiy:

Трейлинг - движение. Тралим стоп - передвигаем стоп по алгоритму. Тралим ТейкПрофит - передвигаем уровень по мере приближения к нему по какому либо алгоритму.

Сильно не пинайте, но я не до понял. В настройках советника, сгенерированного в MetaEditor и включающего в себя модуль трейлинга, указывается трейлинг именно в пунктах. К примеру, я выставляю "Take Profit trailing level (in points)" = 100. Как данный трал будет работать? Поправьте, если ошибаюсь. При достижении текущей ценой расстояния, составляющего 100 пунктов до установленного Take Profita активируется трал. Когда цена достигает TP и пересекает его, то позиция не закрывается. Просто трал начинает следовать за ценой на расстоянии в 100 пунктов. Если цена развернется и пойдет против позиции, то позиция закроется либо по установленному TP либо, если трал ушел дальше TP, по установленному тралом SL. Верно?
Общие принципы - Торговые операции - Справка по MetaTrader 5
Общие принципы - Торговые операции - Справка по MetaTrader 5
  • www.metatrader5.com
Перед тем как приступить к изучению торговых функций платформы, необходимо создать четкое представление об основных терминах: ордер, сделка и позиция. — это распоряжение брокерской компании купить или продать финансовый инструмент. Различают два основных типа ордеров: рыночный и отложенный. Помимо них существуют специальные ордера Тейк Профит и...
 
altec3:
Сильно не пинайте, но я не до понял. В настройках советника, сгенерированного в MetaEditor и включающего в себя модуль трейлинга, указывается трейлинг именно в пунктах. К примеру, я выставляю "Take Profit trailing level (in points)" = 100. Как данный трал будет работать? Поправьте, если ошибаюсь. При достижении текущей ценой расстояния, составляющего 100 пунктов до установленного Take Profita активируется трал. Когда цена достигает TP и пересекает его, то позиция не закрывается. Просто трал начинает следовать за ценой на расстоянии в 100 пунктов. Если цена развернется и пойдет против позиции, то позиция закроется либо по установленному TP либо, если трал ушел дальше TP, по установленному тралом SL. Верно?

Без кода не ответить трудно.

 
Alexey Viktorov:

Это надо только при перезапуске советника в OnInit так искать. А в процессе работы советника получать необходимые данные в момент закрытия позиции. Но всё это дело каждого. Кому-то нравится грузить процессор ненужными действиями………

Это не проверяется на каждом тике. Если есть сигнал, начинается проверка и открывается сделка. И все :)
Причина обращения: