Você está perdendo oportunidades de negociação:
- Aplicativos de negociação gratuitos
- 8 000+ sinais para cópia
- Notícias econômicas para análise dos mercados financeiros
Registro
Login
Você concorda com a política do site e com os termos de uso
Se você não tem uma conta, por favor registre-se
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.
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
Resultado
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".
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):
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á a saída 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.
Agradecemos qualquer ajuda.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.
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.
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
da função MT4OrderSend(). O seguinte é retornado:
Ao analisar o que a biblioteca faz ao executar o código
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:
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.
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
Resultado
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()).
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
// 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.