Socket retornando informações de uma única paridade

 

Boa tarde,


Estou utilizando sockets para integrar mt5 ao python. A comunicação é realizada corretamente, porém, apenas me retorna a informação de apenas uma paridade.


Exemplo:

Caso o EURUSD atinja a banda de bollinger primeiro que o AUDUSD daí em diante o EA só retorna para o python as informação relativas ao EURUSD. Gostaria que a cada paridade que tocar a banda fosse retornada a respectiva informação.

Segue abaixo o um código de exemplo:

//+------------------------------------------------------------------+
//|                                                       Socket.mq5 |
//|                                                                  |
//|                                                                  |
//+------------------------------------------------------------------+
#property copyright ""
#property link      ""
#property version   "1.00"

double upBand[];
double middleBand[];
double lowBand[];

string sHorAtu;
string sMinAtu;
string sSegAtu;

bool falha;

MqlRates rates[];

datetime lastbar_timeopen;

int handle;
int My_Socket_Handle = INVALID_HANDLE; 

int OnInit(){
   My_Socket_Handle = Socket_Connect();
   handle = iBands(Symbol(), PERIOD_M1, 20, 0, 1.50, PRICE_CLOSE); 
   return(INIT_SUCCEEDED);
}

void OnDeinit(const int reason){
   Socket_Close(My_Socket_Handle);
}


void OnTick(){
   ArraySetAsSeries(rates, true);
   ArraySetAsSeries(upBand, true);
   ArraySetAsSeries(middleBand, true);
   ArraySetAsSeries(lowBand, true);
   
   CopyRates(Symbol(), Period(), 0, 5, rates);
   CopyBuffer(handle, 0, 0, 5, middleBand);
   CopyBuffer(handle, 1, 0, 5, upBand);
   CopyBuffer(handle, 2, 0, 5, lowBand);
   
   datetime tm = TimeCurrent();
   MqlDateTime stm;
   TimeToStruct(tm,stm);
   sHorAtu = (string)stm.hour;
   sMinAtu = (string)stm.min;
   sSegAtu = (string)stm.sec;
   
   //if((sMinAtu == 30) && (sSegAtu >= 30)){
      if(rates[0].close < lowBand[0] && rates[1].close >= lowBand[1]){
         ObjectCreate(0, rates[0].time+"_", OBJ_ARROW_UP, 0, rates[0].time, rates[0].close);
         if(isNewBar()){
            Print(Symbol(), " -  COMPRA!!!");
            Socket_Send(My_Socket_Handle, _Symbol + ";" + "call" + ";" + rates[0].close);
         }
      }
      if(rates[0].close > upBand[0] && rates[1].close <= upBand[1]){
         ObjectCreate(0, rates[0].time+"_", OBJ_ARROW_DOWN, 0, rates[0].time, rates[0].close);
         if(isNewBar()){
            Print(Symbol(), " -  VENDA!!!");
            Socket_Send(My_Socket_Handle, _Symbol + ";" + "put" + ";" + rates[0].close);
         }
      }
  //} 
}

int Socket_Connect(){
  int h_socket = SocketCreate(SOCKET_DEFAULT);
  
  if(h_socket != INVALID_HANDLE){
     if(SocketConnect(h_socket,"10.0.0.179",9090,2000)){
         Print("Conectado ao Servidor Socket");
     }
     else{
         Print("Falha ao conectar ao servidor de socket. Código do erro :", GetLastError()); 
     }
  }else{
   Print("Falha no código de erro SocketCreate:", GetLastError()); 
  } 
  return h_socket; 
}

void Socket_Close(int socket_handle)
{
   if(socket_handle != INVALID_HANDLE)
   {
      SocketClose(socket_handle);
      My_Socket_Handle = INVALID_HANDLE; 
      Print("Soquete Fechado");      
   }
}

int Socket_Send(int socket_handle, string sInfPar){
   if(socket_handle == INVALID_HANDLE) return 0; 
   
   uchar bytes[]; 
   int byte_size = StringToCharArray(sInfPar,bytes)-1; 
   
   sInfPar ="";
   
   return SocketSend(socket_handle,bytes,byte_size);
}

//+------------------------------------------------------------------+
//|  Retornando true quando aparece uma nova barra                   |
//+------------------------------------------------------------------+
bool isNewBar(const bool print_log=true){
   static datetime bartime=0; // armazenamos o tempo de abertura da barra atual
//--- obtemos o tempo de abertura da barra zero
   datetime currbar_time=iTime(_Symbol,_Period,0);
//--- se o tempo de abertura mudar, é porque apareceu uma nova barra
   if(bartime!=currbar_time)
     {
      bartime=currbar_time;
      lastbar_timeopen=bartime;
      //--- exibir no log informações sobre o tempo de abertura da nova barra      
      if(print_log && !(MQLInfoInteger(MQL_OPTIMIZATION)||MQLInfoInteger(MQL_TESTER))){
         //--- obtemos os dados do último tick
         MqlTick last_tick;
         if(!SymbolInfoTick(Symbol(),last_tick))
            Print("SymbolInfoTick() failed, error = ",GetLastError());
      }
      //--- temos uma nova barra
      return (true);
     }
//--- não há nenhuma barra nova
   return (false);
}

Caso alguém já tenha passado por esta situação e puder me ajudar, ficarei grato.

 
Graziani Garcia:

.....

vc precisa precisa checar os dois ativos...

eu fiz uma modificação no seu código, não esta otimizado e muito menos elegante. Mas deve funcionar.

//+------------------------------------------------------------------+
//|                                                   ajudaForum.mq5 |
//|                        Copyright 2020, MetaQuotes Software Corp. |
//|                                             https://www.mql5.com |
//+------------------------------------------------------------------+
#property copyright "Copyright 2020, MetaQuotes Software Corp."
#property link      "https://www.mql5.com"
#property version   "1.00"

double upBand_ativo_1[];
double middleBand_ativo_1[];
double lowBand_ativo_1[];

double upBand_ativo_2[];
double middleBand_ativo_2[];
double lowBand_ativo_2[];

string sHorAtu;
string sMinAtu;
string sSegAtu;

bool falha;

MqlRates rates_ativo_1[];
MqlRates rates_ativo_2[];

ENUM_TIMEFRAMES periodo_symbol_1 = PERIOD_M5;
ENUM_TIMEFRAMES periodo_symbol_2 = PERIOD_M5;

datetime lastbar_timeopen;

int handle_1;
int handle_2;
string symbol_1="AUDUSD";
string symbol_2="EURUSD";
int My_Socket_Handle = INVALID_HANDLE;

//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
int OnInit()
  {
   My_Socket_Handle = Socket_Connect();
   handle_1 = iBands(symbol_1, periodo_symbol_1, 20, 0, 1.50, PRICE_CLOSE);
   handle_2 = iBands(symbol_2, periodo_symbol_2, 20, 0, 1.50, PRICE_CLOSE);
   return(INIT_SUCCEEDED);
  }

//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
void OnDeinit(const int reason)
  {
   Socket_Close(My_Socket_Handle);
  }


//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
void OnTick()
  {
   datetime tm = TimeCurrent();
   MqlDateTime stm;
   TimeToStruct(tm,stm);
   sHorAtu = (string)stm.hour;
   sMinAtu = (string)stm.min;
   sSegAtu = (string)stm.sec;

   ArraySetAsSeries(rates_ativo_1, true);
   ArraySetAsSeries(upBand_ativo_1, true);
   ArraySetAsSeries(middleBand_ativo_1, true);
   ArraySetAsSeries(lowBand_ativo_1, true);

   CopyRates(symbol_1, periodo_symbol_1, 0, 5, rates_ativo_1);
   CopyBuffer(handle_1, 0, 0, 5, middleBand_ativo_1);
   CopyBuffer(handle_1, 1, 0, 5, upBand_ativo_1);
   CopyBuffer(handle_1, 2, 0, 5, lowBand_ativo_1);
   

   ArraySetAsSeries(rates_ativo_2, true);
   ArraySetAsSeries(upBand_ativo_2, true);
   ArraySetAsSeries(middleBand_ativo_2, true);
   ArraySetAsSeries(lowBand_ativo_2, true);

   CopyRates(symbol_2, periodo_symbol_2, 0, 5, rates_ativo_2);
   CopyBuffer(handle_2, 0, 0, 5, middleBand_ativo_2);
   CopyBuffer(handle_2, 1, 0, 5, upBand_ativo_2);
   CopyBuffer(handle_2, 2, 0, 5, lowBand_ativo_2);

//if((sMinAtu == 30) && (sSegAtu >= 30)){
   //symbol 1
   if(rates_ativo_1[0].close < lowBand_ativo_1[0] && rates_ativo_1[1].close >= lowBand_ativo_1[1])
     {
      ObjectCreate(0, rates_ativo_1[0].time+"_", OBJ_ARROW_UP, 0, rates_ativo_1[0].time, rates_ativo_1[0].close);
      if(isNewBar())
        {
         Print(symbol_1, " -  COMPRA!!!");
         Socket_Send(My_Socket_Handle, symbol_1 + ";" + "call" + ";" + rates_ativo_1[0].close);
        }
     }
     
     
   if(rates_ativo_1[0].close > upBand_ativo_1[0] && rates_ativo_1[1].close <= upBand_ativo_1[1])
     {
      ObjectCreate(0, rates_ativo_1[0].time+"_", OBJ_ARROW_DOWN, 0, rates_ativo_1[0].time, rates_ativo_1[0].close);
      if(isNewBar())
        {
         Print(symbol_1, " -  VENDA!!!");
         Socket_Send(My_Socket_Handle, symbol_1 + ";" + "put" + ";" + rates_ativo_1[0].close);
        }
     }
     
    //symbol 2
    if(rates_ativo_2[0].close < lowBand_ativo_2[0] && rates_ativo_2[1].close >= lowBand_ativo_2[1])
     {
      ObjectCreate(0, rates_ativo_2[0].time+"_", OBJ_ARROW_UP, 0, rates_ativo_2[0].time, rates_ativo_2[0].close);
      if(isNewBar())
        {
         Print(symbol_2, " -  COMPRA!!!");
         Socket_Send(My_Socket_Handle, symbol_2 + ";" + "call" + ";" + rates_ativo_2[0].close);
        }
     }
     
     
   if(rates_ativo_2[0].close > upBand_ativo_2[0] && rates_ativo_2[1].close <= upBand_ativo_2[1])
     {
      ObjectCreate(0, rates_ativo_2[0].time+"_", OBJ_ARROW_DOWN, 0, rates_ativo_2[0].time, rates_ativo_2[0].close);
      if(isNewBar())
        {
         Print(symbol_2, " -  VENDA!!!");
         Socket_Send(My_Socket_Handle, symbol_2 + ";" + "put" + ";" + rates_ativo_2[0].close);
        }
     }
//}
  }

//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
int Socket_Connect()
  {
   int h_socket = SocketCreate(SOCKET_DEFAULT);

   if(h_socket != INVALID_HANDLE)
     {
      if(SocketConnect(h_socket,"10.0.0.179",9090,2000))
        {
         Print("Conectado ao Servidor Socket");
        }
      else
        {
         Print("Falha ao conectar ao servidor de socket. Código do erro :", GetLastError());
        }
     }
   else
     {
      Print("Falha no código de erro SocketCreate:", GetLastError());
     }
   return h_socket;
  }

//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
void Socket_Close(int socket_handle)
  {
   if(socket_handle != INVALID_HANDLE)
     {
      SocketClose(socket_handle);
      My_Socket_Handle = INVALID_HANDLE;
      Print("Soquete Fechado");
     }
  }

//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
int Socket_Send(int socket_handle, string sInfPar)
  {
   if(socket_handle == INVALID_HANDLE)
      return 0;

   uchar bytes[];
   int byte_size = StringToCharArray(sInfPar,bytes)-1;

   sInfPar ="";

   return SocketSend(socket_handle,bytes,byte_size);
  }

//+------------------------------------------------------------------+
//|  Retornando true quando aparece uma nova barra                   |
//+------------------------------------------------------------------+
bool isNewBar(const bool print_log=true)
  {
   static datetime bartime=0; // armazenamos o tempo de abertura da barra atual
//--- obtemos o tempo de abertura da barra zero
   datetime currbar_time=iTime(_Symbol,_Period,0);
//--- se o tempo de abertura mudar, é porque apareceu uma nova barra
   if(bartime!=currbar_time)
     {
      bartime=currbar_time;
      lastbar_timeopen=bartime;
      //--- exibir no log informações sobre o tempo de abertura da nova barra
      if(print_log && !(MQLInfoInteger(MQL_OPTIMIZATION)||MQLInfoInteger(MQL_TESTER)))
        {
         //--- obtemos os dados do último tick
         MqlTick last_tick;
         if(!SymbolInfoTick(Symbol(),last_tick))
            Print("SymbolInfoTick() failed, error = ",GetLastError());
        }
      //--- temos uma nova barra
      return (true);
     }
//--- não há nenhuma barra nova
   return (false);
  }
//+------------------------------------------------------------------+
 
Obrigado Jonathan, vou testar o código que me passou e retorno com os resultados.