거래 로봇을 무료로 다운로드 하는 법을 시청해보세요
당사를 Telegram에서 찾아주십시오!
당사 팬 페이지에 가입하십시오
스크립트가 흥미로우신가요?
그렇다면 링크 to it -
하셔서 다른 이들이 평가할 수 있도록 해보세요
스크립트가 마음에 드시나요? MetaTrader 5 터미널에서 시도해보십시오
조회수:
38
평가:
(4)
게시됨:
\MQL5\Include\
MQL5 프리랜스 이 코드를 기반으로 한 로봇이나 지표가 필요하신가요? 프리랜스로 주문하세요 프리랜스로 이동

변수 정의

먼저 파일의 첫 줄을 변수 및 배열의 이름과 일치하도록 변경해야 합니다. 아래에서는 캔들 개장, 종가, 고가, 저가가 있는 MqlRates 변수에 g_rates를 사용한 것을 볼 수 있습니다. g_rates를 변수 이름으로 바꿔야 합니다. "i"는 코드의 다른 변수와 간섭하지 않는 더미 변수 이름입니다. 변수 "i"는 사용 중인 캔들 번호입니다. 예: 캔들 3의 종가를 사용하려면 CANDLECLOSE(3)을 사용합니다.


// 캔들 (정의 g_rates: MqlRates g_rates[];)
#define  CANDLELOW(i)    g_rates[i].low
#define  CANDLEHIGH(i)   g_rates[i].high
#define  CANDLEOPEN(i)   g_rates[i].open
#define  CANDLECLOSE(i)  g_rates[i].close
#define CANDLETIME(i)   g_rates[i].time

또한 아래처럼 MqlTick을 사용하여 ASK 및 BID 값을 구하거나 원하는 경우 SymbolInfoDouble(_Symbol,SYMBOL_ASK)을 호출할 수 있습니다. 반환되는 값에는 차이가 없습니다.

// 가격(g_tick을 다음과 같이 정의: MqlTick g_tick;))
#define  ASK             g_tick.ask
#define  BID             g_tick.bid

마지막으로 이동 평균, atr 또는 필요한 추가 배열을 위한 배열도 정의할 수 있습니다. 예: 캔들 1의 평균 진폭을 사용하려면 ATR(1)을 사용합니다.
중요: 배열은 AsSeries(예:ArraySetAsSeries(g_MA20_arr, true); )라고 가정합니다. 이는 나중에 표시되는 #define 문에서 중요합니다.

// 이 배열을 다음과 같이 정의합니다: double g_MA20_arr[];
// 이동 평균 및 ATR
#define  MOVAVG20(i)     g_MA20_arr[i]
#define  MOVAVG40(i)     g_MA40_arr[i]
#define  MOVAVG50(i)     g_MA50_arr[i]
#define  MOVAVG200(i)    g_MA200_arr[i]
#define  ATR(i)          g_atr_arr[i]


위의 문을 정의한 후에는 다른 것을 변경할 필요가 없습니다. 필요한 경우 EA에 맞는 #define 문을 추가로 추가할 수도 있습니다.


캔들 기능

캔들에는 EA를 개발할 때, 특히 가격 행동 기반 EA인 경우 유용한 기능이 있습니다. 다음 정의의 이름을 보면 무엇을 나타내는지 알 수 있습니다. 심지는 상단 캔들의 그림자를, 꼬리는 하단 캔들의 그림자를 나타냅니다. 예: 마지막 캔들 몸통 중앙의 가격을 얻으려면 CANDLEBODYMIDDLE(1)을 사용합니다.

// 캔들 기능
#define  CANDLEBODYTOP(i)      fmax(CANDLEOPEN(i),CANDLECLOSE(i))
#define  CANDLEBODYBOT(i)      fmin(CANDLEOPEN(i),CANDLECLOSE(i))
#define  CANDLEMEDIAN(i)       (0.5*(CANDLEHIGH(i)+CANDLELOW(i)))
#define  CANDLEWEIGHTED(i)     (0.25*(CANDLEHIGH(i)+CANDLELOW(i)+2*CANDLECLOSE(i)))
#define  CANDLETYPICAL(i)      (1./3.*(CANDLEHIGH(i)+CANDLELOW(i)+CANDLECLOSE(i)))
#define  CANDLEBODYMIDDLE(i)   (0.5*(CANDLEBODYTOP(i)+CANDLEBODYBOT(i)))
#define  CANDLESIZE(i)         (CANDLEHIGH(i)-CANDLELOW(i))
#define  CANDLEBODYSIZE(i)     fabs(CANDLECLOSE(i)-CANDLEOPEN(i))
#define  CANDLEWICKSIZE(i)     (CANDLEHIGH(i)-CANDLEBODYTOP(i))
#define  CANDLETAILSIZE(i)     (CANDLEBODYBOT(i)-CANDLELOW(i))

또한 ATR을 기준으로 두 가지 크기를 정의합니다. 예: ATR에 대한 캔들 4의 크기를 알고 싶으면 ATRCANDLESIZE(4)를 사용합니다.

#define  ATRCANDLESIZE(i)      (CANDLESIZE(i)/ATR(i))
#define  ATRCANDLEBODYSIZE(i)  (CANDLEBODYSIZE(i)/ATR(i))

또한 위로 올라가는 캔들(닫힘>열림)은 방향이 +1이고 아래로 내려가는 캔들은 -1입니다. 닫힘==열림이면 방향 = 0입니다. 예: if(CANDLEDIRECTION(10)==1) Print("캔들 10은 상승 캔들입니다");

#define  CANDLEDIRECTION(i)    (CANDLECLOSE(i)>CANDLEOPEN(i)?1:(CANDLECLOSE(i)<CANDLEOPEN(i)?-1:0))

두 가지 유형의 "실행"이 정의되어 있습니다: UP과 DOWN. 상승 캔들에서 runUP은 종가-저점, 그렇지 않으면 0으로 정의되며, 하락 캔들에서 고가-종가, 그렇지 않으면 0으로 정의됩니다. "런"은 한 방향으로의 강한 가격 움직임을 포착하는 데 유용하게 사용됩니다. 예를 들어 캔들 3의 런업을 얻으려면 CANDLERUNUP(3)을 사용합니다.

#define  CANDLERUNUP(i)        ((CANDLECLOSE(i)>CANDLEOPEN(i))?(CANDLECLOSE(i)-CANDLELOW(i)):0)
#define  CANDLERUNDOWN(i)      ((CANDLECLOSE(i)<CANDLEOPEN(i))?(CANDLEHIGH(i)-CANDLECLOSE(i)):0)


캔들 기능 문의

이러한 정의는 캔들 하나 또는 캔들 그룹의 동작을 알려주는 부울 변수입니다. 앞의 #define 문을 사용하여 길이를 짧게 만듭니다.

isCANDLERIGHTDIR(i,dir)은 캔들(i) 방향이 dir과 같으면 참이 되고, 그렇지 않으면 거짓이 됩니다;

프랙탈에는 다섯 개의 캔들을 사용하는 프랙탈과 세 개의 캔들을 사용하는 프랙탈(약한 프랙탈)의 두 가지 유형이 있습니다. 캔들(i) 아래의 프랙탈 #정의에서 가장 높은 고점(TOP) 또는 가장 낮은 저점(BOT)을 가진 중간 캔들입니다. 5개 캔들 프랙탈의 경우 캔들 i-2,i-1,i,i+1,i+2에 대한 데이터가 있는지 확인하세요. 엄격한 부등식 ">" 또는 "<"를 사용하거나 "<=" 또는 ">="를 사용하는 다른 변형도 있습니다. 마지막으로 상단(TOP) 또는 하단(BOT) 프랙탈을 식별하기 위한 #정의가 있습니다. 정의를 살펴보면 어떤 정의를 사용할지 알 수 있습니다.

is3CANDLEGAPUP(i,gap,size)는 UP 갭(한 캔들의 고점이 나중에 두 캔들의 저점보다 아래에 있는 경우)을 찾는 데 사용됩니다. Candle(i)는 문제의 세 캔들 중 가장 최근의 캔들입니다. 다시 말하지만, 캔들은 "AsSeries"라고 가정합니다. "갭"은 갭의 최소 가격-델타이고, "사이즈"는 중간 캔들 몸통 크기의 최소 가격-델타입니다.

is3CANDLEGAPDOWN(i,gap,size)는 동일한 로직을 사용하여 DOWN 갭을 찾는 데 사용됩니다.

is3CANDLEGAPUPTREND(i,gap,size)와 동일하지만 참이 되려면 세 캔들 중 가장 오래된 캔들의 방향이 양수여야 한다는 조건이 추가됩니다.

캔들이 도지인지 조회하는 방법은 두 가지가 있습니다: isCANDLEDOJIPOINTS(i,n) 및 isCANDLEDOJIFRACTION(i,f). 첫 번째 버전은 n*_Point를 사용하고 두 번째 버전은 f*CANDLESIZE(i)를 사용하여 캔들이 도지인지 아닌지(참 또는 거짓)를 판단합니다.

예: 캔들 20이 엄격하지 않은(등식을 사용하는) 프랙탈 정점인지 알고 싶다면 isCANDLEFRACTALEQTOP(20)을 사용하면 참 또는 거짓이 출력됩니다.

보시다시피, 정의는 쿼리를 압축한 형태이므로 EA 코드를 더 짧고 읽기 쉽게 만들 수 있습니다.

// 캔들 기능 문의(부울)
#define  isCANDLEUP(i)               (CANDLEDIRECTION(i)==1)
#define  isCANDLEDOWN(i)             (CANDLEDIRECTION(i)==-1)
#define  isCANDLEFLAT(i)             (CANDLEDIRECTION(i)==0)
#define  isCANDLEWICKLESS(i)         (CANDLEWICKSIZE(i)==0)
#define  isCANDLETAILLESS(i)         (CANDLETAILSIZE(i)==0)
#define  isCANDLESOLID(i)            (CANDLEWICKSIZE(i)==0 && CANDLETAILSIZE(i)==0)
#define  isCANDLERIGHTDIR(i,dir)     (dir*(CANDLECLOSE(i) - CANDLEOPEN(i))>0)
#define  isCANDLEFRACTALTOP(i)       (CANDLEHIGH(i) > CANDLEHIGH(i-1) && CANDLEHIGH(i-1) > CANDLEHIGH(i-2) && CANDLEHIGH(i) > CANDLEHIGH(i+1) && CANDLEHIGH(i+1) > CANDLEHIGH(i+2))
#define  isCANDLEFRACTALBOT(i)       (CANDLELOW(i) < CANDLELOW(i-1) && CANDLELOW(i-1) < CANDLELOW(i-2) && CANDLELOW(i) < CANDLELOW(i+1) && CANDLELOW(i+1) < CANDLELOW(i+2))
#define  isCANDLEFRACTALEQTOP(i)     (CANDLEHIGH(i) >= CANDLEHIGH(i-1) && CANDLEHIGH(i-1) >= CANDLEHIGH(i-2) && CANDLEHIGH(i) >= CANDLEHIGH(i+1) && CANDLEHIGH(i+1) >= CANDLEHIGH(i+2))
#define  isCANDLEFRACTALEQBOT(i)     (CANDLELOW(i) <= CANDLELOW(i-1) && CANDLELOW(i-1) <= CANDLELOW(i-2) && CANDLELOW(i) <= CANDLELOW(i+1) && CANDLELOW(i+1) <= CANDLELOW(i+2))
#define  isCANDLEWEAKFRACTALTOP(i)   (CANDLEHIGH(i) > CANDLEHIGH(i-1) && CANDLEHIGH(i) > CANDLEHIGH(i+1))
#define  isCANDLEWEAKFRACTALBOT(i)   (CANDLELOW(i) < CANDLELOW(i-1) && CANDLELOW(i) < CANDLELOW(i+1))
#define  isCANDLEWEAKFRACTALEQBOT(i) (CANDLELOW(i) <= CANDLELOW(i-1) && CANDLELOW(i) <= CANDLELOW(i+1))
#define  isCANDLEWEAKFRACTALEQTOP(i) (CANDLEHIGH(i) >= CANDLEHIGH(i-1) && CANDLEHIGH(i) >= CANDLEHIGH(i+1))
#define  is3CANDLEGAPUP(i,gap,size)  (CANDLELOW(i)-CANDLEHIGH(i+2)>gap && CANDLEBODYSIZE(i+1)>=size)
#define  is3CANDLEGAPDOWN(i,gap,size) (CANDLELOW(i+2)-CANDLEHIGH(i)>gap && CANDLEBODYSIZE(i+1)>=size)
#define  is3CANDLEGAPUPTREND(i,gap,size)  (CANDLELOW(i)-CANDLEHIGH(i+2)>gap && CANDLEBODYSIZE(i+1)>=size &&  isCANDLEUP(i+2))
#define  is3CANDLEGAPDOWNTREND(i,gap,size) (CANDLELOW(i+2)-CANDLEHIGH(i)>gap && CANDLEBODYSIZE(i+1)>=size &&  isCANDLEDOWN(i+2))
#define  isCANDLEDOJIPOINTS(i,n)     (CANDLEBODYSIZE(i) <= n*_Point)
#define  isCANDLEDOJIFRACTION(i,f)   (CANDLEBODYSIZE(i) <= f*CANDLESIZE(i))


수학 함수 및 연산

이제 EA에서 유용한 몇 가지 수학 함수와 연산을 정의하겠습니다. 이 중 일부는 제가 개발한 EA에만 해당되는 것이지만 원한다면 변경하거나 삭제할 수 있습니다.

BRACKET(x,minV,maxV)는 [minV,maxV] 간격 내에 있는 x 값을 반환합니다. 이 함수는 EA에서 입력 변수를 박스형으로 제한할 때 유용합니다.

CONVEXCOMB(a,x1,x2)는 x1과 x2의 볼록한 조합을 a*x1+x2로 반환합니다. 이 함수는 x1과 x2 사이의 중간값을 계산할 때 유용하지만 평균(a=0.5) 이상의 값을 원할 때 유용합니다.

EVALLINE(x,x1,y1,x2,y2,ymin,ymax)는 두 점 [x1,y1]과 [x2,y2]로 정의된 직선을 평가하는 함수입니다. x에서 평가되면 대괄호로 묶인 [ymin, ymax] 내부의 값을 반환합니다.

MAPAB11(x,A,B)는 대괄호 [A,B]의 값 x를 대괄호 [-1,1]로 매핑합니다. MAP11AB(x,A,B)는 대괄호 [-1,1]의 값 x를 대괄호 [A,B]로 매핑합니다. 이 두 함수는 [-1,1] 범위의 정규화된 변수로 작업할 때 유용합니다.

마지막 네 가지 함수는 제 EA에서 사용되며 모든 사람에게 일반적으로 유용하지는 않을 수 있지만, 혹시 모를 경우를 대비해 남겨두었습니다.

#define  BRACKET(x,minV,maxV)                 (x<minV?minV:(x>maxV?maxV:x))
#define  CONVEXCOMB(a,x1,x2)                  (a*x1+(1.0-a)*x2)
#define  EVALLINE(x,x1,y1,x2,y2,ymin,ymax)    BRACKET((y2-y1)/(x2-x1)*(x-x1)+y1,ymin,ymax)
#define  MAPAB11(x,A,B)                       (2./(B-A)*(BRACKET(x,A,B)-A)-1.)
#define  MAP11AB(x,A,B)                       ((B-A)/2.*(BRACKET(x,-1,1)-1)+B)
#define  SIGMOID(x,a)                         (1.0/(1.0 + exp(-a*x)))
#define  NN1(x,w,b)                           (w*x+b)
#define  EVALPOLY(X,X0,X1,Y0,Y1,EX,ymin,ymax) BRACKET(Y1*pow((X-X0)/(X1-X0),EX)+Y0,ymin,ymax)
#define  EVALPOLY2P(X,X0,X1,Y0,Y1,EX,ymn,ymx) BRACKET((Y1-Y0)*pow((X-X0)/(X1-X0),EX)+Y0,ymn,ymx)


또한 함수와 연산으로 차이 계산(슬로프에 대한 프록시로)이 있습니다.

MA20DIFF(i,n)는 20주 이동평균의 두 값을 캔들 개수로 나눈 값의 차이를 구합니다. 나머지 함수는 동일한 논리를 따릅니다. 예: 캔들 3과 캔들 13의 200일 이동평균의 차이를 계산하려면 MA200DIFF(3,10)을 사용합니다.

#define  MA20DIFF(i,n)                        (MOVAVG20(i)-MOVAVG20(i+n))
#define  MA40DIFF(i,n)                        (MOVAVG40(i)-MOVAVG40(i+n))
#define  MA50DIFF(i,n)                        (MOVAVG50(i)-MOVAVG50(i+n))
#define  MA200DIFF(i,n)                       (MOVAVG200(i)-MOVAVG200(i+n))
#define  CANDLECLOSEDIFF(i,n)                 (CANDLECLOSE(i)-CANDLECLOSE(i+n))
#define  CANDLEOPENDIFF(i,n)                  (CANDLEOPEN(i)-CANDLEOPEN(i+n))
#define  CANDLEHIGHDIFF(i,n)                  (CANDLEHIGH(i)-CANDLEHIGH(i+n))
#define  CANDLELOWDIFF(i,n)                   (CANDLELOW(i)-CANDLELOW(i+n))
#define  CANDLEMEDIANDIFF(i,n)                (CANDLEMEDIAN(i)-CANDLEMEDIAN(i+n))
#define  CANDLEWEIGHTEDDIFF(i,n)              (CANDLEWEIGHTED(i)-CANDLEWEIGHTED(i+n))
#define  CANDLETYPICALDIFF(i,n)               (CANDLETYPICAL(i)-CANDLETYPICAL(i+n))
#define  CANDLEBODYMIDDLEDIFF(i,n)            (CANDLEBODYMIDDLE(i)-CANDLEBODYMIDDLE(i+n))

조회도 수학 함수로 포함되어 있습니다. 괄호 및 볼록성은 아래에서 확인할 수 있습니다.

#define  isINBRACKET(x,minV,maxV)             (x<=maxV && x>=minV)
#define  isINBRACKETSTRICT(x,minV,maxV)       (x<maxV && x> minV)
#define  isOUTBRACKET(x,minV,maxV)            (x>=maxV || x<=minV)
#define  isOUTBRACKETSTRICT(x,minV,maxV)      (x> maxV || x< minV)
#define  isCONVEX(yl,yc,yr)                   (yl>=yc && yc<=yr)
#define  isCONCAVE(yl,yc,yr)                  (yl<=yc && yc>=yr)
#define  isCONVEXTSTRICT(yl,yc,yr)            (yl>yc && yc<yr)
#define  isCONCAVESTRICT(yl,yc,yr)            (yl<yc && yc> yr)


상수

제가 사용하는 몇 가지 상수를 정의합니다. 상수를 사용하는 것은 사용자의 선택입니다.

// 상수
#define  PIVALUE                              (M_PI)
#define  MINSTOPPOINTS                        (30)
#define  MINFREEZEPOINTS                      (30)
#define  STOPLEVEL                            (fmax(MINSTOPPOINTS,(double)SymbolInfoInteger(_Symbol,SYMBOL_TRADE_STOPS_LEVEL))*_Point)
#define  FREEZELEVEL                          (fmax(MINFREEZEPOINTS,(double)SymbolInfoInteger(_Symbol,SYMBOL_TRADE_FREEZE_LEVEL))*_Point)


디버깅

숙련된 프로그래머라면 누구나 코드 디버깅에 가장 좋은 도구가 Print 문이라는 것을 알고 있습니다. 다음 정의를 사용하면 프로그램 전체에 Print 문을 설정하고 관심 있는 디버깅 수준의 값에 따라 이를 켜거나 끌 수 있습니다.

먼저 #define DEBUG_LEVEL0, #define DEBUG_LEVEL1 또는 #define DEBUG_LEVEL2를 사용하여 디버깅 레벨을 정의해야 합니다. DEBUG_LEVEL0을 사용하는 경우 Metatrader 5 터미널의 저널 탭에 인쇄되지 않습니다. DEBUG_LEVEL1을 사용하면 PRINTVARn 문만 활성화되고 저널 탭에 인쇄됩니다. DEBUG_LEVEL2를 사용하면 PRINTVARnVPRINTVARn 문이 모두 저널 탭에 인쇄됩니다. DEBUG_LEVEL2는 VPRINTVARn을 사용하는 "V"에러 케이스입니다.

PRINTVARn은 n개의 변수를 인쇄합니다. 예를 들어 i, x, z를 인쇄하려면 PRINTVAR3(i,x,z); 문자열을 인쇄하려면 PRINTTEXT("임의 문자열"); 인쇄물에는 함수 이름과 PRINTVARn 문이 삽입된 파일의 줄 번호가 포함됩니다.

// 인쇄로 디버깅하기 
// 코드 시작 부분에 디버그 레벨 x={0,1,2}를 다음과 같이 정의합니다: #define DEBUG_LEVELx 
#ifdef  DEBUG_LEVEL0
#define  PRINTTEXT(text)
#define  PRINTVAR(x1)
#define  PRINTVAR1(x1)
#define  PRINTVAR2(x1,x2)
#define  PRINTVAR3(x1,x2,x3)
#define  PRINTVAR4(x1,x2,x3,x4)
#define  PRINTVAR5(x1,x2,x3,x4,x5)
#define  PRINTVAR6(x1,x2,x3,x4,x5,x6)

#define  VPRINTTEXT(text)
#define  VPRINTVAR(x1)
#define  VPRINTVAR1(x1)
#define  VPRINTVAR2(x1,x2)
#define  VPRINTVAR3(x1,x2,x3)
#define  VPRINTVAR4(x1,x2,x3,x4)
#define  VPRINTVAR5(x1,x2,x3,x4,x5)
#define  VPRINTVAR6(x1,x2,x3,x4,x5,x6)

#endif
                                                                                                
#ifdef  DEBUG_LEVEL1
#define  PRINTTEXT(text)           Print("*/*/*/* ",__FUNCTION__,"(",__LINE__,") :",text)
#define  PRINTVAR(x1)              Print("*/*/*/* ",__FUNCTION__,"(",__LINE__,") :", #x1 + "=", (x1))
#define  PRINTVAR1(x1)             Print("*/*/*/* ",__FUNCTION__,"(",__LINE__,") :", #x1 + "=", (x1))
#define  PRINTVAR2(x1,x2)          Print("*/*/*/* ",__FUNCTION__,"(",__LINE__,") :", #x1 + "=", (x1),", " #x2 + "=", (x2))
#define  PRINTVAR3(x1,x2,x3)       Print("*/*/*/* ",__FUNCTION__,"(",__LINE__,") :", #x1 + "=", (x1),", " #x2 + "=", (x2),", " #x3 + "=", (x3))
#define  PRINTVAR4(x1,x2,x3,x4)    Print("*/*/*/* ",__FUNCTION__,"(",__LINE__,") :", #x1 + "=", (x1),", " #x2 + "=", (x2),", " #x3 + "=", (x3),", " #x4 + "=", (x4))
#define  PRINTVAR5(x1,x2,x3,x4,x5) Print("*/*/*/* ",__FUNCTION__,"(",__LINE__,") :", #x1 + "=", (x1),", " #x2 + "=", (x2),", " #x3 + "=", (x3),", " #x4 + "=", (x4),", " #x5 + "=", (x5))
#define  PRINTVAR6(x1,x2,x3,x4,x5,x6) Print("*/*/*/* ",__FUNCTION__,"(",__LINE__,") :", #x1 + "=", (x1),", " #x2 + "=", (x2),", " #x3 + "=", (x3),", " #x4 + "=", (x4),", " #x5 + "=", (x5),", " #x6 + "=", (x6))

#define  VPRINTTEXT(text)
#define  VPRINTVAR(x1)
#define  VPRINTVAR1(x1)
#define  VPRINTVAR2(x1,x2)
#define  VPRINTVAR3(x1,x2,x3)
#define  VPRINTVAR4(x1,x2,x3,x4)
#define  VPRINTVAR5(x1,x2,x3,x4,x5)
#define  VPRINTVAR6(x1,x2,x3,x4,x5,x6)
#endif

#ifdef   DEBUG_LEVEL2
#define  PRINTTEXT(text)           Print("*/*/*/* ",__FUNCTION__,"(",__LINE__,") :",text)
#define  PRINTVAR(x1)              Print("*/*/*/* ",__FUNCTION__,"(",__LINE__,") :", #x1 + "=", (x1))
#define  PRINTVAR1(x1)             Print("*/*/*/* ",__FUNCTION__,"(",__LINE__,") :", #x1 + "=", (x1))
#define  PRINTVAR2(x1,x2)          Print("*/*/*/* ",__FUNCTION__,"(",__LINE__,") :", #x1 + "=", (x1),", " #x2 + "=", (x2))
#define  PRINTVAR3(x1,x2,x3)       Print("*/*/*/* ",__FUNCTION__,"(",__LINE__,") :", #x1 + "=", (x1),", " #x2 + "=", (x2),", " #x3 + "=", (x3))
#define  PRINTVAR4(x1,x2,x3,x4)    Print("*/*/*/* ",__FUNCTION__,"(",__LINE__,") :", #x1 + "=", (x1),", " #x2 + "=", (x2),", " #x3 + "=", (x3),", " #x4 + "=", (x4))
#define  PRINTVAR5(x1,x2,x3,x4,x5) Print("*/*/*/* ",__FUNCTION__,"(",__LINE__,") :", #x1 + "=", (x1),", " #x2 + "=", (x2),", " #x3 + "=", (x3),", " #x4 + "=", (x4),", " #x5 + "=", (x5))
#define  PRINTVAR6(x1,x2,x3,x4,x5,x6) Print("*/*/*/* ",__FUNCTION__,"(",__LINE__,") :", #x1 + "=", (x1),", " #x2 + "=", (x2),", " #x3 + "=", (x3),", " #x4 + "=", (x4),", " #x5 + "=", (x5),", " #x6 + "=", (x6))

#define  VPRINTTEXT(text)           Print("V/*/*/* ",__FUNCTION__,"(",__LINE__,") :",text)
#define  VPRINTVAR(x1)              Print("V/*/*/* ",__FUNCTION__,"(",__LINE__,") :", #x1 + "=", (x1))
#define  VPRINTVAR1(x1)             Print("V/*/*/* ",__FUNCTION__,"(",__LINE__,") :", #x1 + "=", (x1))
#define  VPRINTVAR2(x1,x2)          Print("V/*/*/* ",__FUNCTION__,"(",__LINE__,") :", #x1 + "=", (x1),", " #x2 + "=", (x2))
#define  VPRINTVAR3(x1,x2,x3)       Print("V/*/*/* ",__FUNCTION__,"(",__LINE__,") :", #x1 + "=", (x1),", " #x2 + "=", (x2),", " #x3 + "=", (x3))
#define  VPRINTVAR4(x1,x2,x3,x4)    Print("V/*/*/* ",__FUNCTION__,"(",__LINE__,") :", #x1 + "=", (x1),", " #x2 + "=", (x2),", " #x3 + "=", (x3),", " #x4 + "=", (x4))
#define  VPRINTVAR5(x1,x2,x3,x4,x5) Print("V/*/*/* ",__FUNCTION__,"(",__LINE__,") :", #x1 + "=", (x1),", " #x2 + "=", (x2),", " #x3 + "=", (x3),", " #x4 + "=", (x4),", " #x5 + "=", (x5))
#define  VPRINTVAR6(x1,x2,x3,x4,x5,x6) Print("V/*/*/* ",__FUNCTION__,"(",__LINE__,") :", #x1 + "=", (x1),", " #x2 + "=", (x2),", " #x3 + "=", (x3),", " #x4 + "=", (x4),", " #x5 + "=", (x5),", " #x6 + "=", (x6))
#endif


MetaQuotes Ltd에서 영어로 번역함.
원본 코드: https://www.mql5.com/en/code/56149

Stochastic multi-timeframe [v04] Stochastic multi-timeframe [v04]

스토캐스틱 인디케이터는 모든 차트 주기에 적용할 수 있습니다(현재 차트의 차트 주기보다 높거나 낮음).

RSI multi-timeframe [v03] RSI multi-timeframe [v03]

RSI 지표는 모든 차트 주기(현재 차트 주기보다 높거나 낮은)에 적용할 수 있습니다.

Self Optimized SMA Self Optimized SMA

인디케이터는 두 개의 선으로 표시됩니다. 아래쪽 선은 반등을 일으킨 최신 SMA 기간을 기준으로 계산됩니다. 위쪽 선은 반등을 일으킨 최신 SMA 기간을 기준으로 계산됩니다.

Moving Averages, multi-timeframe [v03] Moving Averages, multi-timeframe [v03]

이동 평균 지표는 모든 차트 주기(현재 차트 주기보다 높거나 낮은 주기)에 적용할 수 있습니다. 포함 SMA, EMA, SMMA, LWMA, AMA, DEMA, TEMA, FRAMA 및 VIDYA