초보자의 질문 MQL5 MT5 MetaTrader 5 - 페이지 713

 
dimnik :
마지막 하나 또는 여러 트랜잭션의 결과를 찾는 방법을 알려주십시오.

두 가지 방법이 있습니다.

EA에서 직접 OnTradeTransaction() 을 사용 하고 히스토리에 기록된 거래를 캐치합니다.

//+------------------------------------------------------------------+
//| TradeTransaction function                                        |
//+------------------------------------------------------------------+
void OnTradeTransaction ( const MqlTradeTransaction &trans,
                         const MqlTradeRequest &request,
                         const MqlTradeResult &result)
  {
//--- get transaction type as enumeration value
   ENUM_TRADE_TRANSACTION_TYPE type=trans.type;
//--- if transaction is result of addition of the transaction in history
   if (type== TRADE_TRANSACTION_DEAL_ADD )
     {
       long      deal_entry        = 0 ;
       double    deal_profit       = 0.0 ;
       double    deal_volume       = 0.0 ;
       string    deal_symbol       = "" ;
       long      deal_magic        = 0 ;
       if ( HistoryDealSelect (trans.deal))
        {
         deal_entry= HistoryDealGetInteger (trans.deal, DEAL_ENTRY );
         deal_profit= HistoryDealGetDouble (trans.deal, DEAL_PROFIT );
         deal_volume= HistoryDealGetDouble (trans.deal, DEAL_VOLUME );
         deal_symbol= HistoryDealGetString (trans.deal, DEAL_SYMBOL );
         deal_magic= HistoryDealGetInteger (trans.deal, DEAL_MAGIC );
        }
       else
         return ;
       if (deal_symbol== Symbol () && deal_magic==m_magic)
         if (deal_entry== DEAL_ENTRY_OUT )
           {
             // здесь ваши действия
           }
     }
  }

또는 거래 내역을 참조하십시오. 예를 들면 다음과 같습니다.

//+------------------------------------------------------------------+
//|                                               HistorySelect.mq5  |
//|                              Copyright © 2016, Vladimir Karputov |
//|                                           http://wmua.ru/slesar/ |
//+------------------------------------------------------------------+
#property copyright "Copyright © 2016, Vladimir Karputov"
#property link        "http://wmua.ru/slesar/"
#property version    "1.00"
#property description "Реверс позиции и исследование \"DEAL_POSITION_ID\" истории сделок"
#property script_show_inputs
//---
input datetime start= D'2016.08.05 09:00:00' ;
//+------------------------------------------------------------------+
//| Script program start function                                    |
//+------------------------------------------------------------------+
void OnStart ()
  {
//---
   if ( AccountInfoInteger ( ACCOUNT_MARGIN_MODE )== ACCOUNT_MARGIN_MODE_RETAIL_HEDGING )
     {
       Print ( "This script cannot be run on a hedge; Этот скрипт нельзя запускать на хедж" );
       return ;
     }
   Print_IDs();
  }
//+------------------------------------------------------------------+
//| List all positions and deals                                     |
//+------------------------------------------------------------------+
void Print_IDs( void )
  {
//--- запрашиваем историю сделок и ордеров за указанный период серверного времени
   HistorySelect (start, TimeCurrent ()+ 86400 );
   uint      total    = HistoryDealsTotal ();   // количество сделок в истории
   ulong     ticket   = 0 ;                     // тикет сделки в истории
   long      type     = 0 ;                     // тип сделки
   long      deal_id= 0 ;   // идентификатор позиции, в открытии, изменении или закрытии которой участвовала эта сделка
   double    volume   = 0.0 ;                   // объём сделки
   double    profit   = 0.0 ;                   // финансовый результат сделки
   double    price    = 0.0 ;                   // цена сделки
   string    symbol   = NULL ;                   // имя символа, по которому произведена сделка
   long      entry    = 0 ;                     // направление сделки – вход в рынок, выход из рынка или разворот
//--- for all deals
   for ( uint i= 0 ;i<total;i++)
     {
       //--- try to get deals ticket
       if ((ticket= HistoryDealGetTicket (i))> 0 )
        {
         //--- get deals properties
         type     = HistoryDealGetInteger (ticket, DEAL_TYPE );
         deal_id  = HistoryDealGetInteger (ticket, DEAL_POSITION_ID );
         volume   = HistoryDealGetDouble (ticket, DEAL_VOLUME );
         profit   = HistoryDealGetDouble (ticket, DEAL_PROFIT );
         price    = HistoryDealGetDouble (ticket, DEAL_PRICE );
         symbol   = HistoryDealGetString (ticket, DEAL_SYMBOL );
         entry    = HistoryDealGetInteger (ticket, DEAL_ENTRY );
         Print ( EnumToString (( ENUM_DEAL_ENTRY )entry),
               ", type " , EnumToString (( ENUM_DEAL_TYPE )type),
               ", price " , DoubleToString (price, Digits ()),
               ", Deal " ,symbol, " volume " , DoubleToString (volume, 2 ),
               ", DEAL_POSITION_ID #" ,deal_id,
               ", profit " , DoubleToString (profit, 2 ));
        }
     }
   Print ( "" );
  }
//+------------------------------------------------------------------+


선택한 방법에 따라 마지막 거래에 대한 정보를 얻으려면 코드를 약간 수정해야 합니다.

파일:
 
void OnTradeTransaction ( const MqlTradeTransaction &trans,
                         const MqlTradeRequest &request,
                         const MqlTradeResult &result)
  {
   if (trans.type == TRADE_TRANSACTION_DEAL_ADD && trans.symbol == _Symbol )
     {
       if (! HistoryOrderSelect (trans.order)) printf ( "Ордер не найден" );
       if (order.Magic() != MagicNumber) printf ( "Ошибка: магик неправильный %u" ,order.Magic());
     }  
    
  }

이벤트 핸들러는 EA의 마법으로 모든 거래를 추적합니다.

그러나 어떤 이유에서인지 첫 번째 트랜잭션의 경우 다음 트랜잭션에 대해 항상 마술이 올바르지 않은(0) 잘못된(0) 기록이 나타납니다.

어떻게 고치는 지? 아니면 다른 방법으로 할 수 있습니까?

 
dimnik :
void OnTradeTransaction ( const MqlTradeTransaction &trans,
                         const MqlTradeRequest &request,
                         const MqlTradeResult &result)
  {
   if (trans.type == TRADE_TRANSACTION_DEAL_ADD && trans.symbol == _Symbol )
     {
       if (! HistoryOrderSelect (trans.order)) printf ( "Ордер не найден" );
       if (order.Magic() != MagicNumber) printf ( "Ошибка: магик неправильный %u" ,order.Magic());
     }  
    
  }

이벤트 핸들러는 EA의 마법으로 모든 거래를 추적합니다.

그러나 어떤 이유에서인지 첫 번째 트랜잭션의 경우 다음 트랜잭션에 대해 항상 마술이 올바르지 않은(0) 잘못된(0) 기록이 나타납니다.

어떻게 고치는 지? 아니면 다른 방법으로 할 수 있습니까?

당신 은 명령 과 함께 운영 에서 벗어나야 합니다 -- 이것은 구식 시스템 입니다 . 그러면 모든 것이 잘 될 것입니다. "TRADE_TRANSACTION_DEAL_ADD" - 기록에 거래를 추가합니다. 주문 실행 또는 계정 잔액 작업의 결과로 수행됩니다. 또 무엇이 필요합니까? 거래는 성사되었고 역사에 기록되었습니다.
 
dimnik :

이벤트 핸들러는 EA의 마법으로 모든 거래를 추적합니다.

그러나 어떤 이유에서인지 첫 번째 트랜잭션의 경우 다음 트랜잭션에 대해 항상 마술이 올바르지 않은(0) 잘못된(0) 기록이 나타납니다.


이 거래의 매개변수를 표시합니다.

티켓/종류/기호/수익을 찾는 문제는 무엇입니까?

 
o_O :


이 거래의 매개변수를 표시합니다.

티켓/종류/기호/수익을 찾는 문제는 무엇입니까?

문제:

거래 2, 매직 0, 볼륨 0.000000

일반적으로 모든 트랜잭션에 대해 정확한 숫자를 제공하지만 마법과 볼륨은 0입니다.


       deal.Ticket(trans.deal);
       printf ( "Сделка %f, Magic %u, Volume %f" , trans.deal,deal.Magic(),deal. Volume ());
 
dimnik :

문제:

거래 2, 매직 0, 볼륨 0.000000

일반적으로 모든 트랜잭션에 대해 정확한 숫자를 제공하지만 마법과 볼륨은 0입니다.


       deal.Ticket(trans.deal);
       printf ( "Сделка %f, Magic %u, Volume %f" , trans.deal,deal.Magic(),deal. Volume ());

여기에 이 코드를 추가하세요.

//+------------------------------------------------------------------+
//| TradeTransaction function                                        |
//+------------------------------------------------------------------+
void OnTradeTransaction ( const MqlTradeTransaction &trans,
                         const MqlTradeRequest &request,
                         const MqlTradeResult &result)
  {
//--- получим тип транзакции в виде значения перечисления  
   ENUM_TRADE_TRANSACTION_TYPE type=trans.type;
   Print ( EnumToString (type));
   long      deal_type         = 0 ;
   long      deal_positions_id = 0 ;
   long      deal_ticket       = 0 ;
   double    deal_volume       = 0 ;
   long      deal_entry        = 0 ;
   long      deal_magic        = 0 ;
   string    deal_symbol       = "" ;
   string    deal_comment      = "" ;
   if ( HistoryDealSelect (trans.deal))
     {
      deal_type         = HistoryDealGetInteger (trans.deal, DEAL_TYPE );
      deal_positions_id = HistoryDealGetInteger (trans.deal, DEAL_POSITION_ID );
      deal_ticket       = HistoryDealGetInteger (trans.deal, DEAL_TICKET );
      deal_volume       = HistoryDealGetDouble (trans.deal, DEAL_VOLUME );
      deal_entry        = HistoryDealGetInteger (trans.deal, DEAL_ENTRY );
      deal_magic        = HistoryDealGetInteger (trans.deal, DEAL_MAGIC );
      deal_symbol       = HistoryDealGetString (trans.deal, DEAL_SYMBOL );
      deal_comment      = HistoryDealGetString (trans.deal, DEAL_COMMENT );
       Print ( "D_TYPE: " , EnumToString (( ENUM_DEAL_TYPE )deal_type), ", " ,
             "D_POSITION_ID: " ,deal_positions_id, ", " ,
             "D_TICKET: " ,deal_ticket, ", " ,
             "D_VOLUME: " , DoubleToString (deal_volume, 2 ), ", " ,
             "D_ENTRY: " , EnumToString (( ENUM_DEAL_ENTRY )deal_entry), ", " ,
             "_MAGIC: " ,deal_magic, ", " ,
             "D_SYMBOL: " ,deal_symbol, ", " ,
             "D_COMMENT: " ,deal_comment);
     }
   else
       return ;
  }

어떤 유형의 트랜잭션이 발생하는지 볼 수 있으며 "TRADE_TRANSACTION_DEAL_ADD"를 사용하면 마법과 볼륨이 모두 표시됩니다.


 
Vladimir Karputov :

여기에 이 코드를 추가하세요.

//+------------------------------------------------------------------+
//| TradeTransaction function                                        |
//+------------------------------------------------------------------+
void OnTradeTransaction ( const MqlTradeTransaction &trans,
                         const MqlTradeRequest &request,
                         const MqlTradeResult &result)
  {
//--- получим тип транзакции в виде значения перечисления  
   ENUM_TRADE_TRANSACTION_TYPE type=trans.type;
   Print ( EnumToString (type));
   long      deal_type         = 0 ;
   long      deal_positions_id = 0 ;
   long      deal_ticket       = 0 ;
   double    deal_volume       = 0 ;
   long      deal_entry        = 0 ;
   long      deal_magic        = 0 ;
   string    deal_symbol       = "" ;
   string    deal_comment      = "" ;
   if ( HistoryDealSelect (trans.deal))
     {
      deal_type         = HistoryDealGetInteger (trans.deal, DEAL_TYPE );
      deal_positions_id = HistoryDealGetInteger (trans.deal, DEAL_POSITION_ID );
      deal_ticket       = HistoryDealGetInteger (trans.deal, DEAL_TICKET );
      deal_volume       = HistoryDealGetDouble (trans.deal, DEAL_VOLUME );
      deal_entry        = HistoryDealGetInteger (trans.deal, DEAL_ENTRY );
      deal_magic        = HistoryDealGetInteger (trans.deal, DEAL_MAGIC );
      deal_symbol       = HistoryDealGetString (trans.deal, DEAL_SYMBOL );
      deal_comment      = HistoryDealGetString (trans.deal, DEAL_COMMENT );
       Print ( "D_TYPE: " , EnumToString (( ENUM_DEAL_TYPE )deal_type), ", " ,
             "D_POSITION_ID: " ,deal_positions_id, ", " ,
             "D_TICKET: " ,deal_ticket, ", " ,
             "D_VOLUME: " , DoubleToString (deal_volume, 2 ), ", " ,
             "D_ENTRY: " , EnumToString (( ENUM_DEAL_ENTRY )deal_entry), ", " ,
             "_MAGIC: " ,deal_magic, ", " ,
             "D_SYMBOL: " ,deal_symbol, ", " ,
             "D_COMMENT: " ,deal_comment);
     }
   else
       return ;
  }

어떤 유형의 트랜잭션이 발생하는지 볼 수 있으며 "TRADE_TRANSACTION_DEAL_ADD"를 사용하면 마법과 볼륨이 모두 표시됩니다.


감사합니다. 작동하는 방식입니다.
 
dimnik :

다음을 제공합니다.

거래 2, 매직 0, 볼륨 0.000000

일반적으로 모든 트랜잭션에 대해 정확한 숫자를 제공하지만 마법과 볼륨은 0입니다.


       deal.Ticket(trans.deal);
       printf ( "Сделка %f, Magic %u, Volume %f" , trans.deal,deal.Magic(),deal. Volume ());

D CDealInfo 클래스를 사용할 때 거래 내역을 직접 불러와야 모든 것이 정상적으로 작동한다는 사실을 오래전에 깨달았습니다.

   if (trans.type== TRADE_TRANSACTION_DEAL_ADD )
     {
       HistorySelect ( 0 , TimeCurrent ());
       deal.Ticket(trans.deal);
       printf ( "Сделка %f, Magic %u, Volume %f" , trans.deal,deal.Magic(),deal. Volume ());
     }
 
dimnik :
감사합니다. 작동하는 방식입니다.

모든 유형의 거래를 인쇄하지 않으려면 OnTradeTransaction 에서 다음 조건을 설정하십시오.

//--- получим тип транзакции в виде значения перечисления  
   ENUM_TRADE_TRANSACTION_TYPE type=trans.type;
   if (type!= TRADE_TRANSACTION_DEAL_ADD )
       return ;

   long      deal_type         = 0 ;

즉, 트랜잭션 유형이 "TRADE_TRANSACTION_DEAL_ADD"가 아니면 종료됩니다.

보류 중인 주문의 배치(트리거되지는 않지만 배치)를 추적해야 하는 경우 OnTradeTransaction은 다음 형식을 취합니다.

//+------------------------------------------------------------------+
//| TradeTransaction function                                        |
//+------------------------------------------------------------------+
void OnTradeTransaction ( const MqlTradeTransaction &trans,
                         const MqlTradeRequest &request,
                         const MqlTradeResult &result)
  {
//--- get transaction type as enumeration value
   ENUM_TRADE_TRANSACTION_TYPE type=trans.type;
   Print ( EnumToString (type));
//--- if transaction is result of addition of the transaction in history
   if (type== TRADE_TRANSACTION_ORDER_ADD )
     {
       long      order_type        = 0 ;
       double    order_price       = 0.0 ;
       double    order_volume      = 0.0 ;
       string    order_symbol      = "" ;
       long      order_magic       = 0 ;
       if ( OrderSelect (trans.order)) // select pending orders
        {
         order_type= OrderGetInteger ( ORDER_TYPE );
         order_price= OrderGetDouble ( ORDER_PRICE_OPEN );
         order_volume= OrderGetDouble ( ORDER_VOLUME_INITIAL );
         order_symbol= OrderGetString ( ORDER_SYMBOL );
         order_magic= OrderGetInteger ( ORDER_MAGIC );
        }
       else
         return ;
       if (order_symbol==m_symbol.Name() && order_magic==m_magic)
        {
         if (order_type== ORDER_TYPE_BUY_LIMIT )
           {
            //
           }
         if (order_type== ORDER_TYPE_SELL_LIMIT )
           {
            //
           }
        }
     }
  }
 

OnTradeTransaction 을 사용 하여 최적화 시간이 이상하게 변경되었습니다. 15M 시스템, 매우 간단, 1년 기록, 1회 실행 시간은 0.3~0.4초입니다.

최적화를 시작한 후 처음 200-300회 실행은 1초 미만의 속도로 실행되고 다음 실행은 최대 15-20초(50배!)로 느려집니다.

프로세서 과열 및 조절이 없으며 메모리의 절반 이상이 사용 가능합니다(16GB 중).

OnTradeTransaction 핸들러를 사용하기 전에는 이와 같은 것이 없었습니다. 더 복잡한 Expert Advisors는 짧은 기간 동안 거의 동일한 속도로 모든 실행에 최적화되었습니다.

HistoryDealSelect가 속도에 많은 영향을 줍니까? 브레이크를 어떻게 없앨 수 있습니까?

void OnTradeTransaction ( const MqlTradeTransaction &trans,
                         const MqlTradeRequest &request,
                         const MqlTradeResult &result)
  {
   if ( trans.type != TRADE_TRANSACTION_DEAL_ADD ) return ;
   ENUM_TRADE_TRANSACTION_TYPE type=trans.type;
   long      deal_type         = 0 ;
   double    deal_volume       = 0 ;
   long      deal_magic        = 0 ;
   if ( HistoryDealSelect (trans.deal))
     {
      deal_type         = HistoryDealGetInteger (trans.deal, DEAL_TYPE );
      deal_volume       = HistoryDealGetDouble (trans.deal, DEAL_VOLUME );
      deal_magic        = HistoryDealGetInteger (trans.deal, DEAL_MAGIC );
     }
   else
       return ;
   if (deal_type == DEAL_TYPE_BUY && deal_magic == MagicNumber) current_position += deal_volume;
   if (deal_type == DEAL_TYPE_SELL && deal_magic == MagicNumber) current_position -= deal_volume;
      
  }
사유: