EA/지표의 틱 에뮬레이션 - 페이지 3

 
Meat :

예, 문제가 무엇인지 명확하지 않습니다... 그런 다음 다음을 시도하십시오. 가져오기 섹션 #import "user32.dll"에 다음 기능을 추가하십시오.

CallWindowProcA(int lpPrevWndFunc[], int hWnd, int Msg, int wParam, int lParam);

그리고 SetMyTimer 함수의 끝에 다음 줄을 추가합니다. CallWindowProcA(code,0,0,0,0);

그리고 병렬 실행 표시기를 사용하여 이 순간에 틱이 생성되는지 확인합니다.

글쎄요, 뭔가 변경된 것 같습니다. 이제 로그에 다음과 같이 표시됩니다.
10:42:52 테스트 EURUSD,H1: 성공적으로 로드됨
10:42:54 테스트 EURUSD,H1: 02C310A8에서 dll 'user32.dll' 치명적 오류 c0000005에서 함수 'CallWindowProcA' 호출.
10:42:54 테스트 EURUSD,H1: 초기화

티키는 어디에 있습니까? ;)

 
Meat :

Zhunko , 글쎄요, 모든 것이 비표준이라면(자신의 로그, 지표 구현 등), 왜 이 모든 대화를 시작했나요? 여기에서 우리는 실제로 우리 자신의 개발이 아닌 MT4를 사용한 작업에 대해 논의하고 있습니다.

첫 번째 게시물에서 나는 작업이 타사 DLL 없이 수행되는 경우 정확히 내 코드가 유용할 것이라고 명시했습니다. 시스템 라이브러리만 사용하는 자급자족 Expert Advisor/indicator를 구현합니다. 그리고 자신의 개발을 사용하는 경우 이것은 귀하에게 적용되지 않습니다.

그리고 일반적으로 "작업 후 로그를 수동으로 청소"하는 이유를 이해하지 못합니다. 어지럽히지 않는 것이 더 쉽습니다. 결국, 내가 이해하는 한 DLL에서 개발을 구현합니다. 그렇다면 여기서 제안한 것과 동일한 타이머를 설정하지 못하는 이유는 무엇입니까? 거기에만 몇 줄의 코드가 필요합니다. 그러나 어떤 이유로 당신은 탬버린으로 모든 종류의 춤을 추고 통나무를 청소하는 것을 선호합니다. 어떻게 든 당신은 프로그래머처럼 생각하지 않습니다 ... 알다시피, 내 코드는 당신을 귀찮게하지만 매일 로그를 정리하기에 너무 게으르지는 않습니다. :)

나에 대한 통나무는 역사를 바꾼 후에야 망치질됩니다. 수요일과 토요일에 진행됩니다. 자동 청소 때문에 그것이 무엇인지 잊어 버렸습니다.

오랜만에 차트 오프라인 업데이트를 했습니다. 여기에서 구현되었습니다. 어떤 프로그램에서든 함수를 한 번 실행하면 다른 작업을 수행할 필요가 없습니다. 언로드된 모든 MQL4 프로그램에서도 업데이트가 계속되고 차트 열기 및 닫기가 모니터링됩니다.

내가 사용하기 때문에가 아니라 귀하의 코드에 대한 대안을 제안했습니다. 이것은 설정한 작업을 기반으로 하는 이 문제에 대한 간단한 솔루션입니다. 코드 한 줄은 코드보다 훨씬 간단합니다. 매일 로그를 정리할 필요가 없습니다. 주말만. 그렇지 않으면 이 코드가 필요하지 않습니다. 이것은 합리적입니다. 로그, 누가 말하든 어떤 경우에도 청소해야합니다. 그게 이유가 아닙니다.

=========================

코드를 실행합니다. Windows 7에서는 작동하지 않습니다.

AddBytes() 함수를 제거하시겠습니까? 다음과 같이 배열을 초기화합니다.

   int code[ 7 ] = { 0x558BEC6A , 0x16A0268 , 0 , 0 , 0 , 0 , 0x33C05DC3 };
  code[ 2 ] = MT4InternalMsg;
  code[ 3 ] = 0x68000000 + (hWnd >> 8 );
  code[ 4 ] = (hWnd << 24 ) + 0x00B80000 + (PostMsgAddr >> 16 );
  code[ 5 ] = (PostMsgAddr << 16 ) + 0x0000FFD0 ;
더 짧을 것입니다. 그러나 이것은 한 번만 수행됩니다.
 
Zhunko :

나에 대한 통나무는 역사를 바꾼 후에야 두들겨집니다. 수요일과 토요일에 진행됩니다. 자동 청소 때문에 그것이 무엇인지 잊어 버렸습니다.

오랜만에 차트 오프라인 업데이트를 했습니다. 여기에서 구현되었습니다. 어떤 프로그램에서든 함수를 한 번 실행하면 다른 작업을 수행할 필요가 없습니다. 언로드된 모든 MQL4 프로그램에서도 업데이트가 계속되고 차트 열기 및 닫기가 모니터링됩니다.

내가 사용하기 때문에가 아니라 귀하의 코드에 대한 대안을 제안했습니다. 이것은 설정한 작업을 기반으로 이 문제에 대한 간단한 솔루션입니다. 코드 한 줄은 코드보다 훨씬 간단합니다. 매일 로그를 정리할 필요가 없습니다. 주말만. 그렇지 않으면 이 코드가 필요하지 않습니다. 이것은 합리적입니다. 로그, 누가 뭐라고 하든 어떤 경우에도 청소해야 합니다. 그게 이유가 아닙니다.

=========================

코드를 실행합니다. Windows 7에서는 작동하지 않습니다.

AddBytes() 함수를 제거하시겠습니까? 다음과 같이 배열을 초기화합니다.

더 짧을 것입니다. 그러나 이것은 한 번만 수행됩니다.

네, 물론, 제가 게시한 코드는 소스 코드일 뿐이므로 의미가 명확하고 물론 이미 패키징된 형태로 사용하는 것이 더 편리합니다... 물론 나중에 편집해야 하는 경우가 아니라면 :) 왜냐하면 그것을 컴파일하기에는 너무 이르기 때문입니다. 웬일인지 그것은 많은 사람들에게 작동하지 않습니다 :) XP와 7 모두에서 잘 작동하지만 한 시간 동안 운전했지만 아무 충돌도 발생하지 않았습니다. 일종의 신비주의...

코드 한 줄은 코드보다 훨씬 간단합니다. 매일 로그를 정리할 필요가 없습니다. 주말만. 그렇지 않으면 이 코드가 필요하지 않습니다. 이것은 합리적입니다.

개인적으로 병렬로 실행되는 "로그 클리너"가 있는 경우 이것은 중요하지 않을 수 있습니다. 저것들. 당신은 당신의 자신의 부엌이 있습니다. 그러나 우리는 일반적인 경우에 대해 이야기하고 있습니다. 탬버린과 함께 그러한 춤에 참여하지 않는 일반 사용자를 상상해보십시오. 그런 다음 표시기에 대한 정상적인 본격적인 작업을 위해서는 "로그 클리너"도 필요합니다. 저것들. 여러 파일의 전체 집합입니다. 그리고 이것은 이미 내 코드의 크기보다 훨씬 큽니다 ;) 합리성과 간결성은 어떻습니까? 저는 당신이 틀렸다고 생각합니다. 특히 제안한 것과 같이 이미 패키지 형태로 내 코드를 사용하는 경우. 이것은 물론 한 줄은 아니지만 다른 로션이 필요하지 않습니다. 이것은 완제품입니다.

로그, 누가 뭐라고 하든, 어떤 경우에도 청소해야 합니다.

왜 갑자기? 아무것도 막히지 않으면 왜 청소해야합니까?

 

Alexey, 청소기가 반드시 자동은 아닐 수도 있습니다. 예를 들어 폴더를 마우스 오른쪽 버튼으로 클릭하고 " 빈 폴더 "를 선택합니다. 주말에 실험한 후에 이것을 하십시오.

한 해 동안 Expert Advisors와 저널에 365개의 파일이 축적됩니다. 저것들. 730개의 파일이 있습니다. 청소할 필요가 없겠죠? 듣다보니 이상하네요. 아무것도 하지 않기 때문에 막히지 않습니다. 일상적인 작업으로 인해 로그의 크기가 크게 늘어납니다.

 
Zhunko :

Alexey, 청소기가 반드시 자동은 아닐 수도 있습니다. 예를 들어 폴더를 마우스 오른쪽 버튼으로 클릭하고 "빈 폴더"를 선택합니다. 주말에 실험한 후에 이것을 하십시오.

한 해 동안 Expert Advisors와 저널에는 365개의 파일이 축적됩니다. 저것들. 730개의 파일이 있습니다. 청소할 필요가 없겠죠? 듣다보니 이상하네요. 아무것도 하지 않기 때문에 막히지 않습니다. 일상적인 작업으로 인해 로그의 크기가 크게 늘어납니다.

글쎄, 원칙적으로 네, 나는 실험 후에 일반적으로 청소해야한다는 데 동의합니다. 그러나 우리는 실험에 대해서만 이야기하는 것이 아닙니다. 결국 지표는 궁극적으로 실험이 아닌 작업을 위해 만들어집니다. 따라서 작업 과정에서 이미 디버그된 표시기가 계속해서 로그를 막히면 더 이상 올바르지 않습니다.

일반적으로 오래된 로그를 제거하는 것은 이미 개인 취향의 문제입니다. 예를 들어, 나는 이미 1년 전의 로그에서 일부 정보를 찾을 필요가 있었습니다. 그래서 나는 그들을 삭제하지 않습니다. 그리고 특히 오래된 것(1년 이상)은 그냥 보관합니다. 음, 즉 우리는 어떤 실험도 아닌 거래와 직접 관련된 로그에 대해 이야기하고 있습니다.

 
Meat :

글쎄, 원칙적으로 네, 나는 실험 후에 일반적으로 청소해야한다는 데 동의합니다. 그러나 우리는 실험에 대해서만 이야기하는 것이 아닙니다. 결국 지표는 궁극적으로 실험이 아닌 작업을 위해 만들어 집니다. 따라서 작업 과정에서 이미 디버그된 표시기가 계속해서 로그를 막히면 더 이상 올바르지 않습니다.

그래서 그런 로션이 주말에만 필요하다는 사실에 대해 이야기하는 것입니다. 나머지 시간은 필요하지 않습니다.
 

글쎄, 일반적 으로 진드기의 생성은 평일에 때때로 필요합니다. 기호의 따옴표만 사용하는 조언자/지표를 고려하고 있을 것입니다. 그러나 일반적으로 분석된 기호가 여러 개 있을 수 있으며 모든 기호에 대해 신속하게 새로운 데이터를 가져와야 합니다. 물론 진드기가 자주 발생하는 EURUSD와 같은 일부 액체 상품에서 간단히 실행할 수 있습니다. 그러나 이것은 만병 통치약이 아니며 매우 편리하지 않을 수 있습니다.

 

어쨌든 틱이 도착하기 전에 결과를 보고 싶을 때.

즉, 연구 목적입니다.

 

무엇이 문제인지 알아냈습니다. 배열은 로컬이 아닌 전역적으로 선언해야 합니다.

수정본 올려드립니다. 동시에 코드를 단축했습니다. 그리고 Zhunko가 제안한 옵션은 이보다 3줄 더 짧지만 알고리즘 인식에 너무 꼬이고 불편하므로 해당 코드가 수행하는 작업을 이해하지 못할 것입니다. 갑자기 일종의 바이러스가 있습니다. ) 그리고 그것은 전혀 유연하지 않습니다. 따라서 코드를 단축하기 위해 극단적인 방법을 사용해서는 안 된다고 생각합니다.

 #property indicator_chart_window

#import "user32.dll"
   int    RegisterWindowMessageA( string lpString);
   int    SetTimer( int hWnd, int nIDEvent, int uElapse, int & lpTimerFunc[]);
   bool   KillTimer( int hWnd, int uIDEvent);
#import "kernel32.dll"
   int    GetModuleHandleA( string lpModuleName);
   int    GetProcAddress( int hModule, string lpProcName);
  
int TimerId= 666 ;
int TimerCode[ 7 ];

//----------------------------------------------------------------------

int init()
{
  SetMyTimer( 1000 );   // интервал в миллисекундах
}
//----------------------------------------------------------------------

int deinit()
{
  KillMyTimer();
   Comment ( "" );
}  

//+------------------------------------------------------------------+
//| program start function                                           |
//+------------------------------------------------------------------+
int start()
{
   static int n= 0 ;
  n++; 
   Comment ( "tick:  " ,n);
   PlaySound ( "tick.wav" );
}
//-------------------------------------------------------------------

int SetMyTimer( int interval)
{    
   int MT4InternMsg= RegisterWindowMessageA( "MetaTrader4_Internal_Message" );
   int hWnd= WindowHandle ( Symbol (), Period ());
   int PostMsgAddr= GetProcAddress(GetModuleHandleA( "user32.dll" ), "PostMessageA" );
   if (PostMsgAddr== 0 ) return ( 0 );
   // push ebp; move ebp,esp; push 01; push 02; push MT4InternMsg; push hWnd; mov eax,PostMsgAddr; call eax; pop ebp; ret;    
   int value[]={ 0x55 , 0x8B , 0xEC , 0x6A , 01 , 0x6A , 02 , 0x68 , 0000 , 0x68 , 0000 , 0xB8 , 0000 , 0xFF , 0xD0 , 0x5D , 0xC3 };
   int len[]=  { 1 ,     1 ,   1 ,     1 ,   1 ,   1 ,   1 ,   1 ,   4 ,     1 ,   4 ,     1 ,   4 ,     1 ,   1 ,     1 ,     1    };
  value[ 8 ]=MT4InternMsg;  value[ 10 ]=hWnd;  value[ 12 ]=PostMsgAddr; 
   int byte= 0 ;
   for ( int i= 0 ; i< ArraySize (value); i++)
     for ( int j= 0 ;  j<len[i];  j++, byte++)
      TimerCode[byte/ 4 ] += (value[i]>>( 8 *j)& 0xFF ) <<(byte% 4 * 8 );
  
   return ( SetTimer(hWnd, TimerId, interval, TimerCode) );
}

//---------------------------------------------------

bool KillMyTimer()
{
   return ( KillTimer( WindowHandle ( Symbol (), Period ()), TimerId) );
}
 
Meat :

글쎄, 일반적으로 진드기의 생성은 평일에 때때로 필요합니다. 기호의 따옴표만 사용하는 조언자/지표를 고려하고 있을 것입니다. 그러나 일반적으로 분석된 기호가 여러 개 있을 수 있으며 모든 기호에 대해 신속하게 새로운 데이터를 가져와야 합니다. 물론 진드기가 자주 발생하는 EURUSD와 같은 일부 액체 상품에서 간단히 실행할 수 있습니다. 그러나 이것은 만병 통치약이 아니며 매우 편리하지 않을 수 있습니다.

적어도 하나의 예?

얼마나 쓰고 사용하는지 주말을 제외하고는 전혀 필요하지 않았습니다.

전문가 + 지표. 이것은 Expert Advisor를 반복하면 해결됩니다. 결과는 귀하와 동일합니다. 정시에 데이터를 수신하려면 서버 시간 변경에 대응하는 것으로 충분합니다. 이를 위해 WinAPI가 필요하지 않습니다.

필요한 경우는 Expert Advisor가 주말에 시작하는 경우뿐입니다. 이마저도 위의 결과를 통해 구현될 수 있습니다. 전문가 전용.

사유: