빌드 216 버그? isConnected()는 false를 반환하지만 메타 트레이더는 여전히 연결되어 있습니다. - 페이지 2

 
알겠습니다. 알겠습니다... 글쎄요... 다시 나오는지 확인하겠습니다 ;)
 

안녕하세요 Stringo님



불행히도 이 버그는 지속됩니다.

아래에서 테스트 스크립트를 실행하고 한 계정에서 다른 계정으로 전환할 때(제 테스트 사례에서는 2~3개의 다른 브로커 계정을 사용하고 하나에서 다른 계정으로 전환했습니다) 몇 번의 accountChanges(매우 임의의 숫자) 후에 알 수 있습니다. connectionState는 실제로 다시 1로 변경되지 않으며 터미널이 연결되어 있어도 0으로 유지됩니다.


당신의 눈에는 이것이 치명적인 버그가 아닐 수도 있습니다. 그러나 connectionState를 표시하는 스크립트를 개발하는 일부 사람들의 경우 수행된 테스트 결과는 매우 놀랍습니다.

그래서 이 문제를 다시 한 번 봐 주시면 감사하겠습니다.



테스트 스크립트는 다음과 같습니다.


 //+------------------------------------------------------------------+
//| script program start function                                    |
//+------------------------------------------------------------------+
int start ()
{
   while ( ! IsStopped ())
   {
       Print ( " test " + IsConnected ()) ;
       Sleep ( 500 ) ;
   }
}




진심으로 당신의,


다니엘.

 
이 버그가 빌드 216에 존재한다는 것도 확인할 수 있습니다. 몇 번의 '연결 실패' - 로그인 시퀀스 후에 발생하는 것 같습니다.
 
예, 이 스크립트는 알려져 있습니다. 그러나 문제를 감지하려면 환경을 재현해야 합니다. 그러나 우리는 그것을 재현 할 수 없습니다
 

나는 또한 같은 버그를 확인해야합니다. 내 EA에서 연결이 존재하는지 동시에 확인 합니다. 그렇지 않으면 내 스크립트가 종료됩니다.

이에 대한 해결 방법을 찾았습니까?

 

스크립트는 무한 루프와 들어오는 틱으로부터의 독립성 때문에 문제를 결정할 수 없습니다.

문제는 전문가만 표시할 수 있습니다. 단 한 줄의 코드로 간단한 전문가 - Print( IsConnected ());

틱 소득(터미널이 연결되었음을 의미) - 시작 기능이 실행됩니다 - 웁스! IsConnected()는 0(즉, 거짓)을 반환합니다.

 

감사해요

예 사용합니다

 int start ()
{
 while ( true )
 {
   if ( IsConnected ())
   {
    ....... i do my work 
   {
   else 
   {return ( - 1 ) ;} // so if connection was lost i break the infiny loop
 }
}

문제는 연결이 다시 되면 문자 IsConnected ()가 이전 값을 false로 유지하고 true로 변경하지 않는다는 것입니다! 하지만 가격이 이동하고 터미널이 100% 연결되는 것을 보고 있습니다. 연결이 복원된 후 첫 번째 틱에서 아무 일도 일어나지 않아 무한 루프가 끊어지고 시작이 실행되었기 때문에 이것은 버그입니다. 그러나 어떤 이유로 Is Connected()는 여전히 false를 반환합니다. 차트에서 EA를 제거하고 다시 넣으면 다음 연결이 끊길 때까지 모든 것이 잘 작동합니다.



이것은 나를 미치게 만든다. 그것에 대해 어떻게든 해주세요!

감사해요

 

Liliput - 위의 설명이 start() 사용에 대한 개요인 경우 무한 루프로 계속 유지해야 하는 이유는 무엇입니까?

나는 정상적인 원인을 묻습니다. 방법은 입력 > 일할래? no:return > 일을 하다 > 돌아가다

(정상 - 물론 주관적입니다 ;o)

디자인하는 방법을 알려주지 않습니다. 그건 당신의 비즈니스입니다. 추론을 물어보면 더 많은 것을 배우고 일을 하는 다양한 방법을 볼 수 있습니다!

내가 질문하게 된 이유는 무엇입니까?

예를 들어 EA가 반환하지 않는 많은 데이터 틱 동안 EA가 반환을 거부하는 경우 터미널이 어떻게 작동하는지 전혀 모릅니다. 터미널이 start()를 호출하지 않거나 ... 전화 를 걸고 결국 EA의 start()를 호출할 수 없는 많은 데이터 틱으로 인해 터미널이 미지의 깊이로 들어가 연결된 문제를 나타냅니까?

;)

 

이렇게 하면 문제가 해결될까요..?

 string FILE [ 1 ] ;
int MOVE [ 1 ] ;
 
void init () { FILE [ 0 ] = Symbol () ; }
 
int start ()
   {
//---- check connection
   if ( ! Connection () ) return ( 0 ) ;
//---- 
   return ( 0 ) ;
   }
 
bool Connection ()
   {
   int d ;
   bool connect ;
   RefreshRates () ;
   for ( d = 0 ; d < ArraySize ( FILE ) ; d ++ )
     {
     if ( MOVE [ d ] != MarketInfo ( FILE [ d ] , 5 ) )
       {
       MOVE [ d ] = MarketInfo ( FILE [ d ] , 5 ) ;
       /* if ( !connect ) */
       connect = 1 ;
       }
     }
   return ( connect ) ;
   }
 
ukt :

Liliput - 위의 설명이 start() 사용에 대한 개요인 경우 무한 루프로 계속 유지해야 하는 이유는 무엇입니까?

나는 정상적인 원인을 묻습니다. 방법은 입력 > 일할래? no:return > 일을 하다 > 돌아가다

(정상 - 물론 주관적입니다 ;o)

디자인하는 방법을 알려주지 않습니다. 그건 당신의 비즈니스입니다. 단지 당신의 추론을 묻는 것뿐입니다. 그러면 나는 더 많은 것을 배우고/일을 하는 다른 방법을 봅니다!

내가 질문하게 된 이유는 무엇입니까?

예를 들어 EA가 반환하지 않는 많은 데이터 틱 동안 EA가 반환을 거부하는 경우 터미널이 어떻게 작동하는지 전혀 모릅니다. 터미널이 start()를 호출하지 않거나 ... 전화 를 걸고 결국 EA의 start()를 호출할 수 없는 많은 데이터 틱으로 인해 터미널이 미지의 깊이로 들어가 연결된 문제를 나타냅니까?

;)


ukt, 문제 없습니다 내가 대답할 것입니다. 많은 작업을 수행해야 하고 새 틱이 작업을 수행할 때까지 기다리고 싶지 않기 때문에 무한 루프를 수행합니다. 그래서 나는 이런 식으로 터미널에서 제어를 취하고 내가 필요하고 원할 때 내 작업을 수행합니다. 나는 실제 데이터를 얻기 위해 RefreshRates ()를 사용한다.

따라서 주문을 보내거나/닫거나 수정하고 연결이 없으면 작동하지 않기 때문에 브로커에 대한 연결이 존재하는지 확인하는 것이 논리적입니다. 간단합니다. 내가 사용하는 루프를 종료하는 다른 검사도 있습니다. 예를 들어 IsStoped() 등이 있지만 문제는 내 코드가 아니라 IsConnected()에 있습니다.