OnTradeTransaction 기능에 대한 질문 - 페이지 5

 
papaklass :

OnTradeTransaction()은 거래 이벤트 핸들러입니다. 사건의 원인이 무엇인지는 중요하지 않습니다. 중요한 것은 사건이 발생했다는 것입니다.

문서에서 추출:

OrderSend() / OrderSendAsync()는 거래 기능입니다.

OnTradeTransaction()의 경우 거래 주문 OrderSend() 또는 OrderSendAsync()를 보내는 데 사용한 함수는 차이가 없습니다.

그래서 주제를 만들기 전에 이것을 너무 많이 반복해서 읽었습니다. ... 나는 아무 말도하지 않을 것입니다.

그러나 여전히 많은 트랜잭션을 잃을 확률이 1초 내에 하나의 트랜잭션을 잃을 가능성이 더 높으며 아마도 1초가 아닐 수도 있다는 결론이 내려졌습니다. 그것이 바로 내가 알아 내려고하는 것입니다. 나는 이것에 대한 당신의 의견을 얻으려고 노력하고 있습니다 . 거래가 충분히 드물고 단일한 경우 거래를 잃을 확률은 얼마입니까?

 
papaklass :
확률적으로는 잘 모르겠습니다.

우리는 마이클 자신의 경험을 바탕으로 한 단 하나의 의견에 따라야 할 것입니다. 그가 6개월 동안 주문 더미에서 단 한 건의 거래도 잃지 않았다면 우리는 단 한 건의 주문도 잃지 않을 것이라고 가정할 것입니다.

나는 논리를 깨뜨리지 않으려고 천천히 마스터하고 있지만 때로는 하나가 다른 하나를 방해하는 것으로 밝혀졌습니다 ...

 
AlexeyVik :

우리는 마이클 자신의 경험을 바탕으로 한 단 하나의 의견에 따라야 할 것입니다. 그가 6개월 동안 주문 더미에서 단 한 건의 거래도 잃지 않았다면 우리는 단 한 건의 주문도 잃지 않을 것이라고 가정할 것입니다.

나는 논리를 깨뜨리지 않으려고 천천히 마스터하고 있지만 때로는 하나가 다른 하나를 방해하는 것으로 밝혀졌습니다 ...

Alex, 스스로에게 간단한 질문을 해보세요.

각 명령 후 또는 1회 또는 전혀 하지 않을 수 있으므로 기록을 자세히 알아보기 위해 주문을 다시 확인하는 것이 더 낫습니다( OnTradeTransaction 이 작동하지 않음)?

검사는 구현하기 쉽지 않지만(그런데 내 예에는 오류가 있음) 매우 현실적입니다. 주요 원칙은 - 모든 주문에는 고유한 마법이 있습니다.

그리고 더. 나는 이미 모든 사람이 자신의 길을 갈 자유가 있다고 말했습니다 ....

 
Mikalas :

Alex, 스스로에게 간단한 질문을 해보세요.

각 명령 후, 또는 한 번 또는 전혀 하지 않고 기록을 조사하여 주문을 다시 확인하는 것이 더 낫습니까(OnTradeTransaction이 작동하지 않음)?

검사는 구현하기 쉽지 않지만 (그런데 내 예에는 오류가 있음) 매우 현실적입니다. 주요 원칙은 - 모든 주문에는 고유한 마법이 있습니다.

그리고 더. 나는 이미 모든 사람이 자신의 길을 갈 자유가 있다고 말했습니다 ....

마이클, 이 간단한 질문에 대한 간단한 대답이 제가 이 모든 것을 논의하게 만들었습니다. 그리고 나는 이 아이디어를 던지지 않을 것입니다. 그러나 나는 여전히 OrderSend() 명령 또는 보류 중 활성화 후 또는 stop/take로 포지션을 닫을 때 트랜잭션이 손실될 수 있는지 알 수 없습니다.

첫 번째 답변에서 OrderSendAsync()도 트랜잭션을 잃지 않는다는 것을 이해했습니다. 이런 다소 희귀한 거래에 대한 확인을 차단해야 하는지 여부를 결정하기 위해 이것을 이해하려고 합니다. 특히 선택이 주어졌습니다.

순전히 논리적으로 OrderSend()가 응답을 받을 때까지 완료되지 않으면 트랜잭션이 손실될 수 없습니다. 하지만 지연의 활성화와 포지션의 청산은 제 논리에 맞지 않습니다. 이 경우 트랜잭션이 MT5 내부에서 작동하면 각각 손실되지 않으며 서버를 통한 경우 ... xs. (그것이 알고싶다) 하지만 직감적으로 서버가 실행에 대한 응답을 받고 OnTradeTransaction()을 활성화 시킨다고 생각합니다.

 

여러분, 여기에 그런 오해가 있습니다.

포지션을 열면 OnTradeTransaction은 TRADE_TRANSACTION_DEAL_ADD만 작동합니다... 모든 것이 정상입니다.

예를 들어 SellStop과 같이 지연을 설정하면 TRADE_TRANSACTION_ORDER_ADD만 작동합니다... 모든 것이 정상입니다.

그러나 위치와 지연을 모두 입력하면 TRADE_TRANSACTION_DEAL_ADD 두 번 작동합니다. TRADE_TRANSACTION_ORDER_ADD

왜 그런 겁니까?

#include <Trade\Trade.mqh>


double point, FirstOpenPrice, TakeProfit, SecondOpenPrice, MaxPrice , MinPrice, SecondTake;
bool   NewStart;
       
    CTrade Trade;
    MqlTradeResult v_res, v_result;
     MqlTradeTransaction v_Trans;

/*******************Expert initialization function*******************/
int OnInit ()
{
 point = _Digits % 2 == 0 ? _Point : _Point * 10 ;
  NewStart = true ;
   return ( INIT_SUCCEEDED );
} /*******************************************************************/

/************************Expert tick function************************/
void OnTick ()
{
  if (NewStart)
  {
   Trade.PositionOpen( Symbol (), ORDER_TYPE_BUY , 0.1 , SymbolInfoDouble ( _Symbol , SYMBOL_ASK ), 0.0 , 0.0 );
    Trade.SellStop( 0.78 , SymbolInfoDouble ( _Symbol , SYMBOL_BID )- 52 *point, Symbol (), 0.0 , 0.0 , 0 , 0 );
   NewStart = false ;
  }
} /*******************************************************************/

/*********************TradeTransaction function**********************/
void OnTradeTransaction ( const MqlTradeTransaction & trans,
                         const MqlTradeRequest & request,
                         const MqlTradeResult & result)
{

   ENUM_TRADE_TRANSACTION_TYPE type = ( ENUM_TRADE_TRANSACTION_TYPE )trans.type;
   
   switch (type)
    {
     case TRADE_TRANSACTION_ORDER_ADD :
      {
       Print ( "order add    * Тикет ордера * " , trans.order);
        Print ( "order add    * Объём ордера * " , trans.volume);
       break ;
      }
     case TRADE_TRANSACTION_DEAL_ADD :
      {
       Print ( "deal add    * Тикет сделки * " , trans.deal);
        Print ( "deal add    * Объём сделки * " , trans.volume);
       break ;
      }
     default : break ;
    }

} /*******************************************************************/
 
AlexeyVik :

여러분, 여기에 그런 오해가 있습니다.

포지션을 열면 OnTradeTransaction은 TRADE_TRANSACTION_DEAL_ADD만 작동합니다... 모든 것이 정상입니다.

예를 들어 SellStop과 같이 지연을 설정하면 TRADE_TRANSACTION_ORDER_ADD만 작동합니다... 모든 것이 정상입니다.

그러나 위치와 지연을 모두 입력하면 TRADE_TRANSACTION_DEAL_ADD 두 번 작동합니다. TRADE_TRANSACTION_ORDER_ADD

왜 그런 겁니까?

당신은 어딘가에 실수를 했다. 첫 번째 경우와 두 번째 경우 모두 TRADE_TRANSACTION_ORDER_ADD 및 TRADE_TRANSACTION_DEAL_ADD의 두 가지 이벤트가 있어야 합니다. TRADE_TRANSACTION_ORDER_ADD를 얻지 못하는 이유는 명확하지 않습니다.

스위치를 주석 처리하고 OnTradeTransaction에서 수신된 모든 이벤트의 전체 로그를 표시합니다.

 
C-4 :

당신은 어딘가에 실수를 했다. 첫 번째 경우와 두 번째 경우 모두 TRADE_TRANSACTION_ORDER_ADD 및 TRADE_TRANSACTION_DEAL_ADD의 두 가지 이벤트가 있어야 합니다. TRADE_TRANSACTION_ORDER_ADD를 얻지 못하는 이유는 명확하지 않습니다.

스위치를 주석 처리하고 OnTradeTransaction에서 수신된 모든 이벤트의 전체 로그를 표시합니다.

예, 물론 시도했습니다. switch(type) 이전에는 빈 줄이 Print(EnumToString(type)); 그리고 그것은 내가 설명한대로 정확하게 인쇄되었습니다.

다음은 반복 실험입니다.




 

귀하의 코드를 확인했습니다. - 모든 것이 올바르게 작동합니다.

따라잡기 위해 정지 명령 을 보내지 않는 옵션:

2015.02.10 18:32:03.332 TestOnTradeTransaction (EURUSD,M1) TRADE_TRANSACTION_DEAL_ADD

2015.02.10 18:32:03.331 TestOnTradeTransaction(EURUSD,M1) TRADE_TRANSACTION_HISTORY_ADD

2015.02.10 18:32:03.327 TestOnTradeTransaction(EURUSD,M1) TRADE_TRANSACTION_ORDER_DELETE

2015.02.10 18:32:03.327 TestOnTradeTransaction(EURUSD,M1) TRADE_TRANSACTION_ORDER_ADD

2015.02.10 18:32:03.327 TestOnTradeTransaction(EURUSD,M1) TRADE_TRANSACTION_REQUEST

중지 주문을 보내는 옵션:

2015.02.10 18:35:59.633 TestOnTradeTransaction(EURUSD,M1) TRADE_TRANSACTION_REQUEST

2015.02.10 18:35:59.629 TestOnTradeTransaction(EURUSD,M1) TRADE_TRANSACTION_ORDER_UPDATE

2015.02.10 18:35:59.629 TestOnTradeTransaction(EURUSD,M1) TRADE_TRANSACTION_ORDER_ADD

2015.02.10 18:35:59.629 TestOnTradeTransaction(EURUSD,M1) TRADE_TRANSACTION_REQUEST

2015.02.10 18:35:59.629 TestOnTradeTransaction(EURUSD,M1) TRADE_TRANSACTION_DEAL_ADD

2015.02.10 18:35:59.629 TestOnTradeTransaction(EURUSD,M1) TRADE_TRANSACTION_HISTORY_ADD

2015.02.10 18:35:59.629 TestOnTradeTransaction(EURUSD,M1) TRADE_TRANSACTION_ORDER_DELETE

2015.02.10 18:35:59.629 TestOnTradeTransaction(EURUSD,M1) TRADE_TRANSACTION_ORDER_ADD


추신 전체 사이클 시간은 60~70ms로 안정적이었습니다. 수고한 개발자 여러분, 수고하셨습니다!
 
C-4 :

귀하의 코드를 확인했습니다. - 모든 것이 올바르게 작동합니다.

따라잡기 위해 정지 명령 을 보내지 않는 옵션:

중지 주문을 보내는 옵션:

추신 전체 사이클 시간은 60~70ms로 안정적이었습니다. 수고한 개발자 여러분, 수고하셨습니다!

분명히 이것은 거래 손실입니다 ... 그리고 무엇보다도 (문서에서 잘라내기)

동시에 이러한 거래가 터미널에 도착하는 순서는 보장되지 않습니다.

Vasily, 이것은 테스터입니까 아니면 데모입니까? 테스터의 샘플이 있습니다. 테스터와 계정에서 트리거되는 OnTradeTransaction 간에 차이가 있는지 궁금합니다. 혹시나 해서 확인하겠습니다.


추신; 거래를 잃은 후 OnTradeTransaction 기능을 다음에 활성화할 때 갑자기 나타납니다.

 
AlexeyVik :

분명히 이것은 거래 손실입니다 ... 그리고 무엇보다도 (문서에서 잘라내기)

Vasily, 이것은 테스터입니까 아니면 데모입니까? 테스터의 샘플이 있습니다. 테스터와 계정에서 트리거되는 OnTradeTransaction 간에 차이가 있는지 궁금합니다. 혹시나 해서 확인하겠습니다.


추신; 거래를 잃은 후 OnTradeTransaction 기능을 다음에 활성화할 때 갑자기 나타납니다.

아니요, 트랜잭션은 손실되지 않으며 특정 순서로 오지 않을 수 있습니다.

TRADE_TRANSACTION_REQUEST만 항상 먼저 옵니다. 그렇지 않으면 주문 티켓을 받을 수 없습니다.

설명서를 주의 깊게 읽으십시오.