Você está perdendo oportunidades de negociação:
- Aplicativos de negociação gratuitos
- 8 000+ sinais para cópia
- Notícias econômicas para análise dos mercados financeiros
Registro
Login
Você concorda com a política do site e com os termos de uso
Se você não tem uma conta, por favor registre-se
Olá Mladen!
Quando tento obter o valor do buffer[0], o valor é algo como Buffer: 2147483647
Portanto, acho que isto não está certo... Deveria haver um valor algo como: 1,23584
como eu fiz um teste e conjunto: tampão = Taxas[10].fechar;
Alguma idéia?
Muito obrigado e adeus, AT
Olá Mladen!
Quando tento obter o valor do buffer[0], o valor é algo como Buffer: 2147483647
Portanto, acho que isto não está certo... Deveria haver um valor algo como: 1,23584
como eu fiz um teste e conjunto: tampão = Taxas[10].fechar;
Alguma idéia?
Muito obrigado e adeus, ATQue valores é o que é conhecido como EMPTY_VALUE
Do lado do mql verifique se tudo está bem com sua declaração de reserva e atribuição de valores. Verifique também como você está lidando com elementos de buffer (array) a partir de um lado C++
Olá Mladen!
Eu tentei algo ao chamar a DLL e também com buffers, MAS sem nenhum resultado positivo...
Tentei definir o valor do buffer no código C++ para 1, buffer[]=1; Sem alteração...
Eu atendi a DLL (por favor, apenas renomeei-a de .zip do .dll), que eu chamo com o seguinte código MQL4
Obrigado por quaisquer sugestões...
Adeus, AT
sma_rec.dll.zip
#property indicator_buffers 1 // one indicator line to be plotted
#property indicator_color1 Red // plot colour is red - change via GUI
#import "sma_rec.dll"
void updateBuffer(MqlRates &rates[], double& buffer[], int bars, int indicator_counted, int period, double& internal_calcs[2] );
#import
extern int ma_period = 10; // default period is 10 - change via GUI
extern int ma_shift = 0; // default is no shift - change via GUI
double buffer[]; // the indicator buffer - the DLL will // write to this and it will be plotted
MqlRates Rates[];
double internal_calcs[2];
int init(){
// set up the indicator buffer
IndicatorBuffers(2);
SetIndexStyle(0, DRAW_LINE);
SetIndexShift(0, ma_shift);
SetIndexBuffer(0, buffer);
SetIndexLabel(0, "Recursive SMA");
IndicatorDigits(Digits);
return(0);
}
int start(){
ArrayCopyRates(Rates);
updateBuffer( Rates, buffer, Bars, IndicatorCounted(), ma_period, internal_calcs );
// Print("4 - close: ",Rates[0].close,"\n");
//Print("Buffer: ",buffer[0],"\n");
return(0);
}Olá Mladen!
Eu tentei algo ao chamar a DLL e também com buffers, MAS sem nenhum resultado positivo...
Tentei definir o valor do buffer no código C++ para 1, buffer[]=1; Sem alteração...
Eu atendi a DLL (por favor, apenas renomeei-a de .zip do .dll), que eu chamo com o seguinte código MQL4
Obrigado por quaisquer sugestões...
Adeus, AT
sma_rec.dll.zip
#property indicator_buffers 1 // one indicator line to be plotted
#property indicator_color1 Red // plot colour is red - change via GUI
#import "sma_rec.dll"
void updateBuffer(MqlRates &rates[], double& buffer[], int bars, int indicator_counted, int period, double& internal_calcs[2] );
#import
extern int ma_period = 10; // default period is 10 - change via GUI
extern int ma_shift = 0; // default is no shift - change via GUI
double buffer[]; // the indicator buffer - the DLL will // write to this and it will be plotted
MqlRates Rates[];
double internal_calcs[2];
int init(){
// set up the indicator buffer
IndicatorBuffers(2);
SetIndexStyle(0, DRAW_LINE);
SetIndexShift(0, ma_shift);
SetIndexBuffer(0, buffer);
SetIndexLabel(0, "Recursive SMA");
IndicatorDigits(Digits);
return(0);
}
int start(){
ArrayCopyRates(Rates);
updateBuffer( Rates, buffer, Bars, IndicatorCounted(), ma_period, internal_calcs );
// Print("4 - close: ",Rates[0].close,"\n");
//Print("Buffer: ",buffer[0],"\n");
return(0);
}Não se pode usar tampão[]=1; - não significa nada em mql. Você tem que usar algum índice na parte do buffer[] (como buffer[0]=1; )
Olá Mladen!
Usei para isso em C++ o seguinte
tampão = 1;
Portanto, isto deve funcionar normalmente...
O código C++ é parecido com o abaixo.
Obrigado pela ajuda!!
Tchau, AT
#include
#include "stdafx.h"
#include
#define WIN32_LEAN_AND_MEAN
#define MT4_EXPFUNC __declspec(dllexport)
//+------------------------------------------------------------------+
//| MT4 HISTORY DATA STRUCT |
//+------------------------------------------------------------------+
#pragma pack(push,1)
struct RateInfo
{
__int64 ctm;
double open;
double low;
double high;
double close;
unsigned __int64 vol_tick;
int spread;
unsigned __int64 vol_real;
};
#pragma pack(pop)
struct MqlStr
{
int len;
char *string;
};
MT4_EXPFUNC void __stdcall updateBuffer(const RateInfo* Rates, double buffer[],int Bars, int IndicatorCounted, int ma_period, double internal_calcs[2] )
{
//---
if(Rates==NULL)
{
printf("updateBuffer: NULL array\n");
}
//---
if(Rates != NULL)
{
printf("updateBuffer: something is in array\n");
}
//---
if(buffer==NULL)
{
printf("updateBuffer: NULL array\n");
}
//---
if(Bars<0)
{
printf("updateBuffer: wrong Bars number (%d)\n", Bars);
}
//---
if(ma_period<0)
{
printf("updateBuffer: wrong MA Period (%d)\n", ma_period);
}
//---
if(ma_period==10)
{
printf("updateBuffer: 10 MA Period (%d)\n", ma_period);
}
// buffer = 1;
//buffer = ( buffer - internal_calcs[0] ) + ( Rates.close/ma_period ); // calculate new SMA value//
// check if the DLL is being called for the very first time
if ( IndicatorCounted == 0 )
{
buffer[0] = Rates[0].close;
buffer[1] = ( Rates[0].close + Rates[1].close ) / 2.0;
for( int ii = 2 ; ii < ma_period ; ii++ )
{
buffer = ( ( buffer * ii ) / (ii+1) ) + ( Rates.close/(ii+1) );
}
for( int ii = ma_period ; ii < Bars - 1 ; ii++ )
{
buffer = ( buffer - (Rates.close/ma_period) ) + ( Rates.close/ma_period );
}
internal_calcs[0] = (Rates.close/ma_period);
internal_calcs[1] = Bars - 1; // how many indicator values calculated so far
}
if ( IndicatorCounted > 0 && (Bars - 1) > internal_calcs[1] ) // evaluates to TRUE if there is a new bar
{
buffer = ( buffer - internal_calcs[0] ) + ( Rates.close/ma_period ); // calculate new SMA value
internal_calcs[0] = (Rates.close/ma_period); // update // internal_calcs with new value for next SMA calc.
internal_calcs[1] = Bars - 1; // update how many indicator values calculated so far
} // end of ( IndicatorCounted > 0 && (Bars - 1) > internal_calcs[1]) if // statement
} // end of main function call
Estou tendo um problema com uma dll c++ que eu criei para me conectar a um servidor, enviar comandos e fechar. Estou usando as bibliotecas do boost asio C++ e peguei um exemplo de seu site. Eu testei o código como um executável independente no console e ele funciona muito bem, mas quando o converti para uma dll, é aí que estou vendo um estranho problema de truncagem de strings.
Apenas o primeiro caractere da string parece ser passado para o servidor. Atualmente estou enviando uma string de teste "get time\n", mas apenas "g" é visto quando a mensagem é recebida.
A API se parece com isto (a função completa está abaixo):
MT4_EXPFUNC int __stdcall messageOrder(char* message, int length)
Li que a cadeia na MQL é na verdade uma estrutura e tentei a estrutura MqlStr que foi sugerida,.......
estrutura MqlStr
{
int len;
char *string;
};
......, mas isso também não parece funcionar. Ele pendura o servidor com uma corda inválida.
O que tem funcionado o "melhor" até agora é o que eu listei abaixo.
Abaixo está meu teste ea que não faz nada além de enviar a mesma string para o servidor a cada tick.
---------------
#propriedade versão "1.00"
#propriedade rigorosa
#importar "Boost.dll";
int messageOrder(string message, int length);
#importar
//+------------------------------------------------------------------+
//| Função de iniciação de especialistas |
//+------------------------------------------------------------------+
int OnInit()
{
//---
//---
return(INIT_SUCCEED);
}
//+------------------------------------------------------------------+
//| Função de desinicialização especializada |
//+------------------------------------------------------------------+
nulo OnDeinit(const int razão)
{
//---
}
//+------------------------------------------------------------------+
//| Função de carrapato de especialista |
//+------------------------------------------------------------------+
nulo OnTick()
{
//---
mensagem de corda = "ganhar tempo\n";
//Print("mensagem: ", mensagem, " comprimento = ", StringLen(mensagem));
messageOrder(mensagem, StringLen(mensagem));
}
//+------------------------------------------------------------------+
A exportação dll está abaixo. Estou criando uma std::string após a mensagem ser recebida e depois enviando essa string para o servidor. O problema em questão é a string MQL para conversão C++ char *.
Obviamente, estou fazendo algo errado. Alguém pode ajudar com isto?
"C" externo
{
#define MT4_EXPFUNC __declspec(dllexport)
MT4_EXPFUNC int __stdcall messageOrder(char* message, int length)
{
tente
{
boost::asio::io_service io_service;
tcp::resolver r(io_service);
cliente c(io_service);
//char * p;
//char msg[1024];
//int i;
//for(i = 0, p= mensagem; i < comprimento; i++, p+++)
//{
// msg = *p;
//}
//std::string line = std::string(msg);
std::string line = mensagem;
c.assignMessage(line);
c.start(r.resolve(tcp::resolver::query("127.0.0.1", "100")));
io_service.run();
}
captura (std::exception& e)
{
std::cerr << "Exceção": "<< e.o quê() << "\n";
}
retornar 0;
}
}
Estou tendo um problema com uma dll c++ que eu criei para me conectar a um servidor, enviar comandos e fechar. Estou usando as bibliotecas do boost asio C++ e peguei um exemplo de seu site. Eu testei o código como um executável independente no console e ele funciona muito bem, mas quando o converti para uma dll, é aí que estou vendo um estranho problema de truncagem de strings.
Apenas o primeiro caractere da corda parece ser passado para o servidor. Atualmente estou enviando uma string de teste "get time\n" mas apenas "g" é visto quando a mensagem é recebida.
A API se parece com isto (a função completa está abaixo):
MT4_EXPFUNC int __stdcall messageOrder(char* message, int length)
Li que a cadeia na MQL é na verdade uma estrutura e tentei a estrutura MqlStr que foi sugerida,.......
estrutura MqlStr
{
int len;
char *string;
};
......, mas isso também não parece funcionar. Ele pendura o servidor com uma corda inválida.
O que tem funcionado o "melhor" até agora é o que eu listei abaixo.
Abaixo está meu teste ea que não faz nada além de enviar a mesma string para o servidor a cada tick.
---------------
#propriedade versão "1.00"
#propriedade rigorosa
#importar "Boost.dll";
int messageOrder(string message, int length);
#importar
//+------------------------------------------------------------------+
//| Função de iniciação de especialistas |
//+------------------------------------------------------------------+
int OnInit()
{
//---
//---
return(INIT_SUCCEED);
}
//+------------------------------------------------------------------+
//| Função de desinicialização especializada |
//+------------------------------------------------------------------+
nulo OnDeinit(const int razão)
{
//---
}
//+------------------------------------------------------------------+
//| Função de carrapato de especialista |
//+------------------------------------------------------------------+
nulo OnTick()
{
//---
mensagem de corda = "ganhar tempo\n";
//Print("mensagem: ", mensagem, " comprimento = ", StringLen(mensagem));
messageOrder(mensagem, StringLen(mensagem));
}
//+------------------------------------------------------------------+
A exportação dll está abaixo. Estou criando uma std::string após a mensagem ser recebida e depois enviando essa string para o servidor. O problema em questão é a string MQL para conversão C++ char *.
Obviamente, estou fazendo algo errado. Alguém pode ajudar com isto?
"C" externo
{
#define MT4_EXPFUNC __declspec(dllexport)
MT4_EXPFUNC int __stdcall messageOrder(char* message, int length)
{
tente
{
boost::asio::io_service io_service;
tcp::resolver r(io_service);
cliente c(io_service);
//char * p;
//char msg[1024];
//int i;
//for(i = 0, p= mensagem; i < comprimento; i++, p+++)
//{
// msg = *p;
//}
//std::string line = std::string(msg);
std::string line = mensagem;
c.assignMessage(line);
c.start(r.resolve(tcp::resolver::query("127.0.0.1", "100")));
io_service.run();
}
captura (std::exception& e)
{
std::cerr << "Exceção": "<< e.o quê() << "\n";
}
retornar 0;
}
}Como acontece quando eu estava usando a estrutura MqlStr, eu a estava desempacotando de forma inadequada.
Agora eu estou fazendo:
struct MqlStr
{
int len;
char *string;
};
extern "C"
{
#define MT4_EXPFUNC __declspec(dllexport)
MT4_EXPFUNC int __stdcall messageOrder(MqlStr * message, int length)
/// MT4_EXPFUNC int __stdcall messageOrder(char* message, int length)
{
std::string line;
try
{
boost::asio::io_service io_service;
tcp::resolver r(io_service);
client c(io_service);
//char * p;
//char msg[1024];
//int i;
//for(i = 0, p= message; i < length; i++, p++)
//{
// msg = *p;
//}
//std::string line = std::string(msg);
line = message[0].string;
c.assignMessage(line);
c.start(r.resolve(tcp::resolver::query("127.0.0.1", "100")));
io_service.run();
}
catch (std::exception& e)
{
std::cerr << "Exception: " << e.what() << "\n";
}
//return line.length();
return strlen(message[0].string);
//return message[0].len;
}
}
[/CODE]
I return the length of the MqlStr string and it is always 1. So it is doing exactly the same as the implementation above.
Here's the MQL code.
[CODE]
#property version "1.00"
#property strict
#import "Boost.dll";
int messageOrder(string message, int length);
#import
//+------------------------------------------------------------------+
//| Expert initialization function |
//+------------------------------------------------------------------+
int OnInit()
{
//---
//---
return(INIT_SUCCEEDED);
}
//+------------------------------------------------------------------+
//| Expert deinitialization function |
//+------------------------------------------------------------------+
void OnDeinit(const int reason)
{
//---
}
//+------------------------------------------------------------------+
//| Expert tick function |
//+------------------------------------------------------------------+
void OnTick()
{
//--- int len = 0;
string message = "get time\n";
//Print("message: ", message, " length = ", StringLen(message));
len = messageOrder(message, StringLen(message)); Print("len ", len);
}
//+------------------------------------------------------------------+
Agora estou explorando uma DLL C# baseada em um link em um post anterior.
derp! Acho que eu poderia ter olhado o exemplo sob roteiros. desconsideração. Obrigado...... Ah! Unicode.
derp! Acho que eu poderia ter olhado o exemplo sob roteiros. desconsideração. Obrigado...... Ah! Unicode.
Não foi uma mensagem longa?
Olá revalfx,
Você quer usar wchar_t instad of char! Eu tinha o mesmo problema! ;-)
Tchau, AT