새로운 MQL4에 의해 망가진 Small Moneymanagement-Indicator - 페이지 2

 
@deysmacro: 0으로 나누는 선이 어디에 있는지 알고 있습니다. 최근 5일간의 일평균 범위가 필요하기 때문입니다. 나중에 표시기에서 ATR로 무언가를 나눕니다. 데이터가 업데이트되지 않는 한 ATR은 0이고 그것이 문제입니다. 적어도 지난 5일의 일일 데이터를 사용할 수 있는지 확인해야 합니다. 그래야만 ATR이 >0이 되고 표시기가 작동합니다.
 
mar :
@deysmacro: 0으로 나누는 선이 어디에 있는지 알고 있습니다. 최근 5일간의 일평균 범위가 필요하기 때문입니다. 나중에 표시기에서 ATR로 무언가를 나눕니다. 데이터가 업데이트되지 않는 한 ATR은 0이고 그것이 문제입니다. 적어도 지난 5일의 일일 데이터를 사용할 수 있는지 확인해야 합니다. 그래야만 ATR이 >0이 되고 표시기가 작동합니다.

사용 가능한 데이터를 GV에 넣고 검색합니다. 이렇게 하면 데이터가 들어오거나 데이터에 차이가 있을 때 GV를 업데이트하면 됩니다.

ATR이 그런 식으로 작동할 수도 있습니다.


사람들은 항상 "먼저 작동하게 만든 다음 코드를 최적화하십시오."라고 말했습니다.

때로는 작동하게 하기 위해 코드 줄이 매우 길지만 작동하면 코드를 다듬기 시작할 수 있습니다. :)

 

어리석게 들릴지 모르지만 GV는 무엇입니까?

 
전역 변수
 

물론이야... :-)

설명할 수 없는 다른 것: 다음 코드는 내가 게시한 첫 번째 코드를 약간 수정한 것입니다. 자금 관리 지표이기도 하지만 ATR을 제거했습니다. 5-핍 단계에서 5 - 100핍의 손절매 수준 만 인쇄합니다. 따라서 ATR 계산이 전혀 없습니다. 이 지표를 차트로 드래그하면 제대로 작동합니다. 모든 쌍, 모든 시간대. 아무 문제 없습니다. 그러나 MetaTrader를 열면 0으로 나누기 오류가 발생하고 다시 손절매 수준 대신 "레이블"만 인쇄됩니다.

다음 줄에서 오류가 발생합니다.

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

이 줄의 모든 변수를 인쇄했고 AccountBalance()가 0이고 MarketInfo(Symbol(), MODE_TICKVALUE)가 0이라는 결론에 도달했습니다. 따라서 분명히 MetaTrader를 열 때 사용할 수 있는 데이터가 전혀 없습니다. 이것은 이전 MetaTrader에서는 결코 발생하지 않았습니다. 그래서 어떻게 해야할지 감이 안잡히네요...

코드는 다음과 같습니다.

 #property indicator_chart_window
//--- input parameters
extern int   Risk= 5 ;
extern int SL_Levels= 20 ;
int multi, exp1, 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 ;
   exp1     = 0 ;
   modifySpread = 1 ;
   if ( Digits == 5 || Digits == 3 )
   {
      modifySpread = 0.1 ;
      multi= 10 ;
      exp1= 1 ;
   }
//----
   SL = 10 ;
//----
   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 ;
   Print (Spread);
   Print ( AccountBalance ());
   Print (MoneyRisk);
   Print ( MarketInfo ( Symbol (), MODE_TICKVALUE ));
   Print (SL);
   Print (multi);
   for (i= 1 ; i<=SL_Levels; i++)
   {
      lots=MoneyRisk/SL/( MarketInfo ( Symbol (), MODE_TICKVALUE )*multi);
       ObjectSetText ( "SL" +i, SL+ " : " + DoubleToStr (lots, 2 ), 10 , "Calibri" , White);
      k=k+ 15 ;
      SL = SL+ 5 ;     
   }
   SL = 10 ;
   ObjectSetText ( "Spread" , Spread, 10 , "Calibri" , White);

   WindowRedraw ();
//----
   return ( 0 );
  }
//+------------------------------------------------------------------+
 
lots=MoneyRisk/SL/( MarketInfo ( Symbol (), MODE_TICKVALUE )*multi);
수학 계산 순서의 기초를 모르십니까? 문제가 무엇인지 바로 알 수 있습니다. 귀하의 수학 계산 순서.
 

조금 더 정확하게 말씀해 주시겠습니까? 문제는 정확히 무엇입니까(항상 작동했기 때문에..)?


AccountBalance() 및 MetaTrader에서 필요한 기타 데이터가 플랫폼을 시작한 직후에 사용할 수 없다는 문제가 여전히 있다고 생각합니다.

 

다른 예시:

#property indicator_chart_window
//+------------------------------------------------------------------+
//| Custom indicator initialization function                         |
//+------------------------------------------------------------------+
int init()
  {
//----
//----
   return ( 0 );
  }
//+------------------------------------------------------------------+
//| Custom indicator deinitialization function                       |
//+------------------------------------------------------------------+
int deinit()
  {
//----
//----
   return ( 0 );
  }
//+------------------------------------------------------------------+
//| Custom indicator iteration function                              |
//+------------------------------------------------------------------+
int start()
//----
  {
   Comment   ( AccountBalance ());
//----
   return ( 0 );
  }
//+------------------------------------------------------------------+
MetaTrader를 열면 결과는 0이 됩니다! 그리고 당신이 기간 또는 쌍을 변경할 때까지 0으로 유지됩니다. 이것이 바로 0으로 나누기 오류의 문제라고 생각합니다. 당신도 생각하지 않습니까?
 
mar :

이 줄의 모든 변수를 인쇄했고 AccountBalance()가 0이고 MarketInfo(Symbol(), MODE_TICKVALUE)가 0이라는 결론에 도달했습니다. 따라서 분명히 MetaTrader를 열면 데이터를 전혀 사용할 수 없습니다. 이것은 이전 MetaTrader에서는 결코 발생하지 않았습니다. 그래서 어찌할 바를 모르겠습니다...

코드는 다음과 같습니다.

이것이 문제의 원인이라고 확신하는 경우 Start() 바로 뒤에 이것을 추가하십시오.

 if ( MarketInfo ( Symbol (), MODE_SPREAD )== 0 || AccountBalance () == 0 )
   return ( 0 );
 

안녕, GumRai,

위의 지표로 테스트했습니다. MetaTrader를 몇 분 동안 실행해도 AccountBalance는 0으로 유지됩니다. 수동으로(페어, 타임프레임) 무언가를 변경할 때까지만 올바른 AccountBalance가 표시됩니다. 귀하의 솔루션을 사용하는 경우 0으로 나누기 오류에 문제가 없지만 AccountBalance가 0으로 유지되기 때문에 표시기가 작동하지 않습니다.

저만 이런 문제가 있는건지 궁금합니다. 새로운 MetaTrader의 일반적인 데이터 가져오기 문제라고 생각합니다...

사유: