MT4에서 MT5로 옮기는 문제. 또는 더 정확하게는 MT5에서 일부 알고리즘의 오류 없는 실행이 불가능합니다. - 페이지 9

 
Vict :

예, 예외를 제외하고는 코드가 훨씬 간단하고 깨끗하며 지속적인 오류 검사가 이를 발판으로 만듭니다. 그러나 마이크로 리터에서 예외없이 샤프트에 문제가 있습니다. 개발자는 십자가를 당기지 않았습니다.

그리고 제 생각에는 차이가 없습니다.

반환 코드를 사용하면 RETURN_IF_BAD_RESULT()와 같은 매크로를 작성하고 결과를 반환하는 모든 함수에 삽입해야 합니다.

예외적으로 - TRY-CACTH 섹션을 작성해야 합니다. 플러스 - 어떤 함수가 예외를 던지고 어떤 함수는 그렇지 않은지 기억하십시오 // 코드에 예외를 추가하십시오.

뭔가 - 족보, 뭔가 ...

 
Vict :

예, 예외를 제외하고는 코드가 훨씬 간단하고 깨끗하며 지속적인 오류 검사가 이를 발판으로 만듭니다. 그러나 마이크로 리터에서 예외없이 샤프트에 문제가 있습니다. 개발자는 십자가를 당기지 않았습니다.

아니요, 예외에 대해 말을 더듬지 않습니다 ... 옵션으로 "사악한 피노키오"가 있습니다.이 옵션 은 배열 너머의 모든 출발을 예외로 감쌀 것입니다)))

IMHO, OS로의 종료로 모든 반환을 중단할 수 있는 기능이 필요합니다. 글쎄, 일종의 Exit()가 되도록 하십시오. 아이디어를 올바르게 이해했습니다. 끝없는 코드 발보를 생성하고 싶지 않습니다. 모든 함수 호출을 지속적으로 래핑하는 것은 의미가 없습니다.

 void OnStart ()
{
if (!MyFuncReadOHLC_1()) return ;
if (!MyFuncReadOHLC_2()) return ;
....
}
 
Georgiy Merts :

그리고 제 생각에는 차이가 없습니다.

반환 코드를 사용하면 RETURN_IF_BAD_RESULT()와 같은 매크로를 작성하고 결과를 반환하는 모든 함수에 삽입해야 합니다.

예외적으로 - TRY-CACTH 섹션을 작성해야 합니다. 플러스 - 어떤 함수가 예외를 던지고 어떤 함수는 그렇지 않은지 기억하십시오 // 코드에 예외를 추가하십시오.

뭔가 - 족보, 뭔가 ...

예외를 제외하고는 아무 것도 기억할 필요가 없습니다. 종종 TRY-CACTH도 필요하지 않습니다(프로그램이 비정상적으로 종료됨). 이는 예외적인 상황이며 일반적으로 발생하지 않으므로 전환할 필요가 없습니다. if-else 블록에 넣습니다. 예를 들어, 여기에서는 실패한 할당에 대한 예외를 던지는 대신 벡터의 유사성(한심한 유사성)을 작성했습니다. 대신 연산자를 끼워야 했습니다! 모든 삽입물과 함께 그것을 트위칭하는 것은 (비록 나는 그것에 대해 신경 쓰지 않지만) 모호한 이점입니다.

 
Igor Makanu :

IMHO, OS 종료로 모든 수익을 중단하는 기능이 필요합니다 ...

예, 또한 아무것도, 이것이 아닌 것이 이상합니다 ...

 
Vict :

예, 또한 아무것도, 이것이 아닌 것이 이상합니다 ...

읽을 수 있는 코드가 있는 짧은 프로그램을 일종의 괴물로 바꾸는 것은 나에게 편리하지 않습니다. 여기에 MQL4의 일반적인 템플릿이 있습니다. "새 막대"를 확인하고 표시기를 확인했습니다.

 void OnTick ()
  {
   int takeprofit,stoploss; 
   double lot;
   ENUM_CMD CMD1,CMD2,CMD3;
   CMD1 = ind1();
   CMD2 = ind2();
   CMD3 = ind3();
   if (NewBar())
     {
      DeleteOrdersLimits(Magic);
       if (CMD1==CMD_BUY && CMD2==CMD_BUY && CMD3==CMD_BUY)
        {
         CalcTakeProfitStopLoss(takeprofit,stoploss);
         lot=CalcLot(stoploss);
         if (ReversSignal)SELL_STOP_PR(Low[ 1 ],lot,Magic,stoploss,takeprofit); else BUY_STOP_PR(High[ 1 ],lot,Magic,stoploss,takeprofit);
        }
       if (CMD1==CMD_SELL && CMD2==CMD_SELL && CMD3==CMD_SELL)
        {
         CalcTakeProfitStopLoss(takeprofit,stoploss);
         lot=CalcLot(stoploss);
         if (ReversSignal)BUY_STOP_PR(High[ 1 ],lot,Magic,stoploss,takeprofit); else SELL_STOP_PR(Low[ 1 ],lot,Magic,stoploss,takeprofit);
        }
     }
  }
//+------------------------------------------------------------------+

이 예에서 표시기는 "모든 틱을 당기기" 때문입니다. 그들은 다른 TF에서 일합니다 ... 일반적으로 중요하지 않습니다.

ind1(), ind2(), ind3() 및 NewBar( ) 에서 OHLC 데이터를 사용합니다.

하나의 함수 호출 에서 시계열 액세스 오류가 발생하면 이 코드를 계속 실행해야 하는 이유가 무엇입니까? - OS를 종료하고 새 틱을 기다려야 합니다. 모든 ind1(), ind2(), ind3() 및 NewBar()에서 GetLastError()를 확인하고 EA 로그에 쓰는 OS에서 즉시 Exit() 오류가 발생합니다.

 
Vict :

예외를 제외하고는 아무 것도 기억할 필요가 없습니다. 종종 TRY-CACTH도 필요하지 않습니다(프로그램이 비정상적으로 종료됨). 이는 예외적인 상황이며 일반적으로 발생하지 않으므로 전환할 필요가 없습니다. if-else 블록에 넣습니다. 예를 들어, 여기에서는 실패한 할당에 대한 예외를 던지는 대신 벡터의 유사성(한심한 유사성)을 작성했습니다. 대신 연산자를 끼워야 했습니다! 모든 삽입물과 함께 그것을 트위칭하는 것은 (비록 나는 그것에 대해 신경 쓰지 않지만) 모호한 이점입니다.

자, 친구야...

당신은 "아무것도 기억할 필요가 없다"고 말하고 즉시 계속합니다. 종종 TRY-CATCH조차 필요하지 않습니다. 이와 동일한 "자주"는 어딘가에 블록이 필요하지만 필요하지 않은 위치에 있다는 것을 의미하며 이를 기억해야 합니다. 상황은 반환 코드의 경우와 정확히 동일합니다. 리소스가 요청되고 예외가 발생한 경우(오류가 반환됨) 리소스를 폐기해야 합니다. 즉, 어떤 경우에도 예외를 발생시키는 함수와 발생하지 않는 함수를 기억해야 합니다.

예, 그리고 "예외적 상황"에 대해 ... 글쎄, 어떻게 말해야 ... 따옴표의 부재 - 예외를 던지는 완전히 합리적인 이유처럼 보이지만 실제로 "예외적인 상황"입니까?

 
Igor Makanu :

읽을 수 있는 코드가 있는 짧은 프로그램을 일종의 괴물로 바꾸는 것은 나에게 편리하지 않습니다. 여기에 MQL4의 일반적인 템플릿이 있습니다. "새 막대"를 확인하고 표시기를 확인했습니다.

이 예에서 표시기는 "모든 틱을 당기기" 때문입니다. 그들은 다른 TF에서 일합니다 ... 일반적으로 중요하지 않습니다.

ind1(), ind2(), ind3() 및 NewBar( ) 에서 OHLC 데이터를 사용합니다.

하나의 함수 호출 에서 시계열 액세스 오류가 발생하면 이 코드를 계속 실행해야 하는 이유가 무엇입니까? - OS를 종료하고 새 틱을 기다려야 합니다. 모든 ind1(), ind2(), ind3() 및 NewBar()에서 GetLastError()를 확인하고 EA 로그에 쓰는 OS에서 즉시 Exit() 오류가 발생합니다.

return(iErrrCode) 호출의 문제는 무엇입니까?

 
Georgiy Merts :

return(iErrrCode) 호출의 문제는 무엇입니까?

흠, 코드에 표시하려고 하고 OHLC 데이터의 잘못된 처리가 있는 경우 출력으로 코드를 다시 작성했습니다. 다음과 같을 것입니다.

 void OnTick ()
  {
   int takeprofit,stoploss; 
   double lot;
   bool nb;
   ENUM_CMD CMD1,CMD2,CMD3;
   if (!ind1( CMD1 )) return ;
   if (!ind2( CMD2 )) return ;
   if (!ind3( CMD3 )) return ;
   if (!NewBar( nb )) return ;
   
   if ( nb )
     {
      DeleteOrdersLimits(Magic);
       if (CMD1==CMD_BUY && CMD2==CMD_BUY && CMD3==CMD_BUY)
        {
         CalcTakeProfitStopLoss(takeprofit,stoploss);
         lot=CalcLot(stoploss);
         if (ReversSignal)SELL_STOP_PR(Low[ 1 ],lot,Magic,stoploss,takeprofit); else BUY_STOP_PR(High[ 1 ],lot,Magic,stoploss,takeprofit);
        }
       if (CMD1==CMD_SELL && CMD2==CMD_SELL && CMD3==CMD_SELL)
        {
         CalcTakeProfitStopLoss(takeprofit,stoploss);
         lot=CalcLot(stoploss);
         if (ReversSignal)BUY_STOP_PR(High[ 1 ],lot,Magic,stoploss,takeprofit); else SELL_STOP_PR(Low[ 1 ],lot,Magic,stoploss,takeprofit);
        }
     }
  }

이제 링크 함수 값을 얻고 함수가 잘못 처리된 경우 종료

 
Georgiy Merts :

자, 친구야...

당신은 "아무것도 기억할 필요가 없다"고 말하고 즉시 계속합니다. 종종 TRY-CATCH조차 필요하지 않습니다. 이와 동일한 "자주"는 어딘가에 블록이 필요하지만 필요하지 않은 위치에 있다는 것을 의미하며 이를 기억해야 합니다. 상황은 반환 코드의 경우와 정확히 동일합니다. 리소스가 요청되고 예외가 발생한 경우(오류가 반환됨) 리소스를 폐기해야 합니다. 즉, 어떤 경우에도 예외를 발생시키는 함수와 발생하지 않는 함수를 기억해야 합니다.

예, 그리고 "예외적 상황"에 대해 ... 글쎄, 어떻게 말해야 ... 따옴표의 부재 - 예외를 던지는 완전히 합리적인 이유처럼 보이지만 실제로 "예외적인 상황"입니까?

당신은 어떻게 든 당신 자신의 방식으로 예외를 부정확하게, 분명히 사용했습니다. 일반적으로 이 함수가 예외를 throw하는지 여부에 대해 신경 쓸 필요가 없습니까? TRY-CATCH의 존재는 선택 사항입니다. 리소스 문제를 방지하려면 RAII https://ru.wikipedia.org/wiki/%D0%9F%D0%BE%D0%BB%D1%83%D1%87%D0%B5%D0%BD% 를 마스터하세요. D0%B8%D0%B5_%D1%80%D0%B5%D1%81%D1%83%D1%80%D1%81%D0%B0_%D0%B5%D1%81%D1%82%D1% 8C_%D0%B8%D0%BD%D0%B8%D1%86%D0%B8%D0%B0%D0%BB%D0%B8%D0%B7%D0%B0%D1%86%D0%B8% D1%8F , 스택 해제는 모든 것을 자체적으로 정리합니다.

예, 그리고 "예외적 상황"에 대해 ... 글쎄, 어떻게 말해야 ... 따옴표의 부재 - 예외를 던지는 완전히 합리적인 이유처럼 보이지만 실제로 "예외적인 상황"입니까?
예외성은 코드 작성자의 재량에 달려 있지만 예외는 물론 if-else의 유사점이 되어서는 안 됩니다.
 

이상하지만 전에는 할 생각이 없었습니다.

 // Немедленное завершение, деструкторы не вызываются
void abort() { Alert ( 1 /( uint ) MathAbs ( 0 ));}

메모리 할당 과 같은 많은 오류 검사를 제거합니다.