Ошибки, баги, вопросы - страница 2614

 
Andrei Kossarev:
Не работает чтение бинарного файла из индикатора, аналогичный код из советника работает без проблем!

Скорее всего, ChartScreenShot в индикаторах работает асинхронно.

 
fxsaber:

Скорее всего, ChartScreenShot в индикаторах работает асинхронно.

Проверял, поэтому и поставил цикл

 
Andrei Kossarev:

Проверял, поэтому и поставил цикл

Окончание цикла не гарантирует наличие файла.

 

Andrei Kossarev:
Не работает чтение бинарного файла из индикатора, аналогичный код из советника работает без проблем!

void TestPhoto() {
   string name;
   MqlDateTime  dtLocal;
   TimeToStruct(TimeLocal(), dtLocal);
   string date = IntegerToString(dtLocal.year) + IntegerToString(dtLocal.mon, 2, '0') + IntegerToString(dtLocal.day, 2, '0');
   string time = IntegerToString(dtLocal.hour, 2, '0') + "." + IntegerToString(dtLocal.min, 2, '0') + "." + IntegerToString(dtLocal.sec, 2, '0');
   name = "ScreenShots/" + date + "/" + _Symbol + "_" +date + "_" + time + ".png";
   
   if (!ChartScreenShot(0, name, 1920,1200, ALIGN_RIGHT))
      return;

   ResetLastError();
   
   for (int i=0; i < 100000; i++){
      if (FileIsExist(name,false) && FileSize(name) > 0)
         break;
   }
   //---
   int flags=FILE_READ|FILE_BIN|FILE_SHARE_READ;

   //---
   int file=FileOpen(name,flags);
   if(file<0) {
      Print("Операция FileOpen неудачна, ошибка ",GetLastError());
      return;
}
   uchar photo[];
   FileReadArray(file,photo);
   FileClose(file);
   
   Print(ArraySize(photo));
}

А вас не смущает что в вашем коде имеются ошибки?

ulong  FileSize( 
   int  file_handle      // handle файла 
   );

Функция FileSize ожидает переменную int а вы туда суёте string...

 
//+------------------------------------------------------------------+
//|                                                         Test.mq5 |
//|                        Copyright 2019, MetaQuotes Software Corp. |
//|                                             https://www.mql5.com |
//+------------------------------------------------------------------+
#property copyright "Copyright 2019, MetaQuotes Software Corp."
#property link      "https://www.mql5.com"
#property version   "1.00"
#property indicator_chart_window
#property indicator_plots   1
#property indicator_buffers 1
#include <Trident\TCoreMain.mqh>
//+------------------------------------------------------------------+
//| Custom indicator initialization function                         |
//+------------------------------------------------------------------+
int OnInit()
  {
   ::EventSetMillisecondTimer(500);
   return(INIT_SUCCEEDED);
  }
  
  void OnDeinit(const int reason) {
   ::EventKillTimer();
}

void OnTimer() {
   ::EventKillTimer();
   TestPhoto();
}
//+------------------------------------------------------------------+
//| Custom indicator iteration function                              |
//+------------------------------------------------------------------+
int OnCalculate(const int rates_total,
                const int prev_calculated,
                const datetime &time[],
                const double &open[],
                const double &high[],
                const double &low[],
                const double &close[],
                const long &tick_volume[],
                const long &volume[],
                const int &spread[])
  {
//---
   
//--- return value of prev_calculated for next call
   return(rates_total);
  }
//+------------------------------------------------------------------+

void TestPhoto() {
   string name;
   MqlDateTime  dtLocal;
   TimeToStruct(TimeLocal(), dtLocal);
   string date = IntegerToString(dtLocal.year) + IntegerToString(dtLocal.mon, 2, '0') + IntegerToString(dtLocal.day, 2, '0');
   string time = IntegerToString(dtLocal.hour, 2, '0') + "." + IntegerToString(dtLocal.min, 2, '0') + "." + IntegerToString(dtLocal.sec, 2, '0');
   name = "ScreenShots/" + date + "/" + _Symbol + "_" +date + "_" + time + ".png";
   
   if (!ChartScreenShot(0, name, 1920,1200, ALIGN_RIGHT))
      return;

   ResetLastError();
   
   //---
   int flags=FILE_READ|FILE_BIN|FILE_SHARE_READ;

   //---
   int file=FileOpen(name,flags);
   if(file<0) {
      Print("Операция FileOpen неудачна, ошибка ",GetLastError());
      return;
   }
   
   for (int i=0; i < 100000; i++){
      if (FileSize(file) > 0)
         break;
   }
   
   uchar photo[];
   FileReadArray(file,photo);
   FileClose(file);
   
   Print(ArraySize(photo));
}

Исправленный код, все равно не работает

 
Andrei Kossarev:

Исправленный код, все равно не работает

Попробуйте разделить код на две отдельных функции:

1. Чтение файла и последующие действия.

2. Снятие скрина.

И если результат будет нулевой, то попробуйте поставить флаг. И последовательность вызова функций, сначала попытка прочесть, но по флагу чтение пропускается, потом снятие скрина, по флагу выполняется и переключается флаг. И после этого, на следующем тике читается файл.

 

Предложение - добавить ещё одно поле для хранения пользовательской информации, не доступное для изменения брокером и в обязательном порядке сохраняющееся при ролловерах.

Короче неуничтожимое поле, доступное только ползователю для изменения.

 
Михаил:

Предложение - добавить ещё одно поле для хранения пользовательской информации, не доступное для изменения брокером и в обязательном порядке сохраняющееся при ролловерах.

Короче неуничтожимое поле, доступное только ползователю для изменения.

Плюс 100600
 
Vladislav Andruschenko:
Плюс 100600

не будет, это серверную часть МТ нужно переписывать, за 10+ лет не сделали, значит так и будет в ближайшее время, пользуйтесь тем что дали - файл, глобальные переменные терминала, БД

я в файл пишу состояние ордеров, вот шаблон своей универсальной БД выкладывал https://www.mql5.com/ru/forum/85652/page17#comment_12370424

вот последнее предложение от разработчиков -   БД SQLite https://www.mql5.com/ru/forum/327940 

 
Igor Makanu:

не будет, это серверную часть МТ нужно переписывать, за 10+ лет не сделали, значит так и будет в ближайшее время, пользуйтесь тем что дали - файл, глобальные переменные терминала, БД

я в файл пишу состояние ордеров, вот шаблон своей универсальной БД выкладывал https://www.mql5.com/ru/forum/85652/page17#comment_12370424

вот последнее предложение от разработчиков -   БД SQLite https://www.mql5.com/ru/forum/327940 


Да я тоже храню информацию в бд. Но .но но.. 

Причина обращения: