Preguntas de los principiantes MQL5 MT5 MetaTrader 5 - página 712
![MQL5 - Lenguaje de estrategias comerciales para el terminal de cliente MetaTrader 5](https://c.mql5.com/i/registerlandings/logo-2.png)
Está perdiendo oportunidades comerciales:
- Aplicaciones de trading gratuitas
- 8 000+ señales para copiar
- Noticias económicas para analizar los mercados financieros
Registro
Entrada
Usted acepta la política del sitio web y las condiciones de uso
Si no tiene cuenta de usuario, regístrese
Varios EAs tienen que trabajar en diferentes ventanas en el mismo instrumento.
¿Podemos hacer que PositionsTotal() cuente sólo nuestras propias posiciones? Pero en cuanto un EA abre una posición, los demás también consideran que ya están en posición.
He puesto diferentes MagicNumbers, pero no ayuda.
Varios EAs tienen que trabajar en diferentes ventanas en el mismo instrumento.
¿Podemos hacer que PositionsTotal() cuente sólo nuestras propias posiciones? Pero en cuanto un EA abre una posición, los demás también consideran que ya están en posición.
He puesto diferentes MagicNumbers, pero no ayuda.
No hay milagros. Si los magos son diferentes, los Asesores Expertos deben distinguir las posiciones. ¿Habrá un código?
El primero (uno de prueba, sólo para un experimento conjunto):
CTrade trade;
int OnInit()
{
trade.SetAsyncMode(true);
trade.SetExpertMagicNumber(111);
return(INIT_SUCCEEDED);
}
void OnTick()
{
if (PositionsTotal()==0)
{
trade.Buy(1);
}
}
El segundo (el mismo, con otro mago):
CTrade trade;
int OnInit()
{
trade.SetAsyncMode(true);
trade.SetExpertMagicNumber(222);
return(INIT_SUCCEEDED);
}
void OnTick()
{
if (PositionsTotal()==0)
{
trade.Buy(1);
}
}
En cuanto cierro una posición manualmente, los EAs lo ven al instante y abren otras nuevas, al mismo tiempo. Si uno se ha abierto mientras el otro no está activo, el segundo no se abrirá.
Varios EAs tienen que trabajar en diferentes ventanas en el mismo instrumento.
¿Podemos hacer que PositionsTotal() cuente sólo nuestras propias posiciones? Pero en cuanto un EA abre una posición, los demás también consideran que ya están en posición.
He establecido diferentes MagicNumbers, pero eso no ayuda.
Ejemplo de EA que recorre todas las posiciones y cierra sólo su propio símbolo y su 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());
}
//+------------------------------------------------------------------+
Añadido: Espero que esté trabajando en una cuenta de comercio de cobertura???
Y en cuanto cierro una posición manualmente, los Asesores Expertos abren instantáneamente una nueva.
Y, por supuesto,PositionsTotal no distingue las posiciones por número mágico ni nada por el estilo, sino que da el número total de posiciones en la cuenta. Deberíamos recorrer las posiciones desde 0 hastaPositionsTotal()-1, mirar el número mágico y contar.
Oh, mientras escribía, ya me enseñaron exactamente cómo hacerlo (:Varios EAs tienen que trabajar en diferentes ventanas en el mismo instrumento.
¿Podemos hacer que PositionsTotal() cuente sólo nuestras propias posiciones? Pero en cuanto un EA abre una posición, los demás también consideran que ya están en posición.
He puesto diferentes MagicNumbers, pero no ayuda.
Добавлено: я надеюсь Вы работает на торговом счетё hedge???
No, Hedge no. ¿Entonces, PositionTotal() no puede contar sólo sus propias posiciones?
¿Puede la clase CTrade considerar entonces sus propias posiciones por separado de las demás?
No, Hedge no. Entonces, ¿PositionTotal() no puede contar sólo sus propias posiciones?
¿Y la clase CTrade podrá considerar sus posiciones por separado?
Foro sobre comercio, sistemas de comercio automatizados y pruebas de estrategias
Número mágico
Vladimir Karputov, 2016.12.25 12:38
En la compensación, quien es el último en enterarse - es decir, el número mágico de la posición será el mismo que el de la última operación con este instrumento...
Comprobación:
//| 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()));
}
}
}
//+------------------------------------------------------------------+