오류, 버그, 질문 - 페이지 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 변수를 예상하고 거기에 문자열을 넣습니다...

 
//+------------------------------------------------------------------+
//|                                                         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. 스크린샷.

결과가 0이면 플래그를 설정해 보십시오. 그리고 함수 호출 순서, 먼저 읽기를 시도하지만 플래그에 의해 읽기를 건너뛴 다음 화면이 캡처되고 플래그가 실행되고 플래그가 플래그로 전환됩니다. 그 후 다음 틱에서 파일을 읽습니다.

 

제안은 사용자 정보를 저장하기 위한 필드를 하나 더 추가하는 것입니다. 이 필드는 브로커가 변경할 수 없으며 롤오버 동안 보존해야 합니다.

한마디로 사용자만이 변경할 수 있는 파괴 불가능한 필드.

 
Михаил :

제안은 사용자 정보를 저장하기 위한 필드를 하나 더 추가하는 것입니다. 이 필드는 브로커가 변경할 수 없으며 롤오버 동안 보존해야 합니다.

간단히 말해 사용자만 수정할 수 있는 파괴 불가능한 필드입니다.

플러스 100600
 
Vladislav Andruschenko :
플러스 100600

그렇지 않습니다. 다시 작성해야 하는 MT의 서버 부분입니다. 그들은 10년 이상 동안 그것을 하지 않았으므로 가까운 장래에 그렇게 될 것입니다. 그들이 준 것을 사용하십시오 - 파일, 전역 터미널 변수 , 데이터베이스

주문 상태를 파일에 씁니다. 여기 내 범용 데이터베이스 템플릿이 있습니다. https://www.mql5.com/en/forum/85652/page17#comment_12370424

다음은 개발자의 최신 제안입니다. - SQLite DB https://www.mql5.com/ru/forum/327940

 
Igor Makanu :

그렇지 않습니다. 다시 작성해야 하는 MT의 서버 부분입니다. 그들은 10년 이상 동안 이를 수행하지 않았으므로 가까운 장래에 그렇게 될 것입니다. 그들이 준 파일, 전역 터미널 변수를 사용하십시오 , 데이터베이스

주문 상태를 파일에 씁니다. 여기 내 범용 데이터베이스 템플릿이 있습니다. https://www.mql5.com/en/forum/85652/page17#comment_12370424

다음은 개발자의 마지막 제안입니다. - SQLite DB https://www.mql5.com/en/forum/327940


예, 또한 데이터베이스에 정보를 저장합니다. 하지만 하지만..