연결되었습니다() - 페이지 2

 
Matutin :

init() 에서 start() 를 호출하면 ... 틱이 오지 않아도 start() 상태가 됩니다!

감사합니다 2
 
Viffer :

위의 내 링크에서 확장 ... 나는 연결 상태를 모니터링하기 위해 별도의 EA를 실행합니다. 기본적으로 내부에 코딩된 내 테스트에 대한 모든 코드가 마지막에 잠자기 상태로 시작됩니다. 시작은 기본적으로 큰 루프이며 완료되면 처음으로 돌아갑니다. 그러나 틱이 시작을 트리거할 때까지 기다리는 대신 init() 내부에서 start()를 호출합니다. 이런 식으로 start()는 계속 sleep으로 루프를 돌고 init()는 절대 끝나지 않으므로 코드는 틱을 기다리지 않고 sleep에서 시간 간격을 기준으로 실행됩니다... 위의 링크는 주요 내용을 보여줍니다...

hth

V


마투틴 :

init()에서 start()를 호출하기만 하면 ... 틱이 오지 않아도 start() 상태가 됩니다!


연결이 없는 경우 init()도 시작되지 않았기 때문에 이 둘 중 어느 것도 문제를 해결하지 않습니다.

이것을 하는 유일한 방법은 스크립트입니다. 문제는 Loaded 스크립트로 터미널을 열 방법이 없다는 것입니다.

 
qjol :


연결이 없으면 init()도 시작되지 않았기 때문에 이 둘 중 어느 것도 문제를 해결하지 못합니다.

이를 수행하는 유일한 방법은 스크립트입니다. 문제는 Loaded 스크립트로 터미널을 열 방법이 없다는 것입니다.


MT4i.com 도구를 살펴보겠습니다. 나는 그것들을 사용하여 연결을 모니터링하고 메일이나 SMS로 경고를 보냅니다.

http://www.mt4i.com/mtdashboard.aspx

 
Matutin :

init() 에서 start() 를 호출하면 ... 틱이 오지 않아도 start() 상태가 됩니다!

아니요! 이것은 허용되지 않습니다. init()는 2초 후에 반환될 것으로 예상됩니다. Init는 차단할 수 없습니다! 모든 종류의 문제가 발생할 수 있습니다.

start에서 루프를 수행하고 EA를 로드한 후 사용 가능한 다음 틱에서 start가 자동으로 호출될 것으로 예상합니다. 연결이 끊어 지기 전에 틱이 있었으므로 이 이벤트가 발생할 때 루프가 이미 실행되고 있을 것입니다.


주말에 실행해야 하기 때문에 init() 내에서 start()를 트리거해야 하는 경우 유일한 올바른 방법은 PostMessage() 트릭을 사용하여 틱을 적용하는 것입니다. 메시지를 게시한 다음 init가 반환되도록 합니다 ! 그런 다음 MT4는 정상적인 방법으로 start()를 호출하고 init()는 차단되지 않습니다.


예시는 다음 포스팅을 참조하세요.

 
// this is an EA

#import "user32.dll"
   int PostMessageA( int hWnd, int Msg, int wParam, int lParam);
   int RegisterWindowMessageA( string lpString);
#import

int init(){
   int hwnd=WindowHandle( Symbol (), Period ());
   int msg = RegisterWindowMessageA( "MetaTrader4_Internal_Message" );
   PostMessageA(hwnd, msg, 2 , 1 ); // enqueue a fake tick and let init() return
   return ( 0 );
}


int start(){
   while (! IsStopped ()){
       // do your stuff here
       Sleep ( 1000 );
   }
   return ( 0 );
}
이것은 EA의 init() 내에서 start()를 강제 실행하는 유일한 올바른 방법 입니다. GUI 스레드에서 start()가 실행되기 때문에 표시기에서 이 작업을 수행할 수 없습니다.
 
/**
* MT4/experts/ scripts /ticks.mq4
* send a fake tick every 200 ms to the chart and
* all its indicators and EA until this script is removed.
*/

#property copyright "© Bernd Kreuss"

#import "user32.dll"
   int PostMessageA( int hWnd, int Msg, int wParam, int lParam);
   int RegisterWindowMessageA( string lpString);
#import

int start(){
   int hwnd=WindowHandle( Symbol (), Period ());
   int msg = RegisterWindowMessageA( "MetaTrader4_Internal_Message" );
   while (! IsStopped ()){
      PostMessageA(hwnd, msg, 2 , 1 );
      Sleep ( 200 );
   }
}
완전성을 위해 위의 스크립트 는 주말에 가짜 틱을 시뮬레이션하는 데 사용하는 스크립트입니다. 당신은 그것을 필요로하지 않습니다, 그것은 단지 예입니다. 이는 다른 EA 및 표시기를 디버깅하는 데 주로 유용합니다.
 
/**
* this is a variation of the above script meant to be run as an EA .
* Send a fake tick every 200 ms to the chart and
* all its indicators until this EA is removed.
*/

#property copyright "© Bernd Kreuss"

#import "user32.dll"
   int PostMessageA( int hWnd, int Msg, int wParam, int lParam);
   int RegisterWindowMessageA( string lpString);
#import

int init(){
   int hwnd=WindowHandle( Symbol (), Period ());
   int msg = RegisterWindowMessageA( "MetaTrader4_Internal_Message" );
   PostMessageA(hwnd, msg, 2 , 1 ); // enqueue the first fake tick
}

int start(){
   int hwnd=WindowHandle( Symbol (), Period ());
   int msg = RegisterWindowMessageA( "MetaTrader4_Internal_Message" );
   while (! IsStopped ()){
      PostMessageA(hwnd, msg, 2 , 1 );   // produce more fake ticks
       Sleep ( 200 );
   }
}

그리고 이것은 위의 스크립트 와 동일 하지만 EA로 구현되어 하나의 EA에서 두 개념을 모두 보여줍니다.

init()에서는 첫 번째 틱을 대기열에 넣어 첫 번째 start()를 트리거한 다음 start()에서 무한 루프에서 더 많은 틱을 생성합니다. 그런 다음 이 틱은 동일한 차트의 모든 표시기에 의해 선택됩니다.

 
7bit :
이것은 EA의 init() 내에서 start()를 강제 실행하는 유일한 올바른 방법 입니다. GUI 스레드에서 start()가 실행되기 때문에 표시기에서 이 작업을 수행할 수 없습니다.

 // this is an EA

#import "user32.dll"
   int PostMessageA( int hWnd, int Msg, int wParam, int lParam);
   int RegisterWindowMessageA( string lpString);
#import

int init(){
   int hwnd=WindowHandle( Symbol (), Period ());
   int msg = RegisterWindowMessageA( "MetaTrader4_Internal_Message" );
   PostMessageA(hwnd, msg, 2 , 1 ); // enqueue a fake tick and let init() return
   return ( 0 );
}


int start(){
   while (! IsStopped ()){
       // do your stuff here
       Sleep ( 1000 );
   }
   return ( 0 );
}

이 EA를 차트에 올려 놓고 터미널을 닫고 인터넷 연결을 비활성화하고 터미널을 켜십시오(인터넷 연결이 꺼져 있는 동안) & 작동하지 않는 것을 볼 수 있습니다

 
qjol :


이 ea를 차트에 올려 놓고 인터넷 연결을 비활성화하고 터미널을 켜는 것보다 터미널을 닫으십시오(인터넷 연결이 꺼져 있는 동안) & 작동하지 않는 것을 볼 수 있습니다

그러나 정상적인 조건(일반적인 사용 사례여야 함)에서 시작된 후에는 계속 실행되어야 합니다. 시작된 후 연결을 끊으십시오.


그리고 init() 차단을 피하고 스크립트 대신 EA로 실행하는 방법의 예입니다.

 
7bit :

그러나 정상적인 조건(일반적인 사용 사례여야 함)에서 시작된 후에는 계속 실행되어야 합니다. 시작된 후 연결을 끊으십시오.


그리고 init() 차단을 피하고 스크립트 대신 EA로 실행하는 방법의 예입니다.


당신 말이 맞아, 하지만 난 당신이 설명하는 상황에 대한 해결책을 찾고 있지 않습니다, 나는 내가 설명하는 상황에 대한 해결책을 찾고 있으며, 지금은 외부 소프트웨어가 실행될 유일한 해결책을 찾았습니다. 스크립트

사유: