Erros, bugs, perguntas - página 2590

 

Pode dizer-me qual poderá ser a razão do erro [Demasiados pedidos comerciais] na segunda chamada da rotina OrderSend (depois de iniciar o terminal) ?

Procurei nos registos de segunda a quinta-feira. Tenho visto a mesma coisa em todo o lado: a primeira ordem de limite é enviada com sucesso e todas as ordens seguintes regressam com erro [Demasiados pedidos comerciais]. Depois começam a passar. A única acção criminosa é a chamada frequente do CopyTickRange no OnInit().


BCS Broker MetaTrader 5 Terminal x64 construído 2170 iniciado

 
Ilyas:


@Ilyas

Da dll, o ponteiro para a string const wchar_t* copia uma string uniforme, com estes parâmetros

memcpy( out, data, wcslen(data) * sizeof(int) );
wcsncpy( out, data, wcslen(data) * 2 );

Com estes parâmetros, é claro, vaza.

2019.10.11 04:32:37.857 ExampleDll      M 739
2019.10.11 04:32:37.857 ExampleDll       660
2019.10.11 04:32:37.857 ExampleDll       701

Mas a corda acaba por ser uma corda uniforme, nem um único carácter extra passa por ela.
E depois de terminar o programa, o registo do Expert Advisor exibe uma mensagem

2019.10.11 03:44:39.202 ExampleDll      1 leaked strings left


E existe um teste deste tipo.

void OnStart()
{  
   Print("sizeof(char)   = " + (string)sizeof(char));
   Print("sizeof(' ')    = " + (string)sizeof(' '));
   Print("sizeof(\"\")   = " + (string)sizeof(""));
   Print("sizeof(string) = " + (string)sizeof(string));
}

Mostra o seguinte

2019.10.11 03:48:01.366 TestScript (EURUSD,H1)  sizeof(char)   = 1
2019.10.11 03:48:01.366 TestScript (EURUSD,H1)  sizeof(' ')    = 2
2019.10.11 03:48:01.366 TestScript (EURUSD,H1)  sizeof("")     = 12
2019.10.11 03:48:01.366 TestScript (EURUSD,H1)  sizeof(string) = 12

O personagem char ' ' devolve dois bytes em vez de um. Provavelmente porque está em Unicode.
E a corda retorna doze bytes cada em vez de dois bytes quando comparada com a wchar_t.

Como uma forma possível, talvez o alinhamento do tipo superior distorça o tamanho da corda algures?


 
Roman:

@Ilyas

Da dll, o ponteiro para a string const wchar_t* copia uma string uniforme, com estes parâmetros

Com estes parâmetros, é claro, vaza.

Mas a corda acaba por ser uma corda uniforme, nem um único carácter extra passa por ela.
E depois de terminar o programa, o registo do Expert Advisor exibe uma mensagem


E existe um teste deste tipo.

Mostra o seguinte

O personagem char ' ' devolve dois bytes em vez de um. Provavelmente porque está em Unicode.
E a corda retorna doze bytes cada um em vez de dois bytes quando comparada com a wchar_t.

Como uma forma possível, talvez o alinhamento do tipo superior distorça o tamanho da corda algures?


corda é um objecto que tem algo para além de um ponteiro para uma corda.
 
Olá a todos! Parece que a função ResourceReadImage() não funciona correctamente quando se obtêm dados de ficheiros BMP! Fiz um guião para desenhar um quadro como fundo sobre tela. Se retirarmos uma imagem de um ficheiro localizado num disco rígido e a preenchermos apenas em tela, tudo funciona bem, mas se retirarmos pixels do recurso BMP que está localizado no próprio ficheiro ex5 usando a função ResourceReadImage(), a imagem resultante parecerá uma pequena e muito maior fatia da imagem de origem. Qual é a razão?
//+------------------------------------------------------------------+
//|                                             BMP_Background_X.mqh |
//|                   Copyright 2009-2017, MetaQuotes Software Corp. |
//|                                              http://www.mql5.com |
//+------------------------------------------------------------------+
#property copyright   "2009-2017, MetaQuotes Software Corp."
#property link        "http://www.mql5.com"
//#property description "Создание фоновой подложки с картиной из BMP файла"
//+------------------------------------------------------------------+
#include <Canvas\Canvas.mqh>
#include <\Canvas\Charts\ChartCanvas.mqh>
#include <Arrays\ArrayObj.mqh>
#resource "\\Files\\bmp_resource_002.bmp" // bmp_resource_002.bmp находится в каталог_данных_терминала\MQL5\Files\ 

//+------------------------------------------------------------------+
//| inputs                                                           |
//+------------------------------------------------------------------+
input int      X=10; //координата X
input int      Y=60; //координата Y
input color    Color=clrMagenta; //цвет заливки
input uchar    BackgroundTransparentLevel=150;  //прозрачность ценового графика и его фона
//input string   FileName="bmp_resource_001.bmp"; //имя BMP рисунока из папки \MQL5\File
input string   ResName="CanvasBackground"; //имя создаваемого графического ресурса
CChartCanvas canvas;  //создание канвы
//+------------------------------------------------------------------+
//| Script program start function                                    |
//+------------------------------------------------------------------+
int OnStart(void)
  {  
//--- Создадим канву
   int width=50;
   int height=50;
//--- COLOR_FORMAT_ARGB_RAW - Компоненты цвета не обрабатываются терминалом (должны быть корректно заданы пользователем)
//--- COLOR_FORMAT_ARGB_NORMALIZE - Компоненты цвета обрабатываются терминалом
//--- COLOR_FORMAT_XRGB_NOALPHA - Компонента альфа-канала (прозрачность) игнорируется
   if(!canvas.CreateBitmapLabel(ResName,X,Y,width,height,COLOR_FORMAT_ARGB_NORMALIZE))
     {
      Print("Error creating canvas: ",GetLastError());
      return(false);
     }
     
//--- Грузим фон на канву из файла на жёстком диске (делаем фоновый рисунок из BMP файла)
   canvas.LoadFromFile("bmp_resource_002.bmp"); //грузим рисунок из папки \MQL5\Files
   canvas.Update(); //фон нарисован 
   Sleep(10000); //пауза десять секунд   

//--- стираем полученный результат и обновляем график
   canvas.Erase(ColorToARGB(clrBlack,0));
   canvas.Update();
   Sleep(3000); //пауза три секунды
   
//--- Грузим фон на канву из данного ex5 файла скрипта (делаем фоновый рисунок из ресурса)
   string path="::Files\\bmp_resource_002.bmp";
   uint bmp_data[]; //массив для получения пикселов
   ResourceReadImage(path,bmp_data,width,height); // получаем массив пикселей 
   Print("Итоговый размер массива с пикселами: "+string(ArraySize(bmp_data)));
   Print("Разрешение полученного изображения: "+string(width)+" X "+string(height));
//--- меняем размер канвы 
   canvas.Resize(width,height);

//--- заливаем фон из массива на канву
   for(int x1=0; x1<width && !IsStopped(); x1++)
      for(int y1=0; y1<height && !IsStopped(); y1++)
        {
         canvas.PixelSet(x1,y1,bmp_data[x1+y1]);
        }
   canvas.Update();
   Sleep(5000); //пауза пять секунд
//--- стираем полученный результат и обновляем график
   canvas.Erase(ColorToARGB(clrBlack,0));
   canvas.Update();
//--- завершение работы кода по созданию подложки
   ObjectDelete(0,ResName);
   ResourceFree(path); 
   canvas.Destroy();
//----
   ChartRedraw(0);
   return(0);
  }
//+------------------------------------------------------------------+
Arquivos anexados:
 
Roman:

@Ilyas

A partir da dll, o apontador de string const wchar_t* copia uma string simples, com estes parâmetros

Com estes parâmetros, é claro, vaza.

Mas a corda acaba por ser uma corda uniforme, não faltando nenhum carácter extra.
E depois de terminar o programa, o registo do Expert Advisor exibe uma mensagem


E um tal teste

Mostra o seguinte

O personagem char ' ' devolve dois bytes em vez de um. Provavelmente porque está em Unicode.
E a corda retorna doze bytes cada em vez de dois bytes quando comparada com a wchar_t.

Como uma forma possível, talvez o alinhamento do tipo superior distorça o tamanho da corda algures?


1. Em MQL apenas Unicode, é por isso que o tamanho dos caracteres é de 2 bytes

2. cordel é uma estrutura (4 bytes de tamanho de buffer e 8 bytes de tamanho de ponteiro)


A cópia a cordel deve ser

wcscpy(out,data);

Se isto não funcionar, o erro deve ser encontrado noutro lugar

 
Nikolay Kositsin:
Olá a todos! Parece que a função ResourceReadImage() não funciona correctamente quando se obtêm dados de ficheiros BMP! Fiz um guião para desenhar um quadro como fundo sobre tela. Se retirarmos uma imagem de um ficheiro localizado num disco rígido e a preenchermos apenas em tela, tudo funciona bem, mas se retirarmos pixels do recurso BMP que está localizado no próprio ficheiro ex5 usando a função ResourceReadImage(), a imagem resultante parecerá uma pequena e muito maior fatia da imagem de origem. Qual é a razão?

O ciclo do ponto de cópia está errado, substitua-o por

//--- заливаем фон из массива на канву
   for(int y1=0; y1<height && !IsStopped(); y1++)
      for(int x1=0; x1<width; x1++)
        {
         canvas.PixelSet(x1,y1,bmp_data[y1*width+x1]);
        }
 

E esta pergunta - como obter uma lista de variáveis de entrada, a mesma que vem na funçãoFrameInputs() , mas apenas numa passagem, sem optimização ?

Sim, muito recentemente tinha surgido tal pergunta, de alguma forma perdi-a de vista, e agora eu próprio tenho essa tarefa (quero fazer set-files automaticamente).

Em que direcção cavar ? E se alguém se lembrar dessa discussão - onde está (não a consigo encontrar) ?

Claro que em cada consultor especializado eu poderia escrever uma função, que criaria uma tal lista, mas seria melhor ter uma função de biblioteca universal.
 
Georgiy Merts:

Poderia, claro, escrever uma única função em cada EA que criasse uma tal lista, mas uma função de biblioteca universal seria melhor.

Dê uma vista de olhos aqui.

 
fxsaber:

Dê uma vista de olhos aqui.

É isso mesmo, é isso mesmo!

Muito obrigado.

 
Ilyas:

1. Em MQL apenas Unicode, é por isso que o tamanho dos caracteres é de 2 bytes

2. cordel é uma estrutura (4 bytes de tamanho de buffer e 8 bytes de tamanho de ponteiro)


A cópia a cordel deve ser

Se isto não funcionar, o erro deve ser procurado noutro lugar

E o que acontece se o tamanho da cadeia a copiar for maior ou menor do que o tamanho do buffer atribuído?