mql5 언어의 특징, 미묘함 및 작업 방법 - 페이지 236 1...229230231232233234235236237238239240241242243...247 새 코멘트 Nikolai Semko 2023.11.14 19:45 #2351 표준 PeriodSeconds() 함수의 빠른 구현: int PeriodSecondsFast(ENUM_TIMEFRAMES tf) { return (tf>>14==0)?(tf&0x0FFF)*60:(tf>>14==1)?(tf&0x0FFF)*60*60:(tf>>14==2)?60*60*24*7:2419200; } fxsaber 2023.11.14 20:09 #2352 Nikolai Semko #: 표준 PeriodSeconds() 함수의 빠른 구현: 형식을 살펴봤습니다. template <typename T> bool IsCorrect( const int Index ) { ResetLastError(); return((EnumToString((T)Index) != NULL) && !_LastError); } template <typename T> string ToBits( const T Value ) { string Str = NULL; for(uint i = sizeof(T) << 3; (bool)i--;) Str += (string)(int)(!!(Value & (1 << i))); return(Str); } void OnStart() { for (int i = 0; i < 1 e7; i++) if (IsCorrect<ENUM_TIMEFRAMES>(i)) Print(ToBits(i) + " - " + EnumToString((ENUM_TIMEFRAMES)i) + ", " + (string)i); } 00000000000000000000000000000000 - PERIOD_CURRENT, 0 00000000000000000000000000000001 - PERIOD_M1, 1 00000000000000000000000000000010 - PERIOD_M2, 2 00000000000000000000000000000011 - PERIOD_M3, 3 00000000000000000000000000000100 - PERIOD_M4, 4 00000000000000000000000000000101 - PERIOD_M5, 5 00000000000000000000000000000110 - PERIOD_M6, 6 00000000000000000000000000001010 - PERIOD_M10, 10 00000000000000000000000000001100 - PERIOD_M12, 12 00000000000000000000000000001111 - PERIOD_M15, 15 00000000000000000000000000010100 - PERIOD_M20, 20 00000000000000000000000000011110 - PERIOD_M30, 30 00000000000000000100000000000001 - PERIOD_H1, 16385 00000000000000000100000000000010 - PERIOD_H2, 16386 00000000000000000100000000000011 - PERIOD_H3, 16387 00000000000000000100000000000100 - PERIOD_H4, 16388 00000000000000000100000000000110 - PERIOD_H6, 16390 00000000000000000100000000001000 - PERIOD_H8, 16392 00000000000000000100000000001100 - PERIOD_H12, 16396 00000000000000000100000000011000 - PERIOD_D1, 16408 00000000000000001000000000000001 - PERIOD_W1, 32769 00000000000000001100000000000001 - PERIOD_MN1, 49153 아마 더 빠르지는 않을 것입니다. 하지만 스위치의 놀라운 속도에 대해 들어본 적이 있습니다. int PeriodSecondsFast( const ENUM_TIMEFRAMES tf ) { switch (tf) { case PERIOD_CURRENT: return(PeriodSecondsFast(_Period)); case PERIOD_M1: return(60); case PERIOD_M2: return(120); case PERIOD_M3: return(180); case PERIOD_M4: return(240); case PERIOD_M5: return(300); case PERIOD_M6: return(360); case PERIOD_M10: return(600); case PERIOD_M12: return(720); case PERIOD_M15: return(900); case PERIOD_M20: return(1200); case PERIOD_M30: return(1800); case PERIOD_H1: return(3600); case PERIOD_H2: return(7200); case PERIOD_H3: return(10800); case PERIOD_H4: return(14400); case PERIOD_H6: return(21600); case PERIOD_H8: return(28800); case PERIOD_H12: return(43200); case PERIOD_D1: return(86400); case PERIOD_W1: return(604800); case PERIOD_MN1: return(2592000); } return(0); } Nikolai Semko 2023.11.14 20:35 #2353 fxsaber #:형식을 살펴봤습니다. 아마 속도가 빨라지지는 않을 겁니다. 하지만 스위치의 기적적인 속도에 대해 들었습니다. 더 길어 보이지만 성능에 차이를 느끼지 못했습니다. int PeriodSecondsFast2(ENUM_TIMEFRAMES tf) { ushort i_tf= ushort(tf); uchar _i =uchar(i_tf>>14); int n = i_tf & 0x0FFF; switch(_i) { case 0: // минуты return n*60; case 1: // часы return n*60*60; case 2: // недели return 60*60*24*7; case 3: // месяцы return 2592000; } return -1; } 그래서 여전히 한 줄 버전이 더 낫다고 생각합니다. int PeriodSecondsFast(ENUM_TIMEFRAMES tf) { return (tf>>14==0)?(tf&0x0FFF)*60:(tf>>14==1)?(tf&0x0FFF)*60*60:(tf>>14==2)?60*60*24*7:60*60*24*30; } fxsaber 2023.11.14 20:43 #2354 Nikolai Semko #:더 길어 보입니다 int PeriodSecondsFast( const ENUM_TIMEFRAMES tf ) { static const int Mult[] = {60, 60 * 60, 60 * 60 * 24 * 7, 60 * 60 * 24 * 30}; return((tf & 0xFF) * Mult[tf >> 14]); } Maxim Kuznetsov 2023.11.14 20:44 #2355 그리고 이제 이 모든 것을 행렬과 ONX로 변환합니다 :-) Nikolai Semko 2023.11.14 20:59 #2356 fxsaber #: 네, 그렇게 할 수 있습니다. 가독성이 더 좋습니다. 내 노트북의 성능은 동일합니다. Nikolai Semko 2023.11.14 21:06 #2357 fxsaber #: int PeriodSecondsFast( const ENUM_TIMEFRAMES tf ) { static const int Mult[] = {60, 60 * 60, 60 * 60 * 24 * 7, 60 * 60 * 24 * 30}; return((tf & 0xFF) * Mult[tf >> 14]); } 그건 그렇고, 이전 게시물에서 제가 틀렸습니다. 어떤 이유에서인지 한 달에 30일이 아니라 28일이 있다고 생각했습니다. 1시간 이상 지난 게시물은 더 이상 수정할 수 없습니다. 그래서 제 올바른 버전은 다음과 같습니다: int PeriodSecondsFast(ENUM_TIMEFRAMES tf) { return (tf>>14==0)?(tf&0xFF)*60:(tf>>14==1)?(tf&0xFF)*60*60:(tf>>14==2)?60*60*24*7:60*60*24*30; } 월의 길이가 다르기 때문에 월의 초는 필요하지 않습니다. Alain Verleyen 2023.11.15 03:29 #2358 Nikolai Semko # :그건 그렇고, 이전 게시물에서 제가 틀렸습니다. 어떤 이유에서인지 한 달에 30일이 아니라 28일이 있다고 생각했습니다. 1시간이 지난 게시물은 수정할 수 없습니다. 따라서 올바른 버전은 다음과 같습니다: 월의 길이가 다르기 때문에 월의 초는 필요하지 않습니다. 이것이 PeriodSeconds(x)보다 빠르다고 생각하는 이유는 무엇인가요? Nikolai Semko 2023.11.15 03:36 #2359 Alain Verleyen #: 이것이 PeriodSeconds(x)보다 빠르다고 생각하는 이유는 무엇인가요? 이 게시물의 테스트 에서 getStartTimeOfBar()의 성능을 PeriodSeconds() 및 PeriodSecondsFast() 와 비교하는 것으로 충분합니다. 비교는 MN1을 제외한 모든 TF에서 수행해야 합니다. 성능이 약 2배 정도 더 높습니다. 전체 반복을 측정한다는 점을 고려하면 3배 정도 더 높을 수도 있습니다. 아니면 이 두 값을 비교하는 것으로 충분할까요? 2023.11.14 22:44:52.581 timeToStartMonth (EURUSD,M1) =====LOOP=10000========STEPS=100000 seconds======PERIOD_H8======== 2023.11.14 22:44:52.581 timeToStartMonth (EURUSD,M1) контрольная сумма - 12000623961600, время выполнения 1 иттерации = 6.80 наносекунд - Расчет через структуру MqlDateTime 2023.11.14 22:44:52.581 timeToStartMonth (EURUSD,M1) контрольная сумма - 12000623961600, время выполнения 1 иттерации = 3.40 наносекунд - Быстрый расчет 2023.11.14 22:44:57.734 timeToStartMonth (EURUSD,M1) контрольная сумма - 12000252960000, время выполнения 1 иттерации = 515301.20 наносекунд - Расчет через iBarShift 2023.11.14 22:44:57.734 timeToStartMonth (EURUSD,M1) ======================================================================== 2023.11.14 22:45:16.253 timeToStartMonth (EURUSD,M1) 60 ,120 ,180 ,240 ,300 ,360 ,600 ,720 ,900 ,1200 ,1800 ,3600 ,7200 ,10800 ,14400 ,21600 ,28800 ,43200 ,86400 ,604800 ,2592000 , 2023.11.14 22:45:16.253 timeToStartMonth (EURUSD,M1) =====LOOP=10000========STEPS=100000 seconds======PERIOD_M4======== 2023.11.14 22:45:16.253 timeToStartMonth (EURUSD,M1) контрольная сумма - 12000769600080, время выполнения 1 иттерации = 3.70 наносекунд - Расчет через структуру MqlDateTime 2023.11.14 22:45:16.253 timeToStartMonth (EURUSD,M1) контрольная сумма - 12000769600080, время выполнения 1 иттерации = 1.90 наносекунд - Быстрый расчет 2023.11.14 22:45:16.471 timeToStartMonth (EURUSD,M1) контрольная сумма - 12000394543440, время выполнения 1 иттерации = 21746.60 наносекунд - Расчет через iBarShift 2023.11.14 22:45:16.471 timeToStartMonth (EURUSD,M1) ======================================================================== 2023.11.14 22:45:57.038 timeToStartMonth (EURUSD,M1) 60 ,120 ,180 ,240 ,300 ,360 ,600 ,720 ,900 ,1200 ,1800 ,3600 ,7200 ,10800 ,14400 ,21600 ,28800 ,43200 ,86400 ,604800 ,2592000 , 2023.11.14 22:45:57.038 timeToStartMonth (EURUSD,M1) =====LOOP=10000========STEPS=100000 seconds======PERIOD_H1======== 2023.11.14 22:45:57.038 timeToStartMonth (EURUSD,M1) контрольная сумма - 12000751999200, время выполнения 1 иттерации = 5.30 наносекунд - Расчет через структуру MqlDateTime 2023.11.14 22:45:57.038 timeToStartMonth (EURUSD,M1) контрольная сумма - 12000751999200, время выполнения 1 иттерации = 3.00 наносекунд - Быстрый расчет 2023.11.14 22:45:57.072 timeToStartMonth (EURUSD,M1) контрольная сумма - 12000378405600, время выполнения 1 иттерации = 3410.10 наносекунд - Расчет через iBarShift 2023.11.14 22:45:57.072 timeToStartMonth (EURUSD,M1) ======================================================================== Alain Verleyen 2023.11.15 04:40 #2360 Nikolai Semko # :이 게시물의 테스트 를 통해 getStartTimeOfBar()의 작업을 PeriodSecond() 및 Per iodSecondsFast()와 비교하는 것으로 충분합니다. 비교는 MN1을 제외한 모든 TF에서 수행해야 합니다. 성능이 약 2배 정도 더 높습니다. 전체 반복을 측정한다는 점을 고려하면 3배 정도 더 높을 수도 있습니다. 아니면 이 두 값을 비교하는 것으로 충분할까요? 내가 뭔가를 놓친 것일 수도 있지만 스크립트를 사용하여 PeriodSeconds (만)를 확인했습니다. 파일: __.mq5 13 kb 1...229230231232233234235236237238239240241242243...247 새 코멘트 트레이딩 기회를 놓치고 있어요: 무료 트레이딩 앱 복사용 8,000 이상의 시그널 금융 시장 개척을 위한 경제 뉴스 등록 로그인 공백없는 라틴 문자 비밀번호가 이 이메일로 전송될 것입니다 오류 발생됨 Google으로 로그인 웹사이트 정책 및 이용약관에 동의합니다. 계정이 없으시면, 가입하십시오 MQL5.com 웹사이트에 로그인을 하기 위해 쿠키를 허용하십시오. 브라우저에서 필요한 설정을 활성화하시지 않으면, 로그인할 수 없습니다. 사용자명/비밀번호를 잊으셨습니까? Google으로 로그인
표준 PeriodSeconds() 함수의 빠른 구현:
형식을 살펴봤습니다.
아마 더 빠르지는 않을 것입니다. 하지만 스위치의 놀라운 속도에 대해 들어본 적이 있습니다.
형식을 살펴봤습니다.
아마 속도가 빨라지지는 않을 겁니다. 하지만 스위치의 기적적인 속도에 대해 들었습니다.
더 길어 보이지만 성능에 차이를 느끼지 못했습니다.
그래서 여전히 한 줄 버전이 더 낫다고 생각합니다.
더 길어 보입니다
그리고 이제 이 모든 것을 행렬과 ONX로 변환합니다 :-)
네, 그렇게 할 수 있습니다. 가독성이 더 좋습니다.
내 노트북의 성능은 동일합니다.
fxsaber #:
그건 그렇고, 이전 게시물에서 제가 틀렸습니다. 어떤 이유에서인지 한 달에 30일이 아니라 28일이 있다고 생각했습니다.
1시간 이상 지난 게시물은 더 이상 수정할 수 없습니다.
그래서 제 올바른 버전은 다음과 같습니다:
월의 길이가 다르기 때문에 월의 초는 필요하지 않습니다.
그건 그렇고, 이전 게시물에서 제가 틀렸습니다. 어떤 이유에서인지 한 달에 30일이 아니라 28일이 있다고 생각했습니다.
1시간이 지난 게시물은 수정할 수 없습니다.
따라서 올바른 버전은 다음과 같습니다:
월의 길이가 다르기 때문에 월의 초는 필요하지 않습니다.
이것이 PeriodSeconds(x)보다 빠르다고 생각하는 이유는 무엇인가요?
이 게시물의 테스트
에서 getStartTimeOfBar()의 성능을 PeriodSeconds() 및 PeriodSecondsFast() 와 비교하는 것으로 충분합니다.
비교는 MN1을 제외한 모든 TF에서 수행해야 합니다.
성능이 약 2배 정도 더 높습니다. 전체 반복을 측정한다는 점을 고려하면 3배 정도 더 높을 수도 있습니다.
아니면 이 두 값을 비교하는 것으로 충분할까요?
이 게시물의 테스트
를 통해 getStartTimeOfBar()의 작업을 PeriodSecond() 및 Per iodSecondsFast()와 비교하는 것으로 충분합니다.
비교는 MN1을 제외한 모든 TF에서 수행해야 합니다.
성능이 약 2배 정도 더 높습니다. 전체 반복을 측정한다는 점을 고려하면 3배 정도 더 높을 수도 있습니다.
아니면 이 두 값을 비교하는 것으로 충분할까요?
내가 뭔가를 놓친 것일 수도 있지만 스크립트를 사용하여 PeriodSeconds (만)를 확인했습니다.