OrderSend를 사용하여 MT5에서 올바르게 작동하는 방법 - 페이지 11

 
prostotrader :

둘이 아니라 하나 :)

if (transaction.type == TRADE_TRANSACTION_REQUEST && request.action == TRADE_ACTION_DEAL )

TRADE_TRANSACTION_REQUEST는 OrderSendAsymc를 사용 하여 주문 티켓을 얻을 때 필요합니다.

그리고 거기에 무엇이 잘못 되었습니까? 내가 OrderSendAsync()를 사용하고 있는지 어떻게 아나요?
예를 들어 거래 요청을 보낸 Expert Advisor의 스탬프를 확인하는 데 사용할 수 없습니까? 또는 예를 들어, 마지막 거래가 이루어진 포지션의 티켓을 확인하려면?

마지막으로, 이 이벤트를 사용하여 거래가 이루어진 가격을 확인할 수 있습니다(비록 이 이벤트에서 가격을 확인하는 것은 비동기 거래를 사용할 때만 의미가 있음에도 동의합니다).

즉, 비동기 주문 전송을 사용하는 경우 코드가 올바른가요?

 
Oleg Shenker :

그리고 거기에 무엇이 잘못 되었습니까? 내가 OrderSendAsync()를 사용하고 있는지 어떻게 아나요?
예를 들어 거래 요청을 보낸 Expert Advisor의 스탬프를 확인하는 데 사용할 수 없습니까? 또는 예를 들어, 마지막 거래가 이루어진 포지션의 티켓을 확인하려면?

마지막으로, 이 이벤트를 사용하여 거래가 이루어진 가격을 확인할 수 있습니다(비록 이 이벤트에서 가격을 확인하는 것은 비동기 거래를 사용할 때만 의미가 있음에도 동의합니다).

즉, 비동기 주문 전송을 사용하는 경우 코드가 올바른가요?

주제는

"OrderSend로 작업하는 방법"

이 기능(개발자가 생각한 대로)은 완전히 동기식이어야 합니다. 즉, 주문을 보내고 티켓을 받으면

그러면 모든 것이 순서대로 됩니다. 그러나 이제 이 기능이 제대로 작동하지 않으므로 주문 티켓을 받은 후

OnTradeTransaction 에서 모든 것이 정상이라는 확인을 받아야 합니다.

즉, 이 주문의 데이터는 터미널에서 완전히 동기화됩니다.

//+------------------------------------------------------------------+
// Expert TradeTransaction function                                  |
//+------------------------------------------------------------------+
void OnTradeTransaction ( const MqlTradeTransaction &trans,
                         const MqlTradeRequest &request,
                         const MqlTradeResult &result)
  {
   switch (trans.type)
     {
       case TRADE_TRANSACTION_ORDER_UPDATE :
           switch (trans.order_state)
           {
             case ORDER_STATE_PLACED :
               if (order_ticket==trans.order)
                 {
                   Print ( __FUNCTION__ , " Order plased done. Ticket = " ,trans.order);
                   if (order_ticket> 0 )
                    {
                     if ( OrderSelect (order_ticket))
                       {
                         //Данные по ордеру синхронизированы
                       }
                     else
                       {
                         Print ( __FUNCTION__ , " Order not select! Ticket = " ,trans.order);
                       }
                    }
                   else
                    {
                     Print ( __FUNCTION__ , " Wrong order ticket = " ,trans.order);
                    }
                 }
               break ;
           }
         break ;
     }
  }
 
prostotrader :

주제는

"OrderSend로 작업하는 방법"

이 기능(개발자가 생각한 대로)은 완전히 동기식이어야 합니다. 즉, 주문을 보내고 티켓을 받으면

그러면 모든 것이 순서대로 됩니다. 그러나 이제 이 기능이 제대로 작동하지 않으므로 주문 티켓을 받은 후

OnTradeTransaction 에서 모든 것이 정상이라는 확인을 받아야 합니다.

즉, 이 주문의 데이터는 터미널에서 완전히 동기화됩니다.

//+------------------------------------------------------------------+
// Expert TradeTransaction function                                  |
//+------------------------------------------------------------------+
void OnTradeTransaction ( const MqlTradeTransaction &trans,
                         const MqlTradeRequest &request,
                         const MqlTradeResult &result)
  {
   switch (trans.type)
     {
       case TRADE_TRANSACTION_ORDER_UPDATE :
           switch (trans.order_state)
           {
             case ORDER_STATE_PLACED :
               if (order_ticket==trans.order)
                 {
                   Print ( __FUNCTION__ , " Order plased done. Ticket = " ,trans.order);
                   if (order_ticket> 0 )
                    {
                     if ( OrderSelect (order_ticket))
                       {
                         //Данные по ордеру синхронизированы
                       }
                     else
                       {
                         Print ( __FUNCTION__ , " Order not select! Ticket = " ,trans.order);
                       }
                    }
                   else
                    {
                     Print ( __FUNCTION__ , " Wrong order ticket = " ,trans.order);
                    }
                 }
               break ;
           }
         break ;
     }
  }


놀라운! 나도 알아 나는 비동기 주문 전송만 사용합니다. 또 다른 문제가 있습니다. 동일한 트랜잭션에 대한 REQUEST 이벤트(트랜잭션의 최종 합계의 의미에서)가 두 번 발생했습니다.
 
Oleg Shenker :
놀라운! 나도 알아 나는 비동기 주문 전송만 사용합니다. 또 다른 문제가 있습니다. 동일한 트랜잭션에 대한 REQUEST 이벤트(트랜잭션의 최종 합계의 의미에서)가 두 번 발생했습니다.

OrderSEndAsync 주문을 할 때 OnTradeTransaction 에서 메시지를 처리하는 방법을 잘 이해하지 못합니다.

이 Expert Advisor를 등록하고 작동 방식을 확인하십시오.

파일:
TestOrders.mq5  25 kb
 
prostotrader :

OrderSEndAsync 주문을 할 때 OnTradeTransaction 에서 메시지를 처리하는 방법을 잘 이해하지 못합니다.

이 Expert Advisor를 등록하고 작동 방식을 확인하십시오.

그래서 TradeTransactions를 올바르게 처리하는 방법을 묻습니다.

 
Oleg Shenker :

그래서 TradeTransactions를 올바르게 처리하는 방법을 묻습니다.

OrderSendAsync의 순서는 다음과 같습니다.

OrderSendAsync 명령으로 주문을 보낼 때 성공적으로 보내면 order_id 를 받습니다.

bool SendOrderAsyncMode()
  {
   double price= SymbolInfoDouble ( Symbol (), SYMBOL_SESSION_PRICE_LIMIT_MAX );
   MqlTradeRequest request={ 0 };
   MqlTradeResult   result={ 0 };
   order_ticket= 0 ;
   order_id= 0 ;
   request.action = TRADE_ACTION_PENDING ;
   request.magic  = 9876543210 ;
   request.symbol = Symbol ();
   request.volume = 1 ;
   request.price  = price;
   request.type= ORDER_TYPE_SELL_LIMIT ;
   request.comment= "Async mode" ;
   request.type_filling= ORDER_FILLING_RETURN ;
   request.type_time= ORDER_TIME_DAY ;
   if ( OrderSendAsync (request,result))
     {
       if ((result.retcode== TRADE_RETCODE_PLACED ) || (result.retcode== TRADE_RETCODE_DONE ))
        {
         if (result.request_id> 0 )
           {
            order_id=result.request_id;
             Print ( __FUNCTION__ , " Order sent in async mode" );
             return ( true );
           }
         else
           {
             Print ( __FUNCTION__ , " Error order sent in async mode! Retcode = " ,result.retcode);
           }
        }
       else
        {
         Print ( __FUNCTION__ , " Error order sent in async mode! Retcode = " ,result.retcode);
        }
     }
   else
     {
       Print ( __FUNCTION__ , " Order not sent in async mode." );
     }
   return ( false );
  }

또한 다른 모든 데이터는 OnTradeTransaction 에서 수신됩니다.

1. 주문 티켓 받기

void OnTradeTransaction ( const MqlTradeTransaction &trans,
                         const MqlTradeRequest &request,
                         const MqlTradeResult &result)
  {
   switch (trans.type)
     {
       case TRADE_TRANSACTION_REQUEST :
         if ((order_id> 0 ) && (order_id==result.request_id))
           {
            order_id= 0 ;
            order_ticket=result.order;
             Print ( __FUNCTION__ , " Order get ticket done. Ticket = " ,result.order);
           }
         break ;
     }
}

2. 시장가 주문 또는 지정가(보류가 아님) 주문, 즉 즉시 실행되는 주문을 사용하는 경우

또는 거부된 경우 TRADE_TRANSACTION_HISTORY_ADD를 모니터링해야 합니다.

이러한 주문은 기록에 추가됩니다.

void OnTradeTransaction ( const MqlTradeTransaction &trans,
                         const MqlTradeRequest &request,
                         const MqlTradeResult &result)
  {
   switch (trans.type)
     {
       case TRADE_TRANSACTION_HISTORY_ADD :
         if (order_ticket==trans.order)
           {
             //Берем данные из истории
           }
         break ;
    }
  }


3. 보류 주문(부분적으로 실행할 수 있음)을 사용하는 경우 모니터링해야 합니다.

스테이시스 3가지 이벤트 TRADE_TRANSACTION_ORDER_UPDATE, TRADE_TRANSACTION_HISTORY_ADD, TRADE_TRANSACTION_DEAL_ADD

TRADE_TRANSACTION_ORDER_UPDATE - 주문(수정)된 정보를 수신하는 데 사용

TRADE_TRANSACTION_DEAL_ADD - 거래가 이루어졌는지 확인

TRADE_TRANSACTION_HISTORY_ADD - 거래 시스템에 주문이 없습니다. 주문 데이터를 확인하세요.

그것이 바로 '지혜'다.

추가됨

OrderSendAsync와 OnTradeTransaction 의 조합은 완벽하게 작동 하며 FOREX(데모)에서도 확인했습니다.

및 FORTS(리얼)

 
prostotrader :

추가됨

OrderSendAsync와 OnTradeTransaction 의 조합은 완벽하게 작동 하며 FOREX(데모)에서도 확인했습니다.

및 FORTS(리얼)

고맙습니다! 이제 OnTradeTransaction() 함수를 사용하는 방법을 알았습니다. 아니면 다른 비밀이 있습니까?

TradeTransaction() 이벤트가 손실될 수 있는 경우 어떻게 문제가 없을 수 있습니까?

 
Oleg Shenker :

고맙습니다! 이제 OnTradeTransaction() 함수를 사용하는 방법을 알았습니다. 아니면 다른 비밀이 있습니까?

TradeTransaction() 이벤트가 손실될 수 있는 경우 어떻게 문제가 없을 수 있습니까?

더 이상 비밀은 없습니다.

그것은 길을 잃을 수 있습니다 (그러나 4-5 개월 동안 3-4 번 발생하고 시장 활동이 활발할 때),

그래서 보험이 아프지 않을 것입니다.

 

다음은 주문을 확인하는 구체적인 예입니다.

터미널 로그:

2017.01.05 11:46:01.673 Trades  'xxxxx': buy limit 1.00 PLT-6.17 at 952.3
2017.01.05 11:46:02.895 Trades  'xxxxx': accepted buy limit 1.00 PLT-6.17 at 952.3
2017.01.05 11:46:02.896 Trades  'xxxxx': buy limit 1.00 PLT-6.17 at 952.3 placed for execution in 1223.187 ms

전문가 로그:

2017.01 . 05 11 : 46 : 02.829  trader (PLT- 3.17 ,H1)      CheckOrders: Задержка ответа сервера. Ожидание продолжается...


주문은 2017.01.05 11:46:01.673 에 발송되었습니다.

1초 이상 서버에서 응답이 없어서 주문을 확인했습니다.

일반 모드에서 응답은 7-10ms 내에 옵니다.

 

" MT5에서 OrderSend 로 작업하는 방법 " 주제의 질문에 답하기

간단한 답이 있습니다

개발자가 버그를 수정할 때까지

ulong pre_ticket; //Предварительный тикет
ulong order_ticket; //Тикет ордера
//---
if ( OrderSend (request,result))
  {
     if (result.retcode== TRADE_RETCODE_DONE )
    {
      pre_ticket=result.order;
    }  
  }
//----------------------------------------------------------------+
//| TradeTransaction function                                        |
//+------------------------------------------------------------------+
void OnTradeTransaction ( const MqlTradeTransaction &trans,
                         const MqlTradeRequest &request,
                         const MqlTradeResult &result)
{
   switch (trans.type)
   {
     case TRADE_TRANSACTION_ORDER_UPDATE :
       if ((pre_ticket> 0 ) && (trans.order==pre_ticket))
       {
         switch (trans.order_state)
         {
           case ORDER_STATE_PLACED :
             order_ticket = pre_ticket;
           break ;
         }
       }
     break ;
   }
}

그리고 그들이 그것을 고칠 때

ulong order_ticket; //Тикет ордера
//---
if ( OrderSend (request,result))
  {
     if (result.retcode== TRADE_RETCODE_DONE )
    {
      order_ticket=result.order;
    }  
  }