Фондовый рынок. Акции. Скорость исполнения торговых приказов. - страница 14

 
Dmitriy Skub #:
Это  с точки зрения накладных расходов. А с точки зрения арбитража?

с точки рения расходов конечно

 за шорт акций  будете платить

 
Dmitriy Skub #:
Это  с точки зрения накладных расходов. А с точки зрения арбитража?

Классический арбитраж, - это:

Покупка (ни в коем случае продажа) акций и одновременная продажа фьючерсов в размере акций.

exp_data.fut_equity = long(exp_data.fut_contr * exp_data.fut_contr_size);

=

exp_data.spot_equity = long(exp_data.spot_lot * exp_data.spot_lot_size);
exp_data.fut_equity = exp_data.spot_equity


Если шортить акции, то Открывашка включит счетчик в размере 23% годовых
 

А вот интересно, что будет, если на Фондовом в структуре request.action = TRADE_ACTION_PENDING; заменить на request.action = TRADE_ACTION_DEAL;


ulong SpotSetOrder(const long vol, const double price, const ulong magic, const int dir)
{
  MqlTradeRequest request = {}; 
  MqlTradeResult  result = {};
//--- Fill structure
  request.magic = magic;
  request.symbol = Symbol();
  request.volume = double(vol); 
  request.type_filling = ORDER_FILLING_RETURN;
  request.type_time = ORDER_TIME_DAY;
  request.action = TRADE_ACTION_PENDING;
  request.price = price;
  request.comment = "Отложенный ордер";
  if (dir == BUY) request.type = ORDER_TYPE_BUY_LIMIT;
   else
  if (dir == SELL) request.type = ORDER_TYPE_SELL_LIMIT;
   else return(0);
  if(OrderSend(request, result) == true)
  {
    if((result.retcode == TRADE_RETCODE_PLACED) || (result.retcode == TRADE_RETCODE_DONE))
    {
      return(result.order);
    }
    else Print("Ордер не размешен на Бирже!");
  }
  else Print("Ордер не отправлен!");
  return(0);
}


Быстрее ордер будет исполняться или нет?

 
prostotrader #:

А вот интересно, что будет, если на Фондовом в структуре request.action = TRADE_ACTION_PENDING; заменить на request.action = TRADE_ACTION_DEAL;



Быстрее ордер будет исполняться или нет?

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

 
Alexey Viktorov #:

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

TRADE_ACTION_PENDING - Установить торговый ордер на совершение сделки при указанных условиях (отложенный ордер)

TRADE_ACTION_DEAL -  Установить торговый ордер на немедленное совершение сделки с указанными параметрами (поставить рыночный ордер)

Думается, что  TRADE_ACTION_DEAL ордер должен исполняться быстрее.

Документация по MQL5: Константы, перечисления и структуры / Торговые константы / Типы торговых операций
Документация по MQL5: Константы, перечисления и структуры / Торговые константы / Типы торговых операций
  • www.mql5.com
Типы торговых операций - Торговые константы - Константы, перечисления и структуры - Справочник MQL5 - Справочник по языку алгоритмического/автоматического трейдинга для MetaTrader 5
 
prostotrader #:

TRADE_ACTION_PENDING - Установить торговый ордер на совершение сделки при указанных условиях (отложенный ордер)

TRADE_ACTION_DEAL -  Установить торговый ордер на немедленное совершение сделки с указанными параметрами (поставить рыночный ордер)

Думается, что  TRADE_ACTION_DEAL ордер должен исполняться быстрее.

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

Вот есть одна зависшая позиция на демке. Этот код

/********************Script program start function*******************/
void OnStart()
 {
  int posTotal = PositionsTotal();
  ulong posTicket = PositionGetTicket(0);
  long posID = PositionGetInteger(POSITION_IDENTIFIER);
  HistorySelectByPosition(posID);
  int ordTotal = HistoryOrdersTotal();
  for(int i = 0; i < ordTotal; i++)
   {
    ulong ordTicket = HistoryOrderGetTicket(i);
    Print("тикет ордера ", ordTicket,
          " время ", (datetime)HistoryOrderGetInteger(ordTicket, ORDER_TIME_SETUP), 
          " цена ", HistoryOrderGetDouble(ordTicket, ORDER_PRICE_OPEN),
          " установлен ", EnumToString((ENUM_ORDER_REASON)HistoryOrderGetInteger(ordTicket, ORDER_REASON)));
   }
 }/*******************************************************************/

результат

2022.04.08 09:30:28.996 !00 (EURUSD,M1) тикет ордера 178273170 время 2022.03.21 18:28:09 цена 0.0 установлен ORDER_REASON_EXPERT

Это не форекс…


Добавлено:

Ну да… Я видимо не сразу всё правильно понял…

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

 
Alexey Viktorov #:

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

Это если в стакане хватает объёма.

 
JRandomTrader #:

Это если в стакане хватает объёма.

Это всё надо проверять на реале. Вероятно в случае нехватки объёма по указанной, лучшей цене, будет добавлено из следующей.

Но ведь если мы говорим о работе советника, то ничего не мешает поставить условие, что если не хватает объёма в лучшей цене, то открыть имеющийся объём и следом повторить открытие по новой лучшей цене остаток объёма. Да хоть сколько раз в цикле do while.

 
Alexey Viktorov #:

Это всё надо проверять на реале. Вероятно в случае нехватки объёма по указанной, лучшей цене, будет добавлено из следующей.

Но ведь если мы говорим о работе советника, то ничего не мешает поставить условие, что если не хватает объёма в лучшей цене, то открыть имеющийся объём и следом повторить открытие по новой лучшей цене остаток объёма. Да хоть сколько раз в цикле do while.

В случае нехватки объёма зависит от типа заполнения - для RETURN лимитник с остатком будет выставлен в стакан.

Кстати, если ставить рыночный ордер с RETURN, TRADE_ACTION_DEAL и нулевой ценой, то потом можно увидеть ещё транзакцию TRADE_TRANSACTION_REQUEST с TRADE_ACTION_PENDING и ценой у планки.

Касательно цикла по стакану - это сработает только в малоликвидных, иначе скорости не хватит. Я тут у себя написал скальпера с выжиманием скорости, с асинхронной отправкой, максимально отказавшись от тяжёлых операций, работы со string и без обращений к истории. Но всё равно, при моём пинге 10-12 мс за стаканом не успевает.

 

Как не странно, но работает с  TRADE_ACTION_DEAL в разы быстрее, только вот думается что цена всегда будет лучшей,

не смотря на то, что она выставляется максимальной (минимальной )в стакане


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