Fehler, Irrtümer, Fragen - Seite 2590

 

Können Sie mir sagen, was der Grund für den Fehler [Too many trade requests] beim zweiten Aufruf der OrderSend-Routine (nach dem Start des Terminals) sein könnte?

Ich habe mir die Protokolle von Montag bis Donnerstag angesehen. Ich habe überall dasselbe gesehen: Die erste Limit-Order wird erfolgreich gesendet und alle weiteren Orders kommen mit dem Fehler [Too many trade requests] zurück. Dann beginnen sie zu vergehen. Die einzige kriminelle Handlung ist der häufige Aufruf von CopyTickRange in OnInit().


BCS Broker MetaTrader 5 Terminal x64 build 2170 gestartet

 
Ilyas:


@Ilyas

Von dll, Zeiger auf String const wchar_t* kopiert einen geraden String, mit diesen Parametern

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

Mit diesen Parametern ist es natürlich undicht.

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

Aber die Zeichenkette wird gerade, kein einziges zusätzliches Zeichen rutscht durch.
Und nach Beendigung des Programms zeigt das Expert Advisor-Protokoll eine Meldung an

2019.10.11 03:44:39.202 ExampleDll      1 leaked strings left


Und es gibt einen solchen Test.

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

Sie zeigt Folgendes

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

Das Char-Zeichen ' ' gibt zwei Bytes statt einem zurück. Wahrscheinlich, weil es in Unicode geschrieben ist.
Und die Zeichenkette gibt im Vergleich zu wchar_t zwölf Bytes statt zwei Bytes zurück.

Vielleicht verzerrt die Ausrichtung des oberen Typs irgendwo die Größe der Saite?


 
Roman:

@Ilyas

Von dll, Zeiger auf String const wchar_t* kopiert einen geraden String, mit diesen Parametern

Mit diesen Parametern ist es natürlich undicht.

Aber die Zeichenkette erweist sich als gerade, kein einziges zusätzliches Zeichen rutscht durch.
Und nach Beendigung des Programms zeigt das Expert Advisor-Protokoll eine Meldung an


Und es gibt einen solchen Test.

Sie zeigt Folgendes

Das Char-Zeichen ' ' gibt zwei Bytes statt einem zurück. Wahrscheinlich, weil es in Unicode geschrieben ist.
Und die Zeichenkette gibt im Vergleich zu wchar_t zwölf Bytes statt zwei Bytes zurück.

Vielleicht verzerrt die Ausrichtung des oberen Typs irgendwo die Größe der Saite?


string ist ein Objekt, das etwas anderes als einen Zeiger auf eine Zeichenkette enthält.
 
Hallo zusammen, es scheint, dass die Funktion ResourceReadImage() nicht richtig funktioniert, wenn man Daten aus BMP-Dateien erhält! Ich habe ein Skript erstellt, um ein Bild als Hintergrund auf die Leinwand zu zeichnen. Wenn wir ein Bild aus einer Datei auf der Festplatte herausnehmen und es einfach auf der Leinwand ausfüllen, funktioniert alles gut, aber wenn wir Pixel aus der BMP-Ressource herausnehmen, die sich in der ex5-Datei selbst befindet, indem wir die Funktion ResourceReadImage() verwenden, sieht das resultierende Bild wie ein winziger und stark vergrößerter Ausschnitt des Quellbildes aus. Was ist der Grund dafür?
//+------------------------------------------------------------------+
//|                                             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);
  }
//+------------------------------------------------------------------+
Dateien:
 
Roman:

@Ilyas

Aus der DLL kopiert der Zeiger const wchar_t* string eine einfache Zeichenkette mit den folgenden Parametern

Mit diesen Parametern ist es natürlich undicht.

Aber die Zeichenkette ist gerade, und es fehlt kein Zeichen mehr.
Und nach Beendigung des Programms zeigt das Expert Advisor-Protokoll eine Meldung an


Und es gibt einen solchen Test.

Sie zeigt Folgendes

Das Char-Zeichen ' ' gibt zwei Bytes statt einem zurück. Wahrscheinlich, weil es in Unicode geschrieben ist.
Und die Zeichenkette gibt im Vergleich zu wchar_t zwölf Bytes statt zwei Bytes zurück.

Vielleicht verzerrt die Ausrichtung des oberen Typs irgendwo die Größe der Saite?


1. in MQL nur Unicode, deshalb ist die Zeichengröße 2 Bytes

2. String ist eine Struktur (4 Byte Puffergröße und 8 Byte Zeigergröße)


Die Kopie in die Zeichenkette sollte sein

wcscpy(out,data);

Wenn dies nicht funktioniert, muss der Fehler an anderer Stelle gefunden werden

 
Nikolay Kositsin:
Hallo zusammen, es scheint, dass die Funktion ResourceReadImage() nicht richtig funktioniert, wenn man Daten aus BMP-Dateien erhält! Ich habe ein Skript erstellt, um ein Bild als Hintergrund auf die Leinwand zu zeichnen. Wenn wir ein Bild aus einer Datei auf der Festplatte herausnehmen und es einfach auf der Leinwand ausfüllen, funktioniert alles gut, aber wenn wir Pixel aus der BMP-Ressource herausnehmen, die sich in der ex5-Datei selbst befindet, indem wir die Funktion ResourceReadImage() verwenden, sieht das resultierende Bild wie ein winziger und stark vergrößerter Ausschnitt des Quellbildes aus. Was ist der Grund dafür?

Der Kopierpunktzyklus ist falsch, ersetzen Sie ihn durch

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

Und diese Frage - wie eine Liste von Eingabevariablen zu erhalten, die gleiche wie kommt inFrameInputs() Funktion, aber nur in einem Durchgang, ohne Optimierung?

Ja, vor kurzem war eine solche Frage aufgetaucht, ich habe sie irgendwie aus den Augen verloren, und jetzt habe ich selbst eine solche Aufgabe (ich möchte automatisch Set-Dateien erstellen).

In welche Richtung soll gegraben werden? Und wenn sich jemand an diese Diskussion erinnert - wo ist sie (ich kann sie nicht finden)?

Natürlich könnte ich in jedem Expert Advisor eine Funktion schreiben, die eine solche Liste erstellt, aber es wäre besser, eine universelle Bibliotheksfunktion zu haben.
 
Georgiy Merts:

Sie könnten natürlich in jedem EA eine einzelne Funktion schreiben, die eine solche Liste erstellt, aber eine universelle Bibliotheksfunktion wäre besser.

Schauen Sie hier nach.

 
fxsaber:

Schauen Sie hier nach.

Das ist richtig, das ist es!

Ich danke Ihnen vielmals.

 
Ilyas:

1. in MQL nur Unicode, deshalb ist die Zeichengröße 2 Bytes

2. String ist eine Struktur (4 Byte Puffergröße und 8 Byte Zeigergröße)


Die Kopie in die Zeichenkette sollte sein

Wenn dies nicht funktioniert, muss der Fehler an anderer Stelle gesucht werden

Und was passiert, wenn die Größe der zu kopierenden Zeichenfolge größer oder kleiner ist als die Größe des zugewiesenen Puffers?