Fragen von Anfängern MQL5 MT5 MetaTrader 5 - Seite 713
Sie verpassen Handelsmöglichkeiten:
- Freie Handelsapplikationen
- Über 8.000 Signale zum Kopieren
- Wirtschaftsnachrichten für die Lage an den Finanzmärkte
Registrierung
Einloggen
Sie stimmen der Website-Richtlinie und den Nutzungsbedingungen zu.
Wenn Sie kein Benutzerkonto haben, registrieren Sie sich
Können Sie mir sagen, wie ich das Ergebnis des letzten oder mehrerer Abschlüsse erfahren kann?
Es gibt zwei Möglichkeiten:
OnTradeTransaction() direkt im Expert Advisor verwenden und Trades abfangen, die in der Historie aufgezeichnet wurden.
//| 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)
{
// здесь ваши действия
}
}
}
oder um auf die Handelshistorie zu verweisen, z. B. so etwas:
//| 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("");
}
//+------------------------------------------------------------------+
Je nachdem, welche Methode Sie wählen, müssen Sie den Code ein wenig bearbeiten, um Informationen über den letzten Handel zu erhalten.
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());
}
}
Der Event-Handler verfolgt alle Trades mit EA's magiks.
Aber aus irgendeinem Grund erhält der erste Handel immer einen falschen Magier (Null), während die folgenden Handlungen in Ordnung sind.
Wie kann ich sie korrigieren? Oder sollte ich es vielleicht anders machen?
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());
}
}
Der Event-Handler verfolgt alle Trades mit EA's magiks.
Aber aus irgendeinem Grund erhält der erste Handel immer einen falschen Magier (Null), während die folgenden Handlungen in Ordnung sind.
Wie kann ich sie korrigieren? Oder sollte ich es vielleicht anders machen?
Der Event-Handler verfolgt alle Trades mit EA's magiks.
Aber aus irgendeinem Grund, für den ersten Handel der Magier (erhalten durch chistoriorder) ist immer falsch (Null), für die folgenden Trades - alles ist normal.
drucken Sie also die Parameter dieser Transaktion.
Wo liegt das Problem, wenn man den Fahrschein/Typ/Symbol/Gewinn kennt?
Drucken Sie also die Parameter dieses Geschäfts.
Was ist das Problem bei der Ermittlung von Ticket/Typ/Symbol/Gewinn?
Ausgänge:
Deal 2, Magie 0, Volumen 0.000000
Im Allgemeinen wird bei allen Geschäften eine korrekte Zahl angezeigt, aber null Mags und Volumen.
printf("Сделка %f, Magic %u, Volume %f", trans.deal,deal.Magic(),deal.Volume());
Ausgänge:
Deal 2, Magie 0, Volumen 0.000000
Im Allgemeinen wird bei allen Geschäften die korrekte Nummer ausgegeben, aber null Mags und Volumen.
printf("Сделка %f, Magic %u, Volume %f", trans.deal,deal.Magic(),deal.Volume());
Fügen Sie diesen Code hinzu:
//| 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;
}
und Sie werden sehen, welche Arten von Transaktionen auftreten und Sie werden auch sehen, dass mit "TRADE_TRANSACTION_DEAL_ADD" sowohl Magie als auch Volumen sichtbar sind.
Fügen Sie diesen Code hinzu:
//| 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;
}
und Sie werden sehen, welche Arten von Transaktionen stattfinden, und Sie werden auch sehen, dass mit "TRADE_TRANSACTION_DEAL_ADD" sowohl Magie als auch Volumen sichtbar sind.
Ausgänge:
Deal 2, Magie 0, Volumen 0.000000
Im Allgemeinen geben alle Abschlüsse die richtige Zahl an, aber keine magischen Zahlen und Mengen.
printf("Сделка %f, Magic %u, Volume %f", trans.deal,deal.Magic(),deal.Volume());
Ich habe lange bemerkt, dass bei der Verwendung von CDealInfo Klasse, ich brauche, um die Geschichte der Geschäfte unabhängig zu laden, dann funktioniert alles gut
{
HistorySelect(0,TimeCurrent());
deal.Ticket(trans.deal);
printf("Сделка %f, Magic %u, Volume %f", trans.deal,deal.Magic(),deal.Volume());
}
Danke, es funktioniert.
Um zu vermeiden, dass alle Transaktionsarten gedruckt werden, stellen Sie die folgende Bedingung in OnTradeTransaction ein:
ENUM_TRADE_TRANSACTION_TYPE type=trans.type;
if(type!=TRADE_TRANSACTION_DEAL_ADD)
return;
long deal_type =0;
d.h. wenn die Transaktionsart nicht "TRADE_TRANSACTION_DEAL_ADD" ist - dann beenden.
Wenn wir die Platzierung (nicht die Auslösung, sondern nur die Platzierung) eines schwebenden Auftrags verfolgen müssen, wird OnTradeTransaction diese Form annehmen:
//| 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)
{
//
}
}
}
}
Mit der Verwendung von OnTradeTransaction hat sich die Optimierungszeit merkwürdigerweise verändert. Ein System auf 15M, sehr einfach, Jahresverlauf, ein Lauf erfolgt in 0,3 - 0,4 Sekunden.
Nach dem Optimierungsstart gehen die ersten 200-300 Läufe unter einer Sekunde, die nächsten verlangsamen sich auf 15-20 Sekunden (50 Mal!);
Kein Überhitzen des Prozessors, mehr als die Hälfte des Speichers ist frei (von 16 GB).
Vor der Verwendung des OnTradeTransaction-Handlers gab es nichts dergleichen - selbst komplexere EAs auf kleinen Zeitrahmen wurden bei jedem Durchlauf mit ungefähr der gleichen Geschwindigkeit optimiert.
Wirkt sich HistoryDealSelect so stark auf die Geschwindigkeit aus? Wie können wir die Verzögerungen beseitigen?
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;
}