Yeni başlayanlardan sorular MQL5 MT5 MetaTrader 5 - sayfa 713

 
dimnik :
Son bir veya birkaç işlemin sonucunu nasıl öğreneceğimi söyle?

İki yol var:

OnTradeTransaction() 'ı doğrudan EA'da kullanın ve geçmişte kaydedilmiş olan işlemleri yakalayın.

//+------------------------------------------------------------------+
//| 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 )
           {
             // здесь ваши действия
           }
     }
  }

veya işlem geçmişine bakın , örneğin şöyle bir şey:

//+------------------------------------------------------------------+
//|                                               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 ( "" );
  }
//+------------------------------------------------------------------+


Hangi yöntemi seçtiğinize bağlı olarak, son işlem hakkında bilgi almak için kodu biraz düzenlemeniz gerekecektir.

Dosyalar:
 
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());
     }  
    
  }

Olay işleyici, EA'nın büyüleri ile tüm işlemleri takip eder.

Ancak bir nedenden dolayı, ilk işlem için, sihir her zaman gelir (tarih sırasını geçerim) yanlış (sıfır), sonraki işlemler için - her şey yolunda.

Nasıl düzeltilir? Ya da farklı bir şekilde yapılabilir mi?

 
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());
     }  
    
  }

Olay işleyici, EA'nın büyüleri ile tüm işlemleri takip eder.

Ancak bir nedenden dolayı, ilk işlem için, sihir her zaman gelir (tarih sırasını geçerim) yanlış (sıfır), sonraki işlemler için - her şey yolunda.

Nasıl düzeltilir? Ya da farklı bir şekilde yapılabilir mi?

Emirlerle çalışmaktan uzaklaşmanız gerekiyor - bu eski bir sistem . O zaman her şey yoluna girecek. "TRADE_TRANSACTION_DEAL_ADD" - Geçmişe bir anlaşma ekleme. Hesap bakiyesi ile emir yürütme veya işlemler sonucunda gerçekleştirilir. Başka ne gerekiyor? Anlaşma gerçekleşti ve tarihe geçti.
 
dimnik :

Olay işleyicisi, EA'nın büyüleriyle tüm işlemleri takip eder.

Ancak bir nedenden dolayı, ilk işlem için, sihir her zaman gelir (tarih sırasını geçerim) yanlış (sıfır), sonraki işlemler için - her şey yolunda.


Peki, bu işlemin parametrelerini görüntüleyin.

biletini/tipini/sembolünü/karını bulma sorunu nedir?

 
o_O :


Peki, bu işlemin parametrelerini görüntüleyin.

biletini/tipini/sembolünü/karını bulma sorunu nedir?

Sorunlar:

İşlem 2, Büyü 0, Hacim 0.000000

Genel olarak, tüm işlemler için doğru sayıyı verir, ancak sıfır büyü ve hacim verir.


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

Sorunlar:

İşlem 2, Büyü 0, Hacim 0.000000

Genel olarak, tüm işlemler için doğru sayıyı verir, ancak sıfır büyü ve hacim verir.


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

Bu kodu buraya ekleyin:

//+------------------------------------------------------------------+
//| 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 ;
  }

ve ne tür işlemlerin gerçekleştiğini göreceksiniz ve ayrıca "TRADE_TRANSACTION_DEAL_ADD" ile hem büyünün hem de hacmin görünür olduğunu göreceksiniz.


 
Vladimir Karputov :

Bu kodu buraya ekleyin:

//+------------------------------------------------------------------+
//| 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 ;
  }

ve ne tür işlemlerin gerçekleştiğini göreceksiniz ve ayrıca "TRADE_TRANSACTION_DEAL_ADD" ile hem büyünün hem de hacmin görünür olduğunu göreceksiniz.


Teşekkürler, bu şekilde çalışır.
 
dimnik :

Sorunlar:

İşlem 2, Büyü 0, Hacim 0.000000

Genel olarak, tüm işlemler için doğru sayıyı verir, ancak sıfır büyü ve hacim verir.


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

D Uzun zaman önce fark ettim ki , CDealInfo sınıfını kullanırken, işlemlerin geçmişini kendiniz yüklemeniz gerekiyor, sonra her şey normal çalışıyor

   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 :
Teşekkürler, bu şekilde çalışır.

Her türlü işlemin yazdırılmaması için OnTradeTransaction'da aşağıdaki koşulu sağlayın:

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

   long      deal_type         = 0 ;

yani işlem tipi "TRADE_TRANSACTION_DEAL_ADD" değilse çıkıyoruz.

Bekleyen bir siparişin yerleşimini (tetikleyici değil, yerleştirme) izlemeniz gerekiyorsa, OnTradeTransaction aşağıdaki formu alacaktır:

//+------------------------------------------------------------------+
//| 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 kullanımıyla optimizasyon süresi garip bir şekilde değişti. 15M sistemi, çok basit, bir yıllık geçmiş, bir çalıştırma 0,3 - 0,4 saniye sürer.

Optimizasyonu başlattıktan sonra, ilk 200-300 çalıştırma bir saniyeden daha kısa bir hızda çalışır, sonrakiler 15-20 saniyeye kadar yavaşlar (50 kez!);

İşlemcinin aşırı ısınması ve daralması yok, belleğin yarısından fazlası boş (16 GB dışında).

OnTradeTransaction işleyicisini kullanmadan önce böyle bir şey yoktu - küçük zaman dilimlerinde daha da karmaşık Uzman Danışmanlar her çalıştırmada yaklaşık olarak aynı hızda optimize edildi.

HistoryDealSelect hızı çok mu etkiliyor? Frenleri nasıl ortadan kaldırabilirsiniz?

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;
      
  }