라이브러리: 멀티 테스터 - 페이지 56

 

때로는 가격 내역을 표 형태로 확인해야 할 때가 있습니다. 이 작업은 막대/틱 탭을 선택한 다음 CTRL+U를 눌러 수행할 수 있습니다. 필요한 간격을 직접 입력합니다. 지루합니다.


그렇기 때문에 다음 전문가 조언자가 시연하는 추가 기능을 만들었습니다.

#include <fxsaber\MultiTester\MTTester.mqh> // https://www.mql5.com/ko/code/26132
#include <fxsaber\Keyboard\Keyboard.mqh> // https://www.mql5.com/ko/code/48393

input bool inTicks = true; // 참 - 틱, 거짓 - 막대
input int inBefore = -60; // 이전(초)
input int inAfter = 60;   // 몇 초 후
input ENUM_TIMEFRAMES inPeriod = PERIOD_CURRENT; // 마침표(막대 모드)

datetime GetTime( const int X )
{
  int Window;
  datetime Res;
  double Price;
    
  return(ChartXYToTimePrice(0, X, 0, Window, Res, Price) ? Res : 0);
}

void OnChartEvent( const int32_t id, const long &lparam, const double&, const string& )
{
  if ((id == CHARTEVENT_CLICK) && KEYBOARD::IsControl())
  {
    const datetime Time = GetTime((int)lparam);

    if (Time)
    {
      if (inTicks)
        MTTESTER::CopyTicks(_Symbol, Time + inBefore, Time + inAfter);
      else
        MTTESTER::CopyRates(_Symbol, inPeriod, Time + inBefore, Time + inAfter);      
    }    
  }
}


차트의 필요한 위치를 클릭(CTRL을 누른 상태)하면 해당 표 형식의 데이터를 한 번에 자동으로 가져옵니다.

선택한 함수는 특정 데이터 필드를 채우고 쿼리하기만 하면 됩니다. 그런 다음 GUI를 통해 관심 있는 내용을 확인할 수 있습니다. 일반적으로 자동화.

 
여러 가지 편리한 기능을 결합한 EA 도구를 만드는 것도 좋은 아이디어가 될 수 있습니다.
 

5430 작업을 준비할 때 창이 계속 깜박입니다.

이 문제를 어떻게 해결하나요?

 
Aleksei Skrypnev #:

5430 과제를 준비할 때 창이 계속 깜박입니다.

이 문제를 어떻게 해결하나요?

이렇게 하세요.
Попробуйте загрузить все файлы в архиве.
Попробуйте загрузить все файлы в архиве.
  • 2025.12.22
  • www.mql5.com
если бы время файлов в архиве совпадало со временем модификации в кодобазе. Не соответствует времени изменения конкретного файла. Я вижу корректную структуру после разархивирования а ведь сам редактор позволяет загрузить все эти файлы именно так
 
fxsaber #:
따라서.

훌륭한 테마입니다. 그러나 모든 것이 개별적으로 여전히 깜박이기 전에 다운로드했습니다.

멀티테스터_예제.mq5 파일에서 보았습니다.

파일에 줄을 추가했습니다.

#define  FAKE // 제거 - 바이패스하여 코드를 KB에 배치합니다.

#ifdef  FAKE
  void OnStart() {}
#else // #ifdef FAKE
#endif // #ifdef FAKE #else

주석을 달았나요 아니면 다르게 해야 하나요? 아니면 이 4줄을 모두 삭제할 수 있나요?

//#define FAKE // 제거 - KB에 코드를 배치하기 위해 우회합니다.

#ifdef FAKE// void OnStart() {}

#else // #ifdef FAKE

#endif // #ifdef FAKE #else


추신 : 이 줄이없는 이전 작업 목록을 가져 와서 깜박이는 것을 보았습니다. 새 줄을 추가하면 깜박이지 않습니다.

하지만 제가 한 줄만 올바르게 주석 처리했나요?

 
Aleksei Skrypnev #:

훌륭한 테마입니다. 그러나 이전에 다운로드 한 모든 것이 여전히 개별적으로 깜박입니다.

멀티테스터_예제.mq5 파일에서 이 문제를 발견했습니다.

줄을 추가했습니다.

이런 식으로 주석을 달았나요 아니면 다르게 해야 하나요? 아니면 일반적으로 이 4줄을 모두 삭제해도 되나요?


추신 : 이 줄이없는 이전 작업 목록을 가져 와서 깜박이는 것을 보았습니다. 새 줄을 추가하면 깜박이지 않습니다.

하지만 제가 한 줄만 올바르게 댓글을 달았나요?

댓글을 제거하거나 이 네 줄을 완전히 삭제하는 것이 맞습니다.
 
안녕하세요, fxsaber 여러분! 문제 해결을 도와주세요. 제 스크립트에는 아카이브 함수가 있는데, 이는 훌륭한 MTTESTER 라이브러리의 도움으로 개발했습니다. 다음 줄에 Setin을 Tester 폴더에 씁니다: if(!kernel32::CopyFileW(SrcPath,DstPath,false)) // 파일 샌드박스에서 Tester 폴더로 Setin을 덮어씁니다. "보관 후"라는 이름의 세트를 얻습니다. 그러나 인코딩 때문에 추가 재작업에는 적합하지 않습니다. 그러나 전략 테스터에서 로봇에 수동으로 쓴 다음 "로봇에 수동으로 쓰고 저장 후"라는 이름으로 저장하면 이 세트는 이미 적합합니다. 그리고 단순히 헤더를 변경하는 것이 아니라 다른 문제가 있습니다. 저는 철인(Qwen, Deep Seek)에게 도움을 요청했고, 그들은 "ReloadSetsFromCommonFixed" 스크립트를 생성했습니다. 이 스크립트에는 많은 훌륭한 기능이 있으며 이 줄을 제외하고는 작동합니다: if(!FileCopy(source_path, FILE_COMMON, dest_path, FILE_COMMON)). 세트가 복사되지만 확인 출력에서 인코딩으로 인해 출력이 아브라카다브라로 표시됩니다. Iron은 4 가지 솔루션을 제공했지만 그 중 어느 것도 작동하지 않았습니다 (텍스트에 모두 있음). 마지막 희망은 가죽입니다. 아카이브 함수에서이 줄을 변경할 수있는 방법이 있습니까 : if(!kernel32::CopyFileW(SrcPath,DstPath,false)) "로봇에 수동으로 쓰고 저장 한 후"필요한 형식으로 로봇에 수동으로 쓰는 것도 시뮬레이션 할 수 있습니까? 안부, 알렉산더
 
klycko #:
보관 기능에서 이 줄을 변경할 수 있는 방법이 있나요?

여기에서 (열린 창에서 주소 표시 줄에서 Enter 키를 누릅니다) 설정된 레코드를 찾았습니다. 이 플래그가 필요할 가능성이 높습니다.

FileOpen(FileName, FILE_WRITE | FILE_UNICODE | FILE_TXT);
 

이 플래그가 많은 도움이 되었고 보관 문제가 해결되었습니다. 이제 결과가 올바른 형식으로 표시됩니다.

정말 감사합니다!

하지만 내 스크립트 Nocturne 에서 명령이 제대로 작동하지 않습니다 :

prWrite0 = MTTESTER::SetSettings2(Settings); // 로봇에 설정 쓰기

실행 후 prWrite0 = true이지만.

아마도 폴더에서 설정 세트를 읽을 때 다시 플래그의 문제일 것입니다.

이 작업은 다음과 같은 줄이 있는 GetKthFileContent 함수에 의해 수행됩니다:

int handle = FileOpen(full_path, FILE_READ | FILE_WRITE | FILE_UNICODE | FILE_TXT | FILE_COMMON);

아래 줄의 변형도 작동하지 않습니다:

// int handle = FileOpen(full_path, FILE_READ | FILE_TXT | FILE_COMMON); // Source variant line

// int handle = FileOpen(full_path, FILE_READ | FILE_UNICODE | FILE_TXT | FILE_COMMON);

다음 명령:

prRead0 = MTTESTER::GetSettings(Control); // 방금 설치한 로봇 설정을 읽습니다.

가 올바르게 작동하고 실행 후 prRead0 = true가 됩니다.

그러나 제어 네트워크에서는 원래 로봇에 수동으로 로드되었기 때문에 prMFI=true가 됩니다. 즉, 로봇에 대한 쓰기가 실제로 발생하지 않았음에도 불구하고 쓰기 기호 prWrite0 = true가 표시됩니다.

원래 네트워크에서 prHEX=true

로봇의 원래 네트워크에서 prMFI=true

MTTESTER::SetSettings2(Settings) 명령은 작동하지만 이러한 설정이 로봇에 나타나지 않습니다.

여기서 무엇이 문제일까요?

안부, 알렉산더

 
klycko #:

그렇다면 여기서 문제는 무엇일까요?

저는 플래그를 공부하는 데 신경 쓰지 않고 테스터 세트 파일을 저장하고 로드하는 작업 코드를 작성하기로 결정했습니다.

// 테스터의 설정 파일을 로드/저장합니다.
#property script_show_inputs

input bool inLoad = true; // 설정 로드/저장 - 참/거짓

#include <fxsaber\MultiTester\MTTester.mqh> // https://www.mql5.com/ko/code/26132

void OnStart()
{
  const string FileName = __FILE__ + ".set";
  
  string Settings;
  ushort Words[];  
      
  if (inLoad) // 설정을 로드합니다.
  {
    Print("Load: " + (string)FileLoad(FileName, Words));
    Settings = ShortArrayToString(Words, 1); // 1 - 유니코드
    
    Print(MTTESTER::SetSettings(Settings));
  
  }
  else if (MTTESTER::GetSettings(Settings)) // 설정을 저장합니다.
  {
    Words[ArrayResize(Words, 1) - 1] = 0xFEFF; // 1 - 유니코드
    
    StringToShortArray(Settings, Words, ArraySize(Words));    
    Print("Save: " + (FileSave(FileName, Words) ? (string)ArraySize(Words) : "error"));
  }
}


스크립트를 통해 세트 파일을 저장(inLoad = false)한 다음 그파일에서 직접 변경하고 스크립트를 통해 테스터에 로드(inLoad = true) 할 수 있습니다.

작동하면 해당 소스의 해당 부분을 직접 가져와 보세요.