Questions des débutants MQL5 MT5 MetaTrader 5 - page 697
Vous manquez des opportunités de trading :
- Applications de trading gratuites
- Plus de 8 000 signaux à copier
- Actualités économiques pour explorer les marchés financiers
Inscription
Se connecter
Vous acceptez la politique du site Web et les conditions d'utilisation
Si vous n'avez pas de compte, veuillez vous inscrire
Bonjour à tous ! Pouvez-vous m'indiquer comment définir la suppression d'un ordre dans un EA ?
La situation est la suivante :
Nous plaçons 2 ordres en attente dans des directions différentes, dès que l'un d'eux se déclenche, l'autre est supprimé et n'est plus exposé.
Je vous serais très reconnaissant de toute aide.
Merci.
Il existe plusieurs façons de procéder. L'une d'entre elles est l'utilisation deOnTradeTransaction.
En attrapant la transaction
TRANSACTION_COMMERCIALE_ADDITIONNELLE
Ajouter la transaction à l'historique. Effectué à la suite de l'exécution d'un ordre ou d'une opération de solde de compte.
et s'assurer que cette transaction est une entrée sur le marché :
DEAL_ENTRY_IN
Entrée sur le marché
//| 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;
long deal_type =0;
string deal_symbol ="";
long deal_magic =0;
if(HistoryDealSelect(trans.deal))
{
deal_entry=HistoryDealGetInteger(trans.deal,DEAL_ENTRY);
deal_type=HistoryDealGetInteger(trans.deal,DEAL_TYPE);
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_IN)
{
CloseAll();
}
}
}
Cette transaction aura lieu une fois que l'ordre en attente aura été déclenché et que la transaction aura été enregistrée dans l'historique.
Une fois que nous avons attrapé cette transaction, il ne nous reste plus qu'à supprimer tous les autres ordres en attente :
//| Close All Orders |
//+------------------------------------------------------------------+
void CloseAll()
{
Print(__FUNCTION__);
for(int i=OrdersTotal()-1;i>=0;i--) // returns the number of open positions
if(m_order.SelectByIndex(i))
if(m_order.Symbol()==Symbol() && m_order.Magic()==m_magic)
m_trade.OrderDelete(m_order.Ticket());
}
Code EA commun (seulement ici j'ai spécifié une magie égale à "0" - vous devez définir votre propre magie) :
//| There will be only one.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"
#include <Trade\Trade.mqh>
#include <Trade\OrderInfo.mqh>
CTrade m_trade; // trading object
COrderInfo m_order; // pending orders object
//---
ulong m_magic=0; // magic number
//+------------------------------------------------------------------+
//| Expert initialization function |
//+------------------------------------------------------------------+
int OnInit()
{
//---
//---
return(INIT_SUCCEEDED);
}
//+------------------------------------------------------------------+
//| Expert deinitialization function |
//+------------------------------------------------------------------+
void OnDeinit(const int reason)
{
//---
}
//+------------------------------------------------------------------+
//| Expert tick function |
//+------------------------------------------------------------------+
void OnTick()
{
//---
}
//+------------------------------------------------------------------+
//| 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;
long deal_type =0;
string deal_symbol ="";
long deal_magic =0;
if(HistoryDealSelect(trans.deal))
{
deal_entry=HistoryDealGetInteger(trans.deal,DEAL_ENTRY);
deal_type=HistoryDealGetInteger(trans.deal,DEAL_TYPE);
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_IN)
{
CloseAll();
}
}
}
//+------------------------------------------------------------------+
//| Close All Orders |
//+------------------------------------------------------------------+
void CloseAll()
{
Print(__FUNCTION__);
for(int i=OrdersTotal()-1;i>=0;i--) // returns the number of open positions
if(m_order.SelectByIndex(i))
if(m_order.Symbol()==Symbol() && m_order.Magic()==m_magic)
m_trade.OrderDelete(m_order.Ticket());
}
//+------------------------------------------------------------------+
Une autre question sur l'événement OnDeinit :
ce code fonctionnera :
void OnDeinit(const int reason)
{
if(reason==REASON_REMOVE)
{
code pour fermer la position(s'il y en a un)
}
}
En général, nous avons besoin de savoir s'il est possible de fermer la position dans le traitement de l'événement OnDeinit.
Bonjour les experts, veuillez partager vos expériences.
Il y a un tableau de valeurs, qui reflète un objet/champ, c'est-à-dire que s'il y a une tâche pour désigner cet objet/champ d'une certaine manière, quelles sont les actions possibles.
Par exemple, serait-il approprié de placer ce tableau dans un réseau de cartes de Kohonen, si le volume du tableau peut atteindre des milliers de cellules de x et y ?
Vous pouvez peut-être suggérer comment insérer l'un des tableaux bidimensionnels (de grande dimension) dans un réseau de Kohonen.
Et Kohonen sera-t-il bon pour l'analyse - récursion de tableaux (tableaux dans un tableau) ?
Ou peut-être que quelqu'un peut aider à poser les bonnes questions
Il existe plusieurs façons de procéder. La première consiste à utiliser la fonctionOnTradeTransaction.
Dans nous attrapons la transaction
TRANSACTION_COMMERCIALE_ADDITIONNELLE
Ajouter la transaction à l'historique. Effectué à la suite de l'exécution d'un ordre ou d'une opération de solde de compte.
et s'assurer que cette transaction est une entrée sur le marché :
DEAL_ENTRY_IN
Entrée sur le marché
//| 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;
long deal_type =0;
string deal_symbol ="";
long deal_magic =0;
if(HistoryDealSelect(trans.deal))
{
deal_entry=HistoryDealGetInteger(trans.deal,DEAL_ENTRY);
deal_type=HistoryDealGetInteger(trans.deal,DEAL_TYPE);
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_IN)
{
CloseAll();
}
}
}
Cette transaction aura lieu une fois que l'ordre en attente aura été déclenché et que la transaction aura été enregistrée dans l'historique.
Une fois que nous avons capturé cette transaction, il ne nous reste plus qu'à supprimer tous les ordres en suspens :
//| Close All Orders |
//+------------------------------------------------------------------+
void CloseAll()
{
Print(__FUNCTION__);
for(int i=OrdersTotal()-1;i>=0;i--) // returns the number of open positions
if(m_order.SelectByIndex(i))
if(m_order.Symbol()==Symbol() && m_order.Magic()==m_magic)
m_trade.OrderDelete(m_order.Ticket());
}
Code EA générique (seulement ici j'ai spécifié une magie égale à "0" - vous devez définir votre propre magie) :
//| There will be only one.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"
#include <Trade\Trade.mqh>
#include <Trade\OrderInfo.mqh>
CTrade m_trade; // trading object
COrderInfo m_order; // pending orders object
//---
ulong m_magic=0; // magic number
//+------------------------------------------------------------------+
//| Expert initialization function |
//+------------------------------------------------------------------+
int OnInit()
{
//---
//---
return(INIT_SUCCEEDED);
}
//+------------------------------------------------------------------+
//| Expert deinitialization function |
//+------------------------------------------------------------------+
void OnDeinit(const int reason)
{
//---
}
//+------------------------------------------------------------------+
//| Expert tick function |
//+------------------------------------------------------------------+
void OnTick()
{
//---
}
//+------------------------------------------------------------------+
//| 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;
long deal_type =0;
string deal_symbol ="";
long deal_magic =0;
if(HistoryDealSelect(trans.deal))
{
deal_entry=HistoryDealGetInteger(trans.deal,DEAL_ENTRY);
deal_type=HistoryDealGetInteger(trans.deal,DEAL_TYPE);
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_IN)
{
CloseAll();
}
}
}
//+------------------------------------------------------------------+
//| Close All Orders |
//+------------------------------------------------------------------+
void CloseAll()
{
Print(__FUNCTION__);
for(int i=OrdersTotal()-1;i>=0;i--) // returns the number of open positions
if(m_order.SelectByIndex(i))
if(m_order.Symbol()==Symbol() && m_order.Magic()==m_magic)
m_trade.OrderDelete(m_order.Ticket());
}
//+------------------------------------------------------------------+
Merci, mais comment l'implémenter dans MQL4 ? Je m'excuse de ne pas avoir précisé tout de suite.
Merci, mais comment puis-je le formater pour MQL4 ? Je m'excuse de ne pas avoir été plus précis tout de suite.
Pourquoi une erreur se produit-elle sur le marché des actions et des contrats à terme alors que tout va bien sur le marché des changes et des matières premières ?
failed sell limit 1.00 USDRUB_TOM at 63.8679 sl : 63.8829 tp : 63.8329 [Invalid expiration].
Pourquoi une erreur se produit-elle sur le marché des actions et des contrats à terme alors que tout va bien sur le marché des changes et des matières premières ?
failed sell limit 1.00 USDRUB_TOM at 63.8679 sl : 63.8829 tp : 63.8329 [Invalid expiration].
vous devez ajouter un paramètre
Bonjour chers collègues, j'ai une question sur mql5 :
Comment calculer le profit sur les positions ouvertes aujourd'hui (si la position a été ouverte hier et fermée aujourd'hui, alors cette position n'est pas prise en compte) ? ???
Bonjour chers collègues, j'ai une question sur mql5 :
Comment calculer le profit sur les positions ouvertes aujourd'hui (si la position a été ouverte hier et fermée aujourd'hui, alors cette position n'est pas prise en compte) ? ???
Évidemment, en comparant l'heure d'ouverture de la position avec l'heure du début de la journée.