Bibliotecas: MT4Orders - página 24

 

Desculpe-me, mas não sei falar russo. Uso o Google Tradutor.

Há alguns dias, encontrei essa biblioteca muito interessante. Mas tenho um problema: envio uma ordem de mercado por meio de OrderSend () e salvo o tíquete retornado por OrderSend (). Depois de algum tempo, o stop loss é atingido ou os lucros são obtidos. Em seguida, tento selecionar uma ordem via OrderSelect(ticket, SELECT_BY_TICKET) com esse ticket. Na MQL4, a ordem será encontrada no histórico. Porém, ao usar essa biblioteca com MQL5, o OrderSelect falhará.

Pesquisei um pouco no código do MT4orders.mqh. MT4ORDERS::SelectByTicket () chama SelectByExistingTicket(), que falha, e depois SelectByHistoryTicket(), que eu espero que seja bem-sucedido. Em SelectByHistoryTicket(), HistoryDealSelect() geralmente retorna falso (exceto talvez em um teste) porque o tíquete é um identificador de posição, não um tíquete de transação. O método ::HistoryOrderSelect() retorna true, porque o tíquete é o mesmo que o tíquete em ordem (e o identificador de posição) (uso o MT5 no modo de hedge). Mas MT4HISTORY::IsMT4Order(Ticket) retorna falso. Espero que ele retorne verdadeiro. A função retornará verdadeiro se o ID da posição for zero. Mas vejo que tanto no teste quanto no boleto real, o ID do item não é zero e é igual ao bit do pedido na ordem.

Qualquer ajuda é bem-vinda.

 
winloosewin:

Encontrei essa biblioteca muito interessante há alguns dias. Mas tenho um problema: envio uma ordem de mercado por meio de OrderSend () e salvo o ticket retornado por OrderSend (). Depois de algum tempo, o stop loss é atingido ou os lucros são obtidos. Em seguida, tento selecionar uma ordem via OrderSelect(ticket, SELECT_BY_TICKET) com esse ticket. Na MQL4, a ordem será encontrada no histórico. Mas ao usar essa biblioteca com MQL5, o OrderSelect falhará.

Isso está correto. Os detalhes estão descritos aqui.

Você pode fazer PositionTicket = OrderSend(OP_BUY, 2 lots) e OrderClose(0.2 lots) + OrderClose(0.3 lots). Assim, você obterá duas "posições" fechadas (0,2/0,3 lote) e uma posição aberta (1,5 lote) com um tíquete igual ao PositionTicket. Essa é uma peculiaridade do MT5. É por isso que é errado selecionar uma posição por seu POSITION_ID no histórico de negociação no modo SELECT_BY_TICKET+MODE_HISTORY.


A memorização de tíquetes é um estilo ruim, embora seja popular. O estilo correto é quando, a cada evento, o robô de negociação lê todo o ambiente do zero.


ZY Aqui você pode ver aproximadamente a mesma situação descrita acima.

Fórum sobre negociação, sistemas de negociação automatizados e teste de estratégias de negociação

Bibliotecas: MT4Orders

fxsaber, 2018.04.14 09:10 AM

Exemplo

#include <MT4Orders.mqh>

#define Bid SymbolInfoDouble(_Symbol, SYMBOL_BID)
#define Ask SymbolInfoDouble(_Symbol, SYMBOL_ASK)

#define  PRINT(A) Print(#A + " = " + (string)(A))

void OnInit()
{
  long Ticket;
  
  PRINT((Ticket = OrderSend(_Symbol, OP_BUY, 1, Ask, 0, Bid - 100 * _Point, Bid + 100 * _Point, "Hello World!", 12345)));
  
  if (OrderSelect(Ticket, SELECT_BY_TICKET))
    PRINT(OrderClose(OrderTicket(), 0.3, OrderClosePrice(), 0));
}

void OnDeinit( const int )
{
  const int Total = OrdersHistoryTotal();
  
  for (int i = 1; i < Total; i++)
    if (OrderSelect(i, SELECT_BY_POS, MODE_HISTORY))
    {
      OrderPrint();
      
      PRINT(OrderTicket());
      PRINT(OrderMagicNumber());
      PRINT(OrderComment());
      PRINT(OrderTicketOpen());
    }
}


Resultado

2018.03.25 00:00:00   instant buy 1.00 EURUSD at 1.23527 sl: 1.23414 tp: 1.23614 (1.23514 / 1.23527)
2018.03.25 00:00:00   deal #2  buy 1.00 EURUSD at 1.23527 done (based on order #2)
2018.03.25 00:00:00   deal performed [#2  buy 1.00 EURUSD at 1.23527]
2018.03.25 00:00:00   order performed buy 1.00 at 1.23527 [#2  buy 1.00 EURUSD at 1.23527]
2018.03.25 00:00:00   (Ticket=OrderSend(_Symbol,OP_BUY,1,Ask,0,Bid-100*_Point,Bid+100*_Point,Hello World!,12345)) = 2
2018.03.25 00:00:00   instant sell 0.30 EURUSD at 1.23514, close #2 (1.23514 / 1.23527)
2018.03.25 00:00:00   deal #3  sell 0.30 EURUSD at 1.23514 done (based on order #3)
2018.03.25 00:00:00   deal performed [#3  sell 0.30 EURUSD at 1.23514]
2018.03.25 00:00:00   order performed sell 0.30 at 1.23514 [#3  sell 0.30 EURUSD at 1.23514]
2018.03.25 00:00:00   OrderClose(OrderTicket(),0.3,OrderClosePrice(),0) = true
2018.03.26 01:04:40   take profit triggered #2  buy 0.70 EURUSD 1.23527 sl: 1.23414 tp: 1.23614 [#4  sell 0.70 EURUSD at 1.23614]
2018.03.26 01:04:40   deal #4  sell 0.70 EURUSD at 1.23614 done (based on order #4)
2018.03.26 01:04:40   deal performed [#4  sell 0.70 EURUSD at 1.23614]
2018.03.26 01:04:40   order performed sell 0.70 at 1.23614 [#4  sell 0.70 EURUSD at 1.23614]
final balance 10000046.11 EUR
2018.03.26 23:59:59   #3 2018.03.25 00:00:00 buy 0.30 EURUSD 1.23527 1.23414 1.23614 2018.03.25 00:00:00 1.23514 0.00 0.00 -3.16 Hello World! 12345
2018.03.26 23:59:59   OrderTicket() = 3
2018.03.26 23:59:59   OrderMagicNumber() = 12345
2018.03.26 23:59:59   OrderComment() = Hello World!
2018.03.26 23:59:59   OrderTicketOpen() = 2
2018.03.26 23:59:59   #4 2018.03.25 00:00:00 buy 0.70 EURUSD 1.23527 0.00000 1.23614 2018.03.26 01:04:40 1.23614 0.00 0.00 49.27 tp 1.23614 12345
2018.03.26 23:59:59   OrderTicket() = 4
2018.03.26 23:59:59   OrderMagicNumber() = 12345
2018.03.26 23:59:59   OrderComment() = tp 1.23614
2018.03.26 23:59:59   OrderTicketOpen() = 2

Os resultados mostram que uma posição foi aberta com ticket == 2. Em seguida, ela foi fechada duas vezes, criando assim duas "posições" fechadas no histórico de negociação. Seus tíquetes são diferentes, mas ambas as "posições" têm OrderTicketOpen == 2. Ou seja, você deve perceber que, se fechar uma posição no MT5, seu tíquete histórico não corresponderá ao de tempo real.


Observe que no MT5 até mesmo os comentários ao fechar a mesma posição em tempo real são diferentes:"Hello World!" e"tp 1.23614".

 
winloosewin:

Desculpe-me, mas não sei falar russo. Uso o Google Tradutor.

Há alguns dias, encontrei essa biblioteca muito interessante. Mas tenho um problema: envio uma ordem de mercado por meio de OrderSend () e salvo o tíquete retornado por OrderSend (). Depois de algum tempo, o stop loss é atingido ou os lucros são obtidos. Em seguida, tento selecionar uma ordem via OrderSelect(ticket, SELECT_BY_TICKET) com esse ticket. Na MQL4, a ordem será encontrada no histórico. Porém, ao usar essa biblioteca com MQL5, o OrderSelect falhará.

Pesquisei um pouco no código do MT4orders.mqh. MT4ORDERS::SelectByTicket () chama SelectByExistingTicket(), que falha, e depois SelectByHistoryTicket(), que eu espero que seja bem-sucedido. Em SelectByHistoryTicket(), HistoryDealSelect() geralmente retorna falso (exceto talvez em um teste) porque o tíquete é um identificador de posição, não um tíquete de transação. O método ::HistoryOrderSelect() retorna true porque o tíquete é o mesmo que o tíquete em ordem (e identificador de posição) (uso o MT5 no modo hedge). Mas MT4HISTORY::IsMT4Order(Ticket) retorna falso. Espero que ele retorne verdadeiro. A função retornará verdadeiro se a identificação da posição for zero. Mas vejo que tanto no teste quanto no boleto real, o ID do item não é zero e é igual ao bit de ordem no pedido.

Qualquer ajuda é bem-vinda.

Para entender completamente sua tradução automática, anexe o texto em inglês.

 

Descobri essa biblioteca muito interessante há alguns dias. Mas tenho um problema: envio uma ordem de mercado por meio de OrderSend() e armazeno o ticket retornado por OrderSend(). Depois de algum tempo, o stop loss ou take profit é atingido. Em seguida, tento selecionar a ordem por meio de
OrderSelect(ticket, SELECT_BY_TICKET) com esse ticket. Na MQL4, a ordem seria encontrada no histórico. Mas usando essa biblioteca com MQL5, o OrderSelect não é bem-sucedido.

Examinei um pouco o código do MT4orders.mqh . MT4ORDERS::SelectByTicket() chama SelectByExistingTicket(), que falha, e depois SelectByHistoryTicket(), que eu esperaria que fosse bem-sucedido. Em SelectByHistoryTicket(), a função HistoryDealSelect() geralmente retorna falso (exceto, talvez, no testador) porque o tíquete é o identificador de posição e não o tíquete da transação. ::HistoryOrderSelect() retorna verdadeiro porque o tíquete é o mesmo que o tíquete da ordem (e o identificador de posição)(uso o MT5 no modo de cobertura). Mas MT4HISTORY::IsMT4Order(Ticket) retorna falso. Eu esperava que ele retornasse verdadeiro. A função retornaria verdadeiro se o identificador de posição fosse zero. Mas vejo que, tanto no testador quanto em uma conta real, o identificador de posição não é zero - e é igual ao tíquete da ordem.

Em outras palavras: não entendo por que na função MT4HISTORY::IsMT4Order() há o seguinte código (retorna verdadeiro se o identificador de posição for zero):

    return(/*(::HistoryOrderGetDouble(Ticket, ORDER_VOLUME_CURRENT) > 0) ||*/ !::HistoryOrderGetInteger(Ticket, ORDER_POSITION_ID));

A seguir, anexei meu código de teste:

void OnTick()
{
   PrintChangesOfMQL5OrderSystemState();

   int total=OrdersTotal();

   double bid = MarketInfo(Symbol(), MODE_BID);
   double ask = MarketInfo(Symbol(), MODE_ASK);

   static int state=0;
   static ulong ticket = 0;

   switch(state)
   {
      case 0:
         ticket = OrderSend(Symbol(), OP_BUY, 1.0, ask, 10, bid - 3*Point, bid + 3*Point);
         state=1;
         break;

      case 1:
         if(0==total)
         {
            bool res = OrderSelect(ticket, SELECT_BY_TICKET, MODE_TRADES);
            if(false==res)
            {
               Print("OrderSelect failed with ticket: ", (string)ticket);
               Print("ORDER_POSITION_ID = ", (string)HistoryOrderGetInteger(ticket, ORDER_POSITION_ID));
               HistoryDealSelect(ticket);
               Print("HistoryDealSelect", (string)HistoryDealSelect(ticket), "   MT4HISTORY::IsMT4Deal", (string)MT4HISTORY::IsMT4Deal(ticket));
               HistoryOrderSelect(ticket);
               Print("HistoryOrderSelect", (string)HistoryOrderSelect(ticket), "   ORDER_POSITION_ID", ::HistoryOrderGetInteger(Ticket, ORDER_POSITION_ID));
               
               ExpertRemove();
            }
         }
         break;
   }
}

PrintChangesOfMQL5OrderSystemState() é uma função direta que imprime o estado do sistema de ordens MQL5 toda vez que uma alteração é detectada.

Aqui está a saída do código de teste (executado no testador):

EURUSD  bid=1.087360   ask=1.087860
263207 EURUSD 2016.01.03 00:00:00  

HistDeal: ticket: 1  position_id: 0  MAGIC: 0  balance  open_price: 0.000000  volume: 0.000000  opened by order: 0  type=balance  reason=client  entry=in


--------------------
EURUSD  bid=1.087350   ask=1.087850
263207 EURUSD 2016.01.03 00:00:00  

HistDeal: ticket: 2  position_id: 2  MAGIC: 0  buy  open_price: 1.087860  volume: 1.000000  opened by order: 2  type=buy  reason=expert  entry=in
HistDeal: ticket: 1  position_id: 0  MAGIC: 0  balance  open_price: 0.000000  volume: 0.000000  opened by order: 0  type=balance  reason=client  entry=in

HistOrder ticket: 2  position_id: 2  MAGIC: 0  buy  open_price: 1.087860  volume: 1.000000  cur_vol=0.000000  type=buy  reason=expert
Order:    ticket: 0  position_id: 0  MAGIC: 0  buy  open_price: 0.000000  volume: 0.000000  cur_vol=0.000000  type=buy  reason=client

Position: ticket: 2  position_id: 2  MAGIC: 0  buy  open_price: 1.087860  volume: 1.000000  reason=expert

--------------------
EURUSD  bid=1.087330   ask=1.087830
263207 EURUSD 2016.01.03 00:00:16  

HistDeal: ticket: 3  position_id: 2  MAGIC: 0  sell  open_price: 1.087330  volume: 1.000000  opened by order: 3  type=sell  reason=stop loss  entry=out
HistDeal: ticket: 2  position_id: 2  MAGIC: 0  buy  open_price: 1.087860  volume: 1.000000  opened by order: 2  type=buy  reason=expert  entry=in
HistDeal: ticket: 1  position_id: 0  MAGIC: 0  balance  open_price: 0.000000  volume: 0.000000  opened by order: 0  type=balance  reason=client  entry=in

HistOrder ticket: 3  position_id: 2  MAGIC: 0  sell  open_price: 1.087330  volume: 1.000000  cur_vol=0.000000  type=sell  reason=stop loss
HistOrder ticket: 2  position_id: 2  MAGIC: 0  buy  open_price: 1.087860  volume: 1.000000  cur_vol=0.000000  type=buy  reason=expert

--------------------

OrderSelect failed with ticket:  2
ORDER_POSITION_ID =  2
HistoryDealSelect true    MT4HISTORY::IsMT4Deal false
HistoryOrderSelect true    MT4HISTORY::IsMT4Order false    ::HistoryOrderGetInteger(Ticket, ORDER_POSITION_ID) 2


Você pode ver que HistoryOrderGetInteger(Ticket, ORDER_POSITION_ID) retorna 2 e não zero. Esse é o motivo pelo qual MT4HISTORY::IsMT4Order() retorna falso.



Agradecemos qualquer ajuda.
Общие принципы - Торговые операции - MetaTrader 5
Общие принципы - Торговые операции - MetaTrader 5
  • www.metatrader5.com
Перед тем как приступить к изучению торговых функций платформы, необходимо создать четкое представление об основных терминах: ордер, сделка и позиция. — это распоряжение брокерской компании купить или продать финансовый инструмент. Различают два основных типа ордеров: рыночный и отложенный. Помимо них существуют специальные ордера Тейк Профит...
 
winloosewin:
Sua resposta já foi dada acima.


Em outras palavras: não entendo por que na função MT4HISTORY::IsMT4Order() há o seguinte código (retorna true se o id da posição for zero):

A seguir, anexei meu código de teste:

PrintChangesOfMQL5OrderSystemState() é uma função direta que imprime o estado do sistema de ordens MQL5 toda vez que uma alteração é detectada.

Aqui está o resultado do código de teste (executado no testador):


Você pode ver que HistoryOrderGetInteger(Ticket, ORDER_POSITION_ID) retorna 2 e não zero. Esse é o motivo pelo qual MT4HISTORY::IsMT4Order() retorna falso.

Você não percebe que uma ordem no MT5 e no MT4 são entidades diferentes.

 
fxsaber:
Sua resposta já foi dada acima.


Você não entende que uma ordem no MT5 e no MT4 são entidades diferentes.

Eu entendo os sistemas de ordens da MQL5 e da MQL4 e suas diferenças.


fxsaber:
Portanto, é incorreto selecionar uma posição por seu POSITION_ID no histórico de negociação no modo SELECT_BY_TICKET+MODE_HISTORY.

Sim, eu sei que a função HistoryOrderSelect() da MQL5 espera um tíquete e não um identificador de posição.

Mas meu código de teste é um código MQL4 válido (exceto pelas chamadas das funções MQL5 HistoryOrderSelect() e HistoryDealSelect()))

e em MQL4 a função OrderSelect(ticket, SELECT_BY_TICKET, MODE_TRADES) retorna true como esperado.

Até onde eu sei, o objetivo da biblioteca é emular o sistema de pedidos MQL4 da melhor forma possível na MQL5. Portanto, eu esperaria que com

a biblioteca, a função OrderSelect(ticket, SELECT_BY_TICKET, MODE_TRADES) também retorne true.

Analisei o código e tentei descobrir por que ele retorna falso.

Primeiro: como trabalho em um sistema de cobertura MQL5, a função

ticket = OrderSend(Symbol(), OP_BUY, 1.0, ask, 10, bid - 3*Point, bid + 3*Point);

atribui à variável 'ticket' o ticket da ordem que é igual ao identificador da posição (futura) no hedge da MQL5. Isso pode ser visto no código

    return((arrow_color == INT_MAX) ? (MT4ORDERS::NewOrderCheck() ? 0 : -1) :
           ((((int)arrow_color != INT_MIN) || MT4ORDERS::NewOrderCheck()) &&
            MT4ORDERS::OrderSend(MT4ORDERS::LastTradeRequest, MT4ORDERS::LastTradeResult) ?
            (MT4ORDERS::IsHedging ? (long)MT4ORDERS::LastTradeResult.order : // PositionID == Result.order é um recurso do MT5-Hedge
             ((MT4ORDERS::LastTradeRequest.action == TRADE_ACTION_DEAL) ?
              (MT4ORDERS::IsTester ? (::PositionSelect(MT4ORDERS::LastTradeRequest.symbol) ? PositionGetInteger(POSITION_TICKET) : 0) :
                                      // HistoryDealSelect em MT4ORDERS::OrderSend
                                      ::HistoryDealGetInteger(MT4ORDERS::LastTradeResult.deal, DEAL_POSITION_ID)) :
              (long)MT4ORDERS::LastTradeResult.order)) : -1));

da função MT4OrderSend(). O seguinte é retornado:

(long)MT4ORDERS::LastTradeResult.order : // PositionID == Result.order é um recurso do MT5-Hedge

Ao analisar o que a biblioteca faz ao executar o código

bool res = OrderSelect(ticket, SELECT_BY_TICKET, MODE_TRADES);

Vejo que a função SelectByHistoryTicket() é executada com o ticket que armazenei na variável 'ticket'.

Nessa função, a função HistoryOrderSelect(ticket) é chamada - com o ticket que é igual ao ticket da ordem e o identificador de posição.

Com a minha chamada MQL4 OrderSelect() , eu não chamo HistoryOrderSelect(ticket) - ela está na biblioteca.

Somente em meu código de teste eu chamo HistoryOrderSelect(ticket) e HistoryDealSelect(ticket) diretamente para ver o que acontece dentro da biblioteca:

/* O código a seguir é MQL5 e não MQL4 - apenas para verificar o que acontece dentro da biblioteca: */
               Print("ORDER_POSITION_ID = ", (string)HistoryOrderGetInteger(ticket, ORDER_POSITION_ID));
               HistoryDealSelect(ticket);
               Print("HistoryDealSelect", (string)HistoryDealSelect(ticket), "   MT4HISTORY::IsMT4Deal", (string)MT4HISTORY::IsMT4Deal(ticket));
               HistoryOrderSelect(ticket);
               Print("HistoryOrderSelect", (string)HistoryOrderSelect(ticket), "   ORDER_POSITION_ID", ::HistoryOrderGetInteger(Ticket, ORDER_POSITION_ID));


Resumindo: de acordo com o valor de retorno de OrderSelect(ticket, SELECT_BY_TICKET, MODE_TRADES), a biblioteca não emula o

sistema de pedidos MQL4 na MQL5 corretamente.

 
winloosewin:

Em MQL4, a função OrderSelect(ticket, SELECT_BY_TICKET, MODE_TRADES) retorna true como esperado.

Até onde sei, o objetivo da biblioteca é emular o sistema de pedidos da MQL4 da melhor forma possível na MQL5. Portanto, eu esperaria que com

a biblioteca, a função OrderSelect(ticket, SELECT_BY_TICKET, MODE_TRADES) também retorne verdadeiro.

Dei uma olhada no código e tentei descobrir por que ele retorna falso.

Você está errado. Execute esse Expert Advisor no Testador

#include <MT4Orders.mqh>
#include <Debug.mqh> // https://c.mql5.com/3/173/Debug.mqh

#define Ask SymbolInfoDouble(_Symbol, SYMBOL_ASK)

void OnTick()
{
  if (_P(OrderSelect(_P(OrderSend(_Symbol, OP_BUY, 1, Ask, 100, 0, 0)), SELECT_BY_TICKET)))
  {
    OrderPrint();
    _P(OrdersTotal());    
  }
  
  ExpertRemove();  
}


Resultado

2018.08.07 10:47:20.340 2018.08.01 00:00:00   instant buy 1.00 EURUSD at 1.16905 (1.16895 / 1.16905 / 1.16895)
2018.08.07 10:47:20.340 2018.08.01 00:00:00   deal #2  buy 1.00 EURUSD at 1.16905 done (based on order #2)
2018.08.07 10:47:20.340 2018.08.01 00:00:00   deal performed [#2  buy 1.00 EURUSD at 1.16905]
2018.08.07 10:47:20.340 2018.08.01 00:00:00   order performed buy 1.00 at 1.16905 [#2  buy 1.00 EURUSD at 1.16905]
2018.08.07 10:47:20.347 2018.08.01 00:00:00   void OnTick(), Line = 8: OrderSend(_Symbol,OP_BUY,1,Ask,100,0,0) = 2
2018.08.07 10:47:20.347 2018.08.01 00:00:00   void OnTick(), Line = 8: OrderSelect(_P(OrderSend(_Symbol,OP_BUY,1,Ask,100,0,0)),SELECT_BY_TICKET) = true
2018.08.07 10:47:20.347 2018.08.01 00:00:00   #2 2018.08.01 00:00:00 buy 1.00 EURUSD 1.16905 0.00000 0.00000 1.16895 0.00 0.00 -10.00 0
2018.08.07 10:47:20.347 2018.08.01 00:00:00   void OnTick(), Line = 11: OrdersTotal() = 1
2018.08.07 10:47:20.347 2018.08.01 00:00:00   ExpertRemove() function called
 

Sim, eu sei que true é retornado quando se chama OrderSelect() diretamente após a abertura da posição.

Nesse caso, temos uma posição MQL5 aberta e a biblioteca encontra a posição ao chamar OrderSelect().

Isso é feito na função interna SelectByExistingTicket() da biblioteca.


Mas o ponto principal é que OrderSelect(ticket) retorna falso quando a posição MQL5 é fechada por stop loss ou take profit.

Execute meu código de teste para verificar isso (se sua corretora não aceitar SL e TP tão próximos, torne-os mais amplos para evitar a rejeição do OrderSend()).

Общие принципы - Торговые операции - MetaTrader 5
Общие принципы - Торговые операции - MetaTrader 5
  • www.metatrader5.com
Перед тем как приступить к изучению торговых функций платформы, необходимо создать четкое представление об основных терминах: ордер, сделка и позиция. — это распоряжение брокерской компании купить или продать финансовый инструмент. Различают два основных типа ордеров: рыночный и отложенный. Помимо них существуют специальные ордера Тейк Профит...
 
winloosewin:

Mas o ponto principal é que OrderSelect(ticket) retorna falso quando a posição MQL5 é fechada por stop loss ou take profit.

Leia parte de minha resposta detalhada novamente

Fórum sobre negociação, sistemas de negociação automatizados e teste de estratégias de negociação.

Bibliotecas: MT4Orders

fxsaber, 2018.08.06 14:21

É isso mesmo. Os detalhes estão descritos aqui.

Você pode fazer PositionTicket = OrderSend(OP_BUY, 2 lotes) e OrderClose(0,2 lotes) + OrderClose(0,3 lotes). Assim, você obterá duas "posições" fechadas (0,2/0,3 lote) e uma posição aberta (1,5 lote) com um tíquete igual ao PositionTicket. Essa é uma peculiaridade do MT5. Portanto, é incorreto selecionar uma posição por seu POSITION_ID no histórico de negociação no modo SELECT_BY_TICKET+MODE_HISTORY.


A memorização de tíquetes é um estilo ruim, embora seja popular. A maneira correta é quando, a cada evento, o robô de negociação lê todo o ambiente do zero.


ZY Aqui você pode ver aproximadamente a mesma situação descrita acima


Os resultados mostram que uma posição foi aberta com ticket == 2. Em seguida, ela foi fechada duas vezes, criando assim duas "posições" fechadas no histórico de negociação. Seus tíquetes são diferentes, mas ambas as "posições" têm OrderTicketOpen == 2. Ou seja, você deve perceber que , se fechar uma posição no MT5, seu tíquete histórico não corresponderá ao de tempo real.


Observe que no MT5 até mesmo os comentários ao fechar a mesma posição em tempo real são diferentes:"Hello World!" e"tp 1.23614".

É impossível selecionar inequivocamente uma posição MT4 fechada pelo POSITION_ID no MT5, pois pode haver várias posições MT4 com o mesmo POSITION_ID ao mesmo tempo.

 

Quem usa o arquivo mql4_to_mql5.mqh do MT4Orders para conversão MT4 -> MT5, por favor, remova esse trecho de código dele.

Fórum sobre negociação, sistemas de negociação automatizados e teste de estratégias de negociação

Testando 'CopyTicks'

fxsaber, 2016.10.19 07:59

// Permite, como no MT4, trabalhar com séries temporais: Open[Pos], High[Pos], Low[Pos], Close[Pos], Time[Pos], Volume[Pos].
// Ele também define as funções usuais do MT4: iOpen, iHigh, iLow, iClose, iTime, iVolume.
#define DEFINE_TIMESERIE(NAME,FUNC,T)                                                                         \
  class CLASS##NAME                                                                                           \
  {                                                                                                           \
  public:                                                                                                     \
    static T Get( const string Symb, const int TimeFrame, const int iShift )                                  \
    {                                                                                                         \
      T tValue[];                                                                                             \
                                                                                                              \
      return((Copy##FUNC((Symb == NULL) ? _Symbol : Symb, _Period, iShift, 1, tValue) > 0) ? tValue[0] : -1); \
    }                                                                                                         \
                                                                                                              \
    T operator []( const int iPos ) const                                                                     \
    {                                                                                                         \
      return(CLASS##NAME::Get(_Symbol, _Period, iPos));                                                       \
    }                                                                                                         \
  };                                                                                                          \
                                                                                                              \
  CLASS##NAME NAME;                                                                                           \
                                                                                                              \
  T i##NAME( const string Symb, const int TimeFrame, const int iShift )                                       \
  {                                                                                                           \
    return(CLASS##NAME::Get(Symb, TimeFrame, iShift));                                                        \
  }

DEFINE_TIMESERIE(Volume, TickVolume, long)
DEFINE_TIMESERIE(Time, Time, datetime)
DEFINE_TIMESERIE(Open, Open, double)
DEFINE_TIMESERIE(High, High, double)
DEFINE_TIMESERIE(Low, Low, double)
DEFINE_TIMESERIE(Close, Close, double)

oficialmente com o MT5 construído em 1860, esse trecho de código não é relevante.

Новая версия платформы MetaTrader 5 build 1860: Функции для работы с барами в MQL5 и улучшения в тестере стратегий
Новая версия платформы MetaTrader 5 build 1860: Функции для работы с барами в MQL5 и улучшения в тестере стратегий
  • 2018.06.14
  • www.mql5.com
Новая версия платформы MetaTrader 5 build 1860: Функции для работы с барами в MQL5 и улучшения в тестере стратегий15 июня 2018 года будет опубликов...