그러나 어떤 이유에서인지 첫 번째 트랜잭션의 경우 다음 트랜잭션에 대해 항상 마술이 올바르지 않은(0) 잘못된(0) 기록이 나타납니다.
어떻게 고치는 지? 아니면 다른 방법으로 할 수 있습니까?
당신 은 명령 과 함께 운영 에서 벗어나야 합니다 -- 이것은 구식 시스템 입니다 . 그러면 모든 것이 잘 될 것입니다. "TRADE_TRANSACTION_DEAL_ADD" - 기록에 거래를 추가합니다. 주문 실행 또는 계정 잔액 작업의 결과로 수행됩니다. 또 무엇이 필요합니까? 거래는 성사되었고 역사에 기록되었습니다.
//--- получим тип транзакции в виде значения перечисления 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 | //+------------------------------------------------------------------+ voidOnTradeTransaction ( constMqlTradeTransaction &trans, constMqlTradeRequest &request, constMqlTradeResult &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 ) { // } } } }
마지막 하나 또는 여러 트랜잭션의 결과를 찾는 방법을 알려주십시오.
두 가지 방법이 있습니다.
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 ( "" );
}
//+------------------------------------------------------------------+
선택한 방법에 따라 마지막 거래에 대한 정보를 얻으려면 코드를 약간 수정해야 합니다.
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) 기록이 나타납니다.
어떻게 고치는 지? 아니면 다른 방법으로 할 수 있습니까?
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) 기록이 나타납니다.
어떻게 고치는 지? 아니면 다른 방법으로 할 수 있습니까?
이벤트 핸들러는 EA의 마법으로 모든 거래를 추적합니다.
그러나 어떤 이유에서인지 첫 번째 트랜잭션의 경우 다음 트랜잭션에 대해 항상 마술이 올바르지 않은(0) 잘못된(0) 기록이 나타납니다.
이 거래의 매개변수를 표시합니다.
티켓/종류/기호/수익을 찾는 문제는 무엇입니까?
이 거래의 매개변수를 표시합니다.
티켓/종류/기호/수익을 찾는 문제는 무엇입니까?
문제:
거래 2, 매직 0, 볼륨 0.000000
일반적으로 모든 트랜잭션에 대해 정확한 숫자를 제공하지만 마법과 볼륨은 0입니다.
printf ( "Сделка %f, Magic %u, Volume %f" , trans.deal,deal.Magic(),deal. Volume ());
문제:
거래 2, 매직 0, 볼륨 0.000000
일반적으로 모든 트랜잭션에 대해 정확한 숫자를 제공하지만 마법과 볼륨은 0입니다.
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"를 사용하면 마법과 볼륨이 모두 표시됩니다.
여기에 이 코드를 추가하세요.
//| 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"를 사용하면 마법과 볼륨이 모두 표시됩니다.
다음을 제공합니다.
거래 2, 매직 0, 볼륨 0.000000
일반적으로 모든 트랜잭션에 대해 정확한 숫자를 제공하지만 마법과 볼륨은 0입니다.
printf ( "Сделка %f, Magic %u, Volume %f" , trans.deal,deal.Magic(),deal. Volume ());
D CDealInfo 클래스를 사용할 때 거래 내역을 직접 불러와야 모든 것이 정상적으로 작동한다는 사실을 오래전에 깨달았습니다.
{
HistorySelect ( 0 , TimeCurrent ());
deal.Ticket(trans.deal);
printf ( "Сделка %f, Magic %u, Volume %f" , trans.deal,deal.Magic(),deal. Volume ());
}
감사합니다. 작동하는 방식입니다.
모든 유형의 거래를 인쇄하지 않으려면 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가 속도에 많은 영향을 줍니까? 브레이크를 어떻게 없앨 수 있습니까?
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;
}