Erros, bugs, perguntas - página 2575

 
Roman:

A memória é atribuída no código mql como

para fora e passado como um ponteiro para a memória atribuída, uma vez que a string em mql é wichar_t* em dll

Oh, que confusão...

Não conheço a implementação da string, só posso adivinhar, mas a julgar pelo erro, a string out cria um ponteiro na pilha que é inicializado a 0x0000000000 e desreferencia-se com segurança um ponteiro nulo na dll.

 
Vladimir Simakov:

É tão complicado...

Não conheço a implementação da string, só posso adivinhar, mas a julgar pelo erro, a string out cria um ponteiro na pilha que é inicializado a 0x0000000000 e desreferencia-se com segurança um ponteiro nulo na dll.

Desculpe, não reparei no StringInit (((.
 
Roman:

A memória é atribuída no código mql como

para fora e é passado como um ponteiro para a memória alocada, como string em mql é wchar_t* em dll

Escavar na própria dll, algo está muito provavelmente lá. Ultimamente, tenho alimentado dados de mql para aplicações C++/C# de terceiros, sem qualquer problema.

 
Vladimir Simakov:

Escave na própria dll, provavelmente há lá alguma coisa. Ultimamente, tenho alimentado dados de mql para aplicações C++/C# de terceiros, sem qualquer problema.

O dll é muito simples, não é necessário para a clareza, a ideia em si é mostrada.

wchar_t* out        = L"";
const wchar_t* data = L"";

while(condition)
{
   data = getData();  //getData библиотечная функция возвращает const wchar_t*
   wcscpy(out, data);
}

Envie os dados do resultado para a consola, todas as linhas na consola são claras, sem lacunas e sem falhas.
Passo o resultado ao mql através do wcscpy(out, data), mas agora tenho problemas.
Se eu passar um fio de cheque escrito por mim mesmo.

wchar_t* out        = L"";
const wchar_t* data = L"";

while(condition)
{
   data = L"{\"p\":\"2000\"}";  //проверочная строка
   wcscpy(out, data);
}

Não tenho problemas por qualquer razão.

Hm, o tipo de fio em mql considera terminal null wchar_t * ??

Arquivos anexados:
 

Sugestão para expandir um pouco a possibilidade de evento OnTimer()

No momento em que o evento OnTimer() começa a ocorrer quando a periodicidade da chamada é definida com a função EventSetTimer().

Acontece que é o seguinte Conselheiro Especialista:

bool timer_set = false;
int OnInit()
{
   return(INIT_SUCCEEDED);
}
//+------------------------------------------------------------------+
void OnDeinit(const int reason)
{
   EventKillTimer();
}
//+------------------------------------------------------------------+
void OnTick()
{
   if (!timer_set)
      {
         // -- имитация включения советника в какое-то
         // -- случайное время
         string time = TimeToString(TimeTradeServer(), TIME_DATE | TIME_MINUTES | TIME_SECONDS);
         if (TimeCurrent() >= D'2019.09.24 3:47:40')
            {
               EventSetTimer(600);
               timer_set = true;
            }
      }
}
//+------------------------------------------------------------------+
void OnTimer()
{
//---
   string time = TimeToString(TimeTradeServer(), TIME_DATE | TIME_MINUTES | TIME_SECONDS);
   printf("Current time: %s", time);
}
//+------------------------------------------------------------------+

Produz aproximadamente o seguinte:

QJ      0       07:53:10.369    test_timer (GBPUSD_i,D1)        2019.09.24 03:57:41   Current time: 2019.09.24 03:57:41
NF      0       07:53:11.246    test_timer (GBPUSD_i,D1)        2019.09.24 04:07:41   Current time: 2019.09.24 04:07:41

No entanto, é frequentemente suficiente verificar a ocorrência do sinal após o aparecimento de outro bar.

Por exemplo, acontece que por exemplo para PERIOD_M15, o bar aparece às 00:15:00, mas o cheque do Consultor Especialista só pode ser verificado às 00:29:59.

Assim, para resultados mais ou menos estáveis e iguais, independentemente da hora de início do Expert Advisor,

terá de definir um temporizador para um intervalo de tempo mais curto ou utilizar adicionalmente OnTick().

Como as experiências demonstraram, reduz drasticamente a velocidade dos testes no testador de estratégias.

Sugestão:

Adicionar uma função que permita definir o tempo inicial a partir do qual o evento OnTimer é contado.

Por exemplo, alguma função EventSetTimerFrom(const datetime SinceDT) que lhe permitiria definir a chamada do temporizador alguns segundos após uma nova barra.

 
Roman:

O dll é simples, o material extra foi removido para maior clareza, a ideia é mostrada.

Coloquei o resultado na consola, todas as linhas estão bem, sem lacunas, sem falhas.
Passo o resultado ao mql através do wcscpy(out, data), mas agora tenho problemas.
Mas se eu passar um fio de cheque escrito à mão.

Não tenho problemas por qualquer razão.

Hm, o tipo de fio em mql considera terminal null wchar_t * ??

Mas esta função funciona.

wcsncpy(out, data, wcslen(data));

Mas não é bem assim, parece haver um mau carácter no fim da corda, aparece um parêntese extra } e depois desaparece.
wcslen(data)+1
wcslen(dados)+2
não ajudou,
e é analisado sem erros, sem fugas de informação.

nenhuma ideia do comprimento ou tamanho de um carácter em mql-looking string
há certamente um erro no tipo de cordel.

E num artigo de há muito tempo no parágrafo 3.3 Passando e modificando as cordas, o exemplo mais provável é que tenha cometido um erro.

_DLLAPI void fnReplaceString(wchar_t *text, wchar_t *from, wchar_t *to)
  {
   wchar_t *cp;
    
   //проверка параметров
   if(text==NULL || from==NULL || to==NULL) return;
   if(wcslen(from)!=wcslen(to))             return;
   
   //поищем подстроку
   if((cp=wcsstr(text,from))==NULL)         return;
   
   //заменим
   memcpy(cp,to,wcslen(to)*sizeof(wchar_t));  //в этой строке должен быть указатель sizeof(wchar_t *)
  }

Talvez algures no código terminal, a conversão de cordas mql funcione da mesma maneira, sem um ponteiro.

 
Maksim Emeliashin:

definir o tempo inicial a partir do qual o evento OnTimer é contado para baixo.

Pode fazê-lo você mesmo através da chamada repetida do EventSetTimer. Note-se que na conta (não no Testador) o temporizador flutua e necessita de ajustes constantes.

 
fxsaber:

Pode fazê-lo você mesmo através de repetidas chamadas para EventSetTimer. Tenha em mente que na conta (não no Testador) o temporizador flutua e necessita de ajustes constantes.

Obrigado, coisa útil!

Muito estranho, claro, que um ponto tão simples não seja tido em conta no terminal "out of the box".

 
Roman:

Mas esta função funciona.

Mas parece ser um pouco estranho, um parêntese extra } aparece ou desaparece no fim da corda.
wcslen(data)+1
wcslen(dados)+2
não ajudou,
e é analisado sem erros, sem fugas de informação.

nenhuma ideia do comprimento ou tamanho de um carácter em mql-looking string
há certamente um erro no tipo de cordel.

E num artigo de há muito tempo no parágrafo 3.3 Passando e modificando as cordas, o exemplo mais provável é que tenha cometido um erro.

Talvez algures no código terminal, a conversão de cordas mql funcione da mesma maneira, sem o ponteiro.

getData() cavar. Tenho a sensação de que há um problema algures por aí.
 
Roman:

O dll é simples, foi removido para maior clareza e a ideia é mostrada

Os seus exemplos são engraçados, removeu tudo, deixou UB (modificação dos literais das cordas), e todos têm de se telepatizar. Se espera obter alguns conselhos inteligentes, dê um código de trabalho mínimo (em dois lados), caso contrário é apenas lixo.