Preguntas de los principiantes MQL5 MT5 MetaTrader 5 - página 712

 

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.

 
dimnik:

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 ningún milagro. Si los MagicNumbers son diferentes, los Asesores Expertos deben distinguir las posiciones. ¿Tendrá el código?
 
Vitalie Postolache:
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):

#include <Trade\Trade.mqh>

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):

#include <Trade\Trade.mqh>

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á.

 
dimnik:

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???

 
dimnik:

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 (:
 
dimnik:

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.

PositionsTotal() no filtra por números mágicos. Para ello, tenemos que recorrer las posiciones y calcular sólo las "propias" con nuestra propia función.
 


Добавлено: я надеюсь Вы работает на торговом счетё 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?

 
dimnik:

No, Hedge no. Entonces, ¿PositionTotal() no puede contar sólo sus propias posiciones?

¿Y la clase CTrade podrá considerar sus posiciones por separado?

No puede haber más de UNA posición para cada símbolo en la red. La regla general se aplica a Magic:

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()));
              }
     }
  }
//+------------------------------------------------------------------+



Archivos adjuntos:
 
Los comentarios no relacionados con este tema han sido trasladados a "Preguntas de los principiantes de MQL4 MT4 MetaTrader 4".
 
¿Pueden decirme cómo averiguar el resultado de la última o las últimas operaciones?
Razón de la queja: