Especialistas: Servidor DDE

 

Servidor DDE:

Exportação dos dados em tempo real do MQL5 para o Excel (DDE).

Na verdade, ela foi projetada para MetaTrader 4 (MQL4), mas, com pequenos ajustes, ela funciona muito bem no MetaTader 5 (MQL5). Ele é um pequeno aplicativo MFC (servidor DDE). Todos os dados que ficam disponíveis em MQL5 podem ser exportados através desta interface DDE (por exemplo, dados em tempo real para o Excel).

Autor: Alexander Piechotta

 

INCREMENT THIS LINES

 

double LAST = SymbolInfoDouble("EURUSD",SYMBOL_LAST) // for eurusd (example) ,

 in // Check & Add Item DDE:

if(!CheckItem("C","D")) 

     {      if(!AddItem("C","D")) return;     }  in // Check & Add Item DDE

 in // Set Item Value DDE 

SetItem("C","D","LAST: "+DoubleToString(LAST,5)); in // Set Item Value DDE 

 

Alguém pode me ajudar, não consegui!

Como faz pra passar do "DDE Server" pro excel? Copiei o "=MT4DDE|TIME!valeu" pra excel mas este mostra o #NOME?" na celula.

 
Rodrigoegc:

Alguém pode me ajudar, não consegui!

Como faz pra passar do "DDE Server" pro excel? Copiei o "=MT4DDE|TIME!valeu" pra excel mas este mostra o #NOME?" na celula.


Não foi dificíl não.

Inicie o servidor DDE.

Inicie o mt5 e compile o dde_exemplo.mq5.

Abra o gráfico do ativo desejado no mt5 e arraste o dde_exemplo.ex5 (resultado da compilação).

Você verá os itens no display do servidor.

Agora e só colocar as funções no excel.

 
lcaccioly:

Não foi dificíl não.

Inicie o servidor DDE.

Inicie o mt5 e compile o dde_exemplo.mq5.

Abra o gráfico do ativo desejado no mt5 e arraste o dde_exemplo.ex5 (resultado da compilação).

Você verá os itens no display do servidor.

Agora e só colocar as funções no excel.

 
Muito bom. Mas como incluio preco volume ask bind pra ficar completo. Tentei mas acho que depende da DLL. 
 

Buenas.


Estou tentando obter o LAST, mas sempre vem em branco.


Alguém faz ideia do que esta errado?




   CopyBuffer(MA_handle,0,0,100,MA);

   ArraySetAsSeries(MA,true);

   double LAST = SymbolInfoDouble("USDBRL", SYMBOL_LAST);


// Check & Add Item DDE

   if(!CheckItem("A","B")) 

     {

      if(!AddItem("A","B")) return; 

     }


   if(!CheckItem("C","D")) 

     {

      if(!AddItem("C","D")) return;

     }

     

   if(!CheckItem("COMPANY","Value")) AddItem("COMPANY","Value");

   if(!CheckItem("TIME","Value")) AddItem("TIME","Value");

   

   if(!CheckItem("LAST","EURUSD")) AddItem("LAST","USDBRL");

 

// Set Item Value DDE  

   SetItem("COMPANY","Value",(string)AccountInfoString(ACCOUNT_COMPANY));

   SetItem("TIME","Value",(string)TimeCurrent());


   SetItem("A","B","EMA(21): "+DoubleToString(MA[0],6));


   SetItem("C","D","LAST: "+DoubleToString(LAST,5));

  }

 

Boa noite. 


Depois de apanhar muito, consegui resolver. Me cadastrei no site só pra isso.

Altere toda a função OnTimer():

void OnTimer()

  {

//--- filling an array MA[] with current values of iMA

//--- Copying 100 elements

//   CopyBuffer(MA_handle,0,0,100,MA);

//   ArraySetAsSeries(MA,true);

   double EURUSD_ASK = SymbolInfoDouble("EURUSD",SYMBOL_ASK); // for eurusd (example)

   double EURUSD_BID = SymbolInfoDouble("EURUSD",SYMBOL_BID); 

   double USDCHF_ASK = SymbolInfoDouble("USDCHF",SYMBOL_ASK); 

   double USDCHF_BID = SymbolInfoDouble("USDCHF",SYMBOL_BID);

   

// Check & Add Item DDE

//   if(!CheckItem("EMA","B")) 

//     {

//      if(!AddItem("EMA","B")) return; 

//     }


   if(!CheckItem("COMPANY","Value")) AddItem("COMPANY","Value");

   if(!CheckItem("TIME","Value")) AddItem("TIME","Value");

   if(!CheckItem("EURUSD","ASK")) AddItem("EURUSD","ASK");

   if(!CheckItem("EURUSD","BID")) AddItem("EURUSD","BID");

   if(!CheckItem("USDCHF","ASK")) AddItem("USDCHF","ASK");

   if(!CheckItem("USDCHF","BID")) AddItem("USDCHF","BID");

   

// Set Item Value DDE  

   SetItem("COMPANY","Value",(string)AccountInfoString(ACCOUNT_COMPANY));

   SetItem("TIME","Value",(string)TimeCurrent());


//   SetItem("EMA","B","EMA(21): "+DoubleToString(MA[0],6));

   SetItem("EURUSD","ASK",DoubleToString(EURUSD_ASK,5));

   SetItem("EURUSD","BID",DoubleToString(EURUSD_BID,5));

   SetItem("USDCHF","ASK",DoubleToString(USDCHF_ASK,5));

   SetItem("USDCHF","BID",DoubleToString(USDCHF_BID,5));

  }

O restante é igual o que foi descrito acima.


Espero que ajude alguém.

 
maurorechi:

Boa noite. 


Depois de apanhar muito, consegui resolver. Me cadastrei no site só pra isso.

Altere toda a função OnTimer():

void OnTimer()

  {

//--- filling an array MA[] with current values of iMA

//--- Copying 100 elements

//   CopyBuffer(MA_handle,0,0,100,MA);

//   ArraySetAsSeries(MA,true);

   double EURUSD_ASK = SymbolInfoDouble("EURUSD",SYMBOL_ASK); // for eurusd (example)

   double EURUSD_BID = SymbolInfoDouble("EURUSD",SYMBOL_BID); 

   double USDCHF_ASK = SymbolInfoDouble("USDCHF",SYMBOL_ASK); 

   double USDCHF_BID = SymbolInfoDouble("USDCHF",SYMBOL_BID);

   

// Check & Add Item DDE

//   if(!CheckItem("EMA","B")) 

//     {

//      if(!AddItem("EMA","B")) return; 

//     }


   if(!CheckItem("COMPANY","Value")) AddItem("COMPANY","Value");

   if(!CheckItem("TIME","Value")) AddItem("TIME","Value");

   if(!CheckItem("EURUSD","ASK")) AddItem("EURUSD","ASK");

   if(!CheckItem("EURUSD","BID")) AddItem("EURUSD","BID");

   if(!CheckItem("USDCHF","ASK")) AddItem("USDCHF","ASK");

   if(!CheckItem("USDCHF","BID")) AddItem("USDCHF","BID");

   

// Set Item Value DDE  

   SetItem("COMPANY","Value",(string)AccountInfoString(ACCOUNT_COMPANY));

   SetItem("TIME","Value",(string)TimeCurrent());


//   SetItem("EMA","B","EMA(21): "+DoubleToString(MA[0],6));

   SetItem("EURUSD","ASK",DoubleToString(EURUSD_ASK,5));

   SetItem("EURUSD","BID",DoubleToString(EURUSD_BID,5));

   SetItem("USDCHF","ASK",DoubleToString(USDCHF_ASK,5));

   SetItem("USDCHF","BID",DoubleToString(USDCHF_BID,5));

  }

O restante é igual o que foi descrito acima.


Espero que ajude alguém.

Valeu Maurorechi,


mas tem que fazer essas linhas que vc fez pro EURUSD pra cada ativo ?

E outra duvida, pra puxar infos de um ativo tem que estar com a janela do ativo aberta?

 
gostaria que ele pudesse gerar os valores bid/ask automático para todos os symbols do market watch. Alguem pode ajudar?
 
maurorechi:

Boa noite. 


Depois de apanhar muito, consegui resolver. Me cadastrei no site só pra isso.

Altere toda a função OnTimer():

void OnTimer()

  {

//--- filling an array MA[] with current values of iMA

//--- Copying 100 elements

//   CopyBuffer(MA_handle,0,0,100,MA);

//   ArraySetAsSeries(MA,true);

   double EURUSD_ASK = SymbolInfoDouble("EURUSD",SYMBOL_ASK); // for eurusd (example)

   double EURUSD_BID = SymbolInfoDouble("EURUSD",SYMBOL_BID); 

   double USDCHF_ASK = SymbolInfoDouble("USDCHF",SYMBOL_ASK); 

   double USDCHF_BID = SymbolInfoDouble("USDCHF",SYMBOL_BID);

   

// Check & Add Item DDE

//   if(!CheckItem("EMA","B")) 

//     {

//      if(!AddItem("EMA","B")) return; 

//     }


   if(!CheckItem("COMPANY","Value")) AddItem("COMPANY","Value");

   if(!CheckItem("TIME","Value")) AddItem("TIME","Value");

   if(!CheckItem("EURUSD","ASK")) AddItem("EURUSD","ASK");

   if(!CheckItem("EURUSD","BID")) AddItem("EURUSD","BID");

   if(!CheckItem("USDCHF","ASK")) AddItem("USDCHF","ASK");

   if(!CheckItem("USDCHF","BID")) AddItem("USDCHF","BID");

   

// Set Item Value DDE  

   SetItem("COMPANY","Value",(string)AccountInfoString(ACCOUNT_COMPANY));

   SetItem("TIME","Value",(string)TimeCurrent());


//   SetItem("EMA","B","EMA(21): "+DoubleToString(MA[0],6));

   SetItem("EURUSD","ASK",DoubleToString(EURUSD_ASK,5));

   SetItem("EURUSD","BID",DoubleToString(EURUSD_BID,5));

   SetItem("USDCHF","ASK",DoubleToString(USDCHF_ASK,5));

   SetItem("USDCHF","BID",DoubleToString(USDCHF_BID,5));

  }

O restante é igual o que foi descrito acima.


Espero que ajude alguém.

Segue as alterações que fiz no código abaixo.

void OnTimer()
  {
//--- filling an array MA[] with current values of iMA
//--- Copying 100 elements

// Check & Add Item DDE
   if(!CheckItem(_Symbol,"B")) 
     {
      if(!AddItem(_Symbol,"B")) return; 
     }

   if(!CheckItem("COMPANY","Value")) AddItem("COMPANY","Value");
   if(!CheckItem("TIME","Value")) AddItem("TIME","Value");

// Set Item Value DDE  
   SetItem("COMPANY","Value",(string)AccountInfoString(ACCOUNT_COMPANY));
   SetItem("TIME","Value",(string)TimeCurrent());

   SetItem(_Symbol,"B",SymbolInfoDouble(_Symbol,SYMBOL_LAST));

  }