새로운 MQL4에 의해 망가진 Small Moneymanagement-Indicator

 

코더 여러분,

나는 나를 위해 잘 작동하는 작은 Moneymanagement 지표를 만들었습니다. 그러나 새로운 MQL4 이후로 내가 처리할 수 없는 문제가 발생합니다.

이 표시기를 차트로 끌면 일부 숫자가 맨 오른쪽에 인쇄됩니다. 첫 번째 숫자는 핍 단위의 손절매를 의미하고 두 번째 숫자는 로트 크기입니다. 옵션에서 위험을 선택할 수 있습니다. 다른 숫자는 손절매 수준입니다. 그러나 통화 쌍 을 변경하면 숫자가 사라집니다. 대신 "Label"이라는 단어가 여러 번 보입니다. 그리고 지표 목록을 보면 내 지표도 사라졌습니다. 따라서 요약하면 통화 쌍을 변경한 후 표시기가 사라지고 숫자 대신 레이블이 남습니다.

나는 완전히 혼란 스럽다. 이 표시기는 문제 없이 작동하는 데 사용되었습니다. 도움을 주시면 감사하겠습니다.

코드는 다음과 같습니다.

 #property indicator_chart_window
//--- input parameters
extern int   Risk= 2 ;
extern int SL_Levels= 20 ;
int multi, exp , SL, i, k;
double MoneyRisk, Spread, _modifySpread, lots;
//+------------------------------------------------------------------+
//| Custom indicator initialization function                         |
//+------------------------------------------------------------------+
int init()
  {
//---- indicators
   k= 0 ;
   for (i= 1 ; i<=SL_Levels; i++)
   {
       if ( ObjectFind ( "SL" +i) == - 1 )
      {
         ObjectCreate ( "SL" +i, OBJ_LABEL , 0 , 0 , 0 );
         ObjectSet ( "SL" +i, OBJPROP_CORNER , 1 );
         ObjectSet ( "SL" +i, OBJPROP_XDISTANCE , 3 );
         ObjectSet ( "SL" +i, OBJPROP_YDISTANCE , k);
         k=k+ 15 ;    
      }
   }
   if ( ObjectFind ( "Spread" ) == - 1 )
   {
       ObjectCreate ( "Spread" , OBJ_LABEL , 0 , 0 , 0 );
       ObjectSet ( "Spread" , OBJPROP_CORNER , 3 );
       ObjectSet ( "Spread" , OBJPROP_XDISTANCE , 3 );
       ObjectSet ( "Spread" , OBJPROP_YDISTANCE , 1 );
   }
   
//-- 4 / 5 Digit Settings --
   multi   = 1 ;
   exp      = 0 ;
   if ( Digits == 5 || Digits == 3 )
   {
      _modifySpread = 0.1 ;
      multi= 10 ;
       exp = 1 ;
   }
//----
   SL = MathFloor (( iATR ( NULL , PERIOD_D1 , 7 , 0 )* MathPow ( 10 , Digits - exp )+ 1 )* 0.1 );
//----
   return ( 0 );
  }
//+------------------------------------------------------------------+
//| Custom indicator deinitialization function                       |
//+------------------------------------------------------------------+
int deinit()
  {
//----
   for (i= 1 ; i<=SL_Levels; i++)
   {
       ObjectDelete ( "SL" +i);
   }
   ObjectDelete ( "Spread" );
//----
   return ( 0 );
  }
//+------------------------------------------------------------------+
//| Custom indicator iteration function                              |
//+------------------------------------------------------------------+
int start()
  {
//----
   Spread     = MarketInfo ( Symbol (), MODE_SPREAD )*_modifySpread;
   MoneyRisk  = AccountBalance ()*Risk* 0.01 ;
   k= 0 ;
   for (i= 1 ; i<=SL_Levels; i++)
   {
      lots=MoneyRisk/SL/( MarketInfo ( Symbol (), MODE_TICKVALUE )*multi);
       ObjectSetText ( "SL" +i, SL+ " : " + DoubleToStr (lots, 2 ), 10 , "Calibri" , Red);
      k=k+ 15 ;
      SL = SL+ MathFloor ((( iATR ( NULL , PERIOD_D1 , 7 , 0 )* MathPow ( 10 , Digits - exp )+ 1 )* 0.1 )/ 2 );     
   }
   SL = MathFloor (( iATR ( NULL , PERIOD_D1 , 7 , 0 )* MathPow ( 10 , Digits - exp )+ 1 )* 0.1 );
   ObjectSetText ( "Spread" , DoubleToStr (Spread, 1 ), 10 , "Calibri" , Red);
   WindowRedraw ();
//----
   return ( 0 );
  }
//+------------------------------------------------------------------+
 

먼저 예약 된 int에 "exp"를 사용할 수 없습니다.

두 번째로 "SL"을 표현합니다.

SL = MathFloor (( iATR ( NULL , PERIOD_D1 , 7 , 0 )* MathPow ( 10 , Digits - exp )+ 1 )* 0.1 );

init 섹션에서 나쁜 생각

오류 4066 "SL" = 0이 발생하면

그런 다음 "많은"에 대해 제로 분할 을 얻습니다.

lots=MoneyRisk/SL/( MarketInfo ( Symbol (), MODE_TICKVALUE )*multi);

표시기가 멈추고 표시기를 다시 로드해야 합니다.

 
이해합니다. 변수 exp를 변경했는데 오류 4066을 확인 하거나 방지하는 방법을 알려주실 수 있습니까? MetaTrader가 현재 차트 및 기간의 시세만 업데이트한다는 사실과 관련이 있다는 것을 읽었습니다. 그러나 4066을 피하기 위해 무엇을 제안하시겠습니까?
 

분명히 업데이트를 피할 수는 없지만 ;-) " 제로 나누기 " 상황은 피해야 합니다.

따라서 변수 중 하나가 0과 같은지 확인해야 합니다.... 0 나누기를 피하는 경우를 대비하여

그리고 지표를 멈출 수 없기 때문에 무언가를 알아내야 합니다.

예시:

SL = MathFloor (( iATR ( NULL , PERIOD_D1 , 7 , 0 )* MathPow ( 10 , Digits - exp )+ 1 )* 0.1 );
if (SL == 0 ) // because error 4066 (for example)
   {
   SL = Someting;
   }
lots=MoneyRisk/SL/( MarketInfo ( Symbol (), MODE_TICKVALUE )*multi);
 

당신 말이 맞아.. 난 피할 수 없어. :-)

내 말은, SL 계산을 계속하기 전에 업데이트가 완료될 때까지 기다릴 수 있습니까? 문제는 전체 지표가 쓸모가 없기 때문에 SL에 임의의 값을 줄 수 없다는 것입니다. 그래서 4066에러가 있는지 확인해 보고 만약 발생한다면 어떻게든 기다렸다가 다시 확인을 하고 진행하고 싶습니다.

 

그건 그렇고, 나는이 지표와 같은 문제가 있습니다. 그러나 "구" MetaTrader에서는 왜 문제가 되지 않았습니까? 여기서 나는 항상 ATR(5)에 대해 0을 받습니다. 왜?!?! 그런 일은 없었다.. 나는 이 새로운 MetaTrader가 싫어...!

 int start()
//----
  {
   double Spread = MarketInfo ( Symbol (), MODE_SPREAD );
   double ATR = iATR ( NULL , PERIOD_D1 , 5 , 0 );
   int exp1 = 0 ;
   if ( Digits == 5 || Digits == 3 )
   {
      Spread=Spread* 0.1 ;
      exp1 = 1 ;
   }
   Comment   (
             "ADR(5): " , DoubleToStr (ATR* MathPow ( 10 , Digits -exp1), 1 ),
             " || TODAY: " ,( iHigh ( NULL , PERIOD_D1 , 0 )- iLow ( NULL , PERIOD_D1 , 0 ))* MathPow ( 10 , Digits -exp1),
             " || " , DoubleToStr ((( iHigh ( NULL , PERIOD_D1 , 0 )- iLow ( NULL , PERIOD_D1 , 0 ))* MathPow ( 10 , Digits -exp1)/(ATR* MathPow ( 10 , Digits -exp1))* 100 ), 2 ), "%" ,
             "\n" +
             "SPREAD: " , Spread,
             " || RATIO: " , DoubleToStr ((Spread/ATR)* MathPow ( 10 ,-( Digits -exp1- 2 )), 2 ), "%"
            );
//----
   return ( 0 );
  }
 
0은 무슨 뜻인가요? 나는 모든 주석을 인쇄하고 ATR(5)는 0보다 큰 출력을 보여줍니다 ... 실제로 50보다 ...
 

문제를 찾은 것 같아요! 확실히 업데이트 문제입니다. 이제 통화를 변경하면 표시기가 작동합니다. 그러나 나는 오늘 아직 열지 않은 통화 쌍을 열었습니다. 그런 다음이 메시지를 받았습니다.


오늘 아직 열지 않은 쌍을 엽니다. D1을 제외하고 원하는 기간으로 전환하십시오. 그런 다음 지표를 차트로 끕니다. 결과는 위와 같은 오류가 됩니다. 일일 차트의 ATR(5)가 DAILY DATA가 누락되어 정확하지 않은 것 같습니다. D1 기간에 "신선한" 차트를 열어도 전혀 문제가 발생하지 않습니다. 그리고 다른 시간 프레임으로 전환할 때도 ATR(5)가 정확하기 때문에 괜찮습니다. 나는 내가 D1 차트에 머무르는 한 어떤 쌍으로든 전환할 수 있다는 것을 알아차렸습니다. 그러나 D1이 아닌 다른 시간대에 다른 쌍으로 전환하면 MetaTrader가 일일 데이터를 수신하지 않는 한 문제가 발생합니다. 그래서, 제 질문은 이제 D1이 아닌 시간대에 새 차트를 열 때 내 ATR 계산이 정확한 일일 데이터를 얻을 수 있습니까?
 

당신은 같은 것을 넣어야합니다

 if ( number== 0 )dothis; else dothis; 

ShowSpread.mq4에서


0 분할 이 발생하는 라인을 검색하기만 하면 됩니다.

 
mar :

문제를 찾은 것 같아요! 확실히 업데이트 문제입니다. 이제 통화를 변경하면 표시기가 작동합니다. 그러나 나는 오늘 아직 열지 않은 통화 쌍을 열었습니다. 그런 다음이 메시지를 받았습니다.


오늘 아직 열지 않은 쌍을 엽니다. D1을 제외하고 원하는 기간으로 전환하십시오. 그런 다음 지표를 차트로 끕니다. 결과는 위와 같은 오류가 됩니다. 일일 차트의 ATR(5)가 DAILY DATA가 누락되어 정확하지 않은 것 같습니다. D1 기간에 "신선한" 차트를 열어도 전혀 문제가 발생하지 않습니다. 그리고 다른 시간 프레임으로 전환할 때도 ATR(5)가 정확하기 때문에 괜찮습니다. 나는 내가 D1 차트에 머무르는 한 어떤 쌍으로든 전환할 수 있다는 것을 알아차렸습니다. 그러나 D1이 아닌 다른 시간대에 다른 쌍으로 전환하면 MetaTrader가 일일 데이터를 수신하지 않는 한 문제가 발생합니다. 그래서, 제 질문은 이제 D1이 아닌 시간대에 새 차트를 열 때 내 ATR 계산이 정확한 일일 데이터를 얻을 수 있습니까?
qjol은 이미 문제가 어디에 있는지 알려줍니다. 도움을 요청하는 경우 사람들이 조언한 내용을 따르거나 최소한 확인 하지 않는 이유는 무엇입니까?
 

gevoyageur, 나는 당신이 나에게서 이 게시물을 보지 못했다고 생각합니다:

2014.04.02 08:16 #

당신 말이 맞아.. 난 피할 수 없어. :-)

"내 말은 SL 계산을 계속하기 전에 업데이트가 완료될 때까지 기다릴 수 있다는 것입니까? 문제는 SL에 임의의 값을 줄 수 없다는 것입니다. 그러면 전체 표시기가 쓸모가 없기 때문입니다. 그래서 확인하고 싶습니다. 오류 4066이 발생하면 어떻게든 기다렸다가 다시 확인하고 계속 진행하고 싶습니다."

거기에서 내가 조언을 따를 수 없다는 설명을 볼 수 있으며 해당 솔루션에 왔기 때문에 qjol이 나에게 조언한 것을 확실히 확인했음을 알 수 있습니다.