파일에서 Expert Advisor 자동 초기화 및 재초기화

 
작업: 재초기화 후 Expert Advisor 환경(위치 데이터, 카운터 등) 복원, 시스템 장애 시 재부팅 등

솔루션: 전문가의 동적 변수에 대한 각 변경 사항을 파일에 저장합니다. OnInit() 동안 파일의 모든 것이 제자리에 다시 로드됩니다.

그러나 다음과 같은 경우 변수의 과거 상태를 파일에서 로드할 수 없습니다.
  • 파일 구조가 변경되었습니다(버전이 일치하지 않음, 전문가의 새 빌드). 초등학교 체크, 문제 없습니다.
  • 마지막으로 봇에 결함이 발생했습니다. 중지에서 끙끙거리거나 정지하거나 오류 한계를 넘었다고 가정해 보겠습니다. 그러면 파일에 즉시 오류로 이어지는 변수가 있을 수 있습니다. 부분적으로 이를 확인하는 것은 매우 쉽지만(고려할 오류 한계, 심각한 오류 기록...), 이 솔루션은 완전하지 않습니다.
  • 파일이 너무 "먼지가 많은" 것입니다. Expert Advisor가 X일 전 또는 심지어 오늘 마지막으로 로드되었지만 그 정보가 이미 구식이라고 가정해 보겠습니다. 확인 방법 - FIG는 알고 있습니다.

이제 이렇게 했습니다. OnDeinit()의 이유를 분석하고 프로그램이 닫히면 터미널 전역(예: 재초기화 플래그)을 삭제합니다.

OnInit() 동안 이 플래그가 없으면 "파일에서 변수를 복원하시겠습니까?"라는 어리석은 메시지 상자와 함께 사용자에게 물어봐야 할 때마다.

그것은 미친 듯이 어리석고 불편합니다!


질문: 그러한 솔루션을 완전히 자동화하는 방법은 무엇입니까?

파일을 다운로드할 수 없는 경우와 다운로드할 수 있는 경우를 확인하는 방법은 무엇입니까?

최소한 이 메시지 상자의 챌린지를 최소한으로 줄이십시오.

 

MQL4 또는 MQL5?

MQL5의 경우   , 그 다음에:

OnInit()에서 다음을 확인합니다.

1. 위치

 if ( PositionSelect ( _Symbol ) )
{
}
else
{
}

2. 주문:

(나는, 실패가 있었다면, "다리가 어디에서 자라는지"를 이해하지 못하도록 모든 주문을 어리석게 삭제합니다)

 //+------------------------------------------------------------------+
//| Expert Remove orders function                                    |
//+------------------------------------------------------------------+
void RemoveOrders()
{
   int orders_total = OrdersTotal ();
//---  
   if ( orders_total > 0 )
  {
     for ( int i = ( orders_total - 1 ); i >= 0 ; i-- )
    {
       ulong temp_order_ticket = OrderGetTicket ( i );
      
       if ( OrderSelect ( temp_order_ticket ) )
      {
         string temp_symbol = OrderGetString ( ORDER_SYMBOL );
        
         if ( ( temp_symbol == sec_symbol ) || ( temp_symbol == _Symbol ) )
        {
          RemoveOldOrder( temp_order_ticket );
        }
      }
    }
  }
}

3. 터미널 전역 변수 :

   if ( ! GlobalVariableCheck ( "trans_count" ) )
  {
     datetime a_time = GlobalVariableSet ( "trans_count" , 0 );
    
     if ( ulong ( a_time ) == 0 )
    {
       MessageBox ( "Глобальная переменная терминала 'Счётчик транзакций' не создана!" , "Ошибка" , MB_OK | MB_ICONHAND );
       return ( INIT_FAILED );
    }
  }

4. 저장할 변수

a) 로딩:

 //+------------------------------------------------------------------+
//| Expert Load setings function                                     |
//+------------------------------------------------------------------+
void LoadSettings()
{
   string file_name = _Symbol + ".dat" ;
   int file_handle;
//---  
   if ( FileIsExist ( file_name, 0 ) )
  {
    file_handle = FileOpen ( file_name, FILE_READ | FILE_BIN );
    
     if ( file_handle != INVALID_HANDLE )
    {
      e_high = FileReadLong ( file_handle );
      a_profit = FileReadLong ( file_handle );
      e_low = FileReadLong ( file_handle );
      ord_delta_high = FileReadLong ( file_handle );
      ord_delta_low = FileReadLong ( file_handle );
      order_delta = FileReadLong ( file_handle );
      exit_delta = FileReadLong ( file_handle );
       FileClose ( file_handle );
    }
  } 
}

b) 저장( OnDeInit() )

 //+------------------------------------------------------------------+
//| Expert Save settings function                                    |
//+------------------------------------------------------------------+
void SaveSettings()
{
   string file_name = _Symbol + ".dat" ;
   int file_handle;
   bool file_found = true ;
//---  
   if ( FileIsExist ( file_name, 0 ) )
  {
     if ( FileDelete ( file_name, 0 ) ) file_found = false ;
  }
   else
  {
    file_found = false ;
  }
//---
   if ( !file_found )
  {
    file_handle = FileOpen ( file_name, FILE_WRITE | FILE_BIN );
    
     if ( file_handle != INVALID_HANDLE )
    {
       FileWriteLong ( file_handle, e_high );
       FileWriteLong ( file_handle, a_profit );
       FileWriteLong ( file_handle, e_low );
       FileWriteLong ( file_handle, ord_delta_high );
       FileWriteLong ( file_handle, ord_delta_low );
       FileWriteLong ( file_handle, order_delta );
       FileWriteLong ( file_handle, exit_delta );
       FileClose ( file_handle );
    }
  } 
}
 
Fry_Антон :
작업: 재초기화 후 Expert Advisor 환경(위치 데이터, 카운터 등) 복원, 시스템 장애 시 재부팅 등

반대 질문 - 왜?

IMHO, 파일에서 환경을 복원하는 것은 결국 항상 자살입니다. 다시 시작할 때 항상 MetaTrader 거래 환경을 기반으로 데이터를 다시 계산해야 합니다.

 
Fry_Антон :
작업: 재초기화 후 Expert Advisor 환경(위치 데이터, 카운터 등) 복원, 시스템 장애 시 재부팅 등
이야기
 
Vasiliy Sokolov :

반대 질문 - 왜?

IMHO, 파일에서 환경을 복원하는 것은 결국 항상 자살입니다. 다시 시작할 때 항상 MetaTrader 거래 환경을 기반으로 데이터를 다시 계산해야 합니다.

선물 시장의 특징.

모든 것을 셀 수 있는 것은 아닙니다. 물론, 나는 환경에서 가능한 것을 업데이트하지만 ... 글쎄, 예를 들면 :

청산 시 포지션과 주문이 마감/개방됩니다. 터미널은 거래를 수정하고 당일 주문을 삭제합니다(취소될 때까지의 주문은 브로커에 의해 금지됨). 새로운 주문을 생성해야 합니다.

그리고 초기 포지션 개시 가격, 초기 포지션, 주문 시간이 필요합니다.

따라서 그러한 매개변수에 대한 자신의 계정을 유지해야 합니다.

초/분/시간/일당 요청 수에 대한 카운터, 치명적이지 않은 오류 작업 등에 대한 카운터도 있습니다. 등.

파일을 기꺼이 거부하겠습니다! 진짜라면. =(

결국, 그런 상황이 있습니다. 터미널이 무너졌습니다(오늘날 빌드는 안정적이지만 이전에는 항상 이랬고 항상 안정적인 릴리스만 있을 것이라는 사실은 아닙니다).

터미널 충돌 후: 빠른 재부팅 및 자동 로드 - 파일에서 복원하면 모든 것이 작동합니다.

OnTrade() 이벤트에 대한 초기화 파일을 지속적으로 저장하기 때문에 매우 안정적으로 작동합니다(디스크를 괴롭히지 않도록 1~2초 타이머 사용).


따라서 저에게 질문은 매우 관련이 있습니다. 오래되었거나 로드하기에 위험한 파일에서 변수를 로드하지 않는 방법은 무엇입니까?

 
Михаил :

MQL4 또는 MQL5?

MQL5의 경우   , 그 다음에:

OnInit()에서 다음을 확인합니다.

1. 위치

2. 주문:

(나는, 실패가 있었다면, "다리가 어디에서 자라는지"를 이해하지 못하도록 모든 주문을 어리석게 삭제합니다)

3. 터미널 전역 변수 :

4. 저장할 변수

a) 로딩:

b) 저장( OnDeInit() )

거의 그랬다. 타이머가 있는 OnTrade()에만 파일을 저장합니다.

저 역시도 다양한 기능과 변수가 많고, 코드가 계속 발전하고 있어서 하나하나 저장하기가 너무 불편했습니다.

파일에 필요한 모든 것을 포함하는 기본 구조를 만들었습니다(몇 가지 문자열 값 제외).

구조체의 이름은 한 글자로 선언되므로 코드가 상당히 짧습니다(b.volume은 볼륨과 거의 비슷합니다). 뭐, operator = 전체 구조를 한 번에 저장하는 것이 편리합니다.

 
Fry_Антон :

...

질문: 그러한 결정을 완전히 자동화하는 방법은 무엇입니까?

...

프로그래밍 고문에 대한 근본적으로 다른 접근 방식.

 
Dmitry Fedoseev :

프로그래밍 고문에 대한 근본적으로 다른 접근 방식.

합리적이고 유용한 생각으로 답변을 확장해 주시면 감사하겠습니다.

Expert Advisor 코드가 "더 나은" 것을 기반으로 하는 기본 원칙은 무엇입니까?

 
Fry_Антон :

합리적이고 유용한 생각으로 답변을 확장해 주시면 감사하겠습니다.

Expert Advisor 코드가 "더 나은" 것을 기반으로 하는 기본 원칙은 무엇입니까?

여기에 이미 썼습니다. 다시 계산하기 위해 모두 새로 작성했습니다. 저것들. 명령으로 상황을 분석합니다. 일부 데이터를 파일이나 다른 것( 전역 변수 에 저장)에 저장하는 것은 중요하지 않습니다. 일부 데이터가 필요한 경우 주문 티켓과 관련하여 저장하는 것이 기본입니다. 이 경우 오래된 데이터의 문제가 없고 주문이 있으면 데이터가 있고 주문이 없으면 데이터가 없습니다 . 특정 순서에 얽매이지 않은 데이터가 있을 수 있지만 여기서는 각각의 특정 경우에 대해 생각해야 하며 일반적으로 작업이 해결됩니다.

청산은 정말 가장 혼란스러운 문제입니다. 그러나 이것은 장기 데이터 저장(또는 노후화)의 문제가 아닙니다. Expert Advisor에서 간단한 변수에 데이터를 저장할 수도 있습니다(약간 위험하지만 단 5분). 여기서 어려움은 나중에 알아내는 방법입니다. 각 주문에 대한 글로벌 터미널 변수 그룹을 생성할 수 있으며, 여기에 시가를 저장할 수도 있습니다. 그런 다음 표시되지 않은 주문이 나타날 때(또는 새 날이 시작될 때) 기록에서 마지막으로 마감된 주문을 보고 가능한 기호(예: lot)에 따라 비교하고 모두 전송합니다. 닫힌 주문에서 새 주문으로 전역 변수.

 

안톤!

당신은 이 문제를 지나치게 생각하고 있습니다.

비상 사태 후 Expert Advisor의 작업을 유능하게 복원하고 싶은 것이 분명합니다.

상황. 저도 처음에는 똑같이 당혹스러웠습니다.

하지만 그런 상황은 극히 드물다고 판단했습니다.

(실제 MT5에서 1년 반 동안 거래한 경험에 비추어 볼 때)

주문을 "성가시"하지만, 타락 이후에 존재하는 모든 것을 단순히 "못 박는" 것입니다.

가을이 되기 전에 명령이 내려졌을 때 실행되면 아무 것도 할 수 없고,

여전히 "매달려" 있고 거래 상황에 따라 그들을 죽이고 다시 설정하면 아무것도 잃지 않을 것입니다!

그러면 존재 여부에 관계없이 위치만 남게 됩니다.

파일에서 변수 쓰기/읽기에 관해서.

내 고문의 변수에 "뜨거운"(작업 중) 변경 사항이 있으므로

나는 Expert Advisor가 새로운 시작에 "뜨거운" 설정을 취할 수 있도록 파일에서 쓰고 읽습니다.

당신이 스스로 문제를 만듭니다 !

그것에 대해 생각!

P/S MT5는 주문이 중요한 MT4가 아닙니다!

MT5에서는 주문이 아닌 POSITION을 기반으로 구축해야 합니다.

 
Fry_Антон :

합리적이고 유용한 생각으로 답변을 확장해 주시면 감사하겠습니다.

Expert Advisor 코드가 "더 나은" 것을 기반으로 하는 기본 원칙은 무엇입니까?

개인적으로 답변했습니다.

Z.Y. 귀하의 예는 유효하지 않습니다. 요새에는 그런 문제가 없습니다. 물론, 당신은 어떤 문제를 발명하고 오랫동안 그것을 해결하려고 노력할 수 있습니다. 그러나 발명하지 않는 것이 더 쉬울 때 왜 그것을 해결합니까?