작동하는 것이 확실합니까????
간단한 컴파일을 통해 이미 의문이 생깁니다.

그리고 두 번째로 이 함수가 무엇을 반환할까요!
CopyClose(symbol,timeframe,start,count,Close); return(ArrayMaximum(Close,start,count));
종가를 Klose 배열에 복사하고, "시작" 위치와 "개수"를 올바르게 복사합니다.
그리고 "시작"위치에서 시작하여 "카운트"요소 만보고 Klose 배열의 최대 요소의 인덱스를 반환합니다......
당신의 이단은 무엇입니까 솔직함에 대해 유감스럽게 생각합니다.....
정말 작동하나요????
네, 작동합니다.
//+------------------------------------------------------------------+
//|test.mq5 |
//|저작권 DC2008 |
//| http://www.mql5.com |
//+------------------------------------------------------------------+
#property copyright "DC2008"
//--- 시계열 배열
double Close[];
double Open[];
double High[];
double Low[];
long Volume[];
datetime Time[];
//+------------------------------------------------------------------+
//| 전문가 초기화 기능|
//+------------------------------------------------------------------+
int OnInit()
{
//---
ArraySetAsSeries(Close,true);
ArraySetAsSeries(Open,true);
ArraySetAsSeries(High,true);
ArraySetAsSeries(Low,true);
ArraySetAsSeries(Volume,true);
ArraySetAsSeries(Time,true);
ArraySetAsSeries(Low,true);
//---
return(0);
}
//+------------------------------------------------------------------+
//| 전문가 초기화 기능|
//+------------------------------------------------------------------+
void OnDeinit(const int reason)
{
//---
}
//+------------------------------------------------------------------+
//| 전문가 틱 기능|
//+------------------------------------------------------------------+
void OnTick()
{
//---
Comment(
"\niHighest",iHighest("EURUSD",PERIOD_M2,0,10,0),
" iLowest ",iLowest("EURUSD",PERIOD_M2,0,10,0)," Open",
"\niHighest",iHighest("EURUSD",PERIOD_M2,1,10,0),
" iLowest ",iLowest("EURUSD",PERIOD_M2,1,10,0)," Low",
"\niHighest",iHighest("EURUSD",PERIOD_M2,2,10,0),
" iLowest ",iLowest("EURUSD",PERIOD_M2,2,10,0)," High",
"\niHighest",iHighest("EURUSD",PERIOD_M2,3,10,0),
" iLowest ",iLowest("EURUSD",PERIOD_M2,3,10,0)," Close",
"\niHighest",iHighest("EURUSD",PERIOD_M2,4,10,0),
" iLowest ",iLowest("EURUSD",PERIOD_M2,4,10,0)," Volume",
"\niHighest",iHighest("EURUSD",PERIOD_M2,5,10,0),
" iLowest ",iLowest("EURUSD",PERIOD_M2,5,10,0)," Time",
"\n",""
);
}
//+------------------------------------------------------------------+
//||
//+------------------------------------------------------------------+
int iLowest(string symbol,
int tf,
int type,
int count=WHOLE_ARRAY,
int start=0)
{
ENUM_TIMEFRAMES timeframe=TFMigrate(tf);
if(type<=0)
{
CopyOpen(symbol,timeframe,start,count,Open);
return(ArrayMinimum(Open,start,count));
}
if(type==1)
{
CopyLow(symbol,timeframe,start,count,Low);
return(ArrayMinimum(Low,start,count));
}
if(type==2)
{
CopyHigh(symbol,timeframe,start,count,High);
return(ArrayMinimum(High,start,count));
}
if(type==3)
{
CopyClose(symbol,timeframe,start,count,Close);
return(ArrayMinimum(Close,start,count));
}
if(type==4)
{
CopyTickVolume(symbol,timeframe,start,count,Volume);
return(ArrayMinimum(Volume,start,count));
}
if(type>=5)
{
CopyTime(symbol,timeframe,start,count,Time);
return(ArrayMinimum(Time,start,count));
}
//---
return(0);
}
//+------------------------------------------------------------------+
//||
//+------------------------------------------------------------------+
int iHighest(string symbol,
int tf,
int type,
int count=WHOLE_ARRAY,
int start=0)
{
ENUM_TIMEFRAMES timeframe=TFMigrate(tf);
if(type<=0)
{
CopyOpen(symbol,timeframe,start,count,Open);
return(ArrayMaximum(Open,start,count));
}
if(type==1)
{
CopyLow(symbol,timeframe,start,count,Low);
return(ArrayMaximum(Low,start,count));
}
if(type==2)
{
CopyHigh(symbol,timeframe,start,count,High);
return(ArrayMaximum(High,start,count));
}
if(type==3)
{
CopyClose(symbol,timeframe,start,count,Close);
return(ArrayMaximum(Close,start,count));
}
if(type==4)
{
CopyTickVolume(symbol,timeframe,start,count,Volume);
return(ArrayMaximum(Volume,start,count));
}
if(type>=5)
{
CopyTime(symbol,timeframe,start,count,Time);
return(ArrayMaximum(Time,start,count));
}
//---
return(0);
}
//+------------------------------------------------------------------+
ENUM_TIMEFRAMES TFMigrate(int tf)
{
switch(tf)
{
case 0: return(PERIOD_CURRENT);
case 1: return(PERIOD_M1);
case 5: return(PERIOD_M5);
case 15: return(PERIOD_M15);
case 30: return(PERIOD_M30);
case 60: return(PERIOD_H1);
case 240: return(PERIOD_H4);
case 1440: return(PERIOD_D1);
case 10080: return(PERIOD_W1);
case 43200: return(PERIOD_MN1);
default: return(PERIOD_CURRENT);
}
}
이건 TF M2에서 가져가는 거야 알았어, 이해해
하지만 이건 우리 눈에 먼지를 뿌리는 거나 마찬가지야. TF 마이그레이션은 우리에게
default: return(PERIOD_CURRENT);
0 바에서. 이상하네요.
하지만 예를 들어 20에서 시도하면.

또 우리를 혼란스럽게 하려는 거군요.
그리고 모든 기능에서 그런 말도 안되는 소리.
그리고 왜 TF를 마이그레이션해야 하죠?
mql5에 mql4가 더 많이 가지고있는 모든 TF가 있다면......
완전한 이단 =))))
중재자가 어떻게 그런 것을 놓쳤습니까?
유진님께! 이 글을 확인하신 분이 아니길 바랍니다.
완전한 이단 =))))
운영진이 어떻게 이걸 놓쳤나요?
유진에게! 이 기사를 확인하지 않으셨기를 바랍니다.
바실리에게!
귀하의 의견에 감사드립니다. 섹션 18의 기능이 업데이트되었습니다. 현재 버전을 확인해 주세요.
작성자가 많은 작업을 수행했으며 오류가있을 수 있으므로 함께 수정하겠습니다.
MQL5 기간의 올바른 값으로 대체하려면 TFMigrate(int tf) 함수가 필요합니다. 예를 들어, MQL4에서 PERIOD_H1 상수의 수치는 60이고, MQL5에서는 PERIOD_H1=16385, 즉 TFMigrate(60)=16385입니다.
실수는 더 많다고 생각해요.
아주 단순한 순간에도 실수가 발생하기 때문입니다. 심지어 가장 단순한 실수라고 말하고 싶습니다.
어떤 섹션에서는 함수가 서로 비교됩니다.
다른 섹션에서는 아날로그가 작성됩니다.
기사를 구현하는 방법에 대한 성공적인 예는 하나도 없습니다,
내가 이해하는 한,이 기사는 µl4..... 에서 무언가를 전송하려는 시도입니다.
검증에 대한 귀하의 태도는 항상 감탄할 만합니다.
여러분의 눈에 먼지를 던지고 싶은 저자의 끊임없는 욕망이라고 생각합니다.
그는 확실히 성공했습니다.
확인 대상 자료에 대한 귀하의 민감성을 알고 있기 때문입니다.
예를 들어 20으로 시도해 보면 어떨까요?
또 헷갈리게 하려는 거군요.
모든 기능에서 그런 말도 안 되는 일이 벌어지고 있습니다.
그리고 왜 TF를 마이그레이션해야 하나요????
mql5에 mql4가 더 많은 TF를 가지고 있다면......
완전한 이단 =)))))
오류를 찾아주셔서 감사합니다. 제로 바가 아닌 다른 곳에서도 검색을 시작할 수 있다는 점을 간과하고 있었습니다. 수정된 기능은 다음과 같습니다:
//+------------------------------------------------------------------+ //|test.mq5 | //|저작권 DC2008 | //| http://www.mql5.com | //+------------------------------------------------------------------+ #property copyright "DC2008" //--- 시계열 배열 double Close[]; double Open[]; double High[]; double Low[]; long Volume[]; datetime Time[]; //+------------------------------------------------------------------+ //| 전문가 초기화 기능| //+------------------------------------------------------------------+ int OnInit() { //--- ArraySetAsSeries(Close,true); ArraySetAsSeries(Open,true); ArraySetAsSeries(High,true); ArraySetAsSeries(Low,true); ArraySetAsSeries(Volume,true); ArraySetAsSeries(Time,true); ArraySetAsSeries(Low,true); //--- return(0); } //+------------------------------------------------------------------+ //| 전문가 초기화 기능| //+------------------------------------------------------------------+ void OnDeinit(const int reason) { //--- } //+------------------------------------------------------------------+ //| 전문가 틱 기능| //+------------------------------------------------------------------+ void OnTick() { //--- Comment(Open[0],Close[0],Open[1],Close[1], "\niHighest",iHighest("EURUSD",PERIOD_M2,0,10,20), " iLowest ",iLowest("EURUSD",PERIOD_M2,0,10,20)," Open", "\niHighest",iHighest("EURUSD",PERIOD_M2,1,10,20), " iLowest ",iLowest("EURUSD",PERIOD_M2,1,10,20)," Low", "\niHighest",iHighest("EURUSD",PERIOD_M2,2,10,20), " iLowest ",iLowest("EURUSD",PERIOD_M2,2,10,20)," High", "\niHighest",iHighest("EURUSD",PERIOD_M2,3,10,20), " iLowest ",iLowest("EURUSD",PERIOD_M2,3,10,20)," Close", "\niHighest",iHighest("EURUSD",PERIOD_M2,4,10,20), " iLowest ",iLowest("EURUSD",PERIOD_M2,4,10,20)," Volume", "\niHighest",iHighest("EURUSD",PERIOD_M2,5,10,20), " iLowest ",iLowest("EURUSD",PERIOD_M2,5,10,20)," Time", "\n","" ); } //+------------------------------------------------------------------+ //|| //+------------------------------------------------------------------+ int iLowest(string symbol, int tf, int type, int count=WHOLE_ARRAY, int start=0) { ENUM_TIMEFRAMES timeframe=TFMigrate(tf); if(type<=0) { CopyOpen(symbol,timeframe,start,count,Open); return(ArrayMinimum(Open,0,count)); } if(type==1) { CopyLow(symbol,timeframe,start,count,Low); return(ArrayMinimum(Low,0,count)); } if(type==2) { CopyHigh(symbol,timeframe,start,count,High); return(ArrayMinimum(High,0,count)); } if(type==3) { CopyClose(symbol,timeframe,start,count,Close); return(ArrayMinimum(Close,0,count)); } if(type==4) { CopyTickVolume(symbol,timeframe,start,count,Volume); return(ArrayMinimum(Volume,0,count)); } if(type>=5) { CopyTime(symbol,timeframe,start,count,Time); return(ArrayMinimum(Time,0,count)); } //--- return(0); } //+------------------------------------------------------------------+ //|| //+------------------------------------------------------------------+ int iHighest(string symbol, int tf, int type, int count=WHOLE_ARRAY, int start=0) { ENUM_TIMEFRAMES timeframe=TFMigrate(tf); if(type<=0) { CopyOpen(symbol,timeframe,start,count,Open); return(ArrayMaximum(Open,0,count)); } if(type==1) { CopyLow(symbol,timeframe,start,count,Low); return(ArrayMaximum(Low,0,count)); } if(type==2) { CopyHigh(symbol,timeframe,start,count,High); return(ArrayMaximum(High,0,count)); } if(type==3) { CopyClose(symbol,timeframe,start,count,Close); return(ArrayMaximum(Close,0,count)); } if(type==4) { CopyTickVolume(symbol,timeframe,start,count,Volume); return(ArrayMaximum(Volume,0,count)); } if(type>=5) { CopyTime(symbol,timeframe,start,count,Time); return(ArrayMaximum(Time,0,count)); } //--- return(0); } //+------------------------------------------------------------------+ ENUM_TIMEFRAMES TFMigrate(int tf) { switch(tf) { case 0: return(PERIOD_CURRENT); case 1: return(PERIOD_M1); case 5: return(PERIOD_M5); case 15: return(PERIOD_M15); case 30: return(PERIOD_M30); case 60: return(PERIOD_H1); case 240: return(PERIOD_H4); case 1440: return(PERIOD_D1); case 10080: return(PERIOD_W1); case 43200: return(PERIOD_MN1); default: return(PERIOD_CURRENT); } }
실수는 더 많다고 생각해요.
아주 단순한 순간에도 실수가 발생하기 때문입니다. 심지어 가장 단순한 실수라고 말하고 싶습니다.
어떤 섹션에서는 함수가 서로 비교됩니다.
다른 섹션에서는 아날로그가 작성됩니다.
기사를 구현하는 방법에 대한 성공적인 예는 하나도 없습니다,
내가 이해하는 한,이 기사는 µl4..... 에서 무언가를 전송하려는 시도입니다.
검증에 대한 귀하의 태도는 항상 감탄할 만합니다.
여러분의 눈에 먼지를 던지고 싶은 저자의 끊임없는 욕망이라고 생각합니다.
그는 확실히 성공했습니다.
검증하는 자료에 대한 여러분의 민감성을 잘 알기 때문입니다.
실수가있을 수 있으며 자료가 상당히 큽니다.
포팅 주제 (더 정확하게는 MQL4 메소드로 에뮬레이터 클래스를 작성하는 주제)는 다른 기사에서 수행되었습니다 (완료되기를 바랍니다). 자료를 읽는 과정에서 우리는 저자에게 MQL4의 모든 기능을 다루는 참고서 형태의 기사를 작성하도록 요청했습니다 (거래 제외-조만간 솔루션 중 하나를 볼 수 있음), MQL5에서 각각에 대한 아날로그를 제공하고 일반적으로 MQL4 프로그램을 다시 작성하는 사람들이 아날로그를 빠르게 찾을 수 있도록 모든 것을 통합하기 위해 요청했습니다. 무제한 욕구에 대해 고려되는 섹션의 수에 대해 이야기하고 있다면 모든 기능을 다루어야한다고 주장했습니다 (250 개 이상으로 판명 됨).
일부 섹션의 기능 비교에 관해서는 정확히 비교가 아니 었습니다. 동일하더라도 아날로그를 제공해야했습니다. 모든 기능에 대해. 그래서 비교가있는 것 같지만 예를 들어 수학 함수가 동일하다는 것을 비교에서 알 수 있습니다. 그건 그렇고, 권장 사항으로 각 섹션의 시작 부분에 이것을 언급하는 것이 유용 할 것입니다.
이러한 이유(에뮬레이터 함수의 아키텍처)로 인해 작성자는 구현에서 명확하지 않은 몇 가지 사항(예: 이전에 전역적으로 선언되고 OnInit에서 AsSeries로 만들어진 iLowest/iHighest 글로벌 Open[]...High[]...)이 있었는데, 이는 에뮬레이터에서처럼 함수의 보편성을 위해 자연스럽게 로컬 배열을 사용하는 것이 더 낫다는 것을 암시합니다.
기술 지표로 작업하는 경우 많은 질문이있을 수 있으므로 로컬 함수에서 매번 생성하는 대신 OnInit에서 수동으로 생성하고 설명자를 참조하는 것이 좋습니다. 그러나 터미널이 표시기를 즉시 파괴하지 않기 때문에 저자가 제안한 접근 방식도 작동합니다. 따라서 많은 미묘함이 있습니다.
중요한 것은 이제 제안 된 함수 구조로 인한 오류를 포함하여 오류를 발견하면 논의 할 것이 있다는 것입니다.
새로운 기고글 MQL4에서 MQL5로 이전하기 가 게재되었습니다:
이 문서는 MQL4 언어 함수에 대한 간략한 가이드로, 프로그램을 MQL4에서 MQL5로 이전하는데에 도움을 드릴 것입니다. MQL4 함수마다 (거래 함수 제외) 설명과 대응하는 MQL5쪽의 구현이 적혀있어 이전하는데에 드는 시간을 눈에 띄게 줄여줄 것입니다.. 편의를 위해 MQL4 함수들은 MQL4 레퍼런스처럼 그룹별로 나뉘어있습니다.
MQL5에서는 차트 기간 상수 또한 변경되었고, 몇몇 신규 기간 (M2, M3, M4, M6, M10, M12, H2, H3, H6, H8, H12) 도 추가되었습니다. MQL4 기간을 변경하려면 다음의 함수를 써야합니다:
작성자: Sergey Pavlov