Processamento OnTradeTransaction - página 3

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

Neste caso, ainda preciso armazenar o bilhete do pedido do requerente em algum lugar para compará-lo com o bilhete do ofício. E eu só quero me afastar de todo armazenamento em variáveis locais e obter informações apenas do mercado/terminal para nivelar os riscos da infra-estrutura local.

Você está sendo um pouco ingênuo.

O mago é o mesmo para todos os ofícios desta EA!

Mas as ordens são diferentes (únicas)!

 
prostotrader:

Estou negociando em Openvashka em real e testando em demonstração, mas não tenho múltiplos gatilhos.

Coloque sua peça de código paraTRADE_TRANSACTION_DEAL_ADD

Isto acabou de acontecer hoje. Acima afixou um recorte do registro de 2 transações idênticas para o mesmo robô.

2019.02.08 10:55:29 [INFO]: ( PChBreak_RTS-3.19_22) TRADE_TRANSACTION_DEAL_ADD
TRADE_TRANSACTION_DEALDEAL_ADD
Símbolo: RTS-3.19
Bilhete de acordo: 12674810
Tipo de negócio: DEAL_TYPE_BUY
Pedido de bilhete: 82646001
Tipo de pedido: ORDER_TYPE_BUY
Estado do pedido: ORDER_STATE_STARTED
Tipo de tempo de pedido: ORDER_TIME_GTC
Validade do pedido: 1970.01.01.01 00:00
Preço: 119700
Preço de ativação: 0
Stop Loss: 0
Tirar Lucro: 0
Volume: 1
Posição: 82646001
Posição por: 0

2019.02.08 10:55:32 [INFO]: ( PChBreak_RTS-3.19_22 ) TRADE_TRANSACTION_DEAL_ADD
TRADE_TRANSACTION_DEALDEAL_ADD
Símbolo: RTS-3.19
Bilhete de acordo: 12674810
Tipo de negócio: DEAL_TYPE_BUY
Pedido de bilhete: 82646001
Tipo de pedido: ORDER_TYPE_BUY
Estado do pedido: ORDER_STATE_STARTED
Tipo de tempo de pedido: ORDER_TIME_GTC
Validade do pedido: 1970.01.01.01 00:00
Preço: 119700
Preço de ativação: 0
Stop Loss: 0
Tirar Lucro: 0
Volume: 1
Posição: 82646001
Posição por: 0

Código no 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;

Depois de um bug com duas transações idênticas, acrescentei uma verificação de que o ticket da transação atual não é igual ao da transação anterior.

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

Isto acabou de acontecer hoje. Acima coloquei um recorte do registro de 2 transações idênticas para o mesmo robô.

2019.02.08 10:55:29 [INFO]: ( PChBreak_RTS-3.19_22 ) TRADE_TRANSACTION_DEAL_ADD
TRADE_TRANSACTION_DEALDEAL_ADD
Símbolo: RTS-3.19
Bilhete de acordo: 12674810
Tipo de negócio: DEAL_TYPE_BUY
Pedido de bilhete: 82646001
Tipo de pedido: ORDER_TYPE_BUY
Estado do pedido: ORDER_STATE_STARTED
.........

Código para negociar_add

Depois de um bug com duas transações idênticas, acrescentei uma verificação de que o ticket da transação atual não é igual ao da transação anterior.

Entendi.

Estado do pedido: ORDER_STATE_STARTED - ESTE NÃO PODE SER EMTRADE_TRANSACTION_DEAL_ADD!

Adicionado

Tenho certeza que você não (eIlya Baranov também não)

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

Adicionado

Este fórum tem uma seção de "Comércio de Câmbio" que seria melhor você se comunicar lá...

 
prostotrader:

Estou vendo.

Estado do pedido: ORDER_STATE_STARTED - ESTE NÃO PODE SER EM TRADE_TRANSACTION_DEAL_ADD!

Adicionado

Tenho certeza de que não.

Adicionado

Este fórum tem uma seção de "Comércio de Câmbio" que seria melhor você se comunicar lá...

Eu a teria movido há muito tempo - mas@Ilya Child nunca disse - ele negocia na bolsa ou apenas na rede de câmbio. Estou aqui sentado esperando...

 
Vladimir Karputov:

Eu a teria movido há muito tempo - mas@Ilya Child nunca disse se ele negocia na bolsa ou apenas na bolsa de valores. Estou aqui sentado esperando...

Símbolo: RTS-3.19 é FORTS

 
prostotrader:

Símbolo: RTS-3.19 é FORTS

Eunão entendo. Há uma bolsa de valores, há forex. Todo o resto está fora do estádio.

 
Vladimir Karputov:

Eu não entendo. Há uma bolsa de valores, há forex. Todo o resto está fora do estádio.

FORTS é RTS Futuros e Opções - a seção do mercado de derivativos da Bolsa de Moscou:)

 
prostotrader:

Estou vendo.

Estado do pedido: ORDER_STATE_STARTED - ESTE NÃO PODE SER EMTRADE_TRANSACTION_DEAL_ADD!

Adicionado

Tenho certeza que você não (eIlya Baranov também não)

Adicionado

Há uma seção "Exchange Trading" neste fórum é melhor você se comunicar lá...

Eu não o sigo muito bem. Aqui eu tenho o processamento da transação.

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;

Quanto ao status da ordem na transação. Você percebe que eu mesmo não estou inventando. Em todas as transações de deal_add este é o status do pedido. Observe que é uma ordem de mercado e que costumava ser uma ordem pendente.

Agora temos outra porção de confusão. Uma transação de acordo_add voou e não apareceu nenhuma posição e nenhuma posição pendente foi colocada em uma posição inexistente.

Adicionado.

Chegou uma transação Deal_add, mas a posição não apareceu e as ordens pendentes sobre a posição inexistente foram colocadas. O tipo de transação é Vender, o tipo de pedido é Comprar. Embora inicialmente o limite era Sell_limit

 
fxsaber:

Os próprios limitadores, para os quais TP/SL será exigido, poderão ser parcialmente executados. O TP na forma de limitadores é o mesmo. Por exemplo, o TP é executado por um terço do volume - SL deve ser reduzido na mesma quantidade.

Em resumo, uma lógica bastante desagradável para capturar todos os truques.


A tarefa deve ser implementada na OnTrade. Não deve ser muito difícil de implementar.

Tarefa

Temos pedidos pendentes na Netting (podem ser dirigidos de forma diferente e qualquer número de cada tipo). Cada vez que a ordem pendente inicial é acionada, precisamos definir seu SL/TP como uma ordem pendente Stop/Limit. Então o SL/TP deve ser interdependente: uma vez que a ordem é acionada, a segunda é apagada. As ordens iniciais e SL/TP pendentes podem acionar parcialmente. O Expert Advisor pode ser recarregado a qualquer momento, incluindo a transferência para outro Terminal.


Solução

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

Eu não o sigo muito bem. Aqui está o processamento da minha transação


Você não tem switch(trans.type)

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


  }
}