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

 
fxsaber :

일반적으로 가능한 구현에 대해 어떻게 생각하십니까?

많은 구현이 가능합니다

그러나 여전히 EA 간의 데이터 교환 문제로 귀결됩니다.

가장 간단한 방법은 각 Expert Advisor의 시작 부분에서 OnTick()에서 초기화 권한 확인을 설정하고 동일한 OnTick()에서 초기화 자체를 수행하는 것입니다. 이렇게 하면 차트를 복원한 다음 차트에서 EA를 실행할 수 없으며, EA를 닫기 전에 저장은 OnDeinit()에서 수행할 수 있습니다.

글쎄요 , 누가 이 동물원을 관리할 것인지는 중요하지 않습니다 - 메인 EA 또는 서비스

 

테스터 로그에서

 2020.09 . 28 00 : 41 : 09.491 wrong tester bar time
2020.09 . 28 00 : 41 : 09.491 history error 9 in undefined function

무슨 뜻인가요?

 
Aleksey Vyazmikin :

테스터 로그에서

무슨 뜻인가요?

이것은 m1 ohlc의 다음 값이 수신될 때(또는 공개 가격 에서 테스트할 때 막대의 상태), 시간 필드가 0으로 판명되었음을 의미합니다.

정의되지 않은 함수는 문제가 미리 정의된 함수(OnTick, OnTimer 등) 외부, 즉 메인 테스터 루프에서 발생했음을 의미합니다.

 
Slava :

이것은 m1 ohlc의 다음 값이 수신될 때(또는 공개 가격 에서 테스트할 때 막대의 상태), 시간 필드가 0으로 판명되었음을 의미합니다.

정의되지 않은 함수는 문제가 미리 정의된 함수(OnTick, OnTimer 등) 외부, 즉 메인 테스터 루프에서 발생했음을 의미합니다.

모든 것이 하루 종일 잘 작동하고 시작되었습니다. 사용자로서 무엇을 할 수 있습니까?

 
Slava :

이것은 m1 ohlc의 다음 값이 수신될 때(또는 공개 가격 에서 테스트할 때 막대의 상태), 시간 필드가 0으로 판명되었음을 의미합니다.

정의되지 않은 함수는 문제가 미리 정의된 함수(OnTick, OnTimer 등) 외부, 즉 메인 테스터 루프에서 발생했음을 의미합니다.

이해할 수 없습니다. 내 코드에 버그가 있습니까? 아니면 터미널에 버그가 있습니까? 전체 기록 지우기 - 도움이되지 않았습니다.

추가됨:

오류를 방지할 수 있는 비활성화 기능을 찾았지만 다른 조언자에서는 이 기능이 올바르게 작동합니다! 어때요? 개인적으로 버릴 수 있어요.

이 버그 기능이 활성화된 경우에도 OnTick()은 첫 번째 막대를 완전히 통과한 다음 해당 오류를 전달합니다.

다른 터미널에서 오류가 확인되었습니다.

틱에 시작됨 - 오류 없음 ...

그러나 로그의 이상함:

 2020.09 . 28 17 : 22 : 22.327 2020.09 . 18 09 : 45 : 02    Test_01

틱으로 보면, 상품을 보면 첫 번째 틱이 정확히 10:00에 있었고 그 시간에 거래 세션이 아직 닫혀있었습니다. 이것은 갈까마귀가 없는 시각 모드이며 첫 번째 인쇄는 10시에 나옵니다.

 
Igor Makanu :

가장 간단한 방법 - OnTick()의 각 Expert Advisor 시작 시 초기화를 위한 권한 확인 등록

이것은 작업의 주요 걸림돌입니다.
 
fxsaber :
이것은 작업의 주요 걸림돌입니다.

차트의 ID에주의를 기울이고 연공서부터 시작하십시오. 그러나 이것이 고문의 상호 작용을 취소하지는 않습니다. 또는 실행 순서의 차트 ID로 파일이나 SQLite 기반을 만드십시오.

예를 들어 최초 초기화 시 목록에 Chart_ID()가 없으면 목록에 추가됩니다. 터미널이 닫혀서 닫히지 않으면 목록에서 제거됩니다. 따라서 어드바이저의 상호 작용을 구성할 수 있습니다.

 
fxsaber :
이것은 작업의 주요 걸림돌입니다.

내가 본대로 스케치 ... 다음 코드로 2 개의 EA를 만들었습니다.

 #define PREFIX_NAME "QWERTY_"
enum ENUM_EA_STATE {WORK, READY_TO_INIT, ENABLE_INIT, ERROR_GLOBAL_VARIABLE};
const string this_ea_name = PREFIX_NAME + MQLInfoString ( MQL_PROGRAM_NAME );
void OnTick ()
{
   static ENUM_EA_STATE state = GlobalVariableSet (this_ea_name, ENUM_EA_STATE::READY_TO_INIT) > 0 ? READY_TO_INIT : ERROR_GLOBAL_VARIABLE;
   Comment ( EnumToString (state));
   if (state != WORK)
   {
       if (state == ERROR_GLOBAL_VARIABLE) return ;
       if (!My_Init(this_ea_name)) return ;
       GlobalVariableSet (this_ea_name, ENUM_EA_STATE::WORK);
      state = WORK;
   }
   Print (this_ea_name, " " , __FUNCTION__ );
}
//+------------------------------------------------------------------+
bool My_Init( const string chek_ea_name)
{
   if ( GlobalVariableGet (chek_ea_name) == (ENUM_EA_STATE)ENABLE_INIT)
   {
       Print ( "EA is init" );
       return ( true );
   }
   return ( false );
}
//+------------------------------------------------------------------+

타이머(5초)에서 작동하는 하나의 제어 EA

 #define PREFIX_NAME "QWERTY_"
enum ENUM_EA_STATE {WORK, READY_TO_INIT, ENABLE_INIT, ERROR_GLOBAL_VARIABLE};
//+------------------------------------------------------------------+
int OnInit ()
{
   EventSetTimer ( 5 );
   return ( INIT_SUCCEEDED );
}
//+------------------------------------------------------------------+
void OnDeinit ( const int reason)
{
   EventKillTimer ();
}
//+------------------------------------------------------------------+
void OnTimer ()
{
   for ( int i = GlobalVariablesTotal () - 1 ; i >= 0 ; i--)
   {
       string curr_gname = GlobalVariableName (i);
       if ( StringFind (curr_gname, PREFIX_NAME) !=- 1 )
      {
         if ( GlobalVariableGet (curr_gname) == (ENUM_EA_STATE)READY_TO_INIT)
         {
             if ( GlobalVariableSet (curr_gname, ENUM_EA_STATE::ENABLE_INIT) > 0 )
            {
               Print ( "Enable Init : " , curr_gname, ".....exit" );
               return ;
            }
         }
      }
   }
}
//+------------------------------------------------------------------+


확인, 모든 것이 작동합니다. 유일한 것은 알아내지 못했거나 전역 변수 에 쓰는 GlobalVariableSetOnCondition()을 통해 작동하지 않았습니다.

 
fxsaber :
이것은 작업의 주요 걸림돌입니다.

GlobalVariableSetOnCondition - 문제를 해결하는 데 필요한 모든 것.

GlobalVariableSetOnCondition이 true를 반환한 경우에만 작업이 허용됩니다.
리소스를 성공적으로 초기화하고 해제한 후 ch를 반환합니다. 변수가 초기 상태로 바뀌고 다른 EA가 시작됩니다.

In DeInit - 어드바이저 없이 터미널 시작을 실행하지 않도록 변수를 무조건 삭제합니다(이전 로드가 올바르게 완료되지 않은 경우).

 
Alexey Viktorov :
이고르 마카누 :
안드레이 카팀리안스키 :

추천해주셔서 감사합니다. GlobalVariableSetOnCondition 방향을 살펴보겠습니다.