Хорошо бы ветку, где будут собраны подобные результаты. Для Оптимизатора актуально.
поддерживаю, я уже не первый раз тестирую и выкладываю результаты не пойми где
но ветку открыть не готов....воспитание плохое, чувство ответственности переполнять будет, а поддерживать в актуальном состоянии топик... я не уверен, что сумею (((
ЗЫ: по примеру выше.... вчера не решил опять писать в этот топик нужно в примере № 2 SymbolInfoTick() на SymbolInfoInteger(_Symbol, SYMBOL_TIME)
ЗЫЗЫ: вот пример где использую, мне удобнее в оптимизаторе искать время с дискретностью в 5 минут - меньше проходов, поэтому время в оптимизаторе вообще сделал на 2 байта в ushort , если 0 - то не используется эта опция, есть еще задел - проверить как с байтами бывтрее работать, но не сейчас - в моем примере один раз в OnInit() на байты разбиваю - не критично
class CWorkTime
{
private:
int m_starthour, m_stophour, m_startmin, m_stopmin;
datetime m_starttime, m_stoptime;
bool UseThisSession, NotIntraDay;
void setTodayWorkTime();
public:
void CWorkTime(constushort worktime);
bool Disable(); };
//+------------------------------------------------------------------+void CWorkTime::CWorkTime(constushort worktime): UseThisSession(true)
{ union UShortToByte { ushort u_short; uchar byte[2]; } ShortToByte;
if(worktime == 0)
{ UseThisSession = false;
Print("EA working time is not used"); }
else
{ ShortToByte.u_short = worktime;
int t = (int)(ShortToByte.byte[0] * 5.625);
m_starthour = (int)(t / 60);
m_startmin = t % 60;
t = (int)(ShortToByte.byte[1] * 5.625);
m_stophour = (int)(t / 60);
m_stopmin = t % 60;
NotIntraDay = m_starthour > m_stophour ? true : false;
setTodayWorkTime();
printf("EA working time start: %d h %d min , end: %d h %d min", m_starthour, m_startmin, m_stophour, m_stopmin); } }
//+------------------------------------------------------------------+void CWorkTime::setTodayWorkTime()
{ MqlDateTime dtstart, dtstop;
TimeCurrent(dtstart);
dtstop = dtstart;
dtstart.hour = m_starthour;
dtstart.min = m_startmin;
dtstop.hour = m_stophour;
dtstop.min = m_stopmin;
m_starttime = StructToTime(dtstart);
m_stoptime = StructToTime(dtstop);
if(NotIntraDay) m_stoptime += 86400; }
//+------------------------------------------------------------------+bool CWorkTime::Disable(void)
{ bool result = false;
if(UseThisSession)
{ datetime time = (datetime)SymbolInfoInteger(_Symbol, SYMBOL_TIME);
if(m_stoptime < time) setTodayWorkTime();
result = time >= m_starttime && time <= m_stoptime ? false : true; }
return(result); };
//+------------------------------------------------------------------+
Можно ли иметь некоторые подробности: почему SocketTlsReadAvailable () возвращает ошибку (5273 ERR_NETSOCKET_IO_ERROR), когда Socket подключен (SocketIsConnected () вернул true)?
Большую часть времени это работает правильно. Однако время от времени я получал сообщение об ошибке, хотя сокет подключен, и через некоторое время (от 1 до 5/6 ошибок) он продолжает работать.
Подскажите в чем, может быть причина ошибки [Too many trade requests] уже на втором вызове обычной OrderSend (после запуска терминала) ?
Посмотрел логи с с понедельника по четверг. Везде одна и та же картина: Первая отправка лимитного ордера проходит удачно, а последующие завершаются с ошибкой [Too many trade requests] . Потом начинают проходить. Из криминального делаю только частые вызовы CopyTickRange в OnInit().
BCS Broker MetaTrader 5 Terminal x64 build 2170 started
Чаровский символ ' ' возращает два байта, вместо одного. Наверно из за того, что в Unicode. А стринги вообще по двенадцать, вместо двух байт, если сравнивать с wchar_t
Как возможный вариант, может где то выравнивание по старшему типу кривит размер стринга?
Из dll, указатель на строку const wchar_t* копирует ровную строку, вот с такими параметрами
С такими параметрами, естественно течёт.
Но строка получается ровная, не одного лишнего символа не проскакивает. И после завершения программы, в журнале экспертов появляется сообщение
И вот такой тест
Показывает следующее
Чаровский символ ' ' возращает два байта, вместо одного. Наверно из за того, что в Unicode. А стринги вообще по двенадцать, вместо двух байт, если сравнивать с wchar_t
Как возможный вариант, может где то выравнивание по старшему типу кривит размер стринга?
string - это объект в котором кроме указателя на строку, еще что-то есть.
Всем привет! Похож, что функция ResourceReadImage() при получении данных из BMP файлов работает некорректно! Нарисовал скрипт для отрисовки картинки, как фона на канве. Если картинку достаём с файла, лежащего на жёстком диске и просто заливаем на канву, то всё работает нормально, но если мы достаём пикселы картинки из BMP ресурса, который находится в самом ex5 файле, с помощью функции ResourceReadImage(), то итоговое фоновое изображение такое, словно это махонький и сильно увеличенный кусочек исходной картинки. В чём причина?
//+------------------------------------------------------------------+//| 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);
}
//+------------------------------------------------------------------+
int Array0[] = {};в принципе как и ожидал вариант №2 быстрее, на 5000 проходов выигрыш около 30 секунд,тоже довольно не плохо
Хорошо бы ветку, где будут собраны подобные результаты. Для Оптимизатора актуально.
Хорошо бы ветку, где будут собраны подобные результаты. Для Оптимизатора актуально.
поддерживаю, я уже не первый раз тестирую и выкладываю результаты не пойми где
но ветку открыть не готов....воспитание плохое, чувство ответственности переполнять будет, а поддерживать в актуальном состоянии топик... я не уверен, что сумею (((
ЗЫ: по примеру выше.... вчера не решил опять писать в этот топик нужно в примере № 2 SymbolInfoTick() на SymbolInfoInteger(_Symbol, SYMBOL_TIME)
ЗЫЗЫ: вот пример где использую, мне удобнее в оптимизаторе искать время с дискретностью в 5 минут - меньше проходов, поэтому время в оптимизаторе вообще сделал на 2 байта в ushort , если 0 - то не используется эта опция, есть еще задел - проверить как с байтами бывтрее работать, но не сейчас - в моем примере один раз в OnInit() на байты разбиваю - не критично
использование:
т.е. результат метода Disable() - труе не рабочее время, фалсе - работаем
Хорошо бы ветку, где будут собраны подобные результаты. Для Оптимизатора актуально.
Можно ли иметь некоторые подробности: почему SocketTlsReadAvailable () возвращает ошибку (5273 ERR_NETSOCKET_IO_ERROR), когда Socket подключен (SocketIsConnected () вернул true)?
Форум по трейдингу, автоматическим торговым системам и тестированию торговых стратегий
Ошибки, баги, вопросы
Alain Verleyen, 2019.08.29 01:17
О функциях mql SocketXXX () это сообщение предназначено в основном для разработчиков Metaquotes: @Renat Fatkhullin, @Slava, @Ilyas
Я использую приведенный ниже код для управления приемом сообщений через защищенное соединение.
Большую часть времени это работает правильно. Однако время от времени я получал сообщение об ошибке, хотя сокет подключен, и через некоторое время (от 1 до 5/6 ошибок) он продолжает работать.
... данные / сообщения получены правильно
2019.08.29 00: 45: 43.019 XXXX (EURUSD, H1) ОШИБКА: 5273, гнездо (1), считано: len = 437
2019.08.29 00: 45: 43.237 XXXX (EURUSD, H1) ОШИБКА: 5273, гнездо (1), считано: len = 1242
... данные / сообщения получены правильно
Ошибка 5273 очень общая и мало помогает. Можно ли получить больше информации о таких ошибках?
Подскажите в чем, может быть причина ошибки [Too many trade requests] уже на втором вызове обычной OrderSend (после запуска терминала) ?
Посмотрел логи с с понедельника по четверг. Везде одна и та же картина: Первая отправка лимитного ордера проходит удачно, а последующие завершаются с ошибкой [Too many trade requests] . Потом начинают проходить. Из криминального делаю только частые вызовы CopyTickRange в OnInit().
BCS Broker MetaTrader 5 Terminal x64 build 2170 started
@Ilyas
Из dll, указатель на строку const wchar_t* копирует ровную строку, вот с такими параметрами
wcsncpy( out, data, wcslen(data) * 2 );С такими параметрами, естественно течёт.
Но строка получается ровная, не одного лишнего символа не проскакивает.
И после завершения программы, в журнале экспертов появляется сообщение
И вот такой тест
Показывает следующее
Чаровский символ ' ' возращает два байта, вместо одного. Наверно из за того, что в Unicode.
А стринги вообще по двенадцать, вместо двух байт, если сравнивать с wchar_t
Как возможный вариант, может где то выравнивание по старшему типу кривит размер стринга?
@Ilyas
Из dll, указатель на строку const wchar_t* копирует ровную строку, вот с такими параметрами
С такими параметрами, естественно течёт.
Но строка получается ровная, не одного лишнего символа не проскакивает.
И после завершения программы, в журнале экспертов появляется сообщение
И вот такой тест
Показывает следующее
Чаровский символ ' ' возращает два байта, вместо одного. Наверно из за того, что в Unicode.
А стринги вообще по двенадцать, вместо двух байт, если сравнивать с wchar_t
Как возможный вариант, может где то выравнивание по старшему типу кривит размер стринга?