Hatalar, hatalar, sorular - sayfa 2590

 

Söylesene, belki de [Çok fazla ticaret talebi] hatasının nedeni normal OrderSend'in ikinci çağrısında (terminali başlattıktan sonra) olabilir mi?

Pazartesiden perşembeye günlüklere baktım. Her yerde aynı resim: Bir limit emrinin ilk gönderimi başarılı ve sonrakiler [Çok fazla ticaret talebi] hatasıyla tamamlandı. Sonra geçmeye başlarlar. Suçludan OnInit () içindeki CopyTickRange'e yalnızca sık çağrılar yapıyorum.


BCS Broker MetaTrader 5 Terminal x64 build 2170 başladı

 
Ilyas :


@ilyas

Dll'den, const wchar_t* dizesine bir işaretçi, bu parametrelerle çift bir dize kopyalar

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

Bu parametrelerle doğal olarak akar.

 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

Ama çizgi eşit çıkıyor, fazladan bir karakter bile kaymıyor.
Ve programın tamamlanmasından sonra, uzman günlüğünde bir mesaj belirir.

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


Ve işte bir test

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

Aşağıdakileri gösterir

 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

' ' karakteri bir yerine iki bayt döndürür. Muhtemelen Unicode'da olduğu için.
Ve wchar_t ile karşılaştırıldığında, dizeler genellikle iki bayt yerine on ikidir.

Olası bir seçenek olarak, belki bir yerde eski türdeki hizalama dizenin boyutunu bozar?


 
Roman :

@ilyas

Dll'den, const wchar_t* dizesine bir işaretçi, bu parametrelerle çift bir dize kopyalar

Bu parametrelerle doğal olarak akar.

Ama çizgi eşit çıkıyor, fazladan bir karakter bile kaymıyor.
Ve programın tamamlanmasından sonra, uzman günlüğünde bir mesaj belirir.


Ve işte bir test

Aşağıdakileri gösterir

' ' karakteri bir yerine iki bayt döndürür. Muhtemelen Unicode'da olduğu için.
Ve wchar_t ile karşılaştırıldığında, dizeler genellikle iki bayt yerine on ikidir.

Olası bir seçenek olarak, belki bir yerde eski türdeki hizalama dizenin boyutunu bozar?


string, bir string işaretçisine ek olarak başka bir şeyin olduğu bir nesnedir.
 
Merhaba! BMP dosyalarından veri alırken ResourceReadImage() işlevi düzgün çalışmıyor gibi görünüyor! Bir tuval üzerine arka plan olarak resim çizmek için bir komut dosyası çizdim. Görüntüyü sabit sürücüdeki bir dosyadan alır ve tuval üzerine doldurursak, her şey yolunda gider, ancak görüntü piksellerini ResourceReadImage() işlevini kullanarak ex5 dosyasının kendisindeki BMP kaynağından alırsak, o zaman son arka plan görüntüsü, orijinal görüntünün küçük ve büyük ölçüde büyütülmüş bir parçasıymış gibi olur. Sebebi ne?
 //+------------------------------------------------------------------+
//|                                             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 );
  }
//+------------------------------------------------------------------+
Dosyalar:
 
Roman :

@ilyas

Dll'den, const wchar_t* dizesine bir işaretçi, bu parametrelerle çift bir dize kopyalar

Bu parametrelerle doğal olarak akar.

Ama çizgi eşit çıkıyor, fazladan bir karakter bile kaymıyor.
Ve programın tamamlanmasından sonra, uzman günlüğünde bir mesaj belirir.


Ve işte bir test

Aşağıdakileri gösterir

' ' karakteri bir yerine iki bayt döndürür. Muhtemelen Unicode'da olduğu için.
Ve wchar_t ile karşılaştırıldığında, dizeler genellikle iki bayt yerine on ikidir.

Olası bir seçenek olarak, belki bir yerde eski türdeki hizalama dizenin boyutunu bozar?


1. MQL'de yalnızca unicode, bu nedenle karakter boyutu 2 bayttır

2. string bir yapıdır (4 bayt arabellek boyutu ve 8 bayt işaretçi)


Dize kopyala böyle olmalı

wcscpy(out,data);

Bu işe yaramazsa, hata başka bir yerde aranmalıdır.

 
Nikolay Kositsin :
Merhaba! BMP dosyalarından veri alırken ResourceReadImage() işlevi düzgün çalışmıyor gibi görünüyor! Bir tuval üzerine arka plan olarak resim çizmek için bir komut dosyası çizdim. Görüntüyü sabit sürücüdeki bir dosyadan alır ve tuval üzerine doldurursak, her şey yolunda gider, ancak görüntü piksellerini ResourceReadImage() işlevini kullanarak ex5 dosyasının kendisindeki BMP kaynağından alırsak, o zaman son arka plan görüntüsü, orijinal görüntünün küçük ve büyük ölçüde büyütülmüş bir parçasıymış gibi olur. Sebebi ne?

Nokta kopyalama döngüsü yanlış, değiştirin

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

Ve böyle bir soru - FrameInputs() işlevinde olduğu gibi girdi değişkenlerinin bir listesi nasıl alınır, ancak optimizasyon olmadan yalnızca bir geçişte?

Görünüşe göre son zamanlarda böyle bir soru ortaya çıktı, bir şekilde tamamen gözden kayboldum ve şimdi kendime böyle bir görevim var (otomatik olarak set dosyaları oluşturmak istiyorum).

Hangi yöne kazılacak? Ve bu tartışmayı hatırlayan varsa - nerede (onu bulamıyorum)?

Elbette her Expert Advisor'da böyle bir liste oluşturacak ayrı bir fonksiyon yazabilirsiniz ama evrensel bir kütüphane fonksiyonu daha iyi olur.
 
Georgiy Merts :

Elbette her Expert Advisor'da böyle bir liste oluşturacak tek bir fonksiyon yazabilirsiniz, ancak evrensel bir kütüphane fonksiyonu daha iyi olur.

Buraya bak.

 
fxsaber :

Buraya bak.

Vay, aynen öyle!

Çok teşekkürler.

 
Ilyas :

1. MQL'de yalnızca unicode, bu nedenle karakter boyutu 2 bayttır

2. string bir yapıdır (4 bayt arabellek boyutu ve 8 bayt işaretçi)


Dize kopyala böyle olmalı

Bu işe yaramazsa, hata başka bir yerde aranmalıdır.

Ancak kopyalanan dizenin boyutu ayrılan arabelleğin boyutundan daha büyük veya daha küçükse ne olur?