Traitement des transactions (OnTradeTransaction) - page 3

 
Илья Ребенок:

Dans ce cas, je dois encore stocker le ticket de l'ordre du demandeur quelque part pour le comparer au ticket de la transaction. Et je veux simplement m'affranchir de tout stockage de variables locales et obtenir des informations uniquement du marché/terminal pour niveler les risques liés à l'infrastructure locale.

Tu es un peu naïf.

Le mage est le même pour tous les métiers de cette EA !

Mais les commandes sont différentes (uniques) !

 
prostotrader:

Je négocie dans Openvashka en réel et je teste en démo, mais je n'ai pas de déclencheurs multiples.

Postez votre morceau de code pourTRADE_TRANSACTION_DEAL_ADD

Ça m'est arrivé aujourd'hui. Nous avons posté ci-dessus une coupure du journal de deux transactions identiques pour le même robot.

2019.02.08 10:55:29 [INFO] : ( PChBreak_RTS-3.19_22) TRADE_TRANSACTION_DEAL_ADD
TRANSACTION_TRADITION_ADD
Symbole : RTS-3.19
Ticket de transaction : 12674810
Type d'offre : DEAL_TYPE_BUY
Billet de commande : 82646001
Type de commande : ORDER_TYPE_BUY
État de la commande : ORDER_STATE_STARTED
Type de temps de commande : ORDER_TIME_GTC
Expiration de la commande : 1970.01.01 00:00
Prix : 119700
Déclenchement du prix : 0
Stop Loss : 0
Prise de profit : 0
Volume : 1
Poste : 82646001
Position par : 0

2019.02.08 10:55:32 [INFO] : ( PChBreak_RTS-3.19_22 ) TRADE_TRANSACTION_DEAL_ADD
TRANSACTION_TRADITION_ADD
Symbole : RTS-3.19
Ticket de transaction : 12674810
Type d'offre : DEAL_TYPE_BUY
Billet de commande : 82646001
Type de commande : ORDER_TYPE_BUY
État de la commande : ORDER_STATE_STARTED
Type de temps de commande : ORDER_TIME_GTC
Expiration de la commande : 1970.01.01 00:00
Prix : 119700
Déclenchement du prix : 0
Stop Loss : 0
Prise de profit : 0
Volume : 1
Poste : 82646001
Position par : 0

Code sur deal_add

case TRADE_TRANSACTION_DEAL_ADD:
        {
         drop_info2("TRADE_TRANSACTION_DEAL_ADD\r\n"+TransactionDescription(trans));
         if((trans.deal_type==DEAL_TYPE_BUY || trans.deal_type==DEAL_TYPE_SELL) && trans.order!=0)
           {
            if(getIsDealOfExpert(trans.deal)) //функция проверки принадлежности сделки к роботу
              {
               drop_info2("Сделка наша");
               analyzeFilledOrder(trans.order,trans.volume); //процедура по выставлению отложенных стоп ордеров
              }
           }
        }
      break;

Suite à un bug avec deux transactions identiques, j'ai ajouté une vérification que le ticket de la transaction courante n'est pas égal à celui de la transaction précédente.

 
Илья Ребенок:

Ça m'est arrivé aujourd'hui. J'ai posté ci-dessus un extrait du journal de deux transactions identiques pour le même robot.

2019.02.08 10:55:29 [INFO] : ( PChBreak_RTS-3.19_22 ) TRADE_TRANSACTION_DEAL_ADD
TRANSACTION_COMMERCIALE_ADDITIONNELLE
Symbole : RTS-3.19
Ticket de transaction : 12674810
Type d'offre : DEAL_TYPE_BUY
Billet de commande : 82646001
Type de commande : ORDER_TYPE_BUY
État de la commande : ORDER_STATE_STARTED
.........

Code pour deal_add

Suite à un bug avec deux transactions identiques, j'ai ajouté une vérification que le ticket de la transaction courante n'est pas égal à celui de la transaction précédente.

Je l'ai.

État de la commande : ORDER_STATE_STARTED - Cela ne peut pas être dansTRADE_TRANSACTION_DEAL_ADD!

Ajouté

Je suis sûr que non (etIlya Baranov non plus).

switch(trans.type)
  {
    case TRADE_TRANSACTION_DEAL_ADD:
    //Place you code here
    break;  
  }

Ajouté

Ce forum a une section "Exchange Trading", vous feriez mieux d'y communiquer...

 
prostotrader:

Je vois.

État de la commande : ORDER_STATE_STARTED - Cela ne peut pas être dans TRADE_TRANSACTION_DEAL_ADD!

Ajouté

Je suis sûr que non.

Ajouté

Ce forum a une section "Exchange Trading", vous feriez mieux d'y communiquer...

Je l'aurais déplacé il y a longtemps - mais@Ilya Child n'a jamais dit - fait-il du commerce sur l'échange ou juste du forex de compensation. Je suis assis ici à attendre...

 
Vladimir Karputov:

Je l'aurais déplacé il y a longtemps - mais@Ilya Child n'a jamais dit s'il négocie à la bourse ou s'il se contente de compenser le forex. Je suis assis ici à attendre...

Symbole : RTS-3.19 est FORTS

 
prostotrader:

Symbole : RTS-3.19 est FORTS

Jene comprends pas. Il y a la bourse, il y a le forex. Tout le reste est à côté de la plaque.

 
Vladimir Karputov:

Je ne comprends pas. Il y a la bourse, il y a le forex. Tout le reste est à côté de la plaque.

FORTS est RTS Futures and Options - la section du marché des produits dérivés de la Bourse de Moscou:)

 
prostotrader:

Je vois.

État de la commande : ORDER_STATE_STARTED - Cela ne peut pas être dansTRADE_TRANSACTION_DEAL_ADD!

Ajouté

Je suis sûr que non (etIlya Baranov non plus).

Ajouté

Il y a une section "Exchange Trading" sur ce forum, vous feriez mieux d'y communiquer...

Je ne te suis pas vraiment. Ici, j'ai le traitement de la transaction.

case TRADE_TRANSACTION_DEAL_ADD:
        {
         drop_info2("TRADE_TRANSACTION_DEAL_ADD\r\n"+TransactionDescription(trans));
         if((trans.deal_type==DEAL_TYPE_BUY || trans.deal_type==DEAL_TYPE_SELL) && trans.order!=0)
           {
            if(getIsDealOfExpert(trans.deal)) //функция проверки принадлежности сделки к роботу
              {
               drop_info2("Сделка наша");
               analyzeFilledOrder(trans.order,trans.volume); //процедура по выставлению отложенных стоп ордеров
              }
           }
        }
      break;

Concernant le statut de la commande dans la transaction. Vous réalisez que je n'invente rien. Dans toutes les transactions deal_add, il s'agit du statut de la commande. Veuillez noter qu'il s'agit d'un ordre au marché et qu'il s'agissait auparavant d'un ordre en attente.

Nous avons maintenant une autre part d'incompréhension. Une transaction deal_add s'est envolée et la position n'est pas apparue et le pending sur la position inexistante a été placé.

Ajouté.

Une transaction Deal_add est arrivée, mais la position n'est pas apparue et les ordres en attente sur la position inexistante ont été placés. Le type de transaction est Vendre, le type d'ordre est Acheter. Bien qu'initialement la limite était Sell_limit

 
fxsaber:

Les limiteurs eux-mêmes, pour lesquels un TP/SL sera requis, peuvent être partiellement exécutés. Le TP sous forme de limiteurs est le même. Par exemple, TP est exécuté par un tiers du volume - SL doit être réduit de la même quantité.

En somme, une logique assez désagréable pour attraper tous les trucs.


La tâche doit être mise en œuvre dans OnTrade. Il ne devrait pas être trop difficile à mettre en œuvre.

Tâche

Nous avons des ordres en attente sur Netting (pouvant être différemment dirigés et un nombre quelconque de chaque type). Chaque fois que l'ordre en attente initial se déclenche, nous devons définir son SL/TP comme un ordre en attente Stop/Limit. Ensuite, les SL/TP doivent être interdépendants : une fois l'ordre déclenché, le second est supprimé. Les ordres initiaux et SL/TP en attente peuvent se déclencher partiellement. Le conseiller expert peut être rechargé à tout moment, y compris lors d'un transfert vers un autre terminal.


Solution

#include <MT4Orders.mqh> // https://www.mql5.com/ru/code/16006

input int inTP = 100;
input int inSL = 200;
sinput MAGIC_TYPE inMagicNumber = 0;
sinput string inStrKey = "SLTP";

int GetAmountDeals()
{
  return(HistorySelect(0, INT_MAX) ? HistoryDealsTotal() : 0);
}

bool IsMyString( const string Str, const string Key )
{
  return(StringSubstr(Str, 0, StringLen(Key)) == Key);
}

string ToMyString( const string Str, const string Key )
{
  return(Key + Str);
}

struct ORDER
{
  int Type;
  TICKET_TYPE Ticket;
  double Lots;
  double OpenPrice;
  MAGIC_TYPE Magic;
  string Comment;
  
  ORDER() : Type(OrderType()), Ticket(OrderTicket()), Lots(OrderLots()),
            OpenPrice(OrderOpenPrice()), Magic(OrderMagicNumber()), Comment(OrderComment())
  {
  }
};

#define _CS(A) ((!::IsStopped()) && (A))

bool GetPairOrder()
{
  bool Res = false;

  ORDER Order;
  Order.Type = 6 - Order.Type + ((Order.Type & 1) << 1);
  
  for (int i = OrdersTotal() - 1; _CS((i >= 0) && (!Res)); i--)
    Res = OrderSelect(i, SELECT_BY_POS) && (OrderType() == Order.Type) &&
          (OrderMagicNumber() == Order.Magic) && (OrderComment() == Order.Comment);
    
  return(Res);
}

void CheckSLTP( const string Symb, const MAGIC_TYPE Magic, const string Key, const int Slip = 100 )
{    
  for (int i = OrdersTotal() - 1; _CS(i >= 0); i--)
    if (OrderSelect(i, SELECT_BY_POS) && (OrderType() > OP_SELL)  &&
        (OrderMagicNumber() == Magic) && (OrderSymbol() == Symb) && IsMyString(OrderComment(), Key))
    {
      const ORDER Order;      
      
      if (!_CS(GetPairOrder()))
      {
        OrderDelete(Order.Ticket);
        
        i = OrdersTotal();
      }
      else if (_CS(OrderLots() < Order.Lots))
      {
        if (OrderDelete(Order.Ticket))
          OrderSend(OrderSymbol(), Order.Type, OrderLots(), Order.OpenPrice, Slip, 0, 0, Order.Comment, Order.Magic);
          
        i = OrdersTotal();          
      }
    }
}

void CheckFill( const string Symb, const MAGIC_TYPE Magic, const string Key, const int SL, const int TP )
{    
  static int PrevDeals = GetAmountDeals();
  
  const double point = SymbolInfoDouble(Symb, SYMBOL_POINT);
  const int NewDeals = GetAmountDeals();
  
  while (_CS(PrevDeals < NewDeals))
  {
    const ulong Ticket = HistoryDealGetTicket(PrevDeals);
    
    if (Ticket && (HistoryDealGetInteger(Ticket, DEAL_MAGIC) == Magic) &&
                  (HistoryDealGetString(Ticket, DEAL_SYMBOL) == Symb) &&
                  !IsMyString(HistoryDealGetString(Ticket, DEAL_COMMENT), Key))
    {
      const double Lots = HistoryDealGetDouble(Ticket, DEAL_VOLUME);
      const double Price = HistoryDealGetDouble(Ticket, DEAL_PRICE);
      const int Type = 1 - (int)HistoryDealGetInteger(Ticket, DEAL_TYPE);
      const double Koef = Type ? -point : point;
      const string Comment = ToMyString((string)Ticket, Key);
      
      if (OrderSend(Symb, Type + OP_BUYLIMIT, Lots, Price - Koef * TP, 0, 0, 0, Comment))
        OrderSend(Symb, Type + OP_BUYSTOP, Lots, Price + Koef * SL, 0, 0, 0, Comment);
    }
    
    PrevDeals++;
  }
}

void System()
{
  CheckFill(_Symbol, inMagicNumber, inStrKey, inSL, inTP);
  CheckSLTP(_Symbol, inMagicNumber, inStrKey);
}

void OnTrade()
{
  System();
}

void OnInit()
{
  OnTrade();
}
 
Илья Ребенок:

Je ne te suis pas vraiment. Voici le traitement de ma transaction


Vous n'avez pas de switch(trans.type)

void OnTradeTransaction( const MqlTradeTransaction &trans,
                         const MqlTradeRequest &request,
                         const MqlTradeResult &result )
{
  switch(trans.type) //<<---- ОТФИЛЬТРОВАТЬ ПО ТИПУ ТРАЗАКЦИИ!!!!!!!!!!!!!!!!!!!!!!
  {
   //А вот здесь уже TRADE_TRANSACTION_DEAL_ADD


  }
}