Вопросы от начинающих MQL5 MT5 MetaTrader 5 - страница 1097

 
Igor Makanu:

хм, странная ситуация, вроде активность  в топике я поднял,  вопрос у меня был, с моей точки зрения конкретный, а вместо ответа пока получил "а зачем тебе это?"

Причина в некомпетентности так отвечающих. Мне понадобилось пять минут на написание и одна попытка на проверку.


MT4

Форум по трейдингу, автоматическим торговым системам и тестированию торговых стратегий

Вопросы от начинающих MQL5 MT5 MetaTrader 5

fxsaber, 2019.07.21 12:54

void OnTick()
  {
   static int ticket1 = -1;
   
   if(ticket1<0) ticket1=OrderSend(_Symbol,OP_BUY,0.1,Ask,30,Ask-100*_Point,Ask+100*_Point);

   if(OrderSelect(ticket1,SELECT_BY_TICKET) && OrderCloseTime())
    {
     int cmd=1-OrderType();
     double open = cmd ? Bid : Ask;
     double tp = open - (cmd ? 1 : -1) * 100 * _Point;
     double sl = open + (cmd ? 1 : -1) * 100 * _Point;
     ticket1=OrderSend(_Symbol,cmd,0.1,open,30,sl,tp);
    }
  }


MT5

#include <Trade\Trade.mqh>

#define Bid SymbolInfoDouble(_Symbol, SYMBOL_BID)
#define Ask SymbolInfoDouble(_Symbol, SYMBOL_ASK)

void OnTick()
{
  static CTrade Trade; // Не стал возиться с Deviation.
  static ulong ticket1 = 0;
 
  if (!ticket1)
    ticket1 = Trade.PositionOpen(_Symbol, ORDER_TYPE_BUY, 0.1, Ask, Ask - 100 * _Point, Ask + 100 * _Point) ? Trade.ResultOrder() : 0;
  else if (!PositionSelectByTicket(ticket1) && HistorySelectByPosition(ticket1))
  {
    ENUM_ORDER_TYPE cmd = (ENUM_ORDER_TYPE)HistoryOrderGetInteger(HistoryOrderGetTicket(HistoryOrdersTotal() - 1), ORDER_TYPE);
    double open = cmd ? Bid : Ask;
    double tp = open - (cmd ? 1 : -1) * 100 * _Point;
    double sl = open + (cmd ? 1 : -1) * 100 * _Point;
    ticket1 = Trade.PositionOpen(_Symbol, cmd, 0.1, open, sl, tp) ? Trade.ResultOrder() : 0;
  }
}


Чтобы это написать, не надо быть сильным разбирающимся, достаточно знать только основы MT5.


ЗЫ На неттинге маленький нюанс существует при определении типа закрытой позиции. Но здесь это не играет роли.

 
fxsaber:

Чтобы это написать, не надо быть сильным разбирающимся, достаточно знать только основы MT5.

Благодарю!

Да это и искал решение если не получилось с помощью СБ в "пять строк" написать

Но сколько я понял, что одной СБ CTrade не получится решить мою задачу?  И нужно было еще и CPositionInfo использовать? - если хочу по нескольким ТФ одновременно 9 позиций сопровождать?

ЗЫ: сижу со смарт ТВ справку MQL5 листаю - довольно неплохо описаны торговые функции, использование СБ под вопросом.... примитивные стратегии вроде имеет смысл использовать СБ, чуть сложнее - функционал недостаточен или не очевидное использование, возможно нужна практика - попробую еще "покрутить" СБ


Еще раз Спасибо!

 
fxsaber:

Причина в некомпетентности так отвечающих. Мне понадобилось пять минут на написание и одна попытка на проверку.


MT4


MT5


Чтобы это написать, не надо быть сильным разбирающимся, достаточно знать только основы MT5.


ЗЫ На неттинге маленький нюанс существует при определении типа закрытой позиции. Но здесь это не играет роли.

Вот здесь

ENUM_ORDER_TYPE cmd = (ENUM_ORDER_TYPE)HistoryOrderGetInteger(HistoryOrderGetTicket(HistoryOrdersTotal() - 1), ORDER_TYPE);

кроется потенциальная ошибка.

В историческом списке ордера не расположены в порядке их появления в этом списке. Сталкивался с этим при разработке библиотеки. Положился как раз на это. Но оказалось, что всё не так просто. Попробуйте выставить поочерёдно лимитные и стоповые ордера в порядке: лимит -> стоп -> лимит -> стоп -> лимит -> стоп, и удаляя каждый в любом порядке, смотрите который записан в историческом списке последним. Будете удивлены.

 
Artyom Trishkin:

Вот здесь

кроется потенциальная ошибка.

В историческом списке ордера не расположены в порядке их появления в этом списке. Сталкивался с этим при разработке библиотеки. Положился как раз на это. Но оказалось, что всё не так просто. Попробуйте выставить поочерёдно лимитные и стоповые ордера в порядке: лимит -> стоп -> лимит -> стоп -> лимит -> стоп, и удаляя каждый в любом порядке, смотрите который записан в историческом списке последним. Будете удивлены.

Там нет ошибки, т.к. список сформирован через HistorySelectByPosition.

 
Igor Makanu:

Благодарю!

Да это и искал решение если не получилось с помощью СБ в "пять строк" написать

Но сколько я понял, что одной СБ CTrade не получится решить мою задачу?  И нужно было еще и CPositionInfo использовать? - если хочу по нескольким ТФ одновременно 9 позиций сопровождать?

ЗЫ: сижу со смарт ТВ справку MQL5 листаю - довольно неплохо описаны торговые функции, использование СБ под вопросом.... примитивные стратегии вроде имеет смысл использовать СБ, чуть сложнее - функционал недостаточен или не очевидное использование, возможно нужна практика - попробую еще "покрутить" СБ


Еще раз Спасибо!

Для "открыть-закрыть позицию" в тестере - норм, ну или для учебных кодов как замена. В остальном - своё делать нужно или наследоваться от CTrade для организации своего полноценного класса для проведения торговых операций с учётом различных нюансов.
В СБ есть гораздо более приятные вещи - вы о них знаете и используете.

 
fxsaber:

Там нет ошибки, т.к. список сформирован через HistorySelectByPosition.

Да, упустил из виду, что это не полный список.

 
Artyom Trishkin:

В СБ есть гораздо более приятные вещи - вы о них знаете и используете.

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

ЗЫ: справка MQL5 очень изощренно написана, сплошные ордера... а ведь говорили - пока не забудешь слово ордер, ты безнадежен!!! 

 
Igor Makanu:

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

ЗЫ: справка MQL5 очень изощренно написана, сплошные ордера... а ведь говорили - пока не забудешь слово ордер, ты безнадежен!!! 

Тут всё просто. Ордер -> сделка -> позиция. В MQL5 от ордеров тоже никуда не деться - они есть, и с них всё начинается. Отсылаем торговый приказ на сервер (это и есть ордер), сервер его принимает/не принимает и возвращает код. Иногда - при неверном составлении запроса, ордер вообще не отправляется на сервер - его отправка блокируется на уровне терминала. После того, как ордер успешно отправлен на сервер и поставлен в очередь на исполнение, мы ожидаем срабатывание этого ордера (его исполнение, иными словами - сделка), в результате совершения сделки (срабатывания ордера - маркет-, или отложенного), образуется позиция (не всегда - на неттинге, и при условии наличия позиции в том же направлении, просто добавляется объём к существующей, если в обратном направлении, то в зависимости от объёма совершённой сделки, текущая позиция либо частично закрывается, либо закрывается, либо переворачивается)

У ордера тоже есть свой тикет. Как и у сделки и позиции. Но у позиции есть ещё и идентификатор. Идентификатор позиции всегда будет равен тикету самого первого её ордера - приказа на открытие этой позиции.

У рыночного ордера есть только тикет. А его свойство идентификатора позиции не заполнено пока ордер не сработал. Т.е., только у исторического ордера есть идентификатор позиции - он заполняется в момент совершения сделки - в момент срабатывания этого ордера. Если же это удалённый отложенный ордер, то его идентификатор позиции тоже не заполнен - не было по нему ни сделки, ни позиции соответственно.

У сделки есть тикет (её тикет), есть идентификатор ордера - в результате которого была совершена эта сделка, и есть идентификатор позиции - позиция, которая появилась в результате совершения этой сделки, либо позиция, которая была изменена в результате совершения этой сделки

У позиции есть тикет, который ей присваивается при открытии или изменении. Если позиция только открыта, то её тикет будет равен её идентификатору - уникальному номеру позиции, который не изменяется на протяжении всей жизни позиции. В то время как тикет у позиции может неоднократно изменяться и соответствовать тикету ордера - в результате срабатывания этого ордера появляется новая сделка, которая изменяет эту позицию - тикет этого ордера присваивается тикету позиции.

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

 
Artyom Trishkin:

Если внимательно понаблюдать за всеми этими метаморфозами в позиции

Спасибо! Вот и наблюдаю второй день, но тут только практика нужна, вот за сегодня с СБ разобрался...ну в общем разобрался ;)

PS: хорошо объясняешь, однозначно талант!

 
Igor Makanu:

Спасибо! Вот и наблюдаю второй день, но тут только практика нужна, вот за сегодня с СБ разобрался...ну в общем разобрался ;)

PS: хорошо объясняешь, однозначно талант!

Рад помочь ;)