MQL4 및 MQL5에 대한 초보자 질문, 알고리즘 및 코드에 대한 도움말 및 토론 - 페이지 1870

 

나는 지금 몇 시간 동안 데이터베이스에서 데이터를 읽으려고 시도했지만 할 수 없습니다.

다음은 테스트용 EA 코드입니다.

간단히. 하나의 테이블로 데이터베이스를 생성합니다(데이터베이스가 존재하는 경우 테이블을 삭제하고 다시 생성). 하나의 단일 행이 테이블에 추가됩니다.

그런 다음 데이터베이스를 닫았다가 다시 엽니다. 이 항목은 간단하게 선택되지만 명령은 쿼리 결과가 비어 있다는 오류를 반환합니다.

IDE를 통해 확인 - 모든 것이 동일한 요청에 의해 선택됩니다. 이것이 버그인지 기능인지 알 수 없습니까?

 int OnInit ()
{
//---
   int db_handle = DatabaseOpen ( "test3" , DATABASE_OPEN_COMMON | DATABASE_OPEN_CREATE | DATABASE_OPEN_READWRITE );
   if (db_handle != INVALID_HANDLE )
      {
         // Структура таблицы
         if ( DatabaseTableExists (db_handle, "ea_dsc" ))
             if (! DatabaseExecute (db_handle, "DROP TABLE IF EXISTS ea_dsc" ))
               Print ( "Failed to drop table with code " , GetLastError ());

         string t_create = "CREATE TABLE ea_dsc (dsc_id INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, "
                           " ea_symb TEXT NOT NULL, dt_from TEXT NOT NULL, dt_to TEXT, magic_buy INTEGER NOT NULL, "
                           " magic_sell INTEGER NOT NULL, version TEXT NOT NULL, ea_method TEXT NOT NULL)" ;
         if (! DatabaseExecute (db_handle, t_create))
             Print ( "Failed to create table with code " , GetLastError ());

         string t_add = "INSERT INTO ea_dsc (ea_symb, dt_from, dt_to, magic_buy, magic_sell, version, ea_method)"
                         "VALUES ('EURUSD', 'dt_from', NULL, '123', '456', 'version', 'ea_method')" ;

         if (! DatabaseExecute (db_handle, t_add))
             Print ( "Failed to add table data  with code " , GetLastError ());

         DatabaseClose (db_handle);
      }

   db_handle = DatabaseOpen ( "test3" , DATABASE_OPEN_COMMON | DATABASE_OPEN_READWRITE );
   if (db_handle != INVALID_HANDLE )
      {
         // Запрос
         string s_quer = "SELECT dsc_id, ea_symb, dt_from, dt_to, magic_buy,"
                         "magic_sell, version, ea_method FROM ea_dsc WHERE ea_symb = ?1" ;
         int c_request = DatabasePrepare (db_handle, s_quer);
         if (c_request != INVALID_HANDLE )
            {
               if (DatabaseBind(c_request, 0 , "EURUSD" ))
                   if ( DatabaseRead (c_request))
                     {
                         Print ( "Found!" );
                     }
                   else
                     PrintFormat ( "Error=%d" , GetLastError ());
               DatabaseFinalize (c_request);
            }
         DatabaseClose (db_handle);
      }

//---
   return ( INIT_SUCCEEDED );
}

작업 결과:

 PrintFormat ( "Error=%d" , GetLastError ());

또한 전체 코드를 첨부합니다.

파일:
testDB_NW.mq5  8 kb
 
음, 입력 매개변수가 루프에서 정렬될 수 없는 이유는 무엇입니까? 왜 우리를 이렇게 벌하시는 겁니까?
 
x572intraday # :
음, 입력 매개변수가 루프에서 정렬될 수 없는 이유는 무엇입니까? 왜 우리를 이렇게 벌하시는 겁니까?

그리고 왜 필요한가? 비밀을 공유...

 
시장에서 고문을 설치하는 방법은 무엇입니까? 여러 터미널이 있습니다.
마켓에서 다운로드를 클릭하면 기본적으로 잘못된 터미널이 열립니다. 삭제했습니다. 이제 "다운로드" 버튼을 클릭한 후 아무 일도 일어나지 않습니다.
 
Vladimir Makhnin # :
시장에서 고문을 설치하는 방법은 무엇입니까? 여러 터미널이 있습니다.
마켓에서 다운로드를 클릭하면 기본적으로 잘못된 터미널이 열립니다. 삭제했습니다. 이제 "다운로드" 버튼을 클릭한 후 아무 일도 일어나지 않습니다.

어떤 브라우저로 다운로드하고 있습니까?

 
Alexey Viktorov # :

그리고 왜 필요한가? 비밀을 공유...

예, 다음 지점에 있었습니다. 멀리 갈 필요가 없습니다.

 enum LIST
  {
   L01= 111 ,   // ITEM 1
   L02= 222 ,   // ITEM 2
   L03= 333 ,   // ITEM 3
   L04= 444 ,   // ITEM 4
   L05= 555 ,   // ITEM 5
   L06= 666 ,   // ITEM 6
   L07= 777 ,   // ITEM 7
   L08= 888 ,   // ITEM 8
  };

input LIST LISTING_01=L01;
input LIST LISTING_02=L02;
input LIST LISTING_03=L03;
input LIST LISTING_04=L04;
input LIST LISTING_05=L05;
input LIST LISTING_06=L06;
input LIST LISTING_07=L07;
input LIST LISTING_08=L08;

LArray[ 0 ]=LISTING_01;
LArray[ 1 ]=LISTING_02;
LArray[ 2 ]=LISTING_03;
LArray[ 3 ]=LISTING_04;
LArray[ 4 ]=LISTING_05;
LArray[ 5 ]=LISTING_06;
LArray[ 6 ]=LISTING_07;
LArray[ 7 ]=LISTING_08;

루프 대신 손으로 모든 것을 LArray 배열로 밀어 넣는 것은 개에게 기쁨입니다. 그리고 이것은 단지 예일 뿐입니다. 실제로 많은 전송이 있을 수 있습니다.

나는 일반적으로 enum 및 ENUM_TIMEFRAMES를 열거할 가능성이 없다는 점에 대해 침묵합니다. 피곤한.
 
x572intraday # :
나는 일반적으로 enum 및 ENUM_TIMEFRAMES를 열거할 가능성이 없다는 점에 대해 침묵합니다.

옛날 옛적에 나는 관심을 위해 비슷한 열거를 시도했습니다.

거래, 자동 거래 시스템 및 거래 전략 테스트에 관한 포럼

Service Desk를 통해 개발자들과 소통하세요!

Mihail Matkovskij , 2019.10.05 22:07

상수만큼 오른쪽/왼쪽으로 이동하거나 반복해야 하는 경우 매우 유용합니다. 내가 얻은 것은 다음과 같습니다.

 #property script_show_inputs
//--- input parameters
input uint      shift = 1 ;

//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
bool incE_TF( ENUM_TIMEFRAMES &__tf, int _n = 1 ) {
   int i = __tf, n = _n;
   if (_n > 0 ) {
     while (i < PERIOD_W1 ) {
      i++;
       if ( StringFind ( EnumToString (( ENUM_TIMEFRAMES )i), "PERIOD_" , 0 ) == 0 ){
        n--;
         if (n == 0 ) {
          __tf = ( ENUM_TIMEFRAMES )i;
           return true ;
        }
      }
    }
  }
   else if (_n < 0 ) {
     while (i > PERIOD_CURRENT ) {
      i--;
       if ( StringFind ( EnumToString (( ENUM_TIMEFRAMES )i), "PERIOD_" , 0 ) == 0 ){
        n++;
         if (n == 0 ) {
          __tf = ( ENUM_TIMEFRAMES )i;
           return true ;
        }
      }
    }
  }
   return false ;
}

//+------------------------------------------------------------------+
//| Script program start function                                    |
//+------------------------------------------------------------------+
void OnStart () {
   ENUM_TIMEFRAMES i;
  i = PERIOD_CURRENT ;
   Print ( "Go" );
   Print ( EnumToString (i), " = " , i);
   while (i < PERIOD_W1 ) {
     if (!incE_TF(i, shift))
       break ;
     Print ( EnumToString (i), " = " , i);
  }
  i = PERIOD_W1 ;
   Print ( "Back" );
   Print ( EnumToString (i), " = " , i);
   while (i > PERIOD_CURRENT ) {
     if (!incE_TF(i, -shift))
       break ;
     Print ( EnumToString (i), " = " , i);
  } 
}

1만큼 오프셋:

 2019.10 . 05 23 : 04 : 12.198 EnumTimeframeIteration (EURUSD,M12)     Go
2019.10 . 05 23 : 04 : 12.198 EnumTimeframeIteration (EURUSD,M12)     PERIOD_CURRENT = 0
2019.10 . 05 23 : 04 : 12.198 EnumTimeframeIteration (EURUSD,M12)     PERIOD_M1 = 1
2019.10 . 05 23 : 04 : 12.198 EnumTimeframeIteration (EURUSD,M12)     PERIOD_M2 = 2
2019.10 . 05 23 : 04 : 12.198 EnumTimeframeIteration (EURUSD,M12)     PERIOD_M3 = 3
2019.10 . 05 23 : 04 : 12.198 EnumTimeframeIteration (EURUSD,M12)     PERIOD_M4 = 4
2019.10 . 05 23 : 04 : 12.198 EnumTimeframeIteration (EURUSD,M12)     PERIOD_M5 = 5
2019.10 . 05 23 : 04 : 12.198 EnumTimeframeIteration (EURUSD,M12)     PERIOD_M6 = 6
2019.10 . 05 23 : 04 : 12.198 EnumTimeframeIteration (EURUSD,M12)     PERIOD_M10 = 10
2019.10 . 05 23 : 04 : 12.198 EnumTimeframeIteration (EURUSD,M12)     PERIOD_M12 = 12
2019.10 . 05 23 : 04 : 12.198 EnumTimeframeIteration (EURUSD,M12)     PERIOD_M15 = 15
2019.10 . 05 23 : 04 : 12.198 EnumTimeframeIteration (EURUSD,M12)     PERIOD_M20 = 20
2019.10 . 05 23 : 04 : 12.198 EnumTimeframeIteration (EURUSD,M12)     PERIOD_M30 = 30
2019.10 . 05 23 : 04 : 12.204 EnumTimeframeIteration (EURUSD,M12)     PERIOD_H1 = 16385
2019.10 . 05 23 : 04 : 12.204 EnumTimeframeIteration (EURUSD,M12)     PERIOD_H2 = 16386
2019.10 . 05 23 : 04 : 12.204 EnumTimeframeIteration (EURUSD,M12)     PERIOD_H3 = 16387
2019.10 . 05 23 : 04 : 12.204 EnumTimeframeIteration (EURUSD,M12)     PERIOD_H4 = 16388
2019.10 . 05 23 : 04 : 12.204 EnumTimeframeIteration (EURUSD,M12)     PERIOD_H6 = 16390
2019.10 . 05 23 : 04 : 12.204 EnumTimeframeIteration (EURUSD,M12)     PERIOD_H8 = 16392
2019.10 . 05 23 : 04 : 12.204 EnumTimeframeIteration (EURUSD,M12)     PERIOD_H12 = 16396
2019.10 . 05 23 : 04 : 12.204 EnumTimeframeIteration (EURUSD,M12)     PERIOD_D1 = 16408
2019.10 . 05 23 : 04 : 12.210 EnumTimeframeIteration (EURUSD,M12)     PERIOD_W1 = 32769
2019.10 . 05 23 : 04 : 12.210 EnumTimeframeIteration (EURUSD,M12)     Back
2019.10 . 05 23 : 04 : 12.210 EnumTimeframeIteration (EURUSD,M12)     PERIOD_W1 = 32769
2019.10 . 05 23 : 04 : 12.217 EnumTimeframeIteration (EURUSD,M12)     PERIOD_D1 = 16408
2019.10 . 05 23 : 04 : 12.217 EnumTimeframeIteration (EURUSD,M12)     PERIOD_H12 = 16396
2019.10 . 05 23 : 04 : 12.217 EnumTimeframeIteration (EURUSD,M12)     PERIOD_H8 = 16392
2019.10 . 05 23 : 04 : 12.217 EnumTimeframeIteration (EURUSD,M12)     PERIOD_H6 = 16390
2019.10 . 05 23 : 04 : 12.217 EnumTimeframeIteration (EURUSD,M12)     PERIOD_H4 = 16388
2019.10 . 05 23 : 04 : 12.217 EnumTimeframeIteration (EURUSD,M12)     PERIOD_H3 = 16387
2019.10 . 05 23 : 04 : 12.217 EnumTimeframeIteration (EURUSD,M12)     PERIOD_H2 = 16386
2019.10 . 05 23 : 04 : 12.217 EnumTimeframeIteration (EURUSD,M12)     PERIOD_H1 = 16385
2019.10 . 05 23 : 04 : 12.223 EnumTimeframeIteration (EURUSD,M12)     PERIOD_M30 = 30
2019.10 . 05 23 : 04 : 12.223 EnumTimeframeIteration (EURUSD,M12)     PERIOD_M20 = 20
2019.10 . 05 23 : 04 : 12.223 EnumTimeframeIteration (EURUSD,M12)     PERIOD_M15 = 15
2019.10 . 05 23 : 04 : 12.223 EnumTimeframeIteration (EURUSD,M12)     PERIOD_M12 = 12
2019.10 . 05 23 : 04 : 12.223 EnumTimeframeIteration (EURUSD,M12)     PERIOD_M10 = 10
2019.10 . 05 23 : 04 : 12.223 EnumTimeframeIteration (EURUSD,M12)     PERIOD_M6 = 6
2019.10 . 05 23 : 04 : 12.223 EnumTimeframeIteration (EURUSD,M12)     PERIOD_M5 = 5
2019.10 . 05 23 : 04 : 12.223 EnumTimeframeIteration (EURUSD,M12)     PERIOD_M4 = 4
2019.10 . 05 23 : 04 : 12.223 EnumTimeframeIteration (EURUSD,M12)     PERIOD_M3 = 3
2019.10 . 05 23 : 04 : 12.223 EnumTimeframeIteration (EURUSD,M12)     PERIOD_M2 = 2
2019.10 . 05 23 : 04 : 12.223 EnumTimeframeIteration (EURUSD,M12)     PERIOD_M1 = 1
2019.10 . 05 23 : 04 : 12.223 EnumTimeframeIteration (EURUSD,M12)     PERIOD_CURRENT = 0

2만큼 오프셋:

 2019.10 . 05 23 : 06 : 11.462 EnumTimeframeIteration (EURUSD,M12)     Go
2019.10 . 05 23 : 06 : 11.462 EnumTimeframeIteration (EURUSD,M12)     PERIOD_CURRENT = 0
2019.10 . 05 23 : 06 : 11.462 EnumTimeframeIteration (EURUSD,M12)     PERIOD_M2 = 2
2019.10 . 05 23 : 06 : 11.462 EnumTimeframeIteration (EURUSD,M12)     PERIOD_M4 = 4
2019.10 . 05 23 : 06 : 11.462 EnumTimeframeIteration (EURUSD,M12)     PERIOD_M6 = 6
2019.10 . 05 23 : 06 : 11.463 EnumTimeframeIteration (EURUSD,M12)     PERIOD_M12 = 12
2019.10 . 05 23 : 06 : 11.463 EnumTimeframeIteration (EURUSD,M12)     PERIOD_M20 = 20
2019.10 . 05 23 : 06 : 11.469 EnumTimeframeIteration (EURUSD,M12)     PERIOD_H1 = 16385
2019.10 . 05 23 : 06 : 11.469 EnumTimeframeIteration (EURUSD,M12)     PERIOD_H3 = 16387
2019.10 . 05 23 : 06 : 11.469 EnumTimeframeIteration (EURUSD,M12)     PERIOD_H6 = 16390
2019.10 . 05 23 : 06 : 11.469 EnumTimeframeIteration (EURUSD,M12)     PERIOD_H12 = 16396
2019.10 . 05 23 : 06 : 11.475 EnumTimeframeIteration (EURUSD,M12)     PERIOD_W1 = 32769
2019.10 . 05 23 : 06 : 11.475 EnumTimeframeIteration (EURUSD,M12)     Back
2019.10 . 05 23 : 06 : 11.475 EnumTimeframeIteration (EURUSD,M12)     PERIOD_W1 = 32769
2019.10 . 05 23 : 06 : 11.482 EnumTimeframeIteration (EURUSD,M12)     PERIOD_H12 = 16396
2019.10 . 05 23 : 06 : 11.482 EnumTimeframeIteration (EURUSD,M12)     PERIOD_H6 = 16390
2019.10 . 05 23 : 06 : 11.482 EnumTimeframeIteration (EURUSD,M12)     PERIOD_H3 = 16387
2019.10 . 05 23 : 06 : 11.482 EnumTimeframeIteration (EURUSD,M12)     PERIOD_H1 = 16385
2019.10 . 05 23 : 06 : 11.488 EnumTimeframeIteration (EURUSD,M12)     PERIOD_M20 = 20
2019.10 . 05 23 : 06 : 11.488 EnumTimeframeIteration (EURUSD,M12)     PERIOD_M12 = 12
2019.10 . 05 23 : 06 : 11.488 EnumTimeframeIteration (EURUSD,M12)     PERIOD_M6 = 6
2019.10 . 05 23 : 06 : 11.488 EnumTimeframeIteration (EURUSD,M12)     PERIOD_M4 = 4
2019.10 . 05 23 : 06 : 11.488 EnumTimeframeIteration (EURUSD,M12)     PERIOD_M2 = 2
2019.10 . 05 23 : 06 : 11.488 EnumTimeframeIteration (EURUSD,M12)     PERIOD_CURRENT = 0

사실, 이 방법은 여전히 스위치가 있는 방법에 비해 속도가 떨어집니다.

따라서 원하는 경우 모든 것이 가능합니다!
 
x572intraday # :
음, 입력 매개변수가 루프에서 정렬될 수 없는 이유는 무엇입니까? 왜 우리를 이렇게 벌하시는 겁니까?

질문에 동참합니다.

예, 열거형도 마찬가지입니다. EnumToString 함수가 있다면 StringToEnum은 안 되는 이유가 무엇입니까? 엄청나게 어려운 작업이 있습니까?

데이터베이스에 열거형 값을 숫자로 저장하는 것은 옵션이 아닙니다. 중간에 열거형에 새로운 값을 추가하면 데이터베이스의 데이터가 호박으로 바뀌고 형식에서 읽을 수 없기 때문입니다. 눈으로 볼 수 없는 숫자입니다.

 

데이터베이스 쿼리 매개변수에 NULL 값을 명시적으로 전달할 수 있습니까?

이 구성은 컴파일 오류 를 일으킵니다.

res = DatabaseBind(request, column, NULL );
 
Maksim Emeliashin 컴파일 오류 를 일으킵니다.
DatabaseBind(request, column, "" );