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

 
Expertboss , 2008 서버가 필요합니까? 제 생각에는 2003년의 가능성은 충분할 뿐만 아니라 리소스에 대한 요구가 적기 때문에 더 저렴한 하드웨어를 선택할 수 있습니다.
 
Meat :

당신의 이 시계가 (지표가 아닌) 전문가라면, 아마도 단순히 루프일 가능성이 높기 때문에 문제 없이 많은 기호에 대한 정보를 얻을 수 있습니다. 나는 이에 대해 이전에 Expert Advisor의 진드기에 큰 문제가 없다고 썼습니다. 루프로 만들 수 있습니다. 그러나 표시기를 사용하면 그러한 숫자가 작동하지 않습니다.

다양한 운영 체제에 관해서는 나에게 여전히 미스터리입니다. 위에 썼듯이 나는 보통 7번 밭을 갈지만 다른 사람들은 웬일인지 하지 않는다. 권한과 관련이 있을지도...

그런데 "라이브러리 교체"는 WinXP(2003)에서 user32, kernel32 파일을 가져와서 Vista(2008)가 설치된 컴퓨터의 Experts\libraries 폴더에 넣어보세요. 갑자기 작동할까요? :) ...의심스럽긴 하지만...

나는 진드기에 대해 똑바로 말할 것입니다. 나는 "당신 편"입니다. 그러나 시계에 관해서는, 대답으로 판단할 때, 당신은 내 아이디어를 이해하지 못했고, 나는 코드로 시도할 것입니다:

정수 초기화()

{

ObjectCreate( "서버 시간", OBJ_LABEL , 0,0,0,0,0,0,0);

ObjectSet( "서버 시간", OBJPROP_CORNER, 3);

ObjectSet( "서버 시간", OBJPROP_XDISTANCE, 10);

ObjectSet( "서버 시간", OBJPROP_YDISTANCE, 37);

ObjectSetText( "서버 시간", "", 20, "Arial", 녹색);

반품;

}

정수 시작()

{

ObjectSetText("서버 시간", TimeToStr( TimeCurrent(), TIME_SECONDS ));

...

반품;

}

이 차트에 대한 새 눈금이 명확하기 때문에 눈금이 표시되고 "시장 관찰" 창에 차트가 생성된 상품이 하나뿐인 경우 이 시간의 시간 및 업데이트도 차트의 눈금과 일치합니다. 따라서 Expert Advisor의 작업으로, 그러나 "시장 감시" 창에서 여러 도구에 비용이 든다면 모든 것이더라도 "시장 감시: 22:59:58" 헤더에 표시되는 작은 시계에서 , 그러면 이 시계는 거의 모든 악기에 대한 모든 따옴표와 함께 똑딱거리는 것을 멈추지 않습니다. 그들은 어딘가에 똑딱거리고 있고 내 쌍의 따옴표가 어떻게 변경되었는지, 그래서 내 시간은 그 시간과 같았습니다. 여기에 이 모든 진드기를 추가할 수 있다는 생각이 있습니다 내 Expert Advisor 또는 Expert Advisor가 작동하는 창에 결국 """ 적용했는데 한 쌍의 견적보다 더 자주 틱이 더 자주 나타납니다.

알렉산더.

리소스를 반복하고 싶지 않습니다... 즉, 모든 따옴표의 모든 눈금을 하나의 차트로 줄이려면?

 

그리고 왜 여러분은 이것이 침략이라고 결정했습니까? 이것은 단지 공손함의 원칙을 상기시키는 것입니다. 당신이 무언가를 제공하기 전에 당신은 대가로 무언가를 넣어야 합니다. 그리고 당신이 아무것도 가지고 있지 않다면, 당신은 단지 요청할 수 있으며 이것이 진실입니다.

저는 64비트 시스템의 작은 전문가이지만 이 주제에 매우 관심이 있지만 여기에서 도움을 줄 수 없기 때문에 아는 사람들에게 물어볼 뿐입니다. 그리고 나는 그것에 대해 아무 잘못도 보지 않습니다.

 
FAQ :

그리고 왜 여러분은 이것이 침략이라고 결정했습니까? 이것은 공손함의 원칙을 상기시켜줍니다. 당신이 무언가를 제공하기 전에 당신은 대가로 무언가를 넣어야 합니다. 그리고 당신이 아무것도 가지고 있지 않다면, 당신은 단지 요청할 수 있습니다. 이것이 진실입니다.

저는 64비트 시스템의 작은 전문가이지만 이 주제에 매우 관심이 있지만 여기에서 도움을 줄 수 없기 때문에 아는 사람들에게 물어볼 뿐입니다. 그리고 나는 그것에 대해 아무 잘못도 보지 않습니다.


아마 공원에 있던 모든 감정과 감정이 드러났을 텐데, 진행자님 말씀에 따라 말씀해주셔서 감사합니다, 열을 식히도록 노력하겠습니다.

유브이와 함께 알렉산더.

 
expertboss :

따라서 """"이 모든 틱을 추가하고 내 Expert Advisor 또는 Expert Advisor가 작동하는 창에 적용할 수 있습니다."" 결과적으로 훨씬 더 많은 틱이 더 자주 나타날 것입니다. 한 쌍의 견적보다.

알렉산더.

리소스를 반복하고 싶지 않습니다... 즉, 모든 따옴표의 모든 눈금을 하나의 차트로 줄이려면?

EA는 자체 틱에만 반응하므로 아무 것도 "추가"할 수 없습니다. 두 가지 옵션만 있습니다. 타이머를 설정하거나(제가 제안한 대로) 다른 차트에서 병렬 루프 Expert Advisor를 실행하여 Expert Advisor를 "틱"합니다. 그리고 이 루프형 Expert Advisor에서 "틱"해야 하는 조건을 어떻게든 처방할 수 있습니다. 예를 들어 설명한 경우와 같이 TimeCurrent() 의 값이 변경된 경우입니다. 다시 말하지만, 추가 조언자에서 요점을 보지는 못하지만 원래 조언자(즉, 시계)를 반복할 수만 있다면.

 
일반적으로 IMHO, 모든 문제에 대한 해결책은 메모리에서 Start 함수의 주소를 찾는 것입니다. :) 그러면 프로그램의 다중 스레드 실행 까지 많은 것을 생각해낼 수 있습니다.
 
나는 터미널이 정기적인 틱을 수신하지 않고 타이머가 그에 따라 작동할 때 그러한 계획의 문제에 부딪쳤습니다. 고문은 코드를 통해 작동하고 어느 시점에서 고문은 예를 들어 주문을 마감하기 위해 잘못된 요청을 보내기 시작합니다. 서버가 일반 오류 "2"를 보낸 다음 오류 "3"을 보내고 주문 번호 등으로 발행할 수도 있습니다. 이런 식으로 상황에서 벗어났습니다. """""""""""" OrdersTotal()==0){Alert("삭제할 항목이 없습니다. "); Sleep(1000);break;} // if ord. 닫힌 루프에서 출구가 없습니다."""""""""""(while에서 종료), 그러나 당신은 약간 잘못 이해하고 있습니다. 질문은 다음과 같습니다. 어떤 종류의 명령이나 연산자(나도 그것을 무엇이라고 불러야 할지 모르겠음), 예를 들어 서버의 응답이 true 가 될 때까지 틱을 일시 중지할 수 있습니다(예: true=OrderClose(OrderTicket(), ....) 그런 다음 평소대로 계속합니다.물론 이것은 가능한 한 부탁입니다. 그리고 한 가지 더 관찰(주말에 확인했습니다) - 차트를 이동하면 틱에서 생성기 또는 일반 틱에서 제자리로 돌아가고 "어드바이저" 버튼이 눌러지고 출력 틱이 없지만 차트는 여전히 제자리로 돌아가고 차트에서 고문을 삭제하고 모든 것이 멈췄습니다. 유브이와 함께 알렉산더.
 
Meat :

일반적으로 함수의 최종 버전은 다음과 같습니다.

// 푸시 ebp; 이동 ebp, esp; 푸시 01; 푸시 02; 푸시 MT4InternMsg; 푸시 hWnd; 이동 eax, PostMsgAddr; 전화 eax; 팝 ebp; ret0010;

내가 이해하는 한 PostMessageA(hwnd, RegisterWindowMessageA("MetaTrader4_Internal_Message"), 2, 1) 명령을 사용합니다. 이 명령은 Expert Advisor의 틱을 에뮬레이트합니다(WinUser32.h의 설명에 따름). 표시기에 대해 눈금이 에뮬레이트되지 않으므로 표시기가 업데이트되지 않습니다. 불행히도 확인할 WinXP는 없지만 XP에서 표시기에 대해 틱이 여전히 에뮬레이트된다면 나는 놀랐습니다.

또한 알고리즘을 확인했습니다.

   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 );

VisualStudio 디버거에서 결과로 얻은 TimerCode 배열이 예상 결과와 전혀 일치하지 않았습니다. 이 알고리즘에 오류가 없는 것이 확실합니까? 코드와 발생한 결과의 스크린샷을 제공할 수 있습니다. 원하시면 더 자세히 분해해 드릴 수 있습니다.

 

이 주제가 지금은 그다지 관련이 없지만, 여전히 새 빌드로 전환하는 것을 서두르지 않는 사람들이 있다고 생각합니다. :) 따라서 틱 타이머가 Win7/Win8에서 작동하지 않으면 DEP 도구를 비활성화하거나 다음과 같은 기능을 추가하십시오.

 #import "kernel32.dll"
  bool   VirtualProtect( int lpAddress[], int dwSize, int flNewProtect, int & lpflOldProtect[]);

그리고 마지막으로 이 옵션:

 int SetMyTimer( int interval= 1000 , int timerId= 0 )
{    
   int MT4InternMsg= RegisterWindowMessageA( "MetaTrader4_Internal_Message" );
   int hWnd= WindowHandle ( Symbol (), Period ());
   int PostMsgAddr= GetProcAddress(GetModuleHandleA( "user32.dll" ), "PostMessageA" );
   if (PostMsgAddr== 0 || hWnd== 0 ) return ( 0 );
   static int TimerCode[ 7 ];   ArrayInitialize (TimerCode, 0 );
   int oldprotect[ 1 ]; 
  VirtualProtect(TimerCode, ArraySize (TimerCode)* 4 , 0x40 , oldprotect);   // PAGE_EXECUTE_READWRITE
  // push ebp; move ebp,esp; push 01; push 02; push MT4InternMsg; push hWnd; mov eax,PostMsgAddr; call eax; pop ebp; ret 0010;    
   int bytes[]={ 0x55 , 0x8B , 0xEC , 0x6A , 01 , 0x6A , 02 , 0x68 , 0000 , 0x68 , 0000 , 0xB8 , 0000 , 0xFF , 0xD0 , 0x5D , 0xC2 , 0x10 };
   int len[]=  { 1 ,     1 ,   1 ,     1 ,   1 ,   1 ,   1 ,   1 ,   4 ,     1 ,   4 ,     1 ,   4 ,     1 ,   1 ,     1 ,     1 ,   2 };
  bytes[ 8 ]=MT4InternMsg;  bytes[ 10 ]=hWnd;  bytes[ 12 ]=PostMsgAddr;
   int nbyte= 0 ;  
   for ( int i= 0 ;  i< ArraySize (bytes);  i++)
     for ( int j= 0 ;  j<len[i];  j++, nbyte++)
      TimerCode[nbyte/ 4 ] |= bytes[i]>>( 8 *j)& 0xFF <<(nbyte% 4 * 8 );
  timerId= SetTimer(hWnd, timerId, interval, TimerCode);
   return (timerId);
}