Elaborazione OnTradeTransaction - pagina 3

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

In questo caso, ho ancora bisogno di memorizzare il biglietto dell'ordine dal richiedente da qualche parte per confrontarlo con il biglietto del commercio. E voglio solo allontanarmi da tutte le memorizzazioni di variabili locali e ottenere informazioni solo dal mercato/terminale per livellare i rischi delle infrastrutture locali.

Sei un po' ingenuo.

Il mago è lo stesso per tutti i mestieri di questo EA!

Ma gli ordini sono diversi (unici)!

 
prostotrader:

Sto facendo trading in Openvashka su reale e testando su demo, ma non ho trigger multipli.

Pubblica il tuo pezzo di codice perTRADE_TRANSACTION_DEAL_ADD

Mi è successo proprio oggi. Sopra ha postato un ritaglio dal registro di 2 transazioni identiche per lo stesso robot.

2019.02.08 10:55:29 [INFO]: ( PChBreak_RTS-3.19_22) TRADE_TRANSACTION_DEAL_ADD
AGGIUNGI UNA TRANSAZIONE COMMERCIALE
Simbolo: RTS-3.19
Biglietto d'affari: 12674810
Tipo di affare: DEAL_TYPE_BUY
Biglietto d'ordine: 82646001
Tipo di ordine: ORDER_TYPE_BUY
Stato dell'ordine: ORDER_STATE_STARTED
Tipo di tempo dell'ordine: ORDER_TIME_GTC
Scadenza ordine: 1970.01.01 00:00
Prezzo: 119700
Prezzo di attivazione: 0
Stop Loss: 0
Prendere profitto: 0
Volume: 1
Posizione: 82646001
Posizione da: 0

2019.02.08 10:55:32 [INFO]: ( PChBreak_RTS-3.19_22 ) TRADE_TRANSACTION_DEAL_ADD
AGGIUNGI UNA TRANSAZIONE COMMERCIALE
Simbolo: RTS-3.19
Biglietto d'affari: 12674810
Tipo di affare: DEAL_TYPE_BUY
Biglietto d'ordine: 82646001
Tipo di ordine: ORDER_TYPE_BUY
Stato dell'ordine: ORDER_STATE_STARTED
Tipo di tempo dell'ordine: ORDER_TIME_GTC
Scadenza ordine: 1970.01.01 00:00
Prezzo: 119700
Prezzo di attivazione: 0
Stop Loss: 0
Prendere profitto: 0
Volume: 1
Posizione: 82646001
Posizione da: 0

Codice su 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;

Dopo un bug con due transazioni identiche, ho aggiunto un controllo che il biglietto della transazione corrente non sia uguale a quello precedente.

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

Mi è successo proprio oggi. Sopra ho postato un ritaglio dal registro di 2 transazioni identiche per lo stesso robot.

2019.02.08 10:55:29 [INFO]: ( PChBreak_RTS-3.19_22 ) TRADE_TRANSACTION_DEAL_ADD
AGGIUNGI UNA TRANSAZIONE COMMERCIALE
Simbolo: RTS-3.19
Biglietto d'affari: 12674810
Tipo di affare: DEAL_TYPE_BUY
Biglietto d'ordine: 82646001
Tipo di ordine: ORDER_TYPE_BUY
Stato dell'ordine: ORDER_STATE_STARTED
.........

Codice per aggiungere l'affare

Dopo un bug con due transazioni identiche, ho aggiunto un controllo che il biglietto della transazione corrente non sia uguale a quello precedente.

Capito.

Stato dell'ordine: ORDER_STATE_STARTED - QUESTO NON PUÒ ESSERE inTRADE_TRANSACTION_DEAL_ADD!

Aggiunto

Sono sicuro che non lo fai (e nemmenoIlya Baranov)

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

Aggiunto

Questo forum ha una sezione "Exchange Trading", faresti meglio a comunicare lì...

 
prostotrader:

Capisco.

Stato dell'ordine: ORDER_STATE_STARTED - QUESTO NON PUÒ ESSERE in TRADE_TRANSACTION_DEAL_ADD!

Aggiunto

Sono sicuro che non è così.

Aggiunto

Questo forum ha una sezione "Exchange Trading", faresti meglio a comunicare lì...

L'avrei spostato molto tempo fa - ma@Ilya Child non ha mai detto - fa trading sullo scambio o solo netting forex. Sono seduto qui ad aspettare...

 
Vladimir Karputov:

L'avrei spostato molto tempo fa - ma@Ilya Child non ha mai detto se fa trading sullo scambio o solo netting forex. Sono seduto qui ad aspettare...

Simbolo: RTS-3.19 è FORTS

 
prostotrader:

Simbolo: RTS-3.19 è FORTS

Non capisco. C'è la borsa, c'è il forex. Tutto il resto è fuori dal campo.

 
Vladimir Karputov:

Non capisco. C'è la borsa, c'è il forex. Tutto il resto è fuori dal campo.

FORTS è RTS Futures and Options - la sezione del mercato dei derivati della Borsa di Mosca:)

 
prostotrader:

Capisco.

Stato dell'ordine: ORDER_STATE_STARTED - QUESTO NON PUÒ ESSERE inTRADE_TRANSACTION_DEAL_ADD!

Aggiunto

Sono sicuro che non lo fai (e nemmenoIlya Baranov)

Aggiunto

C'è una sezione "Exchange Trading" su questo forum, faresti meglio a comunicare lì...

Non ti seguo del tutto. Qui ho l'elaborazione della transazione.

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;

Per quanto riguarda lo stato dell'ordine nella transazione. Si rende conto che non me lo sto inventando io. In tutte le transazioni deal_add questo è lo stato dell'ordine. Si prega di notare che si tratta di un ordine a mercato e che prima era un ordine pendente.

Ora abbiamo un'altra porzione di confusione. Una transazione deal_add è volata dentro e la posizione non è apparsa e il pending sulla posizione inesistente è stato messo.

Aggiunto.

È arrivata una transazione Deal_add, ma la posizione non è apparsa e gli ordini pendenti sulla posizione inesistente sono stati piazzati. Il tipo di transazione è Vendere, il tipo di ordine è Comprare. Anche se inizialmente il limite era Sell_limit

 
fxsaber:

I limitatori stessi, per i quali sarà richiesto il TP/SL, possono essere eseguiti parzialmente. Il TP sotto forma di limitatori è lo stesso. Per esempio, il TP viene eseguito per un terzo del volume - SL deve essere ridotto della stessa quantità.

Tutto sommato, una logica abbastanza sgradevole per catturare tutti i trucchi.


Il compito dovrebbe essere implementato in OnTrade. Non dovrebbe essere troppo difficile da implementare.

Compito

Abbiamo ordini in sospeso su Netting (può essere diversamente diretto e qualsiasi numero di ogni tipo). Ogni volta che l'ordine pendente iniziale scatta, dobbiamo impostare il suo SL/TP come ordine pendente Stop/Limit. Allora lo SL/TP dovrebbe essere interdipendente: una volta che l'ordine scatta, il secondo viene cancellato. Gli ordini pendenti iniziali e SL/TP possono scattare parzialmente. L'Expert Advisor può essere ricaricato in qualsiasi momento, compreso il trasferimento a un altro terminale.


Soluzione

#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();
}
 
Илья Ребенок:

Non ti seguo del tutto. Ecco la mia elaborazione della transazione


Non avete switch(trans.type)

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


  }
}
Motivazione: