전역 초기화 실패!!!!!!! - 페이지 5

 
deysmacro :
Comment()는 대부분 차트에 영향을 미치지 않습니다.

   if ( ObjectFind ( Symbol ()+ "Lot_Size_Label" )== 0 )
   {         
   int x_check= ObjectGet ( Symbol ()+ "Lot_Size_Label" , OBJPROP_XDISTANCE );
   int y_check= ObjectGet ( Symbol ()+ "Lot_Size_Label" , OBJPROP_YDISTANCE );
   Comment (x_check+ " , " +y_check); 
   }

주석()을 사용하여 좌표 데이터가 무엇인지 확인 합니다.

레이블이 올바르면 변경되어야 하지만 변경되지 않습니다.

IOW, 좌표는 있어야 할 것입니다.

레이블이 오른쪽으로 사라집니다.

 

좌표는 XDISTANCE = 225입니다. YDISTANCE = 27; 코너 = 3;

먼저 차트에 indi를 로드하고 레이블을 제자리에 지정합니다.

둘째, MT4를 닫고 다시 시작하면 레이블이 오른쪽으로 이동합니다.

셋째, Tf를 이동한 후 레이블이 뒤로 이동합니다.

코너 계산과 관련된 앵커와 관련이 있으며 B646의 버그임에 틀림없습니다.

 
전역 초기화 실패와 어떤 관련이 있습니까?
 
SDC :
전역 초기화 실패와 어떤 관련이 있습니까?

B646이 심각하게 도청되었습니다!
 
Dadas :


덕분에 deinit에서 객체가 삭제되지 않는 것과 동일한 문제가 발생했습니다.

인디를 개발하고 있었는데 이상한 결과를 얻었습니다. 그러고 나서 개체 목록을 보니 여전히 거기에 있었습니다.

아마도 가장 간단한 방법으로 start()의 ObjectDelete()를 사용하여 이 문제를 해결했습니다.

예, init()를 OnInit()으로 변경하고 deinit()을 OnDeinit()으로 변경하면 레이블이 다시 올바르게 지정됩니다! 감사해요!

그랬더니 얼마 지나지 않아 그렇지 않더라구요!!! 그들은 여전히 같은 춤을 추고 있습니다.


천만에요, 다다스. 그러나 나는 시작 메소드에서 ObjectDelete()를 사용 하지 않을 것입니다. OnDeInit()에서 가장 잘 수행됩니다. 그 이유는 다음과 같습니다. OnStart() 또는 OnCalculate()에 코드를 넣으면 틱이 올 때마다 실행됩니다. 그것은 두 가지 이유로 좋지 않습니다. 1) 실시간 애플리케이션에서 낭비할 여유가 없는 가동 시간을 사용하여 많은 작업을 추가하고 2) 대부분의 상황에서 그렇게 하는 것이 이치에 맞지 않습니다. 차트가 초기화 해제될 때 문제가 됩니다. 가격 변경이 어떤 식으로든 개체에 영향을 줄 경우에만 "시작" 메서드에서 수행해야 합니다. 예를 들어, 이것을 고려하십시오(판매하려는 앱의 일부이지만 이것을 공유하는 것이 좋습니다 :-)).

 // If no trade is progress, there is no Position Value to display
       if ( ObjectFind ( "PositionValue" ) > 0 )
                 ObjectDelete ( "PositionValue" );
                
       if ( ObjectFind ( "PipsProfitLoss" ) > 0 )
                 ObjectDelete ( "PipsProfitLoss" );
                
       if ( ObjectFind ( "CurrentStop" ) > 0 )
                 ObjectDelete ( "CurrentStop" );
                
       if ( ObjectFind ( "PipsLockedIn" ) > 0 )
                 ObjectDelete ( "PipsLockedIn" );
                
       if ( ObjectFind ( "ProfitLockedIn" ) > 0 )
                 ObjectDelete ( "ProfitLockedIn" );
                
       if ( GlobalVariableCheck (CurrentPairPercentageRisk))
         GlobalVariableDel (CurrentPairPercentageRisk);

이 코드는 닫힌 거래에서 남은 개체가 있는 경우 이를 포착합니다.

그건 그렇고 - 다음을 수행하지 마십시오.

 string AcctCurrency = AccountCurrency ();
       
       if (AcctCurrency == "" )
           return (rates_total);

코드의 의도를 잘못 이해했습니다. 서버가 "정착"될 때까지 인디를 실행하지 않도록 설계되었습니다. 그래서 0을 반환합니다. 그렇게 하면 필요한 모든 정보를 사용할 수 있을 때까지 인디 코드가 실행되지 않습니다. 저는 솔직히 OnCalculate()가 필요하지 않았기 때문에 아직 작업하지 않았지만 당신이 하고 있는 일은 재앙에 대한 초대라고 말할 수 있습니다. 프로그램에 "유효한 데이터가 있을 때까지 이 코드를 실행하지 마십시오"라고 말하는 것이 아닙니다. 당신은 바람에 물건을 던지고 최고를 기대하고 있습니다. 사실을 말하자면, 서버에서 신뢰할 수 있는 정보를 얻지 못하면 코드가 어떻게 될지 모르겠습니다. 상당한 양의 읽기 후에, 그들의 새로운 OnCalculate() 메소드는 나에게 의미가 없습니다. 필요한 경우 스스로 수행할 부하 정보를 불필요하게 계산하고 전달하고 필요하지 않은 것을 귀찮게 하지 않음으로써 컴퓨팅 시간을 절약하는 것처럼 보입니다. 나는 그들이 이것으로 무엇을 성취하려고 하는지 잘 모르겠습니다.

행복한 코딩!

 
ProfessorMetal :


천만에요, 다다스. 하지만 시작 메서드에서 ObjectDelete()를 사용하지 않습니다. OnDeInit()에서 가장 잘 수행됩니다. 그 이유는 다음과 같습니다. OnStart() 또는 OnCalculate()에 코드를 넣으면 틱이 올 때마다 실행됩니다. 그것은 두 가지 이유로 좋지 않습니다. 1) 실시간 애플리케이션에서 낭비할 여유가 없는 가동 시간을 사용하여 많은 작업을 추가하고 2) 대부분의 상황에서 그렇게 하는 것이 이치에 맞지 않습니다. 차트가 초기화 해제될 때 문제가 됩니다. 가격 변경이 어떤 식으로든 개체에 영향을 미칠 경우에만 "시작" 메서드에서 수행해야 합니다. 예를 들어, 이것을 고려하십시오(판매하려는 앱의 일부이지만 이것을 공유하는 것이 좋습니다 :-)).

이 코드는 닫힌 거래에서 남은 개체가 있는 경우 이를 포착합니다.

그건 그렇고 - 다음을 수행하지 마십시오.

코드의 의도를 잘못 이해했습니다. 서버가 "정착"될 때까지 인디를 실행하지 않도록 설계되었습니다. 그래서 0을 반환합니다. 그렇게 하면 필요한 모든 정보를 사용할 수 있을 때까지 인디 코드가 실행되지 않습니다. 저는 솔직히 OnCalculate()가 필요하지 않았기 때문에 아직 작업하지 않았지만 당신이 하고 있는 일은 재앙에 대한 초대라고 말할 수 있습니다. 프로그램에 "유효한 데이터가 있을 때까지 이 코드를 실행하지 마십시오."라고 말하는 것이 아닙니다. 당신은 단지 바람에 물건을 던지고 최고를 기대하고 있습니다. 진실을 말하자면, 서버에서 신뢰할 수 있는 정보를 얻지 못하면 코드가 어떻게 될지 모르겠습니다. 상당한 양의 읽기 후에, 그들의 새로운 OnCalculate() 메소드는 나에게 의미가 없습니다. 필요한 경우 스스로 수행할 부하 정보를 불필요하게 계산하고 전달하고 필요하지 않은 것을 귀찮게 하지 않음으로써 컴퓨팅 시간을 절약하는 것처럼 보입니다. 나는 그들이 이것으로 무엇을 성취하려고 하는지 잘 모르겠습니다.

행복한 코딩!


다시 한번 감사합니다!

부동 레이블에 대한 답을 찾았습니다.

이제 코드 자체에서 Object Anchor를 바인딩해야 합니다.

https://docs.mql4.com/en/constants/objectconstants/enum_anchorpoint

따라서 다음과 같이 sm을 추가해야 합니다.

 if (Corner== 0 ) Anchor= ANCHOR_LEFT ;
if (Corner== 1 ) Anchor= ANCHOR_RIGHT ;
if (Corner== 2 ) Anchor= ANCHOR_LEFT ;
if (Corner== 3 ) Anchor= ANCHOR_RIGHT ; 

그런 다음 다른 줄을 사용하여 개체를 설정합니다.

     ObjectSet (objname, OBJPROP_ANCHOR ,Anchor);

인생은 확실히 더 쉬워지지 않습니다!

그리고 이것은 결국 도움이 되지 않습니다!!!

쩝. 그들이 성취하려고 하는 것을 말씀드리겠습니다.

그들은 가능한 한 많은 사람들이 코드를 어지럽히는 것을 막고 싶어합니다.

최대한 상업적이어야 합니다.

최근까지 거의 모든 사람이 간단한 mql4를 사용할 수 있었습니다.

이제 모든 것을 상품화하는 것이 목표입니다!

 
Dadas :

B646이 심각하게 도청되었습니다!
그럴 수도 있지만 전역 초기화 실패는 객체 앵커 포인트 에 대한 이 논의와 관련이 없는 특정 오류입니다.
 
ProfessorMetal :


그들의 새로운 OnCalculate() 메서드는 나에게 의미가 없습니다. 필요한 경우 스스로 수행할 부하 정보를 불필요하게 계산하고 전달하고 필요하지 않은 것을 귀찮게 하지 않음으로써 컴퓨팅 시간을 절약하는 것처럼 보입니다. 나는 그들이 이것으로 무엇을 성취하려고 하는지 잘 모르겠습니다.

행복한 코딩!

OnCalculate는 표시기에 의해 이미 처리된 막대의 수를 계산한 결과를 제공합니다. 이전 IndicatorCounted 함수 를 대체합니다. 또한 시리즈 배열이 참조에 의해 전달되기 때문에 mql5와의 호환성을 달성하지만 전역 시리즈 배열을 사용하는 이전 mql4 방식과 대조됩니다. 코딩 관점에서 보면 차이가 거의 없습니다.

 

다시 한 번, 반갑습니다, 다다스. 내 물건에 ANCHOR 속성을 사용하고 있음에도 불구하고 ANCHOR 속성 을 사용하는 것을 잊었습니다.

SDC님, 정보 감사합니다. 문서는 실제로 그 목적을 명확히 하지 않습니다. 러시아어에서 영어로 번역하는 과정에서 의미가 없어진 것 같습니다. 이제 더 의미가 있습니다. OnStart() 대신 사용되는 것이 아니라 IndicatorCounted() 대신 사용되는 것으로 가정합니다. IndicatorCounted()를 OnCalculate()로 대체하는 것을 보여주는 일종의 "전" 및 "후"를 보여주는 예제를 제공하는 문서에 추가하면 좋을 것입니다. 나는 돌아가서 당신의 설명에 비추어 문서를 검토하고 조각들이 어떻게 모이는지 확인해야 할 것입니다. 다시 한번 감사합니다.

교수

 

int start() 대신 int OnCalculate()를 사용합니다. start()와 같은 모든 틱 에서 실행됩니다. 전과 후는 다음과 같이 보일 것입니다.

 int start()
  {
   int i= 0 , limit= 0;
   int counted_bars= IndicatorCounted ();
//---- check for possible errors
   if (counted_bars < 0 ) return (- 1 );
//----
   limit = Bars -counted_bars- 1 ;
   for (i = limit; i >= 0 ; i--)
   {
//---- indicator calculations
   }
   return ( 0 );
  }

//--------------------------------------------------
//--------------------------------------------------

int OnCalculate ( const int rates_total,
                 const int prev_calculated,
                 const datetime &time[],
                 const double &open[],
                 const double &high[],
                 const double &low[],
                 const double &close[],
                 const long & tick_volume[],
                 const long & volume[],
                 const int & spread[])
  {
   int i= 0 , limit= 0 ;
//--- check for possible errors
   if (prev_calculated < 0 ) return (- 1 );
//---
   limit = rates_total-prev_calculated;
   for (i = limit; i >= 0 ; i--)
   {
//--- indicator calculations
   }
    return (rates_total);
  }

OnCalculate의 형식 매개변수를 사용하면 더 독립적으로 사용할 수 있으며, 코더는 분명히 oop 서클에 있는 나쁜 나쁜 코더, 손목을 때리는 모든 종류의 전역 호출에 의존할 필요가 없습니다. 실제로는 둘 중 하나를 사용하는 데 큰 차이가 없습니다. 또한 OnCalculate는 mql5와 동일하므로 호환 코드를 작성할 수 있습니다.