Crie sua própria extensão MetaTrader (dll) - página 14

 

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

 
at120:
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

Que 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_separate_window

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

}
Arquivos anexados:
 
at120:
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_separate_window

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

}

}

 
revivalfx:
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.

 
revivalfx:
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

Razão: