초보자의 질문 MQL5 MT5 MetaTrader 5 - 페이지 577

 
Artyom Trishkin :
글쎄, 나는이 모든 것을 함수에 넣고 필요할 때 그것을 호출 할 것입니다 - 적어도 모든 틱 (정당화되고 필요한 경우), 적어도 새 촛불이 열릴 때 - 한 시간에 한 번, 예를 들어 우리가 일하는 경우 H1에.

기능이 있어서 당연히 편리합니다. 코드가 무엇인지 알아 냈습니다. 이제 명확해졌습니다. 내가 원하는 목표에 어떻게 가져갈지 고민하고 필요한 데이터를 언제, 어떤 단계에서 추출할지 이해하겠습니다.

 
Koldun Zloy :

바로 '무모함의 극치'라면 금지다.

WinAPI는 MQL의 가능성을 크게 확장합니다. 그리고 dll 없이도 어리석은 일을 할 수 있습니다.

다음은 클립보드에 문자열을 전달하는 예입니다.

훌륭하고 의견이 있습니다.

덕분에.

질문 하나 더.

주어진 좌표에서 "마우스" 클릭을 에뮬레이션할 수 있습니까?

 
mila.com :

훌륭하고 의견이 있습니다.

덕분에.

질문 하나 더.

주어진 좌표에서 "마우스" 클릭을 에뮬레이션할 수 있습니까?

MQL에서 할 필요가 없다면 AutoIT로 가서 원하는 대로 하면 됩니다. 제품은 무료이며 MQL과 상호 작용하는 데 하나의 DLL만 필요합니다.
 
mila.com :

훌륭하고 의견이 있습니다.

덕분에.

질문 하나 더.

주어진 좌표에서 "마우스" 클릭을 에뮬레이션할 수 있습니까?

할 수 있다.

 #define MK_LBUTTON     0x0001
#define WM_LBUTTONDOWN 0x0201
#define WM_LBUTTONUP   0x0202

struct POINT
{
   int x;
   int y;
};

#import "User32.dll"
   uint WindowFromPoint( int x, int y );
   uint PostMessageW( uint hWnd, uint Msg, uint wParam, uint lParam );
   int ScreenToClient( uint hWnd, POINT& lpPoint );
#import

int x = 1000 ;   // Экранные координаты
int y = 350 ;

//+------------------------------------------------------------------+
//| Script program start function                                    |
//+------------------------------------------------------------------+
void OnStart ()
{
   uint hwnd = WindowFromPoint( x, y ); // Получаем дескриптор окна в нужном месте
   
   if ( hwnd ){
      POINT point;
      point.x = x;
      point.y = y;
      ScreenToClient( hwnd, point );   // Преобразуем экранные координаты в координаты рабочей области окна
      
       uint lParam = (point.y * 65536 ) + (point.x & 0xFFFF );   // Упаковываем координаты в 32-разрядное целое
      
      PostMessageW( hwnd, WM_LBUTTONDOWN, MK_LBUTTON, lParam ); // Посылаем сообщения от "мыши"
      PostMessageW( hwnd, WM_LBUTTONUP, MK_LBUTTON, lParam );
   }
}
 
Artyom Trishkin :
글쎄, 나는이 모든 것을 함수에 넣고 필요할 때 그것을 호출 할 것입니다 - 적어도 모든 틱 (정당화되고 필요한 경우), 적어도 새 촛불이 열릴 때 - 한 시간에 한 번, 예를 들어 우리가 일하는 경우 H1에.

Artem, 나는 우리가 순환하는 경우: for(int i=0; i<copy_bars; i++) 및 중첩 for(int j=0; j<copy_bars; j++) , 여기서 if(j= =i) 계속된다는 것을 정확히 이해합니다. ; ,

그러면 이것은 계산이 병렬로 진행되고 대략 5개의 양초가 있는 경우 비교가 진행됨을 의미합니다.

1 대 1 - 버리십시오.

1은 2, 1은 3, 1은 4, 1은 5입니다.

다음과 같은 위치에서 주기가 시작됩니다.

1위에서 2위, 3위에서 2위, 4위에서 2위, 5위에서 2위.

등.

똑같을까요?

 
Andrey Koldorkin :

Artem, 나는 우리가 순환하는 경우: for(int i=0; i<copy_bars; i++) 및 중첩 for(int j=0; j<copy_bars; j++) , 여기서 if(j= =i) 계속된다는 것을 정확히 이해합니다. ; ,

그러면 이것은 계산이 병렬로 진행되고 대략 5개의 양초가 있는 경우 비교가 진행됨을 의미합니다.

1 대 1 - 버리십시오.

2위부터 1위, 3위부터 1위, 4위부터 1위, 5위부터 1위.

다음과 같은 위치에서 주기가 시작됩니다.

1위에서 2위, 3위에서 2위, 4위에서 2위, 5위에서 2위.

등.

똑같을까요?

네.
 
Artyom Trishkin :
네.

또 다른 질문: 현재 양초를 비교할 필요가 없다면 0이 아닌 1부터 계정을 시작해야 하지 않습니까?

또는 여기에서 0은 양초 1, 1은 양초 2 등이라는 것을 이해해야 합니까?

 
Andrey Koldorkin :

또 다른 질문: 현재 양초를 비교할 필요가 없다면 0이 아닌 1부터 계정을 시작해야 하지 않습니까?

또는 여기에서 0은 양초 1, 1은 양초 2 등이라는 것을 이해해야 합니까?

여기서 0은 배열의 시작입니다. 그리고 배열에서 우리는 "to"가 아니라 첫 번째부터 ...까지, 그러나 우리가 필요한 양만큼 양초를 씁니다.

 int copied= CopyRates ( Symbol (), PERIOD_CURRENT , 1 ,copy_bars,array);

1은 복사를 시작할 촛불의 번호이고 copy_bars는 복사할 촛불의 번호입니다.

따라서 array[] 배열에서 인덱스가 0인 셀에 필요한 양초(1 또는 1+copy_bars-1)가 있습니다. array[] 배열의 인덱싱 방향에 따라 (ArraySetAsSeries() 는 인덱싱 방향을 설정합니다 . 이는 ArrayGetAsSeries(), ArrayIsSeries()를 사용하여 확인할 수 있습니다.

 
Artyom Trishkin :

여기서 0은 배열의 시작입니다. 그리고 배열에서 우리는 "to"가 아니라 첫 번째부터 ...까지, 그러나 우리가 필요한 양만큼 양초를 씁니다.

1은 복사를 시작할 촛불의 번호이고 copy_bars는 복사할 촛불의 번호입니다.

따라서 array[] 배열에서 인덱스가 0인 셀에 필요한 양초(1 또는 1+copy_bars-1)가 있습니다. array[] 배열의 인덱싱 방향에 따라 (ArraySetAsSeries() 는 인덱싱 방향을 설정합니다 . 이는 ArrayGetAsSeries(), ArrayIsSeries()를 사용하여 확인할 수 있습니다.

아, 프로그래밍이군요. 숲속으로 더....

나는 먼저 Alert를 통해 그것이 무엇을 제공하는지 확인했습니다. 그 반대가 사실로 밝혀졌습니다. 현재 촛불에 가장 가까운 촛불이 최대 수를 가집니다.

그런 다음 다음과 같이 확인했습니다.

부울 시리즈=ArrayIsSeries(dataCandle);

경고(시리즈);

스크립트가 "거짓"을 반환했습니다.

내 논리에 따르면 거짓이면 잘못된 끝에서 나온 것이고 참은 필요한 것에서 나온 것입니다.

나는 썼다:

ArraySetAsSeries(dataCandle, true); //방향 전환

부울 시리즈=ArrayIsSeries(dataCandle); // 무슨 일이 있었는지 다시 확인

경고(시리즈); // 결과를 화면에 표시합니다.

그러나 그 후에도 나는 "거짓"을 얻습니다.

내 잼은 무엇입니까?

 
Andrey Koldorkin :

아, 프로그래밍이군요. 숲속으로 더....

나는 먼저 Alert를 통해 그것이 무엇을 제공하는지 확인했습니다. 그 반대가 사실로 밝혀졌습니다. 현재 촛불에 가장 가까운 촛불이 최대 수를 가집니다.

그런 다음 다음과 같이 확인했습니다.

부울 시리즈=ArrayIsSeries(dataCandle);

경고(시리즈);

스크립트가 "거짓"을 반환했습니다.

내 논리에 따르면 거짓이면 잘못된 끝에서 나온 것이고 참은 필요한 것에서 나온 것입니다.

나는 썼다:

ArraySetAsSeries(dataCandle, true); //방향 전환

부울 시리즈=ArrayIsSeries(dataCandle); // 무슨 일이 일어났는지 다시 확인

경고(시리즈); // 결과를 화면에 표시합니다.

그러나 여전히 나는 "거짓"을 얻습니다.

내 잼은 무엇입니까?

dataCandles는 구조체입니다. 우리가 기록에서 촛불 자체를 작성하는 배열 - array[]. 따라서 인덱싱이 차트의 양초 인덱싱과 일치하도록 시계열로 수행해야 합니다. 즉, array[] 배열의 0 셀은 현재 날짜에 가장 가까운 양초에 해당합니다.

즉, 1. 양초를 array[] 배열에 복사하고, 2. 그것을 시계열로 만든 다음, 그 값을 구조로 읽어옵니다.

array[] 배열 없이도 가능합니다. 차트에서 직접 구조로 데이터를 쓰는 것이 가능하지만 5개와의 호환성을 위해 이것을 제안했습니다. high[i], low를 사용하여 표시기에서만 직접 복사할 수 있습니다. [i] 및 기타 데이터를 사용하지만 스크립트 또는 Expert Advisor에서 원하는 히스토리 세그먼트를 먼저 어레이에 복사해야 합니다.