Une opération sur les contrats à terme s'ouvre au dernier prix, et non au cours acheteur ou vendeur. Est-ce normal ? - page 2

 

Roman et Alexey Viktorov, merci pour votre aide.

Après avoir ouvert une transaction, j'ai décidé de vérifier simplement si les distances TP et SL réelles et calculées sont les mêmes. Si elles ne coïncident pas, j'essaie de les réinitialiser dans la fonction OnTrade(). Par conséquent, les distances entre le prix ouvert réel et le TP et SL deviennent correctes. Ce qui est surprenant, c'est que ces dérapages sont la norme pour ce symbole. Le code est déclenché presque à chaque ouverture de transaction.

//+------------------------------------------------------------------+
//|                          OnTrade()                               |
//+------------------------------------------------------------------+
void OnTrade()
  {
   if(HistoryDealSelect(last_trade_ticket))
     {
      // сделка выделилась успешно
      ulong pos_id = HistoryDealGetInteger(last_trade_ticket, DEAL_POSITION_ID);
      // идентификатор позиции сохранён
      if(HistorySelectByPosition(pos_id) && HistoryDealsTotal() == 1)
        {
         // история позиции сформирована
         // позиция состоит из одной сделки
         if(PositionSelectByTicket(pos_id))
           {
            // позиция выделена
            string symbol = PositionGetString(POSITION_SYMBOL);
            double pos_op = PositionGetDouble(POSITION_PRICE_OPEN);
            double pos_tp = NormalizeDouble(PositionGetDouble(POSITION_TP), _Digits);
            double pos_sl = NormalizeDouble(PositionGetDouble(POSITION_SL), _Digits);
            long pos_type = PositionGetInteger(POSITION_TYPE);
            long pos_mag = PositionGetInteger(POSITION_MAGIC);
            // параметры позиции получены
            int tp = int(GlobalVariableGet(global_tp));
            int sl = int(GlobalVariableGet(global_sl));
            double calc_tp_price = 0;
            double calc_sl_price = 0;
            if(pos_type == POSITION_TYPE_BUY)
              {
               // покупка
               // расчёт корректных тп и сл
               if(tp > 0)
                  calc_tp_price = NormalizeDouble(pos_op + tp * _Point, _Digits);
               if(sl > 0)
                  calc_sl_price = NormalizeDouble(pos_op - sl * _Point, _Digits);
              }
            if(pos_type == POSITION_TYPE_SELL)
              {
               // продажа
               // расчёт корректных тп и сл
               if(tp > 0)
                  calc_tp_price = NormalizeDouble(pos_op - tp * _Point, _Digits);
               if(sl > 0)
                  calc_sl_price = NormalizeDouble(pos_op + sl * _Point, _Digits);
              }
            if(pos_tp != calc_tp_price || pos_sl != calc_sl_price)
              {
               // обнаружен факт проскальзывания
               // исправить тейк и стоп
               MqlTradeRequest request;
               MqlTradeResult result;
               ZeroMemory(request);
               ZeroMemory(result);
               request.action = TRADE_ACTION_SLTP;
               request.position = pos_id;
               request.symbol = symbol;
               request.magic = pos_mag;
               request.tp = calc_tp_price;
               request.sl = calc_sl_price;
               if(!OrderSend(request, result) || result.retcode != TRADE_RETCODE_DONE)
                  Print("Ticket:", pos_id, " Error: ", ResultRetcode(result));
              }
           }
        }
     }
   last_trade_ticket = 0;
  }
//+------------------------------------------------------------------+
 
Bon sujet. Merci et ne le supprimez pas. Lorsque j'ai essayé l'arbitrage, de nombreuses questions se sont posées, auxquelles nous répondons ici.
 
Oleg Remizov:

Roman et Alexey Viktorov, merci pour votre aide.

Après avoir ouvert une transaction, j'ai décidé de vérifier simplement si les distances TP et SL réelles et calculées sont les mêmes. Si elles ne coïncident pas, j'essaie de les réinitialiser dans la fonction OnTrade(). Par conséquent, les distances entre le prix ouvert réel et le TP et SL deviennent correctes. Ce qui est surprenant, c'est que ces dérapages sont la norme pour ce symbole. Le code est déclenché presque à chaque ouverture de transaction.

Essayez d'exécuter une transaction dans un ordre à cours limité au lieu du prix du marché, mais spécifiez le meilleur cours vendeur à l'achat ou le meilleur cours acheteur à la vente. L'ordre doit être immédiatement exécuté au prix indiqué, à moins, bien sûr, que l'offre ou la demande ne change pendant ce temps.

 
Vitalii Ananev:

Essayez d'exécuter la transaction non pas en fonction du marché, mais par un ordre limite, mais le prix dans l'ordre indique le meilleur prix Ask à l'achat ou le meilleur prix Bid à la vente. L'ordre doit être immédiatement exécuté au prix indiqué, à moins bien sûr que l'offre ou la demande ne change pendant ce temps.

Les ordres à cours limité sont bien exécutés. Parfois même à un meilleur prix que l'offre.

 
Oleg Remizov:

.... Même parfois à un meilleur prix que dans le formulaire de demande.

Les prix ont donc changé.

Voici un conseil :) Avec un ordre à cours limité, vous pouvez ouvrir une position comme si vous ouvriez un ordre au marché, mais vous ajustez également le slippage. Les cambistes ont l'habitude de placer des ordres à cours limité en dessous du cours acheteur. Et les ordres de vente à cours limité doivent être placés au-dessus du cours vendeur. Vous pouvez placer un ordre à cours limité pour acheter au cours vendeur ou à un cours supérieur. Il sera exécuté au meilleur prix suivant. Par exemple, le prix Ask sur le marché est de 5,8,10,20,35. L'envoi d'un ordre limite d'achat à 10 initiera une transaction à 5. Si l'ordre de sécurité contient un changement de prix et que le meilleur prix est à 20, votre ordre ne sera pas exécuté, mais apparaîtra dans les piquets à 10. De cette façon, nous avons limité l'ampleur des dérapages possibles.

 
Vitalii Ananev:

Les prix ont donc changé.

Laissez-moi vous donner un conseil :) Avec un ordre à cours limité, vous pouvez ouvrir une position comme si vous ouvriez un ordre au marché, mais vous ajustez également le slippage. Les cambistes ont l'habitude de placer des ordres à cours limité en dessous du cours acheteur. Et les ordres de vente à cours limité doivent être placés au-dessus du cours vendeur. Vous pouvez placer un ordre à cours limité pour acheter au cours vendeur ou à un cours supérieur. Il sera exécuté au meilleur prix suivant. Par exemple, le prix Ask sur le marché est de 5,8,10,20,35. L'envoi d'un ordre limite d'achat à 10 initiera une transaction à 5. Si l'ordre de sécurité contient un changement de prix et que le meilleur prix est à 20, votre ordre ne sera pas exécuté, mais apparaîtra dans les piquets à 10. De cette façon, nous avons limité les dérapages possibles.

Il ne s'agit pas d'un "mode d'emploi", mais du principe d'exécution des échanges. )))
C'est pourquoi j'ai dit à Aleh plus tôt, de comprendre comment les ordres d'échange fonctionnent.
En comprenant comment ils fonctionnent, vous pouvez améliorer la qualité de vos transactions.

Et voici un petit truc pour ceux qui travaillent dans Quik.
Dans Quik, vous pouvez ouvrir des positions dirigées différemment pour le même instrument au cours de la journée.
Elle est bonne, celle-là))
 
Roman:

Ce n'est pas un truc intelligent, c'est le principe de l'exécution des échanges. )))
C'est pourquoi j'ai dit à Oleg plus tôt, de comprendre comment fonctionnent les ordres d'échange.
En comprenant leur fonctionnement, vous pouvez améliorer la qualité de vos transactions.

Voici une astuce intelligente pour ceux qui travaillent dans Quik.
Dans Quik, vous pouvez ouvrir différentes positions pour un même instrument au cours de la journée.
Voilà un bon savoir-faire).

Je l'ai écrit comme une blague sur ce truc d'argent avec un smiley à la fin.

Mais je ne connaissais pas les positions multidirectionnelles dans le Quick. L'échange vous permet-il de le faire ?

 
Vitalii Ananev:

J'ai écrit ça comme une blague sur le tour avec un smiley à la fin.

Mais je ne connaissais pas les positions multidirectionnelles dans QuickBooks. L'échange vous permet-il de le faire ?

Je ne sais pas qui l'autorise)) L'échange, ou les serveurs d'échange rapide.
Les positions ordinaires peuvent être maintenues jusqu'à la compensation principale, à la compensation elles seront fermées, en volume égal.
C'est-à-dire que si 2 sont longs, 1 est court, alors 1 restera long après la compensation.
En fait, pendant la journée, vous pouvez fixer la perte, mais pas la réaliser, et si vous attendez un rebond, vous pouvez réduire la perte.
Et si le renversement se produit, vous pouvez obtenir le bénéfice de la transaction. En général, entre de bonnes mains, c'est un bon outil.

 
Roman:

Je ne sais pas qui vous permet de faire ça.) L'échange, ou les serveurs rapides.
Les positions divergentes peuvent être maintenues jusqu'au clearing principal, au moment du clearing elles seront fermées, à volume égal.
C'est-à-dire que si 2 sont longs, 1 est court, alors 1 restera long après la compensation.
En fait, pendant la journée, vous pouvez fixer la perte, mais pas la réaliser, et si vous attendez un rebond, vous pouvez réduire la perte.
Et si le renversement se produit, vous pouvez obtenir le bénéfice de la transaction. En général, c'est un bon outil dans des mains habiles.

Je vois. Je ne négocie pas en intraday, seulement en long et en large.

 
Oleg Remizov:

Spécification de l'instrument de négociation :

Sur quelle place de marché ce produit est-il négocié ?

Raison: