OOP, mql5의 템플릿 및 매크로, 미묘함 및 사용 기술 - 페이지 27

 
Vladimir Simakov :

개체에 대한 포인터입니다.

불쾌하지는 않지만 그러한 매크로를 사용하면 너무 이르므로 질식할 것입니다. 먼저 내가 왜 이렇게 했는지 이해하십시오.

그리고 그것을 전송할 클래스 내부에 있는 객체에 대한 이 포인터로 무엇을 해야 할까요?

매크로의 경우 매크로로 작업하는 것이 훨씬 쉽습니다.

 
Seric29 :

그리고 그것을 전송할 클래스 내부에 있는 객체에 대한 이 포인터로 무엇을 해야 할까요?

매크로의 경우 매크로로 작업하는 것이 훨씬 쉽습니다.

그것에 당신은 어디에서나 생성 된 객체에 주소를 지정합니다. 내 예에서 전역 수준에서 생성된 객체에 대한 포인터는 생성자에 전달되지만 이 클래스는 객체가 생성되는 다른 클래스에 중첩될 수 있습니다.

다음은 매크로를 사용하는 예입니다.

 #define foor1(a,b,v,g) \
for (;Funkziya(a,b,v)&&g;b++)

...

foor(a,b,c,isSomething?a>b:b>c){
    DoSomething();
}
...

전개될 내용을 보고 명확성을 위해 대괄호를 추가합니다.

 for (; ( Funkziya(a,b,c)&&isSomething ) ?a>b:b>c;b++){
    DoSomething();
}

결과적으로 컴파일러에 절대적으로 유효한 코드를 얻었지만 프로그램의 동작은 의도한 것과 완전히 다릅니다. 그리고 이제 오류를 알아차리고 코드가 작동한 다음 터미널을 어리둥절하게 보고 궁금해 할 것입니다. 로봇이 모든 보증금을 입력하고 계정을 병합한 이유는 무엇입니까?)))))

저는 매크로를 아주 잘하지만 매크로를 별로 좋아하지 않는 이유입니다. 따라서 여러분에게 드리는 조언은 코드에서 문자를 줄이는 데 사용하지 말라는 것입니다. 이것은 실제로 잘린 mql 버전에서도 강력한 도구이지만 매우 훈련된 접근 방식이 필요합니다.

 

개발자는 매크로 및 함수 내에서 인수를 무제한으로 사용할 수 있는 기능을 추가합니다. 이 정적 인 넌센스에 지쳤습니다. 매크로에 대한 8개의 인수는 무엇이며 108개가 필요한 경우 최소한 10개를 만드십시오. 또한 매크로를 사용하여 새 이름을 생성할 필요가 없도록 매크로를 오버로드할 수 있습니다. 그들이 조직하면 또한 좋을 것입니다.

 #define Znah 0
#define PrmI int     Peremen= 6 ;
#define PrmD double Peremen= 3.345 ;

#if Znah //если больше 0 то появится переменная int Peremen
   PrmI
#else
   PrmD //иначе появится переменная double Peremen
#endif

#if 매크로

 
Vladimir Simakov :

그러나 프로그램의 동작은 의도한 것과 완전히 다릅니다. 그리고 이제 오류를 눈치채고 코드가 작동한 다음 터미널을 어리석게 보고 궁금해 할 것입니다. 로봇이 모든 보증금을 입력하고 계정을 병합한 이유는 무엇입니까?)))))

저는 매크로를 아주 잘하지만 매크로를 별로 좋아하지 않는 이유입니다. 따라서 여러분에게 드리는 조언은 코드에서 문자를 줄이는 데 사용하지 말라는 것입니다. 이것은 실제로 잘린 mql 버전에서도 강력한 도구이지만 매우 훈련된 접근 방식이 필요합니다.

나는 아무것도 추측하지 않을 것이며, 나는 내 일을 안정적으로 수행합니다.

CDataManager*  m_data;

m_data 포인터로 무엇을 하고 있습니까? m_data 요소에 액세스하고 있습니까? 그리고 그것은 당신에게 무엇을 제공합니까? 나는 이것이 여기에서 일어나고 있다는 것을 이해합니다.

   CNewBar(CDataManager* data= NULL ):m_data(!data? new CDataManager:data),cIsDelData(!data){}
   CNewBar( string symbol, ENUM_TIMEFRAMES frame):m_data( new CDataManager(symbol,frame)),cIsDelData( true ){}

달성하려는 것이 무엇인지 명확하지 않습니다(매우 어렵습니다)?

이 줄이 있으면 어떻게 될까요?

CDataManager*  m_data;

대중에게 쓰여질 것입니다

나에게 수업은 어두운 숲이다. 2년 동안 나는 여전히 그들을 어떻게 대해야 하는지 이해하지 못했습니다.

 

테스트 결과의 통계를 데이터베이스 테이블에 쓸 필요가 있습니다.

데이터베이스는 미리 생성했고 EA 설정에서 sinput 변수를 켜서 관심 패스를 씁니다.

DB:

CREATE TABLE " TesterStatistics " (
        "id"    INTEGER,
        "MD5"   TEXT,
        " STAT_PROFIT "   REAL,
        " STAT_GROSS_PROFIT "     REAL,
        " STAT_GROSS_LOSS "       REAL,
        " STAT_MAX_PROFITTRADE "  REAL,
        " STAT_MAX_LOSSTRADE "    REAL,
        " STAT_CONPROFITMAX "     REAL,
        " STAT_CONPROFITMAX_TRADES "      INTEGER,
        " STAT_MAX_CONWINS "      REAL,
        " STAT_MAX_CONPROFIT_TRADES "     INTEGER,
        " STAT_CONLOSSMAX "       REAL,
        " STAT_CONLOSSMAX_TRADES "        INTEGER,
        " STAT_MAX_CONLOSSES "    REAL,
        " STAT_MAX_CONLOSS_TRADES "       INTEGER,
        " STAT_BALANCEMIN "       REAL,
        " STAT_BALANCE_DD "       REAL,
        " STAT_BALANCEDD_PERCENT "        REAL,
        " STAT_BALANCE_DDREL_PERCENT "    REAL,
        " STAT_BALANCE_DD_RELATIVE "      REAL,
        " STAT_EQUITYMIN "        REAL,
        " STAT_EQUITY_DD "        REAL,
        " STAT_EQUITYDD_PERCENT " REAL,
        " STAT_EQUITY_DDREL_PERCENT "     REAL,
        " STAT_EQUITY_DD_RELATIVE "       REAL,
        " STAT_EXPECTED_PAYOFF "  REAL,
        " STAT_PROFIT_FACTOR "    REAL,
        " STAT_RECOVERY_FACTOR "  REAL,
        " STAT_SHARPE_RATIO "     REAL,
        " STAT_MIN_MARGINLEVEL "  REAL,
        " STAT_CUSTOM_ONTESTER "  REAL,
        " STAT_DEALS "    INTEGER,
        " STAT_TRADES "   INTEGER,
        " STAT_PROFIT_TRADES "    INTEGER,
        " STAT_LOSS_TRADES "      INTEGER,
        " STAT_SHORT_TRADES "     INTEGER,
        " STAT_LONG_TRADES "      INTEGER,
        " STAT_PROFIT_SHORTTRADES "       INTEGER,
        " STAT_PROFIT_LONGTRADES "        INTEGER,
        " STAT_PROFITTRADES_AVGCON "      INTEGER,
        " STAT_LOSSTRADES_AVGCON "        INTEGER,
        PRIMARY KEY("id" AUTOINCREMENT)
)

다음 코드를 사용하여 이 테이블에 씁니다.

 DatabaseExecute (handleDB, StringFormat ("INSERT INTO \" TesterStatistics \" "
                                             "VALUES ( NULL , \'%s\',%G, %G, %G, %G, %G, %G, %d, %G, %d, %G, %d, %G, %d, "
                                             "%G, %G, %G, %G, %G, %G, %G, %G, %G, %G, %G, %G, %G, %G, %G, %G, %d, %d, %d, %d, %d, %d, %d, %d, %d, %d);",
                                             md5txt, TesterStatistics ( STAT_PROFIT ),             TesterStatistics ( STAT_GROSS_PROFIT ),
                                             TesterStatistics ( STAT_GROSS_LOSS ),                 TesterStatistics ( STAT_MAX_PROFITTRADE ),
                                             TesterStatistics ( STAT_MAX_LOSSTRADE ),               TesterStatistics ( STAT_CONPROFITMAX ),
                                             ( int ) TesterStatistics ( STAT_CONPROFITMAX_TRADES ),   TesterStatistics ( STAT_MAX_CONWINS ),
                                             ( int ) TesterStatistics ( STAT_MAX_CONPROFIT_TRADES ),   TesterStatistics ( STAT_CONLOSSMAX ),
                                             ( int ) TesterStatistics ( STAT_CONLOSSMAX_TRADES ),     TesterStatistics ( STAT_MAX_CONLOSSES ),
                                             ( int ) TesterStatistics ( STAT_MAX_CONLOSS_TRADES ),     TesterStatistics ( STAT_BALANCEMIN ),
                                             TesterStatistics ( STAT_BALANCE_DD ),                 TesterStatistics ( STAT_BALANCEDD_PERCENT ),
                                             TesterStatistics ( STAT_BALANCE_DDREL_PERCENT ),       TesterStatistics ( STAT_BALANCE_DD_RELATIVE ),
                                             TesterStatistics ( STAT_EQUITYMIN ),                   TesterStatistics ( STAT_EQUITY_DD ),
                                             TesterStatistics ( STAT_EQUITYDD_PERCENT ),           TesterStatistics ( STAT_EQUITY_DDREL_PERCENT ),
                                             TesterStatistics ( STAT_EQUITY_DD_RELATIVE ),         TesterStatistics ( STAT_EXPECTED_PAYOFF ),
                                             TesterStatistics ( STAT_PROFIT_FACTOR ),               TesterStatistics ( STAT_RECOVERY_FACTOR ),
                                             TesterStatistics ( STAT_SHARPE_RATIO ),               TesterStatistics ( STAT_MIN_MARGINLEVEL ),
                                             TesterStatistics ( STAT_CUSTOM_ONTESTER ),            ( int ) TesterStatistics ( STAT_DEALS ),
                                             ( int ) TesterStatistics ( STAT_TRADES ),                ( int ) TesterStatistics ( STAT_PROFIT_TRADES ),
                                             ( int ) TesterStatistics ( STAT_LOSS_TRADES ),           ( int ) TesterStatistics ( STAT_SHORT_TRADES ),
                                             ( int ) TesterStatistics ( STAT_LONG_TRADES ),           ( int ) TesterStatistics ( STAT_PROFIT_SHORTTRADES ),
                                             ( int ) TesterStatistics ( STAT_PROFIT_LONGTRADES ),     ( int ) TesterStatistics ( STAT_PROFITTRADES_AVGCON ),
                                             ( int ) TesterStatistics ( STAT_LOSSTRADES_AVGCON )));


열거형 ENUM_STATISTICS는 도움말에서 확인할 스크립트와 같은 순서를 갖습니다.

 void OnStart ()
{
   for ( int i = 0 ; i <= ( int ) STAT_LOSSTRADES_AVGCON ; i++)
       printf ( "%d ^ %s" , i, EnumToString (( ENUM_STATISTICS )i));
}


모든 것이 작동 하지만 코드의 텍스트가 상당히 방대하고 오타의 가능성이 높습니다. 이 쿼리를 보다 안정적인 방식으로 데이터베이스에 가져오는 방법 - 주요 문제는 StringFormat에 들어가는 방법입니다

 
Igor Makanu :

테스트 결과의 통계를 데이터베이스 테이블에 쓸 필요가 있습니다.

데이터베이스는 미리 생성했고 EA 설정에서 sinput 변수를 켜서 관심 패스를 씁니다.

DB:

다음 코드를 사용하여 이 테이블에 씁니다.


열거형 ENUM_STATISTICS는 도움말에서 확인할 스크립트와 같은 순서를 갖습니다.


모든 것이 작동 하지만 코드의 텍스트가 상당히 방대하고 오타의 가능성이 높습니다. 이 쿼리를 보다 안정적인 방식으로 데이터베이스에 가져오는 방법 - 주요 문제는 StringFormat에 들어가는 방법입니다

정의하기 위해!!! (여기서 일반적인 과부하가 걸리더라도)

이 문자열 형식이 필요한 이유는 무엇입니까?

일반 덧셈보다 절대 빠르지 않습니다....(텍스트 파일을 수십 기가로 만들었습니다 =).... 일반 덧셈도 더 빨리 나오는군요....


이 정규 함수를 통해 직접 하는 것이 중요하다면 문제도 명확하지 않습니다))

 
Alexandr Andreev :

이 문자열 형식이 필요한 이유는 무엇입니까?

일반 덧셈보다 절대 빠르지 않습니다....(텍스트 파일을 수십 기가로 만들었습니다 =).... 일반 덧셈도 더 빨리 나오는군요....

모르겠어

도움말 및 기사 읽기, 예제를 사용하여 데이터베이스에 대한 쿼리 생성

모든 것이 작동하는 것 같지만 이 코드를 부분적으로 사용하면 오타가 날 수 있다고 생각합니다.

일반적으로이 디자인은 멍청해 보이기 때문에 더 컴팩트하게 만들고 엉망으로 만들지 않는 방법을 묻습니다.)))

 
Igor Makanu :

테스트 결과의 통계를 데이터베이스 테이블에 쓸 필요가 있습니다.

데이터베이스는 미리 생성했고 EA 설정에서 sinput 변수를 켜서 관심 패스를 씁니다.

DB:

다음 코드를 사용하여 이 테이블에 씁니다.


ENUM_STATISTICS 열거형은 도움말에서 확인할 스크립트와 같은 순서를 따릅니다.


모든 것이 작동 하지만 코드의 텍스트가 상당히 방대하고 오타의 가능성이 높습니다. 이 쿼리를 보다 안정적인 방식으로 데이터베이스에 가져오는 방법 - 주요 문제는 StringFormat에 들어가는 방법입니다

첫째, SQLite에서 필드 유형은 선택 사항이며 유형 변환 및 포인팅에 대해 걱정할 필요가 없습니다. 그는 단지 "라이트"가 아닙니다.

긴 쿼리는 3-4-5로 나눌 수 있습니다 :-)

BEGIN TRANSACTION

INSERT INTO myTable VALUES (...); --- тут можно получить PrimaryKey

UPDATE myTable .... ; --- обновить по Primary

UPDATE myTable ...  ; --- ещё...

COMMIT ; --- это если все запросы удачны.. иначе ROLLBACK

이것은 오래된 기억에서 나온 것입니다. 즉, 인증서에서 명확히해야합니다.

 
Igor Makanu :

모르겠어

도움말 및 기사 읽기, 예제를 사용하여 데이터베이스에 대한 쿼리 생성

모든 것이 작동하는 것 같지만 이 코드를 부분적으로 사용하면 오타가 날 수 있다고 생각합니다.

일반적으로이 디자인은 멍청해 보이기 때문에 더 컴팩트하게 만들고 엉망으로 만들지 않는 방법을 묻습니다.)))

특히 작업은 다음과 같아야 합니다.

 string MakeRequest( string md5txt){
   static ENUM_STATISTICS intIndex[]={ STAT_CONPROFITMAX_TRADES ,
                                       STAT_MAX_CONPROFIT_TRADES ,
                                       STAT_CONLOSSMAX_TRADES ,
                                       STAT_MAX_CONLOSS_TRADES ,
                                       STAT_DEALS ,
                                       STAT_TRADES ,
                                       STAT_PROFIT_TRADES ,
                                       STAT_LOSS_TRADES ,
                                       STAT_SHORT_TRADES ,
                                       STAT_LONG_TRADES ,
                                       STAT_PROFIT_SHORTTRADES ,
                                       STAT_PROFIT_LONGTRADES ,
                                       STAT_PROFITTRADES_AVGCON ,
                                       STAT_LOSSTRADES_AVGCON };
   string ret="INSERT INTO \" TesterStatistics \" VALUES ( NULL ,"+md5txt;
   for ( int i= 0 ,ii= 0 ;i<= STAT_LOSSTRADES_AVGCON ;++i){
      ret+=",";
       if (i==intIndex[ii]){
         ret+= StringFormat ("%d",( int ) TesterStatistics (( ENUM_STATISTICS )i));
         ++ii;}
       else ret+= StringFormat ("%G", TesterStatistics (( ENUM_STATISTICS )i));}
   return ret;}
   
DatabaseExecute (handleDB, MakeRequest("md5txt"));
 
Vladimir Simakov :

특히 작업은 다음과 같아야 합니다.

팬케이크!

바로 그거죠! 배열!

감사합니다!!!!!