Perguntas de Iniciantes MQL5 MT5 MetaTrader 5 - página 712

 

Vários EAs têm de trabalhar em diferentes janelas sobre o mesmo instrumento.

Podemos de alguma forma fazer as PosiçõesTotal() contar apenas as nossas próprias posições? Mas assim que uma EA abre uma posição, as outras também consideram que já estão em posição.

Eu defini números MagicNumbers diferentes, isso não ajuda.

 
dimnik:

Vários EAs têm de trabalhar em diferentes janelas sobre o mesmo instrumento.

Podemos de alguma forma fazer as PosiçõesTotal() contar apenas as nossas próprias posições? Mas assim que uma EA abre uma posição, as outras também consideram que já estão em posição.

Eu defini números MagicNumbers diferentes, isso não ajuda.

Não há milagre nenhum. Se os números MagicNumbers forem diferentes, então os Conselheiros Especialistas deverão ser capazes de distinguir as posições. Terá o código?
 
Vitalie Postolache:
Não há milagres. Se os mágicos forem diferentes, os Conselheiros Especialistas devem distinguir as posições. Haverá um código?

O primeiro (um teste, apenas para uma experiência conjunta):

#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);
   }
  
  }

O segundo (o mesmo, com outro mágico):

#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);
   }
  
  }

Assim que fecho uma posição manualmente, as EAs vêem isto instantaneamente e abrem novas posições - ao mesmo tempo. Se um tiver aberto enquanto o outro não estiver activo, o segundo não abrirá.

 
dimnik:

Vários EAs têm de trabalhar em diferentes janelas sobre o mesmo instrumento.

Podemos de alguma forma fazer as PosiçõesTotal() contar apenas as nossas próprias posições? Mas assim que uma EA abre uma posição, as outras também consideram que já estão em posição.

Estabeleci diferentes números MagicNumbers, mas isso não ajuda.

Exemplo de EA que passa por todas as posições e fecha apenas o seu próprio símbolo e a sua Magia:

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


Adicionado: Espero que esteja a trabalhar numa conta de negociação de cobertura????

 
dimnik:

E assim que eu fecho uma posição manualmente, os Conselheiros Especialistas abrem imediatamente uma nova posição.

E, claro,PositionsTotal não distingue as posições por número mágico ou qualquer outra coisa, ele dá o número total de posições na conta. Devemos percorrer as posições de 0 aPosiçõesTotal()-1, olhar para o número mágico e contar.

Oh, enquanto eu escrevia, já me mostraram exactamente como o fazer (:
 
dimnik:

Vários EAs têm de trabalhar em diferentes janelas sobre o mesmo instrumento.

Podemos de alguma forma fazer as PosiçõesTotal() contar apenas as nossas próprias posições? Mas assim que uma EA abre uma posição, as outras também consideram que já estão em posição.

Eu defini números MagicNumbers diferentes, isso não ajuda.

PositionsTotal() não filtra por números mágicos. Para isso, temos de passar por posições e calcular apenas posições "próprias" com a nossa própria função.
 


Добавлено: я надеюсь Вы работает на торговом счетё hedge???

Não, não Hedge. Então, PositionTotal() não pode contar apenas as suas próprias posições?

Pode então a classe CTrade considerar as suas próprias posições separadamente das outras?

 
dimnik:

Não, não Hedge. Então, PositionTotal() não pode contar apenas as suas próprias posições?

E a classe CTrade poderá considerar as suas posições separadamente?

Não pode haver MAIS DE UMA posição para cada símbolo na rede. A regra do polegar aplica-se à Magia:

Fórum sobre comércio, sistemas de comércio automatizados e testes estratégicos

Número mágico

Vladimir Karputov, 2016.12.25 12:38

Na netting, quem é o último a saber - ou seja, o número mágico de posição será o mesmo que foi na última troca com este instrumento...

Verificação:

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



Arquivos anexados:
 
Comentários não relacionados com este tópico foram transferidos para "Perguntas dos principiantes do MQL4 MT4 MetaTrader 4".
 
Pode dizer-me como descobrir o resultado do último ou mais ofícios?