Errori, bug, domande - pagina 2590

 

Potete dirmi quale potrebbe essere la ragione dell'errore [Too many trade requests] alla seconda chiamata della routine OrderSend (dopo aver avviato il terminale)?

Ha esaminato i registri da lunedì a giovedì. Ho visto la stessa cosa ovunque: il primo ordine limite viene inviato con successo e tutti gli ordini successivi ritornano con l'errore [Troppe richieste di trade]. Poi iniziano a passare. L'unica azione criminale è la frequente chiamata di CopyTickRange in OnInit().


BCS Broker MetaTrader 5 Terminal x64 build 2170 iniziato

 
Ilyas:


@Ilyas

Da dll, il puntatore alla stringa const wchar_t* copia una stringa pari, con questi parametri

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

Con questi parametri, ovviamente, perde.

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

Ma la stringa risulta pari, non un solo carattere in più sfugge.
E dopo aver terminato il programma, il registro di Expert Advisor mostra un messaggio

2019.10.11 03:44:39.202 ExampleDll      1 leaked strings left


E c'è una tale prova.

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

Mostra quanto segue

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

Il carattere char ' ' restituisce due byte invece di uno. Probabilmente perché è in Unicode.
E la stringa restituisce dodici byte invece di due byte rispetto a wchar_t.

Come possibile via, forse l'allineamento di tipo superiore distorce la dimensione della stringa da qualche parte?


 
Roman:

@Ilyas

Da dll, il puntatore alla stringa const wchar_t* copia una stringa pari, con questi parametri

Con questi parametri, ovviamente, perde.

Ma la stringa risulta pari, non un solo carattere in più sfugge.
E dopo aver terminato il programma, il registro di Expert Advisor mostra un messaggio


E una tale prova

Mostra quanto segue

Il carattere char ' ' restituisce due byte invece di uno. Probabilmente perché è in Unicode.
E la stringa restituisce dodici byte invece di due byte rispetto a wchar_t.

Come possibile via, forse l'allineamento di tipo superiore distorce la dimensione della stringa da qualche parte?


string è un oggetto che ha qualcosa di diverso da un puntatore a una stringa.
 
Sembra che la funzione ResourceReadImage() non funzioni correttamente quando si ottengono dati da file BMP! Ho fatto uno script per disegnare un'immagine come sfondo su tela. Se prendiamo un'immagine da un file che si trova su un disco rigido e la riempiamo sulla tela, tutto funziona bene, ma se prendiamo i pixel dalla risorsa BMP che si trova nel file ex5 stesso usando la funzione ResourceReadImage(), l'immagine risultante sembrerà una fetta minuscola e molto ingrandita dell'immagine sorgente. Qual è la ragione?
//+------------------------------------------------------------------+
//|                                             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:

@Ilyas

Dalla dll, il puntatore const wchar_t* stringa copia una semplice stringa, con questi parametri

Con questi parametri, ovviamente, perde.

Ma la stringa risulta essere pari, senza alcun carattere extra mancante.
E dopo aver terminato il programma, il registro di Expert Advisor mostra un messaggio


E c'è una tale prova.

Mostra quanto segue

Il carattere char ' ' restituisce due byte invece di uno. Probabilmente perché è in Unicode.
E la stringa restituisce dodici byte invece di due byte rispetto a wchar_t.

Come possibile via, forse l'allineamento di tipo superiore distorce la dimensione della stringa da qualche parte?


1. in MQL solo Unicode, ecco perché la dimensione del carattere è di 2 byte

2. la stringa è una struttura (4 byte di dimensione del buffer e 8 byte di dimensione del puntatore)


La copia su stringa dovrebbe essere

wcscpy(out,data);

Se questo non funziona, l'errore deve essere trovato altrove

 
Nikolay Kositsin:
Sembra che la funzione ResourceReadImage() non funzioni correttamente quando si ottengono dati da file BMP! Ho fatto uno script per disegnare un'immagine come sfondo su tela. Se prendiamo i pixel dell'immagine dal file che si trova sull'HDD e li riempiamo sulla tela, tutto funziona bene, ma se prendiamo i pixel dell'immagine dalla risorsa BMP che si trova nel file ex5 stesso usando la funzione ResourceReadImage(), l'immagine di sfondo risultante sembrerà una piccola fetta molto ingrandita dell'immagine sorgente. Qual è la ragione?

Il ciclo del punto di copia è sbagliato, sostituirlo con

//--- заливаем фон из массива на канву
   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 questa domanda - come ottenere una lista di variabili di input, la stessa che arriva nella funzioneFrameInputs() , ma solo in un passaggio, senza ottimizzazione?

Sì, abbastanza recentemente una domanda del genere era venuta fuori, l'ho in qualche modo persa di vista, e ora ho anch'io un compito del genere (voglio fare i set-file automaticamente).

In che direzione scavare? E se qualcuno si ricorda di quella discussione - dove si trova (non riesco a trovarla)?

Naturalmente, in ogni Expert Advisor potrei scrivere una funzione che crei una tale lista, ma sarebbe meglio avere una funzione di libreria universale.
 
Georgiy Merts:

Si potrebbe, naturalmente, scrivere una singola funzione in ogni EA che crei una tale lista, ma una funzione di libreria universale sarebbe meglio.

Date un'occhiata qui.

 
fxsaber:

Date un'occhiata qui.

Proprio così, è così!

Grazie mille.

 
Ilyas:

1. in MQL solo Unicode, ecco perché la dimensione del carattere è di 2 byte

2. la stringa è una struttura (4 byte di dimensione del buffer e 8 byte di dimensione del puntatore)


La copia su stringa dovrebbe essere

Se questo non funziona, l'errore deve essere trovato altrove

E cosa succede se la dimensione della stringa da copiare è più grande o più piccola della dimensione del buffer allocato?