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().
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.1104:32:37.857 ExampleDll M 7392019.10.1104:32:37.857 ExampleDll 6602019.10.1104: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.1103:44:39.202 ExampleDll 1 leaked strings left
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?
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 |//+------------------------------------------------------------------+inputint X=10; //координата Xinputint Y=60; //координата Yinputcolor Color=clrMagenta; //цвет заливкиinputuchar BackgroundTransparentLevel=150; //прозрачность ценового графика и его фона//input string FileName="bmp_resource_001.bmp"; //имя BMP рисунока из папки \MQL5\Fileinputstring ResName="CanvasBackground"; //имя создаваемого графического ресурса
CChartCanvas canvas; //создание канвы//+------------------------------------------------------------------+//| Script program start function |//+------------------------------------------------------------------+intOnStart(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);
}
//+------------------------------------------------------------------+
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.
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
Da dll, o ponteiro para a string const wchar_t* copia uma string uniforme, com estes parâmetros
wcsncpy( out, data, wcslen(data) * 2 );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 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?
@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?
@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
Se isto não funcionar, o erro deve ser encontrado noutro lugar
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
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.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.
Dê uma vista de olhos aqui.
É isso mesmo, é isso mesmo!
Muito obrigado.
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?