오류, 버그, 질문 - 페이지 435

 
voix_kas :

대체로 재미있습니다.
문득 OnDenit 함수는 일종의 소멸자이고 OnInit는 전문 생성자라고 생각했습니다.

사실, OnInit는 다중 이벤트(Expert Advisor의 수명 내)인 것으로 밝혀졌습니다. 그렇다면 Expert Advisor가 작업을 완료하지 않는 것으로 알려진 경우(예: 차트 기간이 변경된 경우) 왜 명시적으로 OnDenit 이벤트를 생성하는지 명확하지 않습니다.

기호를 변경할 때 전문가는 빠른 시작과 전생의 정보 기반을 저장하기 위해 핫 리로드됩니다.

예를 들어, 작업 중인 Expert Advisor가 차트에 매달리고 통계와 논리를 축적한 다음 시간 프레임이 변경되고 콜드 재시작 중에 처음부터 강제로 작업해야 합니다.

그리고 또 다른 질문.
초기화 해제 이유 REASON_CHARTCHANGE - 차트 기호 또는 기간이 변경되었습니다.
Expert Advisor를 삭제하지 않고 차트 기호를 변경할 수 있는 방법을 설명해 주시겠습니까?

핫 리스타트 모드에서.
 

예델킨, 흥미롭다, 레나트
설명해주셔서 감사합니다.

문서에 EA의 "핫" 및 "콜드" 재시작 목록을 명시적으로 포함하는 것도 의미가 있다고 생각합니다.

각 OnInit에서 재초기화되지 않으면 글로벌 플래그 형태의 "목발"이 다중 통화에 사용되어야 합니다. :(
코드는 조금 있다가 올리겠습니다.

 
Interesting :

어떤 경우에도 Expert Advisor는 정상적인 초기화 중에 삭제되지 않으며 특정 터미널 설정 에서 거래가 허용됩니다(그러나 이를 위해 Expert Advisor는 기호가 변경되었음을 이해해야 합니다...).

그건 그렇고, 생각 나게. 오랫동안 언급된 설정에 대해 개발자에게 문의하고 싶습니다.

Renat님, 시간대 변경 및 기호 변경 시 거래를 차단하기 위해 두 개의 다른 확인란을 만드십시오. 이것은 근본적으로 다른 두 가지 변경 사항입니다.

나는 내 Expert Advisors가 기간이 변경될 때 거래를 중단하는 것을 원하지 않습니다. 이것은 절대적으로 쓸모가 없습니다. 그들은 어쨌든 모든 틱을 처리하고 이것에 문제가 없습니다.

그러나 성격의 변화는 근본적으로 중요합니다. 이 차단을 그대로 두고 싶습니다 ... 하지만 이제 이 두 가지 조정이 어떻게든 동기화되고 함께 규제됩니다.

저는 이 문제를 프로그래밍 방식으로 해결합니다(원래 문자를 정적 변수에 저장하고 init의 변경 사항을 제어). 하지만 터미널 수준에서 차단할 수 있다면 더 좋을 것입니다.

Expert Advisor가 실행되는 동안 확인란을 사용하여 기간 또는 기호를 전환할 가능성을 제어하는 것이 훨씬 더 좋습니다. 어리석음-건망증에서 거래를 중단하는 이유는 무엇입니까?

저것들. 전문가가 차트에 매달려 있을 때 금지하도록 설정에 지정된 경우 기간 및/또는 기호 전환을 차단 하는 것이 훨씬 좋습니다(별도!).

// 시도할 때 적절한 메시지를 발행합니다.

실제로 이것은 프로그래밍 방식으로도 해결할 수 있지만(심볼이나 기간을 강제로 제자리로 되돌림) 터미널 수준에서 정말 편리한 설정에 관심이 있으실 것입니다.

 

MetaDriver :

Renat님, 시간대 변경 및 기호 변경 시 거래를 차단하기 위해 두 개의 다른 확인란을 만드십시오. 이것은 근본적으로 다른 두 가지 변경 사항입니다.

나는 내 Expert Advisors가 기간이 변경될 때 거래를 중단하는 것을 원하지 않습니다. 이것은 절대적으로 쓸모가 없습니다. 그들은 어쨌든 모든 틱을 처리하고 이것에 문제가 없습니다.


나는 그 아이디어를 지지할 것입니다. 두 개의 체크박스를 만들고 초기화 해제 이유 코드에서 분리해야 합니다(이것이 편리할 것입니다).

그러나 TF를 변경할 가능성을 차단하면 (심볼을 희생하면서) 방법을 모르겠습니다. 제 생각에는 이것이 과잉입니다.

Документация по MQL5: Стандартные константы, перечисления и структуры / Именованные константы / Причины деинициализации
Документация по MQL5: Стандартные константы, перечисления и структуры / Именованные константы / Причины деинициализации
  • www.mql5.com
Стандартные константы, перечисления и структуры / Именованные константы / Причины деинициализации - Документация по MQL5
 
MetaDriver :

그건 그렇고, 생각 나게. 오랫동안 언급된 설정에 대해 개발자에게 문의하고 싶습니다.

Renat님, 시간대 변경 및 기호 변경 시 거래를 차단하기 위해 두 개의 다른 확인란을 만드십시오. 이것은 근본적으로 다른 두 가지 변경 사항입니다.

네, 심볼 변경 조건과 기간을 헛되이 결합한 것 같습니다.

나는 또한 그것들을 2가지 조건으로 나누는 것에 찬성한다. 이미 서비스 데스크에 티켓을 넣었습니다.

 

사실, 나는 다중 통화를 위한 작동 수단을 결정하기 위한 코드를 동봉하고 있습니다. 비판은 환영합니다. :)

 input uint    inTimeToRescan = 3600 ; // Интервал времени для принудительного пересканирования рабочих инструментов, в секундах
input string inWorkSymbols  = "USDCHF; GBPUSD; EURUSD; USDJPY; USDCAD; AUDUSD; EURGBP; EURAUD; EURCHF; EURJPY; GBPJPY; GBPCHF" ; // Рабочие инструменты


bool Initialize;


int OnInit () {
   //...
  Initialize = true ;
   //...
}


void OnTick () {
   static ulong   LastScan = 0 ;
   if (( ulong ) TimeCurrent () - LastScan >= inTimeToRescan) Initialize = true ;

   static string Symbol [];
//  static int    Forecast[];
//  static int    Volatile[];

   if (Initialize) {
     Comment ( "Опрос рабочих инструментов..." );
     int SymbolCount_1 = 0 ;
     for ( int i = 0 ; i < SymbolsTotal ( false ); i++)
       if ( StringFind (inWorkSymbols, SymbolName (i, false )) != - 1 )
        SymbolCount_1++;

     if (!SymbolCount_1) return ;
     if ( ArrayResize ( Symbol , SymbolCount_1) != SymbolCount_1) return ;

     int SymbolCount_2 = 0 ;
     for ( int i = 0 ; i < SymbolsTotal ( false ); i++)
       if ( StringFind (inWorkSymbols, SymbolName (i, false )) != - 1 )
         Symbol [SymbolCount_2++] = SymbolName (i, false );

     if (SymbolCount_1 != SymbolCount_2) return ;

     //if (ArrayResize(Forecast, SymbolCount_1) != SymbolCount_1) return;
     //if (ArrayResize(Volatile, SymbolCount_1) != SymbolCount_1) return;

    Initialize = false ;
  }
   //...
}

EA는 매 틱마다 작동하는 도구 목록을 얻으려고 시도합니다.
작업 도구 목록의 업데이트는 1) OnInit가 트리거되는 경우, 2) EA의 입력 매개변수에 지정된 시간이 경과한 후의 두 가지 조건에서 발생합니다.
우리가 볼 수 있듯이 전역 변수( bool Initialize) 형태의 "목발"은 다음 초기화를 감지하는 데 사용됩니다. statics의 재초기화가 있었다면 이것은 필요하지 않을 것입니다.

무조건 점프 연산자 "goto"와 마찬가지로 전역 변수를 악으로 간주합니다.

 
voix_kas :

각 OnInit에서 재초기화되지 않으면 글로벌 플래그 형태의 "목발"이 다중 통화에 사용되어야 합니다. :(

중간 정적 변수 의 형태로 목발을 남기지 않고 초기에 코드를 신중하게 작성하는 것이 좋습니다.

해결책으로 이러한 데이터를 클래스 내부에 숨깁니다. 학급도 죽고 환경도 죽었습니다.

그리고 전역 수준에서 최소한의 정적 변수를 남겨둡니다.

Документация по MQL5: Основы языка / Переменные / Статические переменные
Документация по MQL5: Основы языка / Переменные / Статические переменные
  • www.mql5.com
Основы языка / Переменные / Статические переменные - Документация по MQL5
 
voix_kas :

사실, 나는 다중 통화를 위한 작동 수단을 결정하기 위한 코드를 동봉하고 있습니다. 비판은 환영합니다. :)

팁 - Symbol 을 전역 수준으로 가져 와서 OnInit에서 무효화하십시오. 배열이 비어 있으면 초기화할 시간입니다.

그리고 추가 플래그가 없습니다.

 
Renat :

팁 - Symbol을 전역 수준으로 가져 와서 OnInit에서 무효화하십시오. 배열이 비어 있으면 초기화할 시간입니다.

그리고 추가 플래그가 없습니다.

나는 아마 편집증입니다. 나는 공개(전역) 변수를 좋아하지 않는다. 나는 그것을 움직임이라고 생각한다.
OnTick 내부에서 OnInit의 동작을 정의하는 방법이 가능한가요?
예를 들어 OnTick 내부에서 EA 초기화 수를 저장하는 정적 변수를 선언합니다(MQL5에 그러한 속성이나 유사한 속성이 있는 경우)?

 
voix_kas :

무조건 점프 연산자 "goto"와 마찬가지로 전역 변수를 악으로 간주합니다.

나는 아마 편집증입니다. 저는 공개(전역) 변수를 좋아하지 않습니다. 나는 그것을 움직임이라고 생각한다.

1. 이게 왜요? 유해한 증상에서 제거하고 결정적으로해야합니다.

2. 변수, 배열 및 기타 항목은 언어의 키워드와 일치하게 이름을 지정해서는 안 됩니다(그러나 "Symbol" 배열은 매우 인상적이므로 코드에서 이 배열 또는 다른 것을 구문 분석할 것입니다).

레나트 :

해결책으로 이러한 데이터를 클래스 내부에 숨깁니다. 학급도 죽고 환경도 죽었습니다.

그리고 전역 수준에서 최소한의 정적 변수를 남겨둡니다.

좋은 제안입니다. 벌써 OOP로 갈아타야 할 시간... :)