Funcionamento 2 EA's no mesmo símbolo

 
Olá, gostaria de saber se é possível que o EA, modifique ou altere uma ordem ou posição de outro EA operando no mesmo símbolo, e mesmo timeframe, porem com magic number diferente, se sim, como posso tratar.  
 
Romeu Masselai:
Olá, gostaria de saber se é possível que o EA, modifique ou altere uma ordem ou posição do mesmo EA operando no mesmo símbolo, e mesmo timeframe ou não porem com magic number diferente, se sim, como posso tratar.  

Bom dia Romeu,

para ler uma ordem ou posição você usa o índice da lista ou a chave primária ticket , uma vez obtida a ordem ou posição você pode alterá-la a vontade.

 
Rogerio Giannetti Torres:

Bom dia Romeu,

para ler uma ordem ou posição você usa o índice da lista ou a chave primária ticket , uma vez obtida a ordem ou posição você pode alterá-la a vontade.

Mas meu objetivo é deixar o mesmo EA operar em 2 timeframes diferentes do mesmo símbolo, queria saber se não existe o risco de um  mudar a posição do outro. 
 
Romeu Masselai:
Mas meu objetivo é deixar o mesmo EA operar em 2 timeframes diferentes do mesmo símbolo, queria saber se não existe o risco de um  mudar a posição do outro. 

Bom dia!


Quando você informa o seu objetivo, passa mais detalhes, fica mais fácil lhe responder . . .


Sim, sem dúvidas haverá conflitos ao gerenciar as posições. Duas opções para resolver o problema:

//--- Em OnInit() . . .
trade.SetExpertMagicNumber(MagicNumberTF(_Period));



//+--------------------------------------------------------------------------------------------------------------------+
//| Magic number timeframes function                                                                                   |
//+--------------------------------------------------------------------------------------------------------------------+
ulong MagicNumberTF(ENUM_TIMEFRAMES CodeTF)
  {
//--- Local variable
   ulong ResMN;

   switch(CodeTF)
     {
      case PERIOD_M1:
         ResMN = 777001;
         break;
      case PERIOD_M2:
         ResMN = 777002;
         break;
      case PERIOD_M3:
         ResMN = 777003;
         break;
      case PERIOD_M4:
         ResMN = 777004;
         break;
      case PERIOD_M5:
         ResMN = 777005;
         break;
      case PERIOD_M6:
         ResMN = 777006;
         break;
      case PERIOD_M10:
         ResMN = 777007;
         break;
      case PERIOD_M12:
         ResMN = 777008;
         break;
      case PERIOD_M15:
         ResMN = 777009;
         break;
      case PERIOD_M20:
         ResMN = 777010;
         break;
      case PERIOD_M30:
         ResMN = 777011;
         break;
      case PERIOD_H1:
         ResMN = 777012;
         break;
      case PERIOD_H2:
         ResMN = 777013;
         break;
      case PERIOD_H3:
         ResMN = 777014;
         break;
      case PERIOD_H4:
         ResMN = 777015;
         break;
      case PERIOD_H6:
         ResMN = 777016;
         break;
      case PERIOD_H8:
         ResMN = 777017;
         break;
      case PERIOD_H12:
         ResMN = 777018;
         break;
      case PERIOD_D1:
         ResMN = 777019;
         break;
      case PERIOD_W1:
         ResMN = 777020;
         break;
      case PERIOD_MN1:
         ResMN = 777021;
         break;
      default:
         ResMN = 0;
         break;
     }
   return(ResMN);
  }



. . . Ou coloca o Magic Number como parâmetro de entrada (input) e ao anexar o EA, define valores diferentes pra ele (MN) em cada timeframe.

 
Romeu Masselai:
Mas meu objetivo é deixar o mesmo EA operar em 2 timeframes diferentes do mesmo símbolo, queria saber se não existe o risco de um  mudar a posição do outro. 

Basta você fazer a verificação se o EA esta no símbolo que vc quer, e no timeframe desejado. Você pode acrescentar um input onde vc fala qual timeframe que o EA esta operando e quando for executar a ordem comparar. Vou deixar um exemplo. 

#define EXPERT_MAGIC 123      //Magic Number do Robô   
input ENUM_TIMEFRAMES INPperiodoEA = PERIOD_M1; //TimeFrame do Robô  
trade.SetExpertMagicNumber(EXPERT_MAGIC); 

bool ClosePosition()
  {
   for(int i=PositionsTotal()-1; i>=0; i--)
     {
      string symbolPosition = PositionGetSymbol(i); //Pegar o ativo da posição na posição i
      ulong magicPosition = PositionGetInteger(POSITION_MAGIC);
      if(symbolPosition == _Symbol && magicPosition == EXPERT_MAGIC && _Period == INPperiodoEA)
        {
         ulong positionTicket = PositionGetInteger(POSITION_TICKET);
         if(!trade.PositionClose(positionTicket, 5))
           {
            //int errorCode = GetLastError();
            Print("Erro ao fechar posição. ResultRetCode: ", trade.ResultRetcode(), " | ResultRetCodeDescription: ", trade.ResultRetcodeDescription());
            ResetLastError();
            return false;
           }
         else
           {
            return true;
           }
         break;
        }
     }
   return false;
  }
 
Romeu Masselai:
Mas meu objetivo é deixar o mesmo EA operar em 2 timeframes diferentes do mesmo símbolo, queria saber se não existe o risco de um  mudar a posição do outro. 

Não, pois o TICKET é a chave primaria e basta informar o TICKET para indicar a posição que vai ser modificada.  Idem para as ordens.  O MAGIC  é sempre usado como atributo de filtro.

Exemplo usando a classe trade para fechar uma posição em HEDGE.

void ToDoClosePositions()
  {
   for(int i = PositionsTotal()-1; i >= 0; i--)
     {
      if((Ticket = PositionGetTicket(i)) > 0)
         if(PositionGetString(POSITION_SYMBOL) == ativoOper && PositionGetInteger(POSITION_MAGIC) == inpMagicNumber)
            cTrade.PositionClose(Ticket);
     }
  }
 
Vinicius de Oliveira:

Bom dia!


Quando você informa o seu objetivo, passa mais detalhes, fica mais fácil lhe responder . . .


Sim, sem dúvidas haverá conflitos ao gerenciar as posições. Duas opções para resolver o problema:



. . . Ou coloca o Magic Number como parâmetro de entrada (input) e ao anexar o EA, define valores diferentes pra ele (MN) em cada timeframe.

É o que estou fazendo, mesmo EA, no mesmo símbolo, porém com magicnumber e timeframes diferentes, minha dúvida era essa, se mesmo com os MN diferentes poderia ocorrer de um EA interferir no outro.
 
Romeu Masselai:
É o que estou fazendo, mesmo EA, no mesmo símbolo, porém com magicnumber e timeframes diferentes, minha dúvida era essa, se mesmo com os MN diferentes poderia ocorrer de um EA interferir no outro.

Ah, beleza!! Então está tudo OK, desde que verifique o MAGIC ao alterar / deletar ordens e alterar / encerrar posições . . .

 
Vinicius de Oliveira:

Ah, beleza!! Então está tudo OK, desde que verifique o MAGIC ao alterar / deletar ordens e alterar / encerrar posições . . .

Fiz as verificações usando para posições:

 (PositionGetInteger(POSITION_MAGIC)==EA_Magic_Number)

e para ordens: 

(OrderGetInteger(ORDER_MAGIC) == EA_Magic_Number)

Porem me surgiu uma duvida, por se tratar de uma conta netting, com os 2 EA operando simultaneamente, vai funcionar se um entrar comprado e outro vendido?

 
Romeu Masselai:

...vai funcionar se um entrar comprado e outro vendido?

NÃO

 
Jonathan Pereira:

NÃO

Existe conta hedge na B3?