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

 
fxsaber:

아, 그 러시아 해커들.... 글쎄요, 조금 망쳤는데 왜 모든 전문가를 막으세요?

그건 그렇고, 버그도 있습니다. 스태틱이 작동하지 않습니다.

 
Алексей Тарабанов:

그건 그렇고, 버그도 있습니다. 정적이 작동하지 않습니다.

여기에 오류가 표시되지 않았습니다.

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

초보자의 질문 MQL5 MT5 메타트레이더 5

fxsaber, 2018.08.02 17:09

// SL이 트리거되면 모든 전문가 어드바이저를 중지합니다.

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

void OnTrade()
{
  static int PrevTotal = OrdersHistoryTotal();
  const int Total = OrdersHistoryTotal();
  
  for (int i = Total - 1; i >= PrevTotal; i--)
    if (OrderSelect(i, SELECT_BY_POS, MODE_HISTORY) && (OrderCloseReason() == DEAL_REASON_SL))
    {
      long Chart = ChartFirst();
  
      while (Chart != -1)
      {
        if ((Chart != ChartID()) && EXPERT::Is(Chart))
          EXPERT::Remove(Chart);
  
        Chart = ChartNext(Chart);
      }

      break;
    }        
    
  PrevTotal = Total;
}
 
// 이 인디케이터는 전문가 트레이더를 통한 모든 거래 시도를 차단합니다. 손으로만 거래할 수 있습니다.
// 터미널이 실행 중일 때 전원을 끄고 싶은 유혹을 피하기 위해 표시기는 보이지 않는 모드로 설정되어 있습니다.

#property indicator_chart_window
#property indicator_buffers 0
#property indicator_plots   0

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

void MyAlert( const string Str )
{
  string StrArray[];
  
  for (int i = StringSplit(Str, '\n', StrArray) - 1; i >= 0; i--)
    Alert(StrArray[i]);
}

bool NextOnCalculate( const string SymbName = NULL )
{
  const SYMBOL Symb(SymbName);
  
  MqlRates Rates[1] = {0};
  Rates[0].time = TimeCurrent();
          
  return(Symb.IsCustom() ? Symb.CloneRates(Rates) : ChartSetSymbolPeriod(0, _Symbol, _Period));
}

const SYMBOL SymbTimer("Timer");

void OnInit()
{
  if (_Symbol == SymbTimer.Name)
    ChartIndicatorGet(0, 0, ChartIndicatorName(0, 0, 0));    
  else if (SymbTimer.IsExist() && SymbTimer.On() && NextOnCalculate(SymbTimer.Name))
  {
    iCustom(SymbTimer.Name, PERIOD_CURRENT,
            ".." + StringSubstr(MQLInfoString(MQL_PROGRAM_PATH), StringLen(TerminalInfoString(TERMINAL_PATH)) + 5));
    
    SymbTimer.Off(); 
  }
}

string GetExpertData( const ulong Chart = 0 )
{
  string Str = NULL;

  MqlParam Parameters[];
  string Names[];

  if (EXPERT::Parameters(Chart, Parameters, Names))
  {
    Str += "\n" + ::ChartSymbol(Chart) + " " + ::EnumToString(::ChartPeriod(Chart)) + " " + Parameters[0].string_value + "\n";

    const int Amount = ::ArraySize(Names);

    for (int i = 0; i < Amount; i++)
      Str += (string)i + ": "+ Names[i] + " = " + Parameters[i + 1].string_value + "\n";
  }

  return(Str);
}

void Active( const int AlertTime = 5 )
{
  static const uint StartTime = GetTickCount();
  static uint PrevInterval = 0;
  const uint Interval = (GetTickCount() - StartTime) / 1000;
  const string Str = MQLInfoString(MQL_PROGRAM_NAME) + ": I've been watching you for " + TimeToString(Interval, TIME_SECONDS);
    
  long Chart = ChartFirst();

  if (Chart != -1)  
    do
    {
      if (EXPERT::Is(Chart))
        MyAlert(GetExpertData(Chart) + "Removed - " + (string)EXPERT::Remove(Chart));
        
      ChartSetString(Chart, CHART_COMMENT,  Str);
      ChartRedraw(Chart);
    }
    while ((Chart = ChartNext(Chart)) != -1);    
  else if (!(Interval % AlertTime) && (Interval != PrevInterval))
  {
    MyAlert(Str);
    
    PrevInterval = Interval;
  }
}

int OnCalculate( const int, const int, const int, const double &[] )
{
  static int i = 0;
  
  if ((_Symbol == SymbTimer.Name) && NextOnCalculate())
    Active();
  else if (i++ > 0)
    ChartIndicatorDelete(0, 0, ChartIndicatorName(0, 0, ChartIndicatorsTotal(0, 0) - 1));           
    
  return(0);
}


ZY 터미널을 재시작하면 가끔 (MT5 빌드 1881) 프로세스가 중단되는 경우가 있습니다. 해당 프로세스 terminal64.exe를 강제로 제거하고 메타트레이더 5\Bases\Custom\history\Timer\*.hcc를 삭제하면 이 문제를 해결할 수 있습니다.

 
감사합니다. 멋지네요!
 

기사에서 저자는이 라이브러리 결과의 뉘앙스를 매우 자세하게 강조했습니다. 꼭 읽어보시기 바랍니다.

Методы дистанционного управления работой советников
Методы дистанционного управления работой советников
  • www.mql5.com
В наше время информационных технологий использование различных роботов и электронных экспертов для торговли на финансовых рынках стало довольно обычным явлением. Главными преимуществами электронных экспертов принято считать безукоризненное выполнение алгоритма и безустанная работа 24 часа в сутки. Для их круглосуточного использования арендуются...
 
Andrey Khatimlianskii:

MT4는 파일저장 및 파일로드(각각 3줄로 작성됨)보다 훨씬 더 많은 기능이 누락되어 있습니다:

  1. 차트_전문가_이름이 없습니다(다른 모든 뉘앙스를 수정한 후 이름 태그를 제외하고는 대체할 것이 없습니다).

제 프로젝트에서는 이런 식으로 해결했습니다("이름" 태그 사용):

      void Update()
      {                
         long chartId = ChartFirst();
         
         while(chartId > 0)
         {
            #ifdef __MQL4__
            string chartEAName = GetChartEAName(chartId);
            #endif 
            
            #ifdef __MQL5__     
            string chartEAName = ChartGetString(chartId, CHART_EXPERT_NAME);
            #endif
            
            if(chartEAName == m_eaName)
            {
               // ...
            }
            
            chartId = ChartNext(chartId);
         }
      }
      
      #ifdef __MQL4__
      string GetChartEAName(const long chartId)
      {
         if(!SaveTemplate(chartId))
         {
            return "";
         }
         
         string result = "";
         
         int handle = FileOpen("ea_name_checking.tpl",FILE_TXT|FILE_READ);
         if(handle == INVALID_HANDLE)
         {
            Print
            (
               "Error in ", __FILE__,", line ", __LINE__,
               ": can't open template file 'ea_name_checking.tpl', error code = ", GetLastError()
            );
         }
         else
         {
            string text = "";
            
            while(!FileIsEnding(handle)) 
            { 
               text = text + FileReadString(handle, (uint)FileSize(handle)) +"\r\n";
            }
            
            SubstringParser eaSectionTextParser(text, "<expert>", "</expert>");            
            string eaSectionText = eaSectionTextParser.Get();
            
            if(StringTrimLeft(StringTrimRight(eaSectionText)) != "")
            {
               SubstringParser eaNameParser(eaSectionText, "name=","\r\n");
               string eaName = StringTrimLeft(StringTrimRight(eaNameParser.Get()));
               
               if(eaName != "")               
               {
                  result = eaName;
               }
            }            
         }
         
         FileClose(handle);
         FileDelete("ea_name_checking.tpl");
         
         return result;
      }
      
      bool SaveTemplate(const long chartId)
      {
         ResetLastError();
         
         if(!ChartSaveTemplate(chartId, "\\Files\\ea_name_checking.tpl"))
         {            
            Print
            (
               "Error in ", __FILE__,", line ", __LINE__,
               ": can't save template to the file 'ea_name_checking.tpl', error code = ", GetLastError()
            );
            
            return false;
         }
         
         return true;
      }      
      #endif

SubstringParser에 이 코드가 있습니다:

#property strict

class SubstringParser
{
   private:
      string m_text;
      string m_subStart;
      string m_subEnd;
   
   public:
      SubstringParser(const string text, const string subStart, const string subEnd)
      {
         m_text = text;
         m_subStart = subStart;
         m_subEnd = subEnd;
      }
      
      string Get()
      {
         int startPhraseLengt = StringLen(m_subStart);
         int startPos = StringFind(m_text, m_subStart) + startPhraseLengt;
         int endPos = StringFind(m_text, m_subEnd, startPos);
                 
         if(startPos >= startPhraseLengt && endPos > startPos)
         {
            return StringSubstr(m_text, startPos, endPos - startPos);      
         }
         else
         {
            return "";
         }
      }
};

즉, 차트 템플릿을 저장하고, 읽고, 구문 분석하고, 전문가 어드바이저의 이름을 찾습니다. 아직은 목발이지만 지금까지는 (약 두 달 동안) 잘 작동합니다. 일반 HDD를 사용하는 경우이 작업을 너무 자주 (예 : 매 틱마다) 수행해서는 안된다고 생각합니다. 언젠가 차트_전문가_이름이 MQL4에 나타나길 바랍니다 .

 
스크립트 실행을 지원하는 새 버전이 출시되나요?
 
Stanislav Korotky:
스크립트 실행을 지원하는 새 버전이 나오나요?

이 예제가 작동하지 않나요?

 
fxsaber:

이 예제가 작동하지 않나요?

제 사용 사례와 매우 유사하지 않습니다. 이 예제에 대한 주요 질문은 음악 파일의 이름을 전역 변수를 통해 전달하는 대신 스크립트 매개 변수에 지정하면 어떻게 되나요? 제 프로젝트를 비공개 메시지로 보내드릴 수 있습니다.

 
Stanislav Korotky:

제 사용 사례와 매우 유사하지 않습니다. 예제에 대한 주요 질문은 음악 파일의 이름이 전역 변수를 통해 전달되는 대신 스크립트 매개 변수에 지정되면 어떻게 되는가 하는 것입니다.

그 이유는 전혀 기억나지 않지만 입력 매개 변수가 있는 옵션이 즉시 제안됩니다. 예제가 너무 꼬였으니 MT5의 한계일 것입니다.