Bom tarde, respondendo a cada pergunta.
1) Porem quando ela vira um Posição eu perco a referencia já que o ID da posição é diferente do ID da Ordem:
Use o POSITION_ID e ORDER_POSITION_ID para estabelecer a relação entre as tuplas 1:N ( Netting) ou 1:1 ( Hedging )
2) No meu EA, eu crio um sequencia de ordens pendentes do tipo BuyStop e preciso identificar quando a ordem se tornou um posição e quando ela se encerrou pelo TP ou SL.
Vamos aos senão, ok.
2.1) Quando a ordem se tornou posição? A posição é gerada no MT5 assim quando ocorre a primeira execução da ordem. Como é muito comum não operar com lote mínimo, pode ocorrer a execução de várias parciais até o preenchimento total da ordem, quando isso ocorre a ordem sai da lista de ordens pendentes e vai para histórico.
Em resumo: Enquanto existir na lista de ordens uma ordem com POSITION_ORDER_ID = POSITION_ID a ordem não foi totalmente preenchida, podendo também acontecer da posição ser encerrada da SL e o restante da ordem ficar na pedra.
2.2) O TP/SL é uma ordem a mercado oposta a posição e no final de seu preenchimento sai da lista de ordens vai para histórico de ordens, ao mesmo tempo em que a posição sai da lista de posições abertas e vai para histórico de DEALS.
2.3) Lembre-se que SL não significa necessariamente prejuízo, pois pode ser um SL resultado do movimento de um trailing stop em posição de lucro. Então para saber se uma posição encerrou com prejuízo/lucro o programa tem que varrer o histórico de posições por POSITION_ID.
O MT5 dispõe do evento Trade que pode ser manipulado no OnTradeTransacion() para saber a situação do pedido de negociação: Ordem --> Posição --> Encerramento.
void OnTradeTransaction(const MqlTradeTransaction & trans, const MqlTradeRequest & request, const MqlTradeResult & result) { ResetLastError(); if(trans.type == TRADE_TRANSACTION_DEAL_ADD && trans.symbol == ativo) { if(HistoryDealSelect(trans.deal)) { deal_magic = HistoryDealGetInteger(trans.deal, DEAL_MAGIC); deal_entry = (ENUM_DEAL_ENTRY) HistoryDealGetInteger(trans.deal, DEAL_ENTRY); deal_reason = (ENUM_DEAL_REASON) HistoryDealGetInteger(trans.deal, DEAL_REASON); deal_type = trans.deal_type; if(deal_magic == inpMagicNumber) { if(deal_entry != DEAL_ENTRY_IN) // Teste saída parcial if((ENUM_DEAL_ENTRY)deal_entry == DEAL_ENTRY_IN) // Teste entrada parcial } } if(trans.type == TRADE_TRANSACTION_ORDER_ADD && trans.symbol == ativo) // ORDEM colocada da lista ordens if(trans.type == TRADE_TRANSACTION_ORDER_DELETE && trans.symbol == ativo) // ORDEM excluída da lista de ordens if(trans.type == TRADE_TRANSACTION_HISTORY_ADD && trans.symbol == ativo) // ORDEM executada ou cancelada e colocada no histórico }
- Aplicativos de negociação gratuitos
- 8 000+ sinais para cópia
- Notícias econômicas para análise dos mercados financeiros
Você concorda com a política do site e com os termos de uso
Bom dia, a todos,
Estou a alguns dias pesquisando e quebrando a cabeça para encontrar a solução, que penso que deveria ser facil.
No meu EA, eu crio um sequencia de ordens pendentes do tipo BuyStop e preciso identificar quando a ordem se tornou um posição e quando ela se encerrou pelo TP ou SL.
Porem eu não consigo definir um fluxo para acompanhar as mudanças dos ID.
Quando crio a ordem e consigo recuperar o ticket da ordem:
Porem quando ela vira um Posição eu perco a referencia já que o ID da posição é diferente do ID da Ordem:
Já tentei algumas alternativas analisando o Histórico de Posições.
Mas não consigo verificar quando o Ordem foi finalizada :s
Podem me auxiliar?
Att,
Bidu