Questions from Beginners MQL5 MT5 MetaTrader 5 - page 712
You are missing trading opportunities:
- Free trading apps
- Over 8,000 signals for copying
- Economic news for exploring financial markets
Registration
Log in
You agree to website policy and terms of use
If you do not have an account, please register
Several EAs have to work in different windows on the same instrument.
Can we somehow make PositionsTotal() count only our own positions? But as soon as one EA opens a position, the others also consider that they are already in position.
I have set different MagicNumbers, it doesn't help.
Several EAs have to work in different windows on the same instrument.
Can we somehow make PositionsTotal() count only our own positions? But as soon as one EA opens a position, the others also consider that they are already in position.
I have set different MagicNumbers, it doesn't help.
There are no miracles. If the magicians are different, the Expert Advisors should distinguish the positions. Will there be a code?
The first one (a test one, just for a joint experiment):
CTrade trade;
int OnInit()
{
trade.SetAsyncMode(true);
trade.SetExpertMagicNumber(111);
return(INIT_SUCCEEDED);
}
void OnTick()
{
if (PositionsTotal()==0)
{
trade.Buy(1);
}
}
The second (the same one, with another magician):
CTrade trade;
int OnInit()
{
trade.SetAsyncMode(true);
trade.SetExpertMagicNumber(222);
return(INIT_SUCCEEDED);
}
void OnTick()
{
if (PositionsTotal()==0)
{
trade.Buy(1);
}
}
As soon as I close a position manually, EAs instantly see this and open new ones - at the same time. If one has opened while the other is not active, the second one does not open any more.
Several EAs have to work in different windows on the same instrument.
Can we somehow make PositionsTotal() count only our own positions? But as soon as one EA opens a position, the others also consider that they are already in position.
I have set different MagicNumbers, but that does not help.
Example EA that goes through all positions and closes only its own symbol and its 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());
}
//+------------------------------------------------------------------+
Added: I hope you are working on a hedge trading account???
And as soon as I close a position manually, the Expert Advisors instantly open a new one.
And, of course,PositionsTotal does not distinguish positions by magic number or anything else, it gives the total number of positions in the account. We should loop through the positions from 0 toPositionsTotal()-1, look at the magic number and count.
Oh, while I was writing, they already showed me exactly how to do it (:Several EAs have to work in different windows on the same instrument.
Can we somehow make PositionsTotal() count only our own positions? But as soon as one EA opens a position, the others also consider that they are already in position.
I have set different MagicNumbers, it doesn't help.
Добавлено: я надеюсь Вы работает на торговом счетё hedge???
No, not Hedge. So, PositionTotal() can't count only its own positions?
Can the CTrade class then consider its own positions separately from others?
No, not Hedge. So, PositionTotal() can't count only its own positions?
And the CTrade class will be able to consider its positions separately?
Forum on trading, automated trading systems and strategy testing
Magic number
Vladimir Karputov, 2016.12.25 12:38
On netting, who is last to know - i.e. magic number of position will be the same as it was on the last trade with this instrument...
Checking:
//| 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()));
}
}
}
//+------------------------------------------------------------------+