기고글 토론 "MQL5 쿡북: TradeTransaction 이벤트 프로세싱" - 페이지 2

 

다음은 트리거된 테이크프로핏에 의해 청산된 포지션의 로그 항목입니다. OnTradeTransaction( const MqlTradeTransaction& trans, const MqlTradeRequest& request, const MqlTradeResult& result)에서 이를 어떻게 감지할 수 있나요?

모든 거래를 매번 반복하지 않고 찾기 위해 const MqlTradeResult& 결과의 반환 코드(result.retcode)가 설정되지 않았거나(0은 옵션 없음, TRADE_RETCODE_DONE = 10009) ID 중 하나(딜 티켓, 주문 티켓, 요청 ID )가 설정되어 있지 않습니다.

376번 줄의 Print에서 관련(?) 플래그를 인쇄합니다:

void OnTradeTransaction(const MqlTradeTransaction& trans,
                        const MqlTradeRequest& request,
                        const MqlTradeResult& result)
  {
...// line 376:
   Print(__LINE__," ",counter," prc:",_ToStr2Dig(trans.price)," tckt: ",trans.position //," pTrigg:",_ToStr2Dig(trans.price_trigger)
            ," Tr.Type: ",EnumToString(trans.type)//," DL.Type: ",EnumToString(trans.deal_type)
            ," Tr.OrdType: ",EnumToString(trans.order_type)," Tr.OrdFill: ",EnumToString(trans.order_state)
            ," Tr.tckt:",trans.order," ",trans.position," ",trans.position_by
            ," retCode:",result.retcode," ",result.deal," ",result.order," ",result.deal," ",result.request_id         );
...
  }

그리고 이것이 제가 일지에서 읽을 수 있는 내용입니다:

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

"이익실현 트리거 #2 매도 0.01 EURUSD 1.00319 sl: 1.00816 tp: 1.00171 [#3 1.00171에 0.01 EURUSD 매수]"라고 멋지게 적혀 있습니다.

그렇다면 도대체 왜 TRADE_TRANSACTION_TRIGGERED_PT, TRADE_TRANSACTION_TRIGGERED_SL과 같은 플래그가 없는 걸까요?

그리고 요청의 반환 코드는 항상 설정되지 않나요?

 
혼란의 일부는 ENUM_ORDER_TYPE 0 = ORDER_TYPE_BUY라는 사실 때문입니다. 따라서 EA는 ORDER_TYPE_BUY로 설정된 필드 값인지 아니면 무효화되어 설정되지 않은 값인지 구분할 수 없습니다.
 

데니스, 기사 감사합니다! 흥미롭게 읽었지만 아직 읽은 내용을 완전히 이해하지 못했습니다. 또한 TradeProcessor Expert Advisor를 다운로드하여 현재 오픈 포지션이 있는 제 단말기에서 실행했습니다. 출력물을 보니까 바로 몇 가지 질문이 떠서 직접 답을 찾고 싶었습니다. 글쎄, 내가 할 수 없다면, 나는 당신을 귀찮게해야 할 것입니다. ))

안부, 블라디미르.

 
MrBrooklin 오픈 포지션이 있는 제 단말기에서 실행했습니다. 출력물을 보니까 바로 몇 가지 질문이 떠서 직접 답을 찾고 싶었습니다. 글쎄, 내가 할 수 없다면, 나는 당신을 귀찮게해야 할 것입니다. ))

안부, 블라디미르.

의견 주셔서 감사합니다. 천만에요, 브룩린 씨! ))

 
Denis Kirichenko #:

의견 주셔서 감사합니다. 천만에요, 브룩린 씨! ))

데니스, 미안하지만 당신의 도움 없이는 내 마음이 "폭발"합니다. 다음은 EA 패스 중 하나의 결과입니다 (그건 그렇고, 매우 멋진 EA !!!):

2023.10.27 17:11:02.514 TradeProcessor (EURUSDrfd,D1)   Проход : #100
2023.10.27 17:11:02.514 TradeProcessor (EURUSDrfd,D1)   Поступил запрос: изменить параметры отложенного ордера
2023.10.27 17:11:02.733 TradeProcessor (EURUSDrfd,D1)   
2023.10.27 17:11:02.733 TradeProcessor (EURUSDrfd,D1)   ---===Транзакция===---
2023.10.27 17:11:02.733 TradeProcessor (EURUSDrfd,D1)   Тикет сделки: 0
2023.10.27 17:11:02.733 TradeProcessor (EURUSDrfd,D1)   Тип сделки: DEAL_TYPE_BUY
2023.10.27 17:11:02.733 TradeProcessor (EURUSDrfd,D1)   Тикет ордера: 1030195768
2023.10.27 17:11:02.733 TradeProcessor (EURUSDrfd,D1)   Состояние ордера: ORDER_STATE_PLACED
2023.10.27 17:11:02.733 TradeProcessor (EURUSDrfd,D1)   Тип ордера: ORDER_TYPE_SELL_STOP
2023.10.27 17:11:02.733 TradeProcessor (EURUSDrfd,D1)   Цена: 1.05853
2023.10.27 17:11:02.733 TradeProcessor (EURUSDrfd,D1)   Уровень Stop Loss: 1.(скрыл значения стоп-лосса)
2023.10.27 17:11:02.733 TradeProcessor (EURUSDrfd,D1)   Уровень Take Profit: 1.05803
2023.10.27 17:11:02.733 TradeProcessor (EURUSDrfd,D1)   Цена срабатывания стоп-лимитного ордера: 0.00000
2023.10.27 17:11:02.733 TradeProcessor (EURUSDrfd,D1)   Торговый инструмент: EURUSDrfd
2023.10.27 17:11:02.733 TradeProcessor (EURUSDrfd,D1)   Срок истечения отложенного ордера: 2023.10.27 00:00
2023.10.27 17:11:02.733 TradeProcessor (EURUSDrfd,D1)   Тип ордера по времени действия: ORDER_TIME_DAY
2023.10.27 17:11:02.733 TradeProcessor (EURUSDrfd,D1)   Тип торговой транзакции: TRADE_TRANSACTION_ORDER_UPDATE
2023.10.27 17:11:02.733 TradeProcessor (EURUSDrfd,D1)   Тикет позиции: 0
2023.10.27 17:11:02.733 TradeProcessor (EURUSDrfd,D1)   Объём в лотах: 0.04
2023.10.27 17:11:02.733 TradeProcessor (EURUSDrfd,D1)   
2023.10.27 17:11:02.733 TradeProcessor (EURUSDrfd,D1)   Проход : #101

내가 이해하지 못하는 것:

  1. 내 EA가 SELL_STOP 주문을 보류했습니다;
  2. EA는 거래 유형 DEAL_TYPE_BY(노란색으로 강조 표시됨)를 씁니다. 혹시나 해서 MQL5 참조 가이드를 찾아봤습니다. DEAL_TYPE_BY라고 나와 있습니다:

ENUM_DEAL_TYPE

식별자

설명

DEAL_TYPE_BUY

구매


질문 - 지정가 주문 SELL_STOP을 수정할 때 거래 유형이 BUY로 결정되는 방법?????))

안녕하세요, 블라디미르.

 

그리고 거래가 없습니다. 대기 주문과 그 처리는 거래를 수반하지 않습니다. 거래 티켓 = 0, 유형 = 0, 여기서 0은 열거형 ENUM_DEAL_TYPE의 DEAL_TYPE_BUY에 해당 합니다. 즉, MqlTradeTransaction 트랜잭션 구조에서 일부 필드는 채워지고 일부 필드는 채워지지 않습니다. 채워지지 않은 필드는 일반적으로 null이 됩니다.

자세한 내용은 지정가 주문에 대한 문서를 참조하세요.

이 유형의 거래에는 거래 필드가 채워집니다:

TRADE_TRANSACTION_DEAL_*

거래 처리와 관련된 거래 트랜잭션의 경우 MqlTradeTransaction 구조체에서 다음 필드가 채워집니다(TRADE_TRANSACTION_DEAL_ADD, TRADE_TRANSACTION_DEAL_UPDATE 및 TRADE_TRANSACTION_DEAL_DELETE):

  • 거래 - 거래 티켓입니다;
  • 주문 - 거래가 이루어진 주문의 티켓입니다;
  • 심볼 - 거래에 사용된 금융상품의 이름;
  • 유형 - 거래 유형;
  • 거래 유형 - 거래 유형
  • 가격 - 거래가 체결된 가격;
  • price_sl - 스톱로스 가격(거래가 체결된 주문에 지정되어 있는 경우 입력됨);
  • price_tp - 이익실현 가격(주문에 명시된 경우 거래가 체결된 기준으로 입력됨);
  • 거래량 - 랏 단위의 거래량.
  • 포지션 - 거래 체결의 결과로 개설, 변경 또는 청산된 포지션의 티켓입니다.
  • position_by - 카운터 포지션의 티켓. 카운터 포지션 청산(아웃 바이)을 위한 거래에만 입력됩니다.


"거래" 유형에 속하는 거래는 TRADE_TRANSACTION_DEAL_ADD, TRADE_TRANSACTION_DEAL_UPDATE, TRADE_TRANSACTION_DEAL_DELETE의 3가지 유형만 있습니다.

Документация по MQL5: Константы, перечисления и структуры / Структуры данных / Структура торговой транзакции
Документация по MQL5: Константы, перечисления и структуры / Структуры данных / Структура торговой транзакции
  • www.mql5.com
Структура торговой транзакции - Структуры данных - Константы, перечисления и структуры - Справочник MQL5 - Справочник по языку алгоритмического/автоматического трейдинга для MetaTrader 5
 
Denis Kirichenko #:

그리고 거래가 없습니다. 지정가 주문은 거래가 수반되지 않습니다. 거래 티켓 = 0, 유형 = 0, 여기서 0은 열거형 ENUM_DEAL_TYPE의 DEAL_TYPE_BUY에 해당합니다. 즉, MqlTradeTransaction 트랜잭션 구조에서 일부 필드는 채워지고 일부 필드는 채워지지 않습니다. 채워지지 않은 필드는 일반적으로 0이 됩니다.

자세한 내용은 지정가 주문 관련 문서를 참조하세요.

아, 그거예요!!! 머리가 깨졌어요! ))

감사합니다!!!

안부, 블라디미르.