Opa, boa noite!
Uma solução é coletar o tickt da ordem quando da emissão para acompanhar, lembrando:
Vamos supor que seja o tickt X:
Primeiro é criado uma ordem (1), que se executada abre uma posição (2), que quando fechada vira um negócio(3).
1 = se usar OrderSelect(X) retorna true se ordem estiver aberta e false se estiver fechada (supondo que a ordem inicial foi criada com sucesso)
https://www.mql5.com/pt/docs/trading/orderselect
2 = se usar PositionSelecByTicket(X) retorna true se estiver no trade, e false se ele foi fechado
https://www.mql5.com/pt/docs/trading/positionselectbyticket
3 = veja também https://www.mql5.com/pt/docs/trading/historydealselect.
Observe que seu meta é EDGE ou NETTING que tem algumas diferenças no conjunto de comandos a utilizar.
At.
Daniel
- www.mql5.com
Opa, boa noite!
Uma solução é coletar o tickt da ordem quando da emissão para acompanhar, lembrando:
Vamos supor que seja o tickt X:
Primeiro é criado uma ordem (1), que se executada abre uma posição (2), que quando fechada vira um negócio(3).
1 = se usar OrderSelect(X) retorna true se ordem estiver aberta e false se estiver fechada (supondo que a ordem inicial foi criada com sucesso)
https://www.mql5.com/pt/docs/trading/orderselect
2 = se usar PositionSelecByTicket(X) retorna true se estiver no trade, e false se ele foi fechado
https://www.mql5.com/pt/docs/trading/positionselectbyticket
3 = veja também https://www.mql5.com/pt/docs/trading/historydealselect.
Observe que seu meta é EDGE ou NETTING que tem algumas diferenças no conjunto de comandos a utilizar.
At.
Daniel
Boa noite, Daniel. Tudo bem?
Então, vamos lá:
1) Aberta uma OrderSend para compra de um _Symbol
2) Executada essa ordem, uma posição foi aberta
3) Nessa mesma ordem foi estabelecido parâmetros de Stop Loss
Tentei o código abaixo porém não está rodando. Minha única necessidade é retornar se o último trade foi encerrado através do Stop Loss ou Take Profit:
datetime end=TimeCurrent();
datetime start=end-PeriodSeconds(PERIOD_D1);
HistorySelect(start,end);
int deals=HistoryDealsTotal();
ulong deal_ticket=HistoryDealGetTicket(deals-1); // o index 0 corresponde ao primeiro ao último trade?
ENUM_DEAL_ENTRY entry_type=(ENUM_DEAL_ENTRY)HistoryDealGetInteger(deal_ticket,DEAL_ENTRY); // isso está certo para retornar o último trade?
if(entry_type == "STOPLOSS") // aqui que gostaria da ajuda!!!
{
}
Algumas dúvidas estão comentadas no próprio código!
Grande abs!
Bom dia!
Experimente usar HistoryDealGetDouble() para obter o DEAL_PROFIT que é o Lucro de uma operação (deal), esse se positivo o trade foi fechado com lucro e negativo prejuízo!
Se possível, quando postar código aqui na comunidade use o botão "SRC" no editar de mensagem aqui do site para inserir o código dentro e facilitar a visualização.
No OrderSend tem o result que você pode pegar o numero da ordem ou negócio, a seguir pode usar direto com a função acima para obter o profit!
bool OrderSend( MqlTradeRequest& request, // estrutura de consulta MqlTradeResult& result // estrutura da resposta ); struct MqlTradeResult { uint retcode; // Código de retorno da operação ulong deal; // Bilhetagem (ticket) da operação (deal),se ela for realizada ulong order; // Bilhetagem (ticket) da ordem, se ela for colocada double volume; // Volume da operação (deal), confirmada pela corretora double price; // Preço da operação (deal), se confirmada pela corretora double bid; // Preço de Venda corrente double ask; // Preço de Compra corrente string comment; // Comentário da corretora para a operação (por default, ele é preenchido com a descrição código de retorno de um servidor de negociação) uint request_id; // Identificador da solicitação definida pelo terminal durante o despacho uint retcode_external; // Código de resposta do sistema de negociação exterior };
Espero que ajude!
Bom dia e boa semana!
Bom dia!
Experimente usar HistoryDealGetDouble() para obter o DEAL_PROFIT que é o Lucro de uma operação (deal), esse se positivo o trade foi fechado com lucro e negativo prejuízo!
Se possível, quando postar código aqui na comunidade use o botão "SRC" no editar de mensagem aqui do site para inserir o código dentro e facilitar a visualização.
No OrderSend tem o result que você pode pegar o numero da ordem ou negócio, a seguir pode usar direto com a função acima para obter o profit!
Espero que ajude!
Bom dia e boa semana!
Olá Daniel Andrejczuk,
Essa frase sobre DEAL_PROFIT não ajuda a responder a questão original: "se positivo o trade foi fechado com lucro e negativo prejuízo!"
O usuário gostaria de saber se a operação bateu no TP ou no SL. Basta você imaginar uma situação de trailing stop, onde o SL é movido na direção do trade, para verificar que é possível fechar uma operação com lucro TANTO no take profit quanto no stop loss.
Portanto, a pergunta do usuário continua não respondida.
Abraços,
Malacarne
Olá Malacarne,
Sim, o que respondi era se o trade houve ganho ou perda, não fugi do tema do tópico e dei uma forma alternativa com um resultado similar.
Destaco que na minha resposta escrevi "Espero que ajude!".
Vejo como positivo qualquer força para auxiliar algum membro e negativo todo comentário vazio (sem informação útil).
Também sou iniciante e estou aprendendo o MQL, sei como começar é difícil por isso tentei ajudar, lembrando que não quero e não sou remunerado por qualquer comentários que eventualmente faço aqui no grupo.
Eu não domino/conheço como fazer exatamente isso (pergunta do usuário) que é diferente de saber e não ajudar. Presumo como despendeu seu tempo comentando nesse tópico e não ajudou o usuário é porque você não deva saber a resposta também.
Atenciosamente,
Daniel
Felipe Dourado,
Me veio uma ideia da sua necessidade, mais é trabalhosa, o trade é pareado em 2 ordens, a de entrada que tem o cotação do profit e stop, então se consultar a ordem de saída e ver se o valor executado é igual ao do stop ou profit você pode ter sucesso.
Talvez exista uma forma mais simples, mais no momento não sei dizer.
At.
Daniel
Olá Malacarne,
Olá Daniel Andrejczuk,
"é porque você não deva saber a resposta também". Comentário interessante...
É importante dar espaço a todos aqui no fórum... Por isso não respondemos a todas as perguntas.
Com relação à pergunta original, basta varrer o histórico de operações e capturar o comentário da última ordem executada.
Você consegue obter uma substring onde consta o comentário "sl"... independente se foi no lucro ou no prejuízo, a ordem que encerrou a operação foi um stop loss. O mesmo vale para o take profit.
Abraços,
Malacarne
Prezados Rodrigo e Daniel,
Agradeço o apoio de ambos nessa jornada. Acabei encontrando um método que me auxiliou de uma forma fácil. Como não estou trabalhando com trailing stop, creio que o código abaixo funcione corretamente e não me trará maiores prejuízos:
datetime end=TimeCurrent(); datetime start=0; HistorySelect(start,end); int total=HistoryOrdersTotal(); ulong ticket = HistoryOrderGetTicket(total-1); double second_trade=HistoryOrderGetDouble(ticket,ORDER_PRICE_OPEN); if((trade=="Compra" && first_trade>second_trade) || (trade=="Venda" && first_trade<second_trade)) { ...
Prezados Rodrigo e Daniel,
Agradeço o apoio de ambos nessa jornada. Acabei encontrando um método que me auxiliou de uma forma fácil. Como não estou trabalhando com trailing stop, creio que o código abaixo funcione corretamente e não me trará maiores prejuízos:
Prezados,
Desenvolvi uma solução pessoal para a questão. Peço desculpas caso contenha algum erro (sou novato em programação), mas até então para mim tem funcionado perfeitamente para capturar transações de Compra, Venda, SL na Compra, SL na Venda, TP na Compra ou TP na Venda....
void OnTradeTransaction(const MqlTradeTransaction & trans, const MqlTradeRequest & request, const MqlTradeResult & result) { if (HistoryDealSelect(trans.deal)) { ENUM_DEAL_ENTRY deal_entry = (ENUM_DEAL_ENTRY) HistoryDealGetInteger(trans.deal, DEAL_ENTRY); ENUM_DEAL_REASON deal_reason = (ENUM_DEAL_REASON) HistoryDealGetInteger(trans.deal, DEAL_REASON); if(EnumToString(deal_entry) == "DEAL_ENTRY_IN") { if(EnumToString(deal_reason) == "DEAL_REASON_EXPERT" && EnumToString(trans.deal_type) == "DEAL_TYPE_BUY") { Alert("Buy"); } else if(EnumToString(deal_reason) == "DEAL_REASON_EXPERT" && EnumToString(trans.deal_type) == "DEAL_TYPE_SELL") { Alert("Sell"); } } else if(EnumToString(deal_entry) == "DEAL_ENTRY_OUT") { if(EnumToString(deal_reason) == "DEAL_REASON_SL" && EnumToString(trans.deal_type) == "DEAL_TYPE_BUY") { Alert("Sell SL"); } else if(EnumToString(deal_reason) == "DEAL_REASON_SL" && EnumToString(trans.deal_type) == "DEAL_TYPE_SELL") { Alert("Buy SL"); } else if(EnumToString(deal_reason) == "DEAL_REASON_TP" && EnumToString(trans.deal_type) == "DEAL_TYPE_BUY") { Alert("Sell TP"); } else if(EnumToString(deal_reason) == "DEAL_REASON_TP" && EnumToString(trans.deal_type) == "DEAL_TYPE_SELL") { Alert("Buy TP"); } } } }
- 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
Galera, boa noite
Estou aprendendo MQL5 e gostaria de tirar uma dúvida: tenho uma ordem a mercado de compra com determinado TP e SL. Porém, como faço para identificar se ocorreu o TP ou o SL? Na verdade não preciso nem saber qual foi o valor ou outros valores mas somente se bateu no TP ou SL.
Li materiais na internet sobre status do último deal mas não consegui rodar no meu código!
Não teria algo mais fácil não?
Obrigado