Questions des débutants MQL5 MT5 MetaTrader 5 - page 712
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
Plusieurs EAs doivent travailler dans des fenêtres différentes sur le même instrument.
Peut-on faire en sorte que PositionsTotal() ne compte que nos propres positions ? Mais dès qu'un EA ouvre une position, les autres considèrent également qu'ils sont déjà en position.
J'ai défini différents MagicNumbers, mais cela n'aide pas.
Plusieurs EAs doivent travailler dans des fenêtres différentes sur le même instrument.
Peut-on faire en sorte que PositionsTotal() ne compte que nos propres positions ? Mais dès qu'un EA ouvre une position, les autres considèrent également qu'ils sont déjà en position.
J'ai défini différents MagicNumbers, mais cela n'aide pas.
Il n'y a pas de miracles. Si les magiciens sont différents, les conseillers experts doivent distinguer les positions. Y aura-t-il un code ?
Le premier (un test, juste pour une expérience commune) :
CTrade trade;
int OnInit()
{
trade.SetAsyncMode(true);
trade.SetExpertMagicNumber(111);
return(INIT_SUCCEEDED);
}
void OnTick()
{
if (PositionsTotal()==0)
{
trade.Buy(1);
}
}
Le second (le même, avec un autre magicien) :
CTrade trade;
int OnInit()
{
trade.SetAsyncMode(true);
trade.SetExpertMagicNumber(222);
return(INIT_SUCCEEDED);
}
void OnTick()
{
if (PositionsTotal()==0)
{
trade.Buy(1);
}
}
Dès que je ferme une position manuellement, les EA le voient instantanément et en ouvrent de nouvelles - en même temps. Si l'un s'est ouvert alors que l'autre n'est pas actif, le second ne s'ouvre plus.
Plusieurs EAs doivent travailler dans des fenêtres différentes sur le même instrument.
Peut-on faire en sorte que PositionsTotal() ne compte que nos propres positions ? Mais dès qu'un EA ouvre une position, les autres considèrent également qu'ils sont déjà en position.
J'ai défini différents MagicNumbers, mais cela n'aide pas.
Exemple d'EA qui passe en revue toutes les positions et ne ferme que son propre symbole et son Magic :
//| CloseALL.mq5 |
//| Copyright © 2017, Vladimir Karputov |
//| http://wmua.ru/slesar/ |
//+------------------------------------------------------------------+
#property copyright "Copyright © 2017, Vladimir Karputov"
#property link "http://wmua.ru/slesar/"
#property version "1.00"
#include <Trade\Trade.mqh>
#include <Trade\PositionInfo.mqh>
CTrade m_trade; // trading object
CPositionInfo m_position; // trade position object
//--- input parameter
input ulong m_magic=159753698; // magic number
//+------------------------------------------------------------------+
//| Expert initialization function |
//+------------------------------------------------------------------+
int OnInit()
{
//---
CloseAll();
//---
return(INIT_SUCCEEDED);
}
//+------------------------------------------------------------------+
//| Expert deinitialization function |
//+------------------------------------------------------------------+
void OnDeinit(const int reason)
{
//---
}
//+------------------------------------------------------------------+
//| Expert tick function |
//+------------------------------------------------------------------+
void OnTick()
{
//---
}
//+------------------------------------------------------------------+
//| Close All |
//+------------------------------------------------------------------+
void CloseAll()
{
Print(__FUNCTION__);
for(int i=PositionsTotal()-1;i>=0;i--) // returns the number of open positions
if(m_position.SelectByIndex(i))
if(m_position.Symbol()==Symbol() && m_position.Magic()==m_magic)
m_trade.PositionClose(m_position.Ticket());
}
//+------------------------------------------------------------------+
Ajouté : J'espère que vous travaillez sur un compte de hedge trading ? ??
Et dès que je ferme une position manuellement, les conseillers experts en ouvrent instantanément une nouvelle.
Et, bien sûr,PositionsTotal ne distingue pas les positions par numéro magique ou autre, il donne le nombre total de positions dans le compte. Nous devrions parcourir en boucle les positions de 0 àPositionsTotal()-1, regarder le nombre magique et compter.
Oh, pendant que j'écrivais, ils m'ont déjà montré exactement comment faire ( :Plusieurs EAs doivent travailler dans des fenêtres différentes sur le même instrument.
Peut-on faire en sorte que PositionsTotal() ne compte que nos propres positions ? Mais dès qu'un EA ouvre une position, les autres considèrent également qu'ils sont déjà en position.
J'ai défini différents MagicNumbers, mais cela n'aide pas.
Добавлено: я надеюсь Вы работает на торговом счетё hedge???
Non, pas Hedge. Donc, PositionTotal() ne peut pas compter seulement ses propres positions ?
La classe CTrade peut-elle alors considérer ses propres positions séparément des autres ?
Non, pas Hedge. Donc, PositionTotal() ne peut pas compter seulement ses propres positions ?
Et la classe CTrade pourra considérer ses positions séparément ?
Forum sur le trading, les systèmes de trading automatisés et les tests de stratégie
Nombre magique
Vladimir Karputov, 2016.12.25 12:38
Lors de la compensation, qui est le dernier à savoir - c'est-à-dire que le numéro magique de la position sera le même que lors de la dernière transaction avec cet instrument...
Vérification :
//| ReplacementMagic.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 "Что происходит с magic на netting"
#include <Trade\PositionInfo.mqh>
#include <Trade\Trade.mqh>
CPositionInfo m_position; // trade position object
CTrade m_trade; // trading object
//+------------------------------------------------------------------+
//| Expert initialization function |
//+------------------------------------------------------------------+
int OnInit()
{
//---
if(AccountInfoInteger(ACCOUNT_MARGIN_MODE)==ACCOUNT_MARGIN_MODE_RETAIL_HEDGING)
{
Print("Этот пример только для netting!");
return(INIT_FAILED);
}
//---
return(INIT_SUCCEEDED);
}
//+------------------------------------------------------------------+
//| Expert deinitialization function |
//+------------------------------------------------------------------+
void OnDeinit(const int reason)
{
//---
}
//+------------------------------------------------------------------+
//| Expert tick function |
//+------------------------------------------------------------------+
void OnTick()
{
//---
static int counter=-10;
if(counter%300==0)
{
//--- генерируем Magic
ulong m_magic=MathRand();
Print("new Magic: ",IntegerToString(m_magic));
//--- устанавливаем новый Magic
m_trade.SetExpertMagicNumber(m_magic);
//--- определим лот
double lots=0.0;
if(MathRand()%2==0)
lots=0.01;
else
lots=0.02;
//--- определяем, что открывать: Buy или Sell
if(MathRand()%2==0) // значит Buy
{
m_trade.Buy(lots);
}
else // значит Sell
{
m_trade.Sell(lots);
}
}
counter++;
}
//+------------------------------------------------------------------+
//| 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)
{
for(int i=PositionsTotal()-1;i>=0;i--) // returns the number of open positions
if(m_position.SelectByIndex(i))
if(m_position.Symbol()==Symbol())
{
//string text=ChartGetString(0,CHART_COMMENT)+"\n"+
// "Magic: "+IntegerToString(m_position.Magic());
//Comment(text);
Print("Обнаружена позиция с Magic: "+IntegerToString(m_position.Magic()));
}
}
}
//+------------------------------------------------------------------+