2017-03-13 7 views
0

나는이 문제를 일으키는이 작은 함수를 가지고 있는데, 함수의 일부만이 한 번에 내 조건을 따를 것이다.MQL4 : if/else if 루프의 절반 만 현재 실행으로 이어진다.

bool trend() 
    { 
    //is there a trend? 
    close1 = iClose(NULL,0,1); //vars 
    close2 = iClose(NULL,0,2); 
    close3 = iClose(NULL,0,3); 

    open1 = iOpen(NULL,0,1); 
    open2 = iOpen(NULL,0,2); 
    open3 = iOpen(NULL,0,3); 

    if(close3 > open3 && close2 > open2 && close1 > open1) 
    { 
     return(true);   //uptrend 
    } 

    else if(close3 < open3 && close2 < open2 && close1 < open1) 
    { 
     return(false);   //downtrend 
    } 

    else return(EMPTY_VALUE); 
    } 

이 기능이 INT 시작(), 내 판매 신호 조건 다음 작동하지만 매수 신호가 조건을 따르지 않는 위의 기록으로

trending = trend(); 

    if (trending == true) Order = SIGNAL_BUY; // Rule to ENTER a Long trade 

    if (trending == false) Order = SIGNAL_SELL; // Rule to ENTER a Short trade 

에서, 호출되는 방법입니다 , 나는 그들이 어떻게 행동 하는지를 알 수 없다.

"else return (EMPTY_VALUE);" 구매 주문은 조건을 따르기 시작하지만 판매 주문은 더 이상 조건을 따르지 않습니다. 깨진 주문은 깨진 구매 주문과 같습니다.

내 기능이 이와 같이 작동하는 이유는 무엇입니까? 감사!

답변

1

함수는 bool trend()으로 선언되어 true 또는 false 중 하나를 반환 할 수 있습니다. else return(EMPTY_VALUE) 줄에서 상수 EMPTY_VALUE (MQL 설명서에 따라 0x7FFFFFFF 값을 가짐)은 암시 적으로 true으로 변환됩니다. 즉, 상승 추세가없고 하락 추세가없는 경우 함수는 true (구매 신호를 내 보냅니다)을 반환합니다.

마지막 줄을 생략하면 else return(EMPTY_VALUE)에 누락 된 신고서가 있습니다. trending = trend() 줄에서 수행하는 함수의 반환 값에 액세스하려고하면 정의되지 않은 동작이 발생합니다.

요약 : 문제는 trend 함수가 true 또는 false의 두 값 중 하나만 반환 할 수 있다는 것입니다. 하지만 필요한 것은 uptrend, downtrend, no_trend의 세 가지 값 중 하나를 반환하는 함수입니다. 당신은 그 세 값 열거를 선언하고 그에 따라 반환 유형을 변경할 수 있습니다 : 다음

enum Trend { 
    UPTREND, 
    DOWNTREND, 
    NONE 
} 

Trend trend() { 
    // check if there is a trend 
    // [...] 
    if (close3 > open3 && close2 > open2 && close1 > open1) { 
     return UPTREND; 
    } 
    else if (close3 < open3 && close2 < open2 && close1 < open1) { 
     return DOWNTREND; 
    } 
    else { 
     return NONE; 
    } 
} 

과 도움이되었다 나중에

Trend trending = trend(); 
if (trending == UPTREND) Order = SIGNAL_BUY; 
if (trending == DOWNTREND) Order = SIGNAL_SELL; 
+0

감사합니다. 열거 형을 사용할 수 없지만 함수를 int로 변환하고 각 가능성에 대한 값을 반환하여 더 까다로운 해결책을 찾았습니다. – Jacket