Marché boursier. Les actions. Vitesse d'exécution des ordres de bourse. - page 14

 
Dmitriy Skub #:
C'est en termes de frais généraux. Mais en termes d'arbitrage ?

en termes de coûts, bien sûr.

vous paierez pour avoir vendu l'action à découvert

 
Dmitriy Skub #:
C'est en termes de frais généraux. Et en termes d'arbitrage ?

L'arbitrage classique, c'est :

Acheter(en aucun cas vendre) des actions et vendre simultanément des contrats à terme sur la taille des actions.

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


Si vous vendez une action à découvert, Opener allumera le compteur à 23% par an.
 

Mais je me demande ce qui se passera si request.action = TRADE_ACTION_PENDING; est remplacé par request.action = TRADE_ACTION_DEAL dans la structure du stock ;


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);
}


L'ordre sera-t-il exécutéplus rapidement ou non ?

 
prostotrader TRADE_ACTION_PENDING; est remplacé par request.action = TRADE_ACTION_DEAL dans la structure du stock ;



L'ordre sera-t-il exécutéplus rapidement ou non ?

Si vous indiquez le prix actuel du marché, il ne sera pas plus rapide. Mais des dérapages peuvent se produire. Quoi qu'il en soit, je l'ai observé sur les démonstrateurs.

 
Alexey Viktorov #:

Si vous citez le prix actuel du marché, je ne pense pas que cela ira plus vite. Mais des dérapages peuvent se produire. Du moins, je l'ai observé dans le mode démo.

TRADE_ACTION_PENDING - définit un ordre de transaction pour l'exécution d'une transaction aux conditions spécifiées (ordre en attente ).

TRADE_ACTION_DEAL - Définit un ordre de transaction pour l'exécution immédiate d'une transaction aux paramètres spécifiés (place un ordre de marché).

Il semble que l 'ordre TRADE_ACTION_DEAL devrait être exécuté plus rapidement.

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

TRADE_ACTION_PENDING - Place un ordre de transaction pour exécuter une transaction aux conditions spécifiées (ordre en attente ).

TRADE_ACTION_DEAL - définit un ordre de transaction pour l'exécution immédiate d'une transaction avec les paramètres spécifiés (ordre de marché de vente).

Il semble que l 'ordre TRADE_ACTION_DEAL devrait être exécuté plus rapidement.

Il n'y a pas moyen de se passer d'un ordre. L'exécution immédiate signifie uniquement au prix actuel. Plus tard, nous pourrons obtenir une liste des commandes par ID de position, mais les propriétés ne seront pas toutes présentes. Je ne me souviens pas de ce qui manque encore à l'heure actuelle, mais certainement pas du prix de la commande.

Ici, nous avons une position en attente sur la démo. Ce code

/********************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)));
   }
 }/*******************************************************************/

résultat

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

Ce n'est pas du forex...


Ajouté :

Eh bien oui, je suppose que je n'ai pas tout de suite compris...

Dans ce cas, vous devez comprendre que si vous placez un prix égal au meilleur prix de la fenêtre de marché dans un ordre en attente, cela équivaut à placer un ordre au marché.

 
Alexey Viktorov #:

Dans ce cas, il faut comprendre que si vous mettez un prix égal au meilleur prix du marché, cela équivaut à passer un ordre au marché.

Ceci s'il y a suffisamment de volume sur le marché.

 
JRandomTrader #:

Ceci, s'il y a suffisamment de volume dans le verre.

Tout cela doit être vérifié dans la vie réelle. Probablement, s'il n'y a pas assez de volume au meilleur prix, il sera ajouté à partir du prochain.

Mais si nous parlons du travail de l'Expert Advisor, rien ne nous empêche de mettre la condition que, s'il n'y a pas assez de volume au meilleur prix, nous pouvons ouvrir le volume actuel et ensuite ouvrir le prochain meilleur prix avec le volume restant. Vous pouvez le faire autant de fois que vous le souhaitez dans la boucle do while.

 
Alexey Viktorov #:

Tout cela doit être vérifié dans la vie réelle. Il est probable que s'il n'y a pas assez de volume au meilleur prix, le meilleur prix suivant sera ajouté.

Mais si nous parlons du travail de l'Expert Advisor, rien ne nous empêche de stipuler que si nous n'avons pas assez de volume au meilleur prix, alors il faut ouvrir le volume actuel et rouvrir le prochain meilleur prix avec le reste du volume. Vous pouvez le faire autant de fois que vous le souhaitez dans la boucle do while.

En cas de volume insuffisant, cela dépend du type de remplissage - pour le RETOUR, la limite avec le reste sera fixée dans la tasse.

A propos, si nous plaçons un ordre au marché avec RETURN, TRADE_ACTION_DEAL et un prix nul, nous pouvons voir une autre transaction TRADE_TRANSACTION_REQUEST avec TRADE_ACTION_PENDING et un prix à la latte.

En ce qui concerne la boucle au-dessus de la barre - cela ne fonctionnera que pour les liquides peu abondants, sinon la vitesse ne sera pas suffisante. J'ai écrit un scalper avec la vitesse en tête, avec des envois asynchrones, en évitant les opérations lourdes, en travaillant avec des chaînes de caractères et sans appels à l'historique autant que possible. Mais quand même, avec mon ping de 10-12 ms, il ne peut pas suivre le verre.

 

Aussi étrange que cela puisse paraître, cela fonctionne plusieurs fois plus vite avec TRADE_ACTION_DEAL, sauf que le prix sera toujours meilleur,

malgré le fait qu'il soit réglé sur le maximum (minimum) dans la tasse.


Raison: