エラー、バグ、質問 - ページ 2614

 
Andrei Kossarev:
インジケータからのバイナリ読み込みがうまくいかない、EAからの同様のコードは問題なく動作する

インジケーターの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型変数を想定しており、文字列を入れると...

 
//+------------------------------------------------------------------+
//|                                                         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:

修正したコード、まだ動作しない

コードを2つの別々の関数に分割してみてください。

1.ファイルを読み、フォローする。

2.スクリーンショットを撮る

そして、その結果がnullであれば、フラグを立ててみてください。そして、関数呼び出しの シーケンスは、最初に読もうとするが、フラグによって読み取りがスキップされ、次にスキム、フラグによって実行され、フラグが切り替わります。そして、その次のtickでファイルが読み込まれます。

 

提案 - ユーザー情報を保存するための別のフィールドを追加し、ブローカーによる変更にアクセスできず、ロールオーバー時に保存することが必須。

要するに、ユーザーによってのみ変更可能な非破壊のフィールドです。

 
Михаил:

提案 - ユーザー情報を保存するための別のフィールドを追加し、ブローカーによる変更にアクセスできず、ロールオーバー時に保存することが必須。

要するに、ユーザーによってのみ変更可能な非破壊のフィールドです。

プラス100600
 
Vladislav Andruschenko:
プラス100600

MTのサーバー部分は書き換えが必要で、ここ10年以上されていないので、近い将来されるでしょう。

注文の状態をファイルに書き込むのですが、ユニバーサルデータベースのテンプレート(https://www.mql5.com/ru/forum/85652/page17#comment_12370424)を使いました。

開発者からの最新オファーです - SQLiteデータベースhttps://www.mql5.com/ru/forum/327940

 
Igor Makanu:

MTのサーバー部分は書き換えが必要で、ここ10年以上されていないので、近い将来されるでしょう。

注文の状態をファイルに書き込むのですが、ユニバーサルデータベースのテンプレート(https://www.mql5.com/ru/forum/85652/page17#comment_12370424)を使いました。

これは開発者からの最新の提案です - SQLite DBhttps://www.mql5.com/ru/forum/327940


はい、私もDBに情報を保存しています。でも......でも......でも......でも......。