라이브러리: 전문가 - 페이지 11

 
입력 이름을 알고 있다면 두 번째 옵션이 더 좋습니다. 전문가 어드바이저에서 입력 순서에 대해 생각하지 않아도 됩니다. 그리고 기술적으로도 더 잘 구현되어 있습니다.
#include <fxsaber\Expert.mqh>

void OnStart()
{
  MqlParam Params[2];

  // 상담사 연결 경로
  Params[0].string_value = "Experts\\Test6.ex5";
  Params[0].string_value += "\nexpertmode=5";
  
  Params[1].type = TYPE_INT;
  Params[1].integer_value = 123423;
  EXPERT::AddInputName(Params[1], "inpFirst");

  EXPERT::Run(0, Params);
}


inpFirst가 두 번째 순서라는 사실에도 불구하고 무엇이든 설정할 수 있습니다(이 경우 첫 번째이자 유일한 것으로 설정됨). 설정되지 않은 것은 기본값이 됩니다.

 
실험을 위해 여러 차트에 로봇을 복제해야 했습니다. 저는 이 기능을 통해 이를 수행했습니다.
#include <fxsaber\Expert.mqh> // https://www.mql5.com/ko/code/19003

// 현재 설정이 있는 실행 중인 Expert Advisor를 한 차트에서 다른 차트로 복사합니다.
bool ExpertFromTo( const long ChartSource, const long ChartTarget )
{
  bool Res = false;
    
  MqlParam Params[];
  string Names[];

  const int ExpertMode = EXPERT::Parameters(ChartSource, Params, Names);  
  const int Size = ArraySize(Params);
  
  if (Size)
  {
    Params[0].string_value += "\nexpertmode=" + (string)ExpertMode;
    
    for (int i = 1; i < Size; i++)
      EXPERT::AddInputName(Params[i], (Names[i - 1] == NULL) ? " " : Names[i - 1]);

    Res = EXPERT::Run(ChartTarget, Params);
  }
  
  return(Res);
}


이렇게 사용했습니다.

#property script_show_inputs

input int inAmount = 5; // 클론 수

void OnStart()
{
  const int Size = SymbolsTotal(true);
  
  if (Size > inAmount)
    for (int i = 0, Count = 0; i < Size; i++)
    {
      const string Symb = SymbolName(i, true);
      
      if (Symb != _Symbol)
      {
        ExpertFromTo(0, ChartOpen(Symb, PERIOD_CURRENT)); // 새 차트-심볼에서 현재 EA를 실행합니다.
        Count++;
        
        if (Count == inAmount)
          break;
      }
    }
}
 

하나 이상의 터미널에서 12개의 서로 다른 전문가 어드바이저를 다시 시작해야 하는 작업이 발생합니다. 일반적으로 큰 루틴입니다.

예를 들어, 무언가를 수정했습니다. 그런 다음 ME에서 일괄 컴파일하고 다시 시작합니다. 저는 그런 스크립트를 사용합니다.

// 모든 차트에서 EA를 로드합니다.
input int inInterval = 5; // 차트 재시작 간격(초)

bool ReloadChart( const long Chart )
{
  return (ChartSaveTemplate(Chart, "\\Files\\" + __FILE__ + ".tpl") &&
          ChartApplyTemplate(Chart, "\\Files\\" + __FILE__ + ".tpl") && // 작업을 차트 대기열에 넣습니다.
          ChartGetInteger(Chart, CHART_WINDOW_HANDLE));                 // 대기열을 이동합니다.
}

void OnStart()
{
  const long chartID = ::ChartID();

  for (long Chart = ChartFirst(); (Chart != -1) && !IsStopped(); Chart = ChartNext(Chart))
    if ((Chart != chartID) && (ChartGetString(Chart, CHART_EXPERT_NAME) != NULL) && (ReloadChart(Chart)))    
      Sleep(inInterval * 1000);
}

코드에서 중요한 위치를 표시했습니다. 그것 없이는 템플릿의 적용은 스크립트가 끝날 때까지 없을 것입니다. 비유하면 터미널을 다시로드 한 후 전문가 고문 시작 등을 해결할 수 있습니다.

 
fxsaber:

하나 이상의 터미널에서 12개의 서로 다른 전문가 어드바이저를 다시 시작해야 하는 작업이 발생합니다. 일반적으로 큰 일이죠.

예를 들어, 무언가를 수정했습니다. 그런 다음 ME에서 일괄 컴파일하고 다시 시작합니다. 저는 이 스크립트를 사용합니다.

코드에서 중요한 부분을 강조 표시했습니다. 템플릿이 없으면 스크립트가 끝날 때까지 템플릿이 사용되지 않습니다. 비유하자면 터미널을 다시로드 한 후 전문가 고문 시작 등을 해결할 수 있습니다.

지정된 차트에서 EA의 이름을 얻을 수 있다면 완전한 세트가 될 것입니다. 어렵지 않다면 완료하세요.

 
Vladimir Pastushak:

지정된 차트에 해당 의원의 이름을 적으면 완료됩니다. 괜찮으시다면 작성해 주세요.

ChartGetString(Chart, CHART_EXPERT_NAME)

MT5입니다. 크로스 플랫폼 또는 Expert Advisor에 대한 전체 경로가 필요한 경우 Expert.mqh를 이용하세요.

 
fxsaber:

MT5입니다. 크로스 플랫폼 또는 Expert Advisor에 대한 전체 경로가 필요한 경우 Expert.mqh를 통해.

크로스 플랫폼이 필요합니다...

 
Vladimir Pastushak:

크로스 플랫폼 게임이 필요하세요...

트레이딩, 자동매매 시스템 및 트레이딩 전략 테스트 포럼.

라이브러리: 전문가

FXSABER, 2019.09.12 06:17 오후.

#include <fxsaber\Expert.mqh> // https://www.mql5.com/ko/code/19003

// 실행 중인 EA의 데이터를 출력합니다.
string EAToString( const long Chart_ID = 0 )
{
  string Names[];
  MqlParam Params[];
  
  const int Flag = EXPERT::Parameters(Chart_ID, Params, Names);
  const int Size = ArraySize(Names);
  
  string Str = "Expert " + Params[0].string_value + ", expertmode = " + (string)Flag;
  
  for (int i = 0; i < Size; i++)
    Str += "\n" + Names[i] + " = " + Params[i + 1].string_value;
    
  return(Str);    
}
 
// 파일 입력 변수를 선택한 파일과 동일하게 만듭니다.
bool FileDialogToInput( const string InputName, const long Chart = 0 )
{  
  string FileNames[];
  const bool Res = (FileSelectDialog(MQLInfoString(MQL_PROGRAM_NAME) + " " + _Symbol + " " + EnumToString(_Period) +
                    ": input string " + InputName + " = ",
                    NULL, NULL, FSD_FILE_MUST_EXIST, FileNames, NULL) > 0);
  if (Res)
  {    
    MqlParam Params[];
    string Names[];
  
    const int ExpertMode = EXPERT::Parameters(Chart, Params, Names);  
    const int Size = ArraySize(Params);
    
    if (Size)
    {
      Params[0].string_value += "\nexpertmode=" + (string)ExpertMode;
      
      for (int i = 1; i < Size; i++)
      {
        if (Names[i - 1] == InputName)
          Params[i].string_value = FileNames[0];
        
        EXPERT::AddInputName(Params[i], (Names[i - 1] == NULL) ? " " : Names[i - 1]);
      }
  
      EXPERT::Run(Chart, Params);
    }    
  }
  
  return(Res);
}

이 함수를 사용하면 파일을 입력 변수로 선택할 수 있습니다. 이 구현.

input string inFileName = NULL; // 선택한 파일

#define  TOSTRING(A) #A          

int OnInit()
{
  if (!FileIsExist(inFileName))
    return(FileDialogToInput(TOSTRING(inFileName)) || INIT_FAILED);
    
  // 입력 변수에 유효한 파일이 지정된 경우 코드화합니다.

  return(INIT_SUCCEEDED);
}


시작.


확인을 클릭하고 선택합니다.


열기를 클릭하고 실행 중인 EA의 속성(F7)을 확인합니다.


파일 수에 관계없이 동일하게 작동합니다.

input string inFileName1 = NULL; // 선택한 파일1
input string inFileName2 = NULL; // 선택한 파일2

#define  TOSTRING(A) #A          

int OnInit()
{
  if (!FileIsExist(inFileName1))
    return(FileDialogToInput(TOSTRING(inFileName1)) || INIT_FAILED);

  if (!FileIsExist(inFileName2))
    return(FileDialogToInput(TOSTRING(inFileName2)) || INIT_FAILED);
    
  // 입력 변수에 유효한 파일이 지정된 경우 코드화합니다.

  return(INIT_SUCCEEDED);
}
 
그리고 제가 알기로는 설정 파일에서 매개 변수를 로드하는 것은 아직 지원되지 않나요?
 
traveller00:
그리고 제가 알기로는 설정 파일에서 매개변수를 로드하는 것은 아직 지원되지 않나요?

아직 안 해봤어요. 하지만 매우 간단합니다.