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ı
' ' 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?
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 |//+------------------------------------------------------------------+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 );
}
//+------------------------------------------------------------------+
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.
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
Dll'den, const wchar_t* dizesine bir işaretçi, bu parametrelerle çift bir dize kopyalar
wcsncpy( out, data, wcslen(data) * 2 );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?
@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?
@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ı
Bu işe yaramazsa, hata başka bir yerde aranmalıdır.
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
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.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.
Buraya bak.
Vay, aynen öyle!
Çok teşekkürler.
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?