기고글 토론 "MQL5 소개: 간단한 전문가 자문 및 사용자 지정 지표 작성 방법" - 페이지 2

 
Rosh:

인디케이터 버퍼의 경우 SetIndexBuffer라고 표시됩니다:

전문가 어드바이저의 경우 비슷해야 합니다.

아직 비유가 없습니다. 이 코드를 확인할 때

//+------------------------------------------------------------------+
//|Test002.mq5 |
//+------------------------------------------------------------------+
double high[];
int bars;
//+------------------------------------------------------------------+
//| 전문가 초기화 기능|
//+------------------------------------------------------------------+
int OnInit()
  {
//---
   bars=Bars(Symbol(),PERIOD_CURRENT);
   ArraySetAsSeries(high,true);
//---
   return(0);
  }
//+------------------------------------------------------------------+
//| 전문가 초기화 기능|
//+------------------------------------------------------------------+
void OnDeinit(const int reason)
  {
//---
  }
//+------------------------------------------------------------------+
//| 전문가 틱 기능|
//+------------------------------------------------------------------+
void OnTick()
  {
//---
   int copied=CopyHigh(Symbol(),0,0,bars,high);
   return;
  }
//+------------------------------------------------------------------+

반환 연산자 반대편에 중단점을 넣었습니다. 디버거는 다음과 같은 결과를 생성합니다: 높은 "동적 배열[8563], S". S는 "시리즈"의 약자라는 것을 알고 있습니다.

 
Yedelkin:

이 비유는 아직 작동하지 않습니다. 이 코드를 확인할 때

반환 연산자 반대편에 중단점을 넣었습니다. 디버거는 다음과 같은 결과를 생성합니다: 높은 "동적 배열[8563], S". S가 "시리즈"의 약자라는 것을 알고 있습니다.

그런데 왜 작동하지 않나요? 확실하지 않은 경우 ArrayGetAsSeries 함수로 시리즈에 대한 명시적 검사를 설정하세요:

//+------------------------------------------------------------------+
//|Test_ArraySetAsSeries.mq5 |
//| 저작권 © 2010, MetaQuotes Software Corp.
//| http://www.mql5.com |
//+------------------------------------------------------------------+
#property copyright "Copyright 2010, MetaQuotes Software Corp."
#property link      "http://www.mql5.com"
#property version   "1.00"
double high[];
int bars;
//+------------------------------------------------------------------+
//| 전문가 초기화 기능|
//+------------------------------------------------------------------+
int OnInit()
  {
//---
   bars=Bars(Symbol(),PERIOD_CURRENT);
   ArraySetAsSeries(high,true);
//---
   return(0);
  }
//+------------------------------------------------------------------+
//| 전문가 틱 기능|
//+------------------------------------------------------------------+
void OnTick()
  {
//---
   int copied=CopyHigh(Symbol(),0,0,bars,high);
   bool IsSeries=ArrayGetAsSeries(high);
   return;
  }
//+------------------------------------------------------------------+

결과


 
Rosh писал(а) :

작동하지 않는 이유. 확실하지 않은 경우 ArrayGetAsSeries 함수를 사용하여 직렬성을 명시적으로 검사하세요:

제가 무슨 말을 하고 있는지 상기시켜드리겠습니다. 배열을 복사한 후에만 항상 인덱싱해야 하는지 묻고 있었습니다. SetIndexBuffer 함수 노트를 언급하며 EA에 대해서도 동일해야 한다고 말씀하셨습니다. 이 SetIndexBuffer 함수 노트는"링크된 배열이 시계열처럼 색인되도록 미리 설정되어 있 더라도링크 후에는 동적 배열 버퍼[] 가 일반 배열과 마찬가지로 색인된다" 는 것을 의미합니다.

따라서 저는 CopyTime, CopyHigh, CopyLow 함수를 사용한 후 수신 배열도 일반 배열과 마찬가지로 인덱싱해야 한다는 점에서 EA를 비유할 수 있다고 생각했습니다. 이 유추를 테스트하기 위해 OnInit() 함수에서 CopyHigh 함수 앞에 ArraySetAsSeries 함수를 배치했습니다. 그러나 제 예제와 제안하신 ArrayGetAsSeries 함수에 의한 직렬화 명시적 검사에 따르면 CopyHigh 함수를 사용한 후에도 수신 배열 high[]의 사전 설정된 인덱싱( 시계열에서와 같이)이 변경되지 않았습니다. 이는 다시 말해, 명시적 직렬화 검사에서 IsSeries=false가 표시되어야 하므로 말씀하신 SetIndexBuffer 함수와의 유추가 아직 관찰되지 않았다는 것을 나타냅니다.

 

Yedelkin:

이 비유를 테스트하기 위해 OnInit() 함수에서 CopyHigh 함수 앞에 ArraySetAsSeries 함수를 배치했습니다. 그러나 제 예제와 제안하신 ArrayGetAsSeries 함수에 의한 직렬화를 명시적으로 확인한 결과 CopyHigh 함수를 사용한 후에도 수신 배열 high[]의 사전 설정된 인덱싱( 시계열에서와 같이)이 변경되지 않았음을 보여줍니다.

사실, 제 말은 OnInit() 또는 다른 함수에서 전역 배열에 대한 직렬화를 설정한 후에는 이 직렬화가 다른 곳에서는 변경되지 않는다는 뜻이었습니다. 유일한 예외는 SetIndexBuffer() 함수와 관련된 것입니다.

이 문제에 대해서는 합의에 도달했다고 생각하며 이 문제는 해결된 것으로 간주할 수 있습니다.

 

예, 질문에 대한 답변이 완료되었습니다. 명확하게 설명해 주셔서 감사합니다!

 

몇 가지 질문이 있습니다.

1.

   if(CopyTime(Symbol(),0,0,i,t)<i || CopyHigh(Symbol(),0,0,i,h)<i || CopyLow(Symbol(),0,0,i,l)<i)
     {
      Print("시계열을 복사하지 못했습니다!");
      return;
     }

" if... 연산자에서 반환 연산자는 OnTick 함수 실행을 종료하는 데 사용됩니다."라고 되어 있습니다.

만약 (....) {...}에서 것이 아니라 OnTick?

2.

   for(i=0;i<PositionsTotal();i++) {…}

MQL4에서는 역방향 검색이 권장됩니다.

for(i= PositionsTotal();i>0;i--) {…}
무엇이 더 낫나요?

3. 전문가 어드바이저 및 표시기를 다운로드했습니다 ( Opera 10.54 중재자의 경우 첨부 파일 다운로드 문제). 모두 컴파일되었습니다. 지난 달을 선택하는 M5에서 테스터에서 시작했습니다.

로그

2010.05.15 13:16:02 Core 1 연결 끊김

2010.05.15 13:16:01 Core 1 로그 파일 "D:\MetaTrader 5\Tester\Agent-127.0.0.0.1-3000\logs\20100515.log" 작성되었습니다.

2010.05.15 13:16:01 Core 1 EURUSD,M5: 1431016ms 이내에 553908 틱(2580 바) 생성 (총 100352 바 기록)

2010.05.15 13:16:01 Core 1 OnTester 결과 0

2010.05.15 12:52:13 Core 1 EURUSD,Daily: 2009.01.02 00:00부터 기록 시작

2010.05.15 12:52:13 Core 1 EURUSD,Daily: 약 355개의 바에 대한 히스토리 캐시 보유

2010.05.15 12:52:13 Core 1 EURUSD: 2009.01.02 06:01 ~ 2010.05.03 00:00 시작 데이터의 484483 M1 레코드 포함

2010.05.15 12:52:10 Core 1 Lots=0.100000

2010.05.15 12:52:10 Core 1 MAper=240

2010.05.15 12:52:10 Core 1 EndHour=19

2010.05.15 12:52:10 Core 1 StartHour=7

2010.05.15 12:52:10 Core 1 EURUSD,M5: 2010.05.01 00:00 ~ 2010.05.14 00:00에 Experts\expert.ex5의 테스트가 입력으로 시작되었습니다:

실행하는 데 매우 오랜 시간이 걸렸고 단 한 건의 거래도 체결되지 않았습니다. 자동 거래가 허용됩니다. 로그에 메시지가 없습니다 ((((편집 아마도 아직 찾는 방법을 모릅니다)). 인디케이터와 전문가 조언자가 있어야 할 곳에 있습니다. Windows XP, MT (빌드 274).

4. 디버깅 모드를 시도했지만 작동하지 않습니다. 아마도 토요일 때문일 것입니다. 따옴표가 없습니다. 나는 기사에서와 같은 방식으로 정지 지점을 만들었습니다. 내가 맞다면 유감스럽게도 근무일에만 디버깅 할 수 있다는 것이 밝혀졌습니다. 디버깅에 필요한 데이터와 함께 자신의 파일을 업로드 할 수 있고 (또는) 일부 일반적인 데이터 (하루 동안의 기록으로 남겨 두십시오)를 사용하면 디버깅에 충분할 것입니다.

5. 복사 기능을 연구한 사람이 있다면... 누락된 막대가 있는 경우 작동 방식에 대한 정보를 공유해 주세요. 기사를 주문하는 것이 더 나을 수도 있겠지만요.

 
Prival:

몇 가지 질문이 있습니다.

1. " if... 연산자에서 반환 연산자는 OnTick 함수 실행을 종료하는 데 사용됩니다."라고 되어 있습니다.

만약 (....) {...}에서 것이 아니라 OnTick인가요?

반환 연산자 반환에 대한 설명에서

Оператор return прекращает выполнение текущей функции и возвращает управление 
вызвавшей программе. Результат вычисления выражения возвращается вызываемой 
функции. Выражение может содержать оператор присваивания.

이 예제에서 반환 문의 현재 함수는 OnTick() 함수입니다.

개인:

4. 디버그 모드를 시도했지만 실행되지 않습니다. 아마도 토요일 때문일 것입니다. 따옴표가 없습니다. 나는 기사에서와 같은 방식으로 정지 지점을 만들었습니다. 내가 맞다면 유감스럽게도 근무일에만 디버깅 할 수 있다는 것이 밝혀졌습니다. 디버깅에 필요한 데이터와 함께 자신의 파일을 업로드 할 수 있고 (또는) 일부 일반적인 데이터 (하루 동안의 기록으로 남겨 두십시오)를 사용하면 디버깅에 충분할 것입니다.

이 사이트에서는 이미 디버깅에 대한 유사한 질문에 대해 논의했습니다. 관심이 있으시면 검색창에서 "디버깅"이라는 단어를 검색해 보세요.

 

자동 업데이트 (빌드 275)를 로드한 후 컴파일러는 다음 유형의 조건이 확인되는 줄에서 경고를 생성하기 시작했습니다.

if(PositionGetInteger(POSITION_TYPE)==POSITION_TYPE_BUY)
경고는 동일한 유형입니다:
implicit enum conversion Perito02-04 temp3.mq5 1233 45
질문: 컴파일러의 올바른 작동이 지정된 상황에서 이러한 경고의 출현을 의미합니까? 어떤 "변환"에 대해 이야기하고 있나요?
 
Yedelkin :

자동 업데이트 (빌드 275)를로드 한 후 컴파일러는 해당 유형의 조건이 확인되는 줄에서 경고를 생성하기 시작했습니다.

경고는 동일한 유형입니다: 질문: 컴파일러의 올바른 작업이 지정된 상황에서 이러한 경고의 출현을 의미합니까? 어떤 "변환"에 대해 이야기하고 있나요?

이 경고는 프로그래머가 주의를 기울이고 코드를 다시 확인하도록 하기 위해 도입되었습니다.

함수 결과를 열거형 또는 열거형을 int로 명시적으로 캐스팅하면 경고를 제거할 수 있습니다.

 
Prival:

몇 가지 질문이 있습니다.

1. " if... 연산자에서 반환 연산자는 OnTick 함수 실행을 종료하는 데 사용됩니다."라고 되어 있습니다.

만약 (....) {...}에서 것이 아니라 OnTick?

연산자의 조건 중 하나 이상이 충족되면

if(CopyTime(Symbol(),0,0,i,t)<i || CopyHigh(Symbol(),0,0,i,h)<i || CopyLow(Symbol(),0,0,i,l)<i)

조건 중 하나 이상이 충족되는 경우, 즉 배열 중 하나 이상을 완전히 복사할 수 없는 경우(기록 데이터가 충분하지 않거나 오류가 발생함) - 이 데이터 없이는 추가 계산이 불가능하므로 OnTick 함수가 종료됩니다.

2. MQL4에서는 역 열거가 권장되었습니다.

무엇이 더 낫습니까?

변형

for(i=0;i<PositionsTotal();i++)

и

for(i=PositionsTotal()-1;i>=0;i--)

는 동일하지만 첫 번째 변형이 텍스트 형식이 더 짧기 때문에 사용되었습니다.

3. 전문가 고문 및 표시기를 다운로드했습니다 (중재자 용 Opera 10.54 첨부 파일 다운로드 문제). 모두 컴파일되었습니다. M5의 테스터에서 실행하여 지난 달을 선택했습니다.

실행하는 데 매우 오랜 시간이 걸렸고 단일 거래를 열지 않았습니다. 자동 거래가 허용됩니다. 로그에 메시지가 없습니다 ((((아직 찾는 방법을 모를 수도 있습니다)). 인디케이터와 전문가 조언자가 있어야 할 곳에 있습니다. Windows XP, MT (빌드 274).

4. 디버깅 모드를 시도했지만 실행되지 않습니다. 아마도 토요일 때문일 것입니다. 따옴표가 없습니다. 나는 기사에서와 같은 방식으로 정지 지점을 만들었습니다. 내가 맞다면 유감스럽게도 근무일에만 디버깅 할 수 있다는 것이 밝혀졌습니다. 디버깅에 필요한 데이터와 함께 자신의 파일을 업로드 할 수 있고 (또는) 일부 일반적인 데이터 (하루 동안의 기록으로 남겨 두십시오)를 사용하면 디버깅에 충분할 것입니다.

5. 복사 기능을 연구한 사람이 있다면... 누락된 막대가 있는 경우 작동 방식에 대한 정보를 공유해 주세요. 기사를 주문하는 것이 더 나을 수도 있지만.

솔직히 말해서 내 테스터도 잘 작동하지 않습니다. 테스트는 MQL4에서 유사한 EA를 테스트하는 것보다 훨씬 오래 걸립니다. 테스트 간격의 처음 1 ~ 2 일 동안 만 거래가 열립니다 (다른 전문가 고문을 테스트 할 때 관찰 됨).

OnTick 및 OnCalculate 기능은 새 견적이 수신되면 시작되므로 디버깅을 위해서는 견적을 수신해야합니다 (주말에는 작동하지 않음). 그렇지 않으면 디버거가 정상적으로 작동합니다(사용해보시고 필요한 것이 있으면 저에게 문의하세요).

배열 시계열 관련 : - 배열의 방향은 언제든지 양방향으로 변경할 수 있으며 메모리의 배열 위치는 변경되지 않고 인덱싱 만 변경됩니다 ( 0,1,2,...,마지막에서 마지막까지 ,...,2,1,0) .