Aqui estão as entradas de registro de uma posição fechada por um Take Profit acionado. Como isso pode ser detectado em OnTradeTransaction( const MqlTradeTransaction& trans, const MqlTradeRequest& request, const MqlTradeResult& result)?
Nem o código de retorno do const MqlTradeResult& result (result.retcode) é definido (0 não é uma opção, TRADE_RETCODE_DONE = 10009) nem um dos IDs (ticket da transação, ticket do pedido, ID da solicitação) para encontrá-los sem fazer um looping a cada vez em todas as transações.
Este é o Print na linha #376 que imprime os sinalizadores relevantes(?):
Parte da confusão se deve ao fato de que ENUM_ORDER_TYPE 0 = ORDER_TYPE_BUY. Portanto, um EA não consegue distinguir se o valor do campo está definido com ORDER_TYPE_BUY ou se está anulado e, portanto, não está definido - ótimo!!!
Denis, obrigado pelo artigo! Eu o li com interesse, mas ainda não me dei conta do que li. Também baixei seu Expert Advisor TradeProcessor e o executei em meu terminal, onde atualmente tenho uma posição aberta. Dei uma olhada nas impressões e imediatamente surgiram algumas perguntas, para as quais quero encontrar respostas por conta própria. Bem, se eu não conseguir fazer isso, terei que incomodá-lo. ))
MrBrooklin posição aberta. Dei uma olhada nas impressões e imediatamente surgiram algumas perguntas, para as quais quero encontrar respostas por conta própria. Bem, se eu não conseguir fazer isso, terei que incomodá-lo. ))
Saudações, Vladimir.
Obrigado por sua opinião. De nada, Sr. Brooklin! ))
Obrigado por sua opinião. De nada, Sr. Brooklin! ))
Denis, desculpe, mas sem sua ajuda minha mente "explode". Aqui está o resultado de uma das passagens de seu EA (a propósito, um EA muito legal!!!):
2023.10.2717:11:02.514 TradeProcessor (EURUSDrfd,D1) Проход : #1002023.10.2717:11:02.514 TradeProcessor (EURUSDrfd,D1) Поступил запрос: изменить параметры отложенного ордера
2023.10.2717:11:02.733 TradeProcessor (EURUSDrfd,D1)
2023.10.2717:11:02.733 TradeProcessor (EURUSDrfd,D1) ---===Транзакция===---
2023.10.2717:11:02.733 TradeProcessor (EURUSDrfd,D1) Тикет сделки: 02023.10.2717:11:02.733 TradeProcessor (EURUSDrfd,D1) Тип сделки: DEAL_TYPE_BUY2023.10.2717:11:02.733 TradeProcessor (EURUSDrfd,D1) Тикет ордера: 10301957682023.10.2717:11:02.733 TradeProcessor (EURUSDrfd,D1) Состояние ордера: ORDER_STATE_PLACED2023.10.2717:11:02.733 TradeProcessor (EURUSDrfd,D1) Тип ордера: ORDER_TYPE_SELL_STOP2023.10.2717:11:02.733 TradeProcessor (EURUSDrfd,D1) Цена: 1.058532023.10.2717:11:02.733 TradeProcessor (EURUSDrfd,D1) Уровень Stop Loss: 1.(скрыл значения стоп-лосса)2023.10.2717:11:02.733 TradeProcessor (EURUSDrfd,D1) Уровень Take Profit: 1.058032023.10.2717:11:02.733 TradeProcessor (EURUSDrfd,D1) Цена срабатывания стоп-лимитного ордера: 0.000002023.10.2717:11:02.733 TradeProcessor (EURUSDrfd,D1) Торговый инструмент: EURUSDrfd
2023.10.2717:11:02.733 TradeProcessor (EURUSDrfd,D1) Срок истечения отложенного ордера: 2023.10.2700:002023.10.2717:11:02.733 TradeProcessor (EURUSDrfd,D1) Тип ордера по времени действия: ORDER_TIME_DAY2023.10.2717:11:02.733 TradeProcessor (EURUSDrfd,D1) Тип торговой транзакции: TRADE_TRANSACTION_ORDER_UPDATE2023.10.2717:11:02.733 TradeProcessor (EURUSDrfd,D1) Тикет позиции: 02023.10.2717:11:02.733 TradeProcessor (EURUSDrfd,D1) Объём в лотах: 0.042023.10.2717:11:02.733 TradeProcessor (EURUSDrfd,D1)
2023.10.2717:11:02.733 TradeProcessor (EURUSDrfd,D1) Проход : #101
O que não estou entendendo:
Meu EA colocou uma ordem pendente SELL_STOP;
Seu EA escreve - tipo de negociação DEAL_TYPE_BY (destacado em amarelo). Por via das dúvidas, dei uma olhada no Guia de Referência MQL5. Ele diz que DEAL_TYPE_BY é:
ENUM_DEAL_TYPE
Identificador
Descrição
DEAL_TYPE_BUY
Comprar
Pergunta - como, ao modificar uma ordem pendente SELL_STOP, o tipo de transação é determinado como BUY?????))
E não há nenhuma transação. A colocação de uma ordem pendente e seu processamento não implicam em nenhuma transação. Tíquete de negociação = 0, tipo = 0, em que 0 é equivalente a DEAL_TYPE_BUY para a enumeração ENUM_DEAL_TYPE. Ou seja, na estrutura transMqlTradeTransaction, alguns campos são preenchidos e outros não. Os campos não preenchidos geralmente são anulados.
O campo deal será preenchido para uma transação desse tipo:
TRADE_TRANSACTION_DEAL_*
Os campos a seguir são preenchidos na estrutura MqlTradeTransaction para transações comerciais relacionadas ao processamento de transações (TRADE_TRANSACTION_DEAL_ADD, TRADE_TRANSACTION_DEAL_UPDATE e TRADE_TRANSACTION_DEAL_DELETE):
deal - o tíquete da negociação;
ordem - tíquete da ordem, com base na qual a transação foi feita;
símbolo - nome do instrumento financeiro na transação;
type - tipo de transação comercial;
deal_type - tipo da transação;
price - preço pelo qual a transação foi feita;
price_sl - preço de Stop Loss (é preenchido se for especificado na ordem com base na qual a transação foi feita);
price_tp - preço Take Profit (é preenchido, se estiver especificado na ordem, com base no qual a transação foi feita);
volume - volume da transação em lotes.
position - ticket de uma posição aberta, alterada ou fechada como resultado da execução de uma transação.
position_by - ticket de uma posição contrária. É preenchido somente para negociações de fechamento de uma posição contrária (out by).
Apenas 3 tipos de transações pertencem aos tipos de "transação": TRADE_TRANSACTION_DEAL_ADD, TRADE_TRANSACTION_DEAL_UPDATE, TRADE_TRANSACTION_DEAL_DELETE.
Структура торговой транзакции - Структуры данных - Константы, перечисления и структуры - Справочник MQL5 - Справочник по языку алгоритмического/автоматического трейдинга для MetaTrader 5
E não há nenhuma transação. A colocação de uma ordem pendente não implica em nenhuma transação. Tíquete de negociação = 0, tipo = 0, em que 0 é equivalente a DEAL_TYPE_BUY para a enumeração ENUM_DEAL_TYPE. Ou seja, na estrutura transMqlTradeTransaction, alguns campos são preenchidos e outros não. Os campos não preenchidos geralmente são zerados.
Aqui estão as entradas de registro de uma posição fechada por um Take Profit acionado. Como isso pode ser detectado em OnTradeTransaction( const MqlTradeTransaction& trans, const MqlTradeRequest& request, const MqlTradeResult& result)?
Nem o código de retorno do const MqlTradeResult& result (result.retcode) é definido (0 não é uma opção, TRADE_RETCODE_DONE = 10009) nem um dos IDs (ticket da transação, ticket do pedido, ID da solicitação) para encontrá-los sem fazer um looping a cada vez em todas as transações.
Este é o Print na linha #376 que imprime os sinalizadores relevantes(?):
E isso é o que posso ler no diário:
10:04:40 take profit triggered #2 sell 0.01 EURUSD 1.00319 sl: 1.00816 tp: 1.00171 [#3 buy 0.01 EURUSD at 1.00171]
10:04:40 deal #3 buy 0.01 EURUSD at 1.00171 done (based on order #3)
10:04:40 deal performed [#3 buy 0.01 EURUSD at 1.00171]
10:04:40 order performed buy 0.01 at 1.00171 [#3 buy 0.01 EURUSD at 1.00171]
10:04:40 373 New trade operation dTime1970.01.01 09:03:41
10:04:40 376 0 prc:trans.price=1.00171 tckt: 2 Tr.Type: TRADE_TRANSACTION_DEAL_ADD Tr.OrdType: ORDER_TYPE_BUY Tr.OrdFill: ORDER_STATE_STARTED Tr.tckt:3 2 0 retCode:0 0 0 0 0
10:04:40 489 MqlTradeTransaction: TRADE_TRANSACTION_DEAL_ADD deal #3 DEAL_TYPE_BUY EURUSD 0.01 lot
10:04:40 376 1 prc:trans.price=1.00171 tckt: 2 Tr.Type: TRADE_TRANSACTION_ORDER_DELETE Tr.OrdType: ORDER_TYPE_BUY Tr.OrdFill: ORDER_STATE_FILLED Tr.tckt:3 2 0 retCode:0 0 0 0 0
10:04:40 383 1 prc:trans.price=1.00171 tckt: 2 res.Ord:0 Tr.Type: TRADE_TRANSACTION_ORDER_DELETE Tr.OrdFill: ORDER_STATE_FILLED Tr.OrdType: ORDER_TYPE_BUY Tr.tckt:3 2 0 Res::0 0 0 0 0
10:04:40 408 PosExists #3 2 mag:0 ORDER_STATE_FILLED ORDER_TYPE_BUY
10:04:40 376 2 prc:trans.price=1.00171 tckt: 2 Tr.Type: TRADE_TRANSACTION_HISTORY_ADD Tr.OrdType: ORDER_TYPE_BUY Tr.OrdFill: ORDER_STATE_FILLED Tr.tckt:3 2 0 retCode:0 0 0 0 0
10:04:40 408 PosExists #3 2 mag:0 ORDER_STATE_FILLED ORDER_TYPE_BUY
2022.09.26 14:08:33.755 disconnected
O terminal escreve lindamente "take profit triggered #2 sell 0.01 EURUSD 1.00319 sl: 1.00816 tp: 1.00171 [#3 buy 0.01 EURUSD at 1.00171]"
Então, por que diabos não há um sinalizador como TRADE_TRANSACTION_TRIGGERED_PT e TRADE_TRANSACTION_TRIGGERED_SL?
E o código de retorno da solicitação não é sempre definido?
Denis, obrigado pelo artigo! Eu o li com interesse, mas ainda não me dei conta do que li. Também baixei seu Expert Advisor TradeProcessor e o executei em meu terminal, onde atualmente tenho uma posição aberta. Dei uma olhada nas impressões e imediatamente surgiram algumas perguntas, para as quais quero encontrar respostas por conta própria. Bem, se eu não conseguir fazer isso, terei que incomodá-lo. ))
Saudações, Vladimir.
Saudações, Vladimir.
Obrigado por sua opinião. De nada, Sr. Brooklin! ))
Obrigado por sua opinião. De nada, Sr. Brooklin! ))
Denis, desculpe, mas sem sua ajuda minha mente "explode". Aqui está o resultado de uma das passagens de seu EA (a propósito, um EA muito legal!!!):
O que não estou entendendo:
ENUM_DEAL_TYPE
Identificador
Descrição
DEAL_TYPE_BUY
Comprar
Pergunta - como, ao modificar uma ordem pendente SELL_STOP, o tipo de transação é determinado como BUY?????))
Atenciosamente, Vladimir.
E não há nenhuma transação. A colocação de uma ordem pendente e seu processamento não implicam em nenhuma transação. Tíquete de negociação = 0, tipo = 0, em que 0 é equivalente a DEAL_TYPE_BUY para a enumeração ENUM_DEAL_TYPE. Ou seja, na estrutura transMqlTradeTransaction , alguns campos são preenchidos e outros não. Os campos não preenchidos geralmente são anulados.
Mais detalhes: na Documentação sobre ordens pendentes.
O campo deal será preenchido para uma transação desse tipo:
TRADE_TRANSACTION_DEAL_*
Os campos a seguir são preenchidos na estrutura MqlTradeTransaction para transações comerciais relacionadas ao processamento de transações (TRADE_TRANSACTION_DEAL_ADD, TRADE_TRANSACTION_DEAL_UPDATE e TRADE_TRANSACTION_DEAL_DELETE):
Apenas 3 tipos de transações pertencem aos tipos de "transação": TRADE_TRANSACTION_DEAL_ADD, TRADE_TRANSACTION_DEAL_UPDATE, TRADE_TRANSACTION_DEAL_DELETE.
E não há nenhuma transação. A colocação de uma ordem pendente não implica em nenhuma transação. Tíquete de negociação = 0, tipo = 0, em que 0 é equivalente a DEAL_TYPE_BUY para a enumeração ENUM_DEAL_TYPE. Ou seja, na estrutura transMqlTradeTransaction , alguns campos são preenchidos e outros não. Os campos não preenchidos geralmente são zerados.
Mais detalhes: na Documentação sobre ordens pendentes.
Ahhhh, é isso!!! Cara, isso quebrou minha cabeça! ))
Obrigado!!!
Abraços, Vladimir.