거래 처리 OnTradeTransaction

 

좋은 저녁이에요.

여러분, 제가 알아낼 수 있도록 도와주세요. 문제가 새로운 것은 아니지만 명확한 해결책을 찾지 못했습니다(실제로는 물론 포럼에서도).

2 도구의 터미널에서 2개의 다른 로봇을 시작합니다. 마법은 모든 곳에서 다릅니다. 로봇은 보류 중인 제한을 설정하고 OnTradeTransaction 절차에서 트랜잭션의 트랜잭션을 포착하고 이를 기반으로 보류 중인 정지 주문을 내립니다.

아래는 거래 거래 코드입니다.

 case TRADE_TRANSACTION_DEAL_ADD :
        {
         drop_info2( "TRADE_TRANSACTION_DEAL_ADD\r\n" +TransactionDescription(trans));
         if ((trans.deal_type== DEAL_TYPE_BUY || trans.deal_type== DEAL_TYPE_SELL ) && trans.order!= 0 )
           {
             if (getIsDealOfExpert(trans.deal)) //функция проверки принадлежности сделки к роботу
              {
               drop_info2( "Сделка наша" );
               analyzeFilledOrder(trans.order,trans.volume); //процедура по выставлению отложенных стоп ордеров
              }
           }
        }
       break ;

거래가 로봇에 속하는지 확인하기 위한 기능 코드

 bool getIsDealOfExpert( ulong dealTicket)
     {
       if ( HistoryDealSelect (dealTicket) && HistoryDealGetInteger (dealTicket, DEAL_MAGIC )==magic_number && HistoryDealGetString (dealTicket, DEAL_SYMBOL )==symbol)
         return true ;
       else
         return false ;
     }

보류 중인 중지 주문을 위한 절차 코드

 void analyzeFilledOrder( ulong orderTicket, double volume)
  {
   bool isFindOrder= false ;
   string fullComment;
   ENUM_ORDER_TYPE orderType;
   if (getIsOrderOfExpert(orderTicket, true )) //Если ордер из сделки уже в истории
     {
      fullComment= HistoryOrderGetString (orderTicket, ORDER_COMMENT );
      orderType= ENUM_ORDER_TYPE ( HistoryOrderGetInteger (orderTicket, ORDER_TYPE ));
      isFindOrder= true ; //локальная переменная, если нашли в истории
     }
   if (!isFindOrder && getIsOrderOfExpert(orderTicket, false )) //Если не нашли ордер в истории и ордер есть не в истории
     {
      fullComment= OrderGetString ( ORDER_COMMENT ); 
      orderType= ENUM_ORDER_TYPE ( OrderGetInteger ( ORDER_TYPE ));
      isFindOrder= true ; //локальная переменная, если нашли не в истории
     }
   if (isFindOrder) //если хоть где-то нашли, то выставляем отложенные стоп ордера
     {
     //выставляем стоп ордера

내역이 아닌 내역에 있는 주문 검색 기능의 코드

 bool getIsOrderOfExpert( ulong OrderTicket , bool isHistory)
     {
       bool is_expert= false ;
       //если ордер находится в истории
       if (isHistory)
        {
         if ( HistoryOrderSelect ( OrderTicket ) && HistoryOrderGetInteger ( OrderTicket , ORDER_MAGIC )==magic_number && HistoryOrderGetString ( OrderTicket , ORDER_SYMBOL )==symbol)
            is_expert= true ;
        }
       else
        {
         if ( OrderSelect ( OrderTicket ) && OrderGetInteger ( ORDER_MAGIC )==magic_number && OrderGetString ( ORDER_SYMBOL )==symbol)
            is_expert= true ;
        }
       return is_expert;
     }

나는 터미널에서 수신된 순서대로 로그에 트랜잭션의 도착에 대한 정보를 표시합니다. 이제 데모 계정에서 거래할 때 발생한 문제:

주기적으로 거래는 TRADE_TRANSACTION_ORDER_DELETE, TRADE_TRANSACTION_DEAL_ADD, TRADE_TRANSACTION_HISTORY_ADD 순서로 도착합니다. 이 경우 종종 거래가 완료된 후 중지 주문이 설정되지 않습니다. 내 생각에 이것은 주문이 이미 삭제되었지만 아직 내역에 입력되지 않았기 때문입니다. 즉, 거래 내역이나 터미널에서 주문을 찾을 수 없습니다. 이것이 의심스럽긴 하지만 로봇이 모든 차원( isFindOrder= false )에서 주문을 검색한 후 찾지 못하기 때문에 중지 주문이 지정되지 않는다는 사실이 남아 있습니다. 거래 순서는 정확할 수 있지만 주문은 여전히 어디에도 없습니다. 모든 경우에 로봇은 거래를 올바르게 결정하지만 주문에 도달하지는 않습니다. 동시에 모든 것이 때때로 올바르게 작동하고 주문이 이루어집니다.

다른 접근 방식을 시도했지만 아무 것도 도움이되지 않습니다. 이제 보류 중인 주문을 하는 절차의 시작 부분에 1초의 절전 모드를 추가할 생각입니다. 시간이 충분하지 않을 수 있습니다. 일반적으로 나는 다른 곳을 파야할지조차 모릅니다.

경험과 아이디어를 공유해 주세요.

 
Илья Ребенок :

좋은 저녁이에요.

여러분, 제가 알아낼 수 있도록 도와주세요. 문제가 새로운 것은 아니지만 명확한 해결책을 찾지 못했습니다(실제로는 물론 포럼에서도).

2 도구의 터미널에서 2개의 다른 로봇을 시작합니다. 마법은 모든 곳에서 다릅니다. 로봇은 보류 중인 제한을 설정하고 OnTradeTransaction 절차에서 트랜잭션의 트랜잭션을 포착하고 이를 기반으로 보류 중인 정지 주문을 내립니다.

아래는 거래 거래 코드입니다.

거래가 로봇에 속하는지 확인하기 위한 기능 코드

보류 중인 중지 주문을 위한 절차 코드

내역이 아닌 내역에 있는 주문 검색 기능의 코드

나는 터미널에서 수신된 순서대로 로그에 트랜잭션의 도착에 대한 정보를 표시합니다. 이제 데모 계정에서 거래할 때 발생한 문제:

주기적으로 거래는 TRADE_TRANSACTION_ORDER_DELETE, TRADE_TRANSACTION_DEAL_ADD, TRADE_TRANSACTION_HISTORY_ADD 순서로 도착합니다. 이 경우 종종 거래가 완료된 후 스탑 오더가 배치되지 않습니다. 내 생각에 이것은 주문이 이미 삭제되었지만 아직 내역에 입력되지 않았기 때문입니다. 즉, 거래 내역이나 터미널에서 주문을 찾을 수 없습니다. 이것이 의심스럽긴 하지만 로봇이 모든 차원( isFindOrder= false )에서 주문을 검색한 후 찾지 못하기 때문에 중지 주문이 지정되지 않는다는 사실이 남아 있습니다. 거래 순서는 정확할 수 있지만 주문은 여전히 어디에도 없습니다.

다른 접근 방식을 시도했지만 아무 것도 도움이되지 않습니다. 이제 보류 중인 주문을 하는 절차의 시작 부분에 1초의 절전 모드를 추가할 생각입니다. 시간이 충분하지 않을 수 있습니다. 일반적으로 어디를 파야할지조차 모릅니다.

경험과 아이디어를 공유해 주세요.

모든 코드를 이해하지 못했습니다. 제 생각에는 접근 방식이 전혀 옳지 않습니다.

거래 유형 TRADE_TRANSACTION_DEAL_ADD 시 trans.position으로 포지션을 선택하고 그 마법을 확인해야 합니다.

 if ( PositionSelectByTicket (trans.position) && PositionGetInteger ( POSITION_MAGIC ) == mag)

또한 trans.symbol == _Symbol로 기호를 확인하고 이러한 확인 결과를 기반으로 결정을 내릴 수 있습니다.

 
Alexey Viktorov :

모든 코드를 이해하지 못했습니다. 제 생각에는 접근 방식이 전혀 옳지 않습니다.

거래 유형 TRADE_TRANSACTION_DEAL_ADD 시 trans.position으로 포지션을 선택하고 그 마법을 확인해야 합니다.

또한 trans.symbol == _Symbol로 기호를 확인하고 이러한 확인 결과를 기반으로 결정을 내릴 수 있습니다.

그물 모드를 추가하는 것을 잊었습니다. 위치는 모든 로봇이 동일합니다. 즉, 한 로봇이 포지션을 매수하고, 두 번째 로봇이 포지션을 매수하고, TRADE_TRANSACTION_DEAL_ADD 이벤트가 역순으로 발생하여 첫 번째 로봇은 이를 보지 못했습니다.

예, 논리에 따르면 트랜잭션에서 주문 주석을 받아야 합니다. 위치는 여기에서별로 도움이 되지 않습니다.
 
Илья Ребенок :

경험과 아이디어를 공유해 주세요.

하나의 상황

거래, 자동 거래 시스템 및 거래 전략 테스트에 관한 포럼

오류, 버그, 질문

fxsaber , 2018.06.20 23:18

그런 팬텀 오더의 상황이 얼마나 오래 지속되는지 확인하기 위해 주문은 시스템에 있지만 터미널에는 있지 않습니다.

 // Советник отслеживает длительность ситуаций, когда ордер отсутствует среди текущих и исторических

#define TOSTRING(A)   #A + " = " + ( string )(A) + "\n"
#define TOSTRING2(A) #A + " = " + EnumToString (A) + " (" + ( string )(A) + ")\n"

bool OrderIsExist( const ulong & OrderTicket )
{
   return ( OrderTicket ? OrderSelect ( OrderTicket ) || HistoryOrderSelect ( OrderTicket ) : true );
}

void OnTradeTransaction ( const MqlTradeTransaction &Trans, const MqlTradeRequest &, const MqlTradeResult & )
{
   static bool PrevIsExist = true ;
   static ulong StartTime = 0 ;
   static ulong MaxInterval = 0 ;
  
   const ulong NowTime = GetMicrosecondCount ();
   const bool IsExist = OrderIsExist(Trans.order);
    
   if (!IsExist)
  {
     Print (TOSTRING2(Trans.type) + TOSTRING(Trans.order) +
          TOSTRING( OrderSelect (Trans.order)) + TOSTRING( HistoryOrderSelect (Trans.order)));       
  
     if (PrevIsExist) 
      StartTime = NowTime;
  }
   else if (!PrevIsExist)
  {
     const ulong Interval = NowTime - StartTime;
    
     Print (TOSTRING(Interval) + TOSTRING2(Trans.type) + TOSTRING(Trans.order) +
          TOSTRING( OrderSelect (Trans.order)) + TOSTRING( HistoryOrderSelect (Trans.order)));       
    
     if (Interval > MaxInterval)
    {
      MaxInterval = Interval;
      
       Comment (TOSTRING(MaxInterval) + TOSTRING(Trans.order)); // mcs.
    }
  }
          
  PrevIsExist = IsExist;
}


결과

 2018.06 . 21 00 : 10 : 31.047 Trans.type = TRADE_TRANSACTION_ORDER_DELETE ( 2 )
2018.06 . 21 00 : 10 : 31.047 Trans.order = 2210967406
2018.06 . 21 00 : 10 : 31.047 OrderSelect (Trans.order) = false
2018.06 . 21 00 : 10 : 31.047 HistoryOrderSelect (Trans.order) = false
2018.06 . 21 00 : 10 : 31.047 
2018.06 . 21 00 : 10 : 31.080 Interval = 32643
2018.06 . 21 00 : 10 : 31.080 Trans.type = TRADE_TRANSACTION_HISTORY_ADD ( 3 )
2018.06 . 21 00 : 10 : 31.080 Trans.order = 2210967406
2018.06 . 21 00 : 10 : 31.080 OrderSelect (Trans.order) = false
2018.06 . 21 00 : 10 : 31.080 HistoryOrderSelect (Trans.order) = true


32밀리세컨드 주문이 있는데 터미널에 없습니다! 이 간격에서 거래 로직이 실행된다면 이것이 어떤 결과를 가져올지 상상해보세요...


흥미롭게도 팬텀 주문은 TRADE_TRANSACTION_ORDER_DELETETRADE_TRANSACTION_DEAL_ADD (훨씬 덜 자주) 거래 유형 에 대해서만 존재하는 경우가 가장 많습니다.


플랫폼의 매우 나쁜 뉘앙스.


ZY 불행히도 상위 5 위의 거래 작업의 의심스러운 성능.


두번째

포지션을 개시하는 시장가 주문이 접수되었고 OrdersTotal이 1 증가했습니다.

  • 이행되었고 OrdersTotal은 1 감소했지만 PositionsTotal은 1 증가하지 않았습니다. 저것들. 위치가 있지만 터미널은 그것에 대해 알지 못합니다.
  • 예를 들어 포지션이나 주문이 없습니다 - PositionsTotal = 0, OrdersTotal = 0.

    시장가 주문을 합니다. 이 경우 PositionsTotal = 0, OrdersTotal = 1입니다.

    시장가 주문 완료 - OrdersTotal = 0. 그러나 PositionsTotal = 0 !

     
    Илья Ребенок :

    그물 모드를 추가하는 것을 잊었습니다. 모든 로봇의 위치는 동일합니다.

    상관없습니다. 위치에는 항상 티켓이 있지만 기호로 선택할 수도 있습니다. 거래량 이나 다른 것에 대한 수표를 추가해야 할 수도 있습니다. 예를 들어 주문을 선택하고 거래를 배치하고 올바른 것을 찾아 흔들어 보세요. 그러나 거래는 거래입니다... 그리고 아무도 거래 순서를 보장하지 않습니다. 얼마 전까지만 해도 일반적으로 거래 손실 가능성에 대한 경고가 있었습니다.


    귀하의 게시물에 추가된 내용을 감안할 때 적합하지 않습니다. 이 경우 자세히 살펴봐야 합니다.

     
    Илья Ребенок :

    다른 접근 방식을 시도했지만 아무 것도 도움이되지 않습니다.

    구현할 간단한 작업을 작성하십시오.

     
    fxsaber :

    하나의 상황


    두번째

    감사합니다. 읽어보겠습니다. 하지만 언뜻 보기에는 내 가정이 확증됩니다.

    알렉세이 빅토로프 :

    상관없습니다. 위치에는 항상 티켓이 있지만 기호로 선택할 수도 있습니다. 거래량 이나 다른 것에 대한 수표를 추가해야 할 수도 있습니다. 예를 들어 주문을 선택하고 거래를 배치하고 올바른 것을 찾아 흔들어 보세요. 그러나 거래는 거래입니다... 그리고 아무도 거래 순서를 보장하지 않습니다. 얼마 전까지만 해도 일반적으로 거래 손실 가능성에 대한 경고가 있었습니다.


    귀하의 게시물에 추가된 내용을 감안할 때 적합하지 않습니다. 이 경우 자세히 살펴봐야 합니다.

    거래 손실에 대한 게시물을 보았지만 거기에서 중재자가 이것이 과거의 유물이라고 말하고 문서에서 그것을 제거하는 것을 잊었습니다.

    fxsaber :

    구현할 간단한 작업을 작성하십시오.

    간단한 액션을 작성하는 것에 대해 잘 이해하지 못했습니다) 설명하십시오.

     
    Илья Ребенок :


    거래 손실에 대한 게시물을 보았지만 거기에서 중재자가 이것이 과거의 유물이라고 말하고 문서에서 그것을 제거하는 것을 잊었습니다.

    이미 삭제되었지만 그리 오래되지 않았습니다.

     
    Илья Ребенок :

    간단한 액션을 작성하는 것에 대해 잘 이해하지 못했습니다) 설명하십시오.

    거래 업무는 무엇입니까?

     
    fxsaber :

    거래 업무는 무엇입니까?

    우리는 제한 지연을 설정 하고 트리거되면 정지 주문 과 이익 실현 주문을 설정합니다. 중지가 트리거되고 이익 실현을 제거하고 그 반대의 경우도 마찬가지입니다. 우리가 스탑 주문을하고 이익을 취하는 것을 기반으로하는 초기 제한의 티켓, 나는 스탑 주문을 적고 코멘트에 이익을 얻습니다. 그렇기 때문에 스탑 오더 발동 시 같은 댓글로 테이크 프로핏을 찾아서 삭제할 수 있도록 오더 댓글을 받는 것이 중요합니다.

    로봇은 리필을 제공하므로 재구매시 우리는 또한 중지 주문을하고 이익을 얻고 댓글에 리필 티켓을 입력합니다.

    1초에 자는 아이디어가 하루를 구할 수 있습니까? 모든 거래 TRADE_TRANSACTION_ORDER_DELETE TRADE_TRANSACTION_HISTORY_ADD 를 검토할 시간을 갖기 위해

    Общие принципы - Торговые операции - MetaTrader 5
    Общие принципы - Торговые операции - MetaTrader 5
    • www.metatrader5.com
    Перед тем как приступить к изучению торговых функций платформы, необходимо создать четкое представление об основных терминах: ордер, сделка и позиция. — это распоряжение брокерской компании купить или продать финансовый инструмент. Различают два основных типа ордеров: рыночный и отложенный. Помимо них существуют специальные ордера Тейк Профит...
     

    Илья Ребенок :

    로봇은 리필을 제공하므로 재구매시 우리는 또한 중지 주문을하고 이익을 얻고 댓글에 리필 티켓을 입력합니다.

    >=2개의 테이크 및 스톱이 동시에 있을 수 있습니까?