Библиотеки: MT4Orders - страница 44

 
fxsaber:

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

Речь о том, как отображается исполнение ТП?

Тогда понятно, о чем изначальный пост)

 
fxsaber :

I am developing features of the conversion of indicators for self-education. Here are three more indicators.

As usual - the original MT4 code did not touch.

The source clearly shows what the authors use StringConcatenate in their codes. This is just plain stupid!

HI..


How did you go with converting to MT5?

 

Есть неттинг счёт. На нём маркетами открываю и закрываю позицию. На закрытии позиции OrderSend возвращает 0. Что, вроде бы, и не ошибка, но и не совсем успех.

Смотрю я на следующий код в OrderSend

    return((arrow_color == INT_MAX) ? (MT4ORDERS::NewOrderCheck() ? 0 : -1) :
           ((((int)arrow_color != INT_MIN) || MT4ORDERS::NewOrderCheck()) &&
            MT4ORDERS::OrderSend(MT4ORDERS::LastTradeRequest, MT4ORDERS::LastTradeResult) ?
            (MT4ORDERS::IsHedging ? (long)MT4ORDERS::LastTradeResult.order : // PositionID == Result.order - особенность MT5-Hedge
             ((MT4ORDERS::LastTradeRequest.action == TRADE_ACTION_DEAL) ?
              (MT4ORDERS::IsTester ? (::PositionSelect(MT4ORDERS::LastTradeRequest.symbol) ? PositionGetInteger(POSITION_TICKET) : 0) :
                                      // HistoryDealSelect в MT4ORDERS::OrderSend
                                      ::HistoryDealGetInteger(MT4ORDERS::LastTradeResult.deal, DEAL_POSITION_ID)) :
              (long)MT4ORDERS::LastTradeResult.order)) : -1));

MT4ORDERS::OrderSend вернула true. MT4ORDERS::LastTradeRequest.action == TRADE_ACTION_DEAL это тоже true. MT4ORDERS::IsTester тоже true. А вот PositionSelect(MT4ORDERS::LastTradeRequest.symbol) возвращает уже false. Видимо, потому что позиция закрыта. Это баг или фича? Или я снова залез в область, которая этой либой не полностью поддерживается?

 
traveller00:

Есть неттинг счёт. На нём маркетами открываю и закрываю позицию. На закрытии позиции OrderSend возвращает 0. Что, вроде бы, и не ошибка, но и не совсем успех.

Закрытие позиции чаще всего делается через OrderClose. Если закрываете через OrderSend, то логично возвращать ноль, потому что MT4Style-OrderSend возвращает тикет открытой позции. Ну а раз Вы закрыли, то и возвращать нечего. Ошибка, это когда -1.


ЗЫ Если через OrderSend закрываетесь частично или переворачиваетесь, то должна (по идее) возвращать тикет измененной позиции. Ноль - когда нет тикета для возврата.

 

Пытаюсь у себя в голове устаканить частичное исполнение ордеров, но пока не до конца понятно. А демо счета в основном плюют на объём и не позволяют проверить экспериментально.

Есть 2 ситуации: используется чистый MT4 с опцией "Частичное исполнение лимитных ордеров" и используется MT5 с библиотекой MT4Orders. Ставится лимитник, который исполняется частично.

1. Для MT4, как я понимаю, появятся 2 ордера: 1 на частично исполненный объём как не лимитник, а уже исполненный, и 1 на оставшийся объём как лимитник. Ордера будут независимые, 2-й ордер по сути ставит брокер. После того, как зальётся оставшийся объём, так и будут висеть 2 ордера, только оба исполненные. Всё я правильно понимаю? Ибо разглядывая схему API в MT4 только такое пришло в голову, никакой работы с частичным исполнением там не вижу, как и выставления типа ордера, типа FOK или ещё что.

2. Для MT5 ордер останется 1, пока по-прежнему лимитник, только будет разделение объёмов на ORDER_VOLUME_INITIAL и ORDER_VOLUME_CURRENT. Причём MT4Orders будет возвращать ORDER_VOLUME_CURRENT и для получения второго объёма надо будет дёргать нативное MT5 API. Когда зальётся оставшийся объём, ордер останется 1, перейдёт из лимитника в исполненный, цена будет пересчитана на среднюю. Всё я правильно понимаю?

 
traveller00:

Пытаюсь у себя в голове устаканить частичное исполнение ордеров, но пока не до конца понятно. А демо счета в основном плюют на объём и не позволяют проверить экспериментально.

Есть 2 ситуации: используется чистый MT4 с опцией "Частичное исполнение лимитных ордеров" и используется MT5 с библиотекой MT4Orders. Ставится лимитник, который исполняется частично.

1. Для MT4, как я понимаю, появятся 2 ордера: 1 на частично исполненный объём как не лимитник, а уже исполненный, и 1 на оставшийся объём как лимитник. Ордера будут независимые, 2-й ордер по сути ставит брокер. После того, как зальётся оставшийся объём, так и будут висеть 2 ордера, только оба исполненные. Всё я правильно понимаю? Ибо разглядывая схему API в MT4 только такое пришло в голову, никакой работы с частичным исполнением там не вижу, как и выставления типа ордера, типа FOK или ещё что.

Верно.

2. Для MT5 ордер останется 1, пока по-прежнему лимитник, только будет разделение объёмов на ORDER_VOLUME_INITIAL и ORDER_VOLUME_CURRENT. Причём MT4Orders будет возвращать ORDER_VOLUME_CURRENT и для получения второго объёма надо будет дёргать нативное MT5 API. Когда зальётся оставшийся объём, ордер останется 1, перейдёт из лимитника в исполненный, цена будет пересчитана на среднюю. Всё я правильно понимаю?

Будет порождаться много сделок с одним и тем же DEAL_ORDER. При этом ордер может быть даже модифицирован (цена открытия ) или удален Вами. Т.е. его статус может быть CANCELED, но при этом он породил несколько сделок. Поэтому не всегда возможно узнать величину проскальзывания.


Не в курсе. Возможно, на MOEX-демо-контуре возможно влиять на цену через демо-лимитники. Тогда легко воспроизвести ситуацию: выставили BuyLimit внутрь спреда и тут же сделали несколько мелких SELL-маркетов.


ORDER_VOLUME_INITIAL - не увидел сценария, где эта информация могла бы пригодиться.


Если не было открытых позиций (для Хеджа не обязательно), то частичное исполнение создает MT5-Позицию и MT5-ордер с одним и тем же тикетом. Более того, создает сделки с этим же PositionID. Поэтому в режиме SELECT_BY_TICKET, в отличие от MT4, можно задавать приоритет, где сначала искать (в Истории или среди живых) - MODE_HISTORY/MODE_TRADES. И выбор по Тикету, соответственно, не однозначен.


Поэтому рекомендую делать через SELECT_BY_POS.

 
fxsaber:

ORDER_VOLUME_INITIAL - не увидел сценария, где эта информация могла бы пригодиться.

Я у себя использую совместно с ORDER_VOLUME_CURRENT для определения, сколько уже залито и сколько ещё висит в лимитнике. В основном для своей статистики для наглядности процесса.


По детальному объяснению отдельное спасибо. Значит я себе всё примерно верно представлял, так и делаю. Единственно не учёл, что частичное исполнение в MT5 создаст новый маркет ордер.

 
fxsaber:

Закрытие позиции чаще всего делается через OrderClose.

А в этом случае не получится же сработать через лимитник. Или как-то можно?

 
traveller00:

А в этом случае не получится же сработать через лимитник. Или как-то можно?

Закрываю позиции через выставление тейка на текущую цену. Но тейк наружу не всегда идет в виде лимитника (зависит от софта брокера). Поэтому такое решение не всегда подходит.

Если надо точно лимитником. То ставлю лимитник и, в случае хеджа, схлопываю противоположные позиции через OrderCloseBy.

 

Я так понимаю, выбран тейк, чтобы для хеджа можно было отправлять 1 запрос тейка на сервер вместо 2-отдельного лимитника и CloseBy? А для неттинга это уже без разницы.

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

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