오류, 버그, 질문 - 페이지 2590

 

말해봐. [Too many trade requests] 오류의 원인은 이미 일반 OrderSend 의 두 번째 호출(터미널 시작 후)에 있습니까?

나는 월요일부터 목요일까지 로그를 보았다. 모든 곳에서 같은 그림: 지정가 주문의 첫 번째 전송은 성공하고 후속 작업은 [Too many trade requests] 오류와 함께 완료됩니다. 그런 다음 그들은 통과하기 시작합니다. 범죄에서 나는 OnInit()에서 CopyTickRange를 자주 호출합니다.


BCS 브로커 MetaTrader 5 터미널 x64 빌드 2170 시작

 
Ilyas :


@일리아스

dll에서 문자열 const wchar_t*에 대한 포인터는 다음 매개변수를 사용하여 짝수 문자열을 복사합니다.

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

이러한 매개 변수를 사용하면 자연스럽게 흐릅니다.

 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

그러나 선은 하나의 추가 문자가 미끄러지지 않는 균일한 것으로 판명되었습니다.
그리고 프로그램 완료 후 전문가 로그에 메시지가 나타납니다.

 2019.10 . 11 03 : 44 : 39.202 ExampleDll       1 leaked strings left


그리고 여기 테스트가 있습니다

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

다음을 보여줍니다

 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

' ' 문자는 1바이트 대신 2바이트를 반환합니다. 아마도 유니코드라는 사실 때문일 것입니다.
그리고 문자열은 wchar_t와 비교할 때 일반적으로 2바이트가 아니라 12입니다.

가능한 옵션으로 이전 유형의 정렬이 문자열 크기를 왜곡할 수 있습니까?


 
Roman :

@일리아스

dll에서 문자열 const wchar_t*에 대한 포인터는 다음 매개변수를 사용하여 짝수 문자열을 복사합니다.

이러한 매개 변수를 사용하면 자연스럽게 흐릅니다.

그러나 선은 하나의 추가 문자가 미끄러지지 않는 균일한 것으로 판명되었습니다.
그리고 프로그램 완료 후 전문가 로그에 메시지가 나타납니다.


그리고 여기 테스트가 있습니다

다음을 보여줍니다

' ' 문자는 1바이트 대신 2바이트를 반환합니다. 아마도 유니코드라는 사실 때문일 것입니다.
그리고 문자열은 wchar_t와 비교할 때 일반적으로 2바이트가 아니라 12입니다.

가능한 옵션으로 이전 유형의 정렬이 문자열 크기를 왜곡할 수 있습니까?


string은 문자열에 대한 포인터 외에 다른 것이 있는 객체입니다.
 
안녕하세요! BMP 파일에서 데이터를 가져올 때 ResourceReadImage() 함수 가 제대로 작동하지 않는 것 같습니다! 캔버스에 배경으로 그림을 그리는 스크립트를 그렸습니다. 하드 드라이브의 파일에서 이미지를 가져와 캔버스에 채우면 모든 것이 잘 작동하지만 ResourceReadImage() 함수를 사용하여 ex5 파일 자체에 있는 BMP 리소스에서 이미지 픽셀을 가져오면 그러면 최종 배경 이미지는 마치 원본 이미지의 작고 크게 확대된 부분인 것처럼 입니다. 이유는 무엇입니까?
 //+------------------------------------------------------------------+
//|                                             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 );
  }
//+------------------------------------------------------------------+
파일:
 
Roman :

@일리아스

dll에서 문자열 const wchar_t*에 대한 포인터는 다음 매개변수를 사용하여 짝수 문자열을 복사합니다.

이러한 매개 변수를 사용하면 자연스럽게 흐릅니다.

그러나 선은 하나의 추가 문자가 미끄러지지 않는 균일한 것으로 판명되었습니다.
그리고 프로그램 완료 후 전문가 로그에 메시지가 나타납니다.


그리고 여기 테스트가 있습니다

다음을 보여줍니다

' ' 문자는 1바이트 대신 2바이트를 반환합니다. 아마도 유니코드라는 사실 때문일 것입니다.
그리고 문자열은 wchar_t와 비교할 때 일반적으로 2바이트가 아니라 12입니다.

가능한 옵션으로 이전 유형의 정렬이 문자열 크기를 왜곡할 수 있습니까?


1. MQL 전용 유니코드에서는 문자 크기가 2바이트입니다.

2. string은 구조체(4바이트 버퍼 크기와 8바이트 포인터)


문자열에 복사는 다음과 같아야 합니다.

wcscpy(out,data);

이것이 작동하지 않으면 다른 곳에서 오류를 찾아야 합니다.

 
Nikolay Kositsin :
안녕하세요! BMP 파일에서 데이터를 가져올 때 ResourceReadImage() 함수가 제대로 작동하지 않는 것 같습니다! 캔버스에 배경으로 그림을 그리는 스크립트를 그렸습니다. 하드 드라이브의 파일에서 이미지를 가져와 캔버스에 채우면 모든 것이 잘 작동하지만 ResourceReadImage() 함수를 사용하여 ex5 파일 자체에 있는 BMP 리소스에서 이미지 픽셀을 가져오면 그러면 최종 배경 이미지는 마치 원본 이미지의 작고 크게 확대된 부분인 것처럼 입니다. 이유는 무엇입니까?

포인트 복사 주기가 올바르지 않습니다. 다음으로 교체하십시오.

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

그리고 그러한 질문 - FrameInputs() 함수와 동일하지만 최적화 없이 한 번의 패스로만 입력 변수 목록을 얻는 방법은 무엇입니까?

그런 질문이 최근에 떠오른 것 같아서 어떻게든 완전히 잊어버렸고 이제는 그런 작업을 스스로 수행하게 되었습니다(설정 파일을 자동으로 만들고 싶습니다).

어느 방향으로 파나요? 그리고 그 토론을 기억하는 사람이 있다면 - 어디에 있습니까(찾을 수 없습니다)?

물론 각 Expert Advisor에 이러한 목록을 생성하는 별도의 기능을 작성할 수 있지만 범용 라이브러리 기능이 더 좋습니다.
 
Georgiy Merts :

물론 각 Expert Advisor에 이러한 목록을 생성하는 별도의 기능을 작성할 수 있지만 범용 라이브러리 기능이 더 좋습니다.

여기 봐 .

 
fxsaber :

여기 봐 .

와, 바로 그렇군요!

매우 감사합니다.

 
Ilyas :

1. MQL 전용 유니코드에서는 문자 크기가 2바이트입니다.

2. string은 구조체(4바이트 버퍼 크기와 8바이트 포인터)


문자열에 복사는 다음과 같아야 합니다.

이것이 작동하지 않으면 다른 곳에서 오류를 찾아야 합니다.

그러나 복사된 문자열의 크기가 할당된 버퍼의 크기보다 크거나 작으면 어떻게 될까요?