Yeni başlayanlardan sorular MQL5 MT5 MetaTrader 5 - sayfa 713
![MQL5 - MetaTrader 5 müşteri terminalinde yerleşik ticaret stratejileri dili](https://c.mql5.com/i/registerlandings/logo-2.png)
Ticaret fırsatlarını kaçırıyorsunuz:
- Ücretsiz ticaret uygulamaları
- İşlem kopyalama için 8.000'den fazla sinyal
- Finansal piyasaları keşfetmek için ekonomik haberler
Kayıt
Giriş yap
Gizlilik ve Veri Koruma Politikasını ve MQL5.com Kullanım Şartlarını kabul edersiniz
Hesabınız yoksa, lütfen kaydolun
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.
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?
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?
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?
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.
printf ( "Сделка %f, Magic %u, Volume %f" , trans.deal,deal.Magic(),deal. Volume ());
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.
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.
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.
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.
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
{
HistorySelect ( 0 , TimeCurrent ());
deal.Ticket(trans.deal);
printf ( "Сделка %f, Magic %u, Volume %f" , trans.deal,deal.Magic(),deal. Volume ());
}
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?
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;
}