전문 고문 - 기타 질문 - 페이지 13

 

다음과 같이 함수 를 작성할 수 있습니다.

void DrawLabel( string name, string text, int x, int y, int  fontsize = 10 )

최종 값 없이 호출하면 기본값이 사용됩니다. 즉, fontsize는 10이 됩니다.

DrawLabel( "MyLabel" , "Hello,World!" , 50 , 50 ); // final parameter not passed (default value used)

또는 기본 fontsize 값을 명시적으로 재정의할 수 있습니다.

DrawLabel( "MyLabel" , "Hello,World!" , 50 , 50 , 24 ); // fontsize parameter is 24

이게 네가 말하는거야?

 
honest_knave :

이게 네가 말하는거야?

내 영어로 인해 귀하의 의견을 이해하지 못할 수도 있습니다.
귀하의 의견에 감사드립니다.
내가 올바르게 이해했다면 다음과 같이 이해합니다. Label에 1x Void 함수를 작성할 수 있으며 아래와 같은 두 가지 방법으로 사용할 수 있습니다. (글꼴 크기 매개변수가 있고 없는 레이블 개체 에 대해 하나의 Void 함수를 사용할 수 있습니다 . 맞습니까? )

DrawLabel( "MyLabel" , "Hello,World!" , 50 , 50 );     // #1
DrawLabel( "MyLabel" , "Hello,World!" , 50 , 50 , 24 ); // #2

그래서 저는 이 스프레드시트 개체를 위해 그 문제가 어디에서 발생하고 어떻게 해결할 수 있는지에 대해 몇 시간을 보냈다고 말하고 싶습니다.
그래서 라벨 기능이 아닌 아래 코드에서 온 것 같습니다. 2x 라벨 기능이 있기 때문에 그 중 하나를 제거했습니다. Bid 및 Ask 가격 표시기( 시장 가격 )는 여전히 잘 작동하지만 스프레드시트는 Label 기능과 함께 작동하지 않습니다. . 스프레드시트는 레이블 기능 없이도 잘 작동합니다.

스프레드시트의 일부 코드를 공유해야 합니다. 아래 코드와 같이 의심됩니다. (심지어 - Spreadsheet용 Label 기능 없이 Label 객체를 생성할 때 잘 작동하는 코드 아래에서 다시 한 번 언급해야 합니다.)

double   spread                                                 ;
        spread       = MarketInfo   ( symbol, MODE_SPREAD ) / 10 ;
        spreadstring = DoubleToStr ( spread, 1            )     ;

모든 것에 감사드립니다.

 

생성하려고 하는 것이 실제로 생성되는지 확인하는 것은 좋은 방법입니다.

예를 들어 화면 크기와 관련하여 많은 사용자가 다른 해상도를 사용하고 어떤 이유로 개체가 차트 너비 또는 높이의 경계를 넘어 생성될 때마다 개체가 그려 지지 않거나 사라집니다.

또는 예를 들어 오류 4200은 생성하려는 개체가 이미 존재함을 표시합니다.

이것은 객체에 다른 값을 할당하려는 경우 중요하며 생성에 실패하면 새 값이 할당되지 않습니다.

이것이 해당 함수가 값을 반환하여 생성이 성공했는지 여부를 확인할 수 있는 이유입니다.

함수가 성공했는지 여부를 확인하는 것은 사용자의 몫이지만 좋은 코더는 결과를 확인할 것입니다.

void 함수를 작성하면 아무 것도 반환하지 않으므로 호출할 때 반환되는 내용을 분석하여 결과를 확인할 수 없습니다.

그러나 단순히 함수 자체를 확인하고 문제가 발생하면 간단한 경고를 표시할 수도 있습니다.

그렇게하면 해당 경고가 정상적으로 표시되지 않지만 문제가 발생할 때마다 즉시 문제 자체를 알려줍니다.


두 번째 문제의 경우 최소한 일부 매개변수를 여러 번 생략할 수 있습니다. 그렇게 하면 함수가 기본값을 가정합니다.

따라서 표준 매개변수가 필요하거나 전환하려는 경우가 아니면 지정합니다.

글꼴 크기는 지정하지 않을 때 단순히 기본 설정을 사용하는 좋은 예입니다.

또한 특정 객체 간에 약간의 차이가 있으며 이는 함수에 전달된 매개변수를 분석할 때 확인할 수 있습니다.

모두 동일한 변수 집합을 공유하지 않으므로 참조로 전달할 수 있는 것과 전달할 수 없는 것을 살펴보는 것이 중요합니다.

나는 당신이 Spreadstring으로 무엇을 하고 싶은지 잘 모르겠습니다. 아마도 그것이 무엇을 위한 것이고 어떻게 사용하기를 원하는지 조금 더 설명할 수 있습니까?

 
Marco vd Heijden :

나는 당신이 Spreadstring으로 무엇을 하고 싶은지 잘 모르겠습니다. 아마도 그것이 무엇을 위한 것이고 어떻게 사용하기를 원하는지 조금 더 설명할 수 있습니까?

Bid , Ask , Spreadsheet 등에 대해 Label Object Function 을 사용합니다. 스프레드시트 없이 모든 것이 완벽하게 작동합니다. 삭제하고 다시 작성했는데 좋은 효과가 없었습니다.

오류 설명을 위해 오류 코드의 @honest_knave 메소드를 사용한 후. 더 이상 경고 4200이 표시되지 않습니다.
내가 언급했듯이 Init() 함수에서 #1 - OnTick() 함수에서 #2 라는 두 곳에서 ' Spreadsheet '를 사용하지만 'Spreadsheet'로 2곳에서 Bid, Ask도 사용합니다. 오류, 경고가 없습니다. . 그러나 이 스프레드시트는 어떤 경고도 제공하지 않지만 업데이트도 하지 않습니다.

내 EA 코드에서 모든 개체에 대해 오류, 경고 없이 절대적으로 성공적으로 생성되었습니다.

내가 좋은 코더 또는 무엇을 몰라?! (나는 코더나 프로그래머라고 생각하지 않는다. ) 그러나 나는 결과를 본다. 따라서 레이블 개체만 사용할 수 있습니다( 스프레드시트용 기능 없이).

Void 함수는 내가 원하는 결과를 반환합니다. 또한 이 함수는 초기 스프레드 값에 대한 객체를 생성하지만 업데이트하지는 않습니다.



나는 당신이 Spreadstring으로 무엇을 하고 싶은지 잘 모르겠습니다. 아마도 그것이 무엇을 위한 것이고 어떻게 사용하기를 원하는지 조금 더 설명할 수 있습니까?

좋아요, 그냥 다음과 같이 사용하고 싶습니다. 지금 당장은 EA를 열거나 차트에 추가할 때 스프레드시트 크기(/값)를 제공하기를 원합니다. 그런 다음 현재 Hour Spread High/Low 크기( / values )에 대한 코드를 작성하려고 합니다.

미리 감사드립니다.

 

이중 배열[]에 저장한 다음 모두 비교하여 가장 낮은 스프레드가 있는 위치를 확인할 수도 있습니다.


double spread[];
--

ArrayResize (spread, SymbolsTotal ( 1 ), 0 );
   for ( int i= 0 ;i< SymbolsTotal ( 1 );i++)
     {
      spread[i]= MarketInfo ( SymbolName (i, 1 ), 13 );
     }
 

아래 코드를 제거하면 스프레드시트가 완벽하게 작동하기 시작합니다.
그래서, 나는 단지 도움이 필요 합니다. 대신에 어떻게 좋은 ( / Optimal ) 코드를 작성할 수 있습니까?

{
     Print ( __FUNCTION__ , ": failed to create text label! Error code = " , GetLastError ());
     return ( false );
}

나는 Label Object 기능에 대한 코드를 아래에 유지합니다.

if ( ! ObjectCreate ( chart_ID, name, OBJ_LABEL , sub_window, 0 , 0 ) ) 

미리 감사드립니다.

(이 문제가 실제 문제라면 - MetaQuotes가 해결해 주기를 바랍니다. 몇 시간이 걸렸기 때문에 이 코드 업계에서 새로운 사람들을 도와주세요.)

 

"return(false)"을 삭제하되 Print 문을 유지하고 코드를 실행하십시오.

메시지를 받을 수 있을 것 같아요. 값을 바꾸지 않고 계속해서 레이블을 만들려고 하는 것 같아요.

 
honest_knave :

"return(false)"을 삭제하되 Print 문을 유지하고 코드를 실행하십시오.

도대체!
sh** 는 몇 시간이 걸렸습니다. 그것에 대해 뭐라고 말해야 할지 모르겠습니다.
내 모든 개체 기능 에서 제거할 수 있습니까?
또한 어떻게 작동하는지 알려주실 수 있습니까?

return ( false );

고마워요.

 
Max Enrik :

도대체!
내 모든 개체 기능 에서 제거할 수 있습니까?

예, 하지만 보관하고 오류의 원인을 해결하는 것이 좋습니다.

맥스 엔릭 :

도대체!
또한 어떻게 작동하는지 알려주실 수 있습니까?

return ( false );

return 연산자 는 단순히 함수가 즉시 종료되도록 지시합니다. 함수가 값을 반환하면(귀하의 경우에는 bool임) 값도 반환해야 합니다.

개체를 만들기 전에 개체가 있는지 확인하면 오류(4200, 맞습니까?)가 제거됩니다.

Return Operator - Operators - Language Basics - MQL4 Reference
Return Operator - Operators - Language Basics - MQL4 Reference
  • docs.mql4.com
Return Operator - Operators - Language Basics - MQL4 Reference
 
honest_knave :

귀하의 명확한 의견에 감사드립니다.

이미 아래 코드와 같이 귀하의 방법으로 대체합니다. ( 레이블 개체 기능의 경우 )

이전 - 오류 설명에 대한 귀하의 의견 이전:

if ( ! ObjectCreate ( chart_ID, name, OBJ_LABEL , sub_window, 0 , 0 ) )
{
     Print ( __FUNCTION__ , ": failed to create text label! Error code = " , GetLastError () );
     return ( false );
}

// which one this code gives me error no: 4200 

후에:

if ( ! ObjectCreate ( chart_ID, name, OBJ_LABEL , sub_window, 0 , 0 ) )
{
     if ( errorcode != 0 ) printf ( "Error %i: %s" , errorcode, ErrorDescription( errorcode ) );
     return ( false );
}

// prevent error no: 4200 - but was not update spreadsheet values 

이제 완벽하게 작동합니다.

if ( ! ObjectCreate ( chart_ID, name, OBJ_LABEL , sub_window, 0 , 0 ) )
{
     if ( errorcode != 0 ) printf ( "Error %i: %s" , errorcode, ErrorDescription( errorcode ) );
     return ( false ); // removed this line
}

// now spreadsheet values updates, no any more error no: 4200 

당신에게 최선을 다합니다.
사유: