MQL4 ve MQL5 ile ilgili herhangi bir acemi sorusu, algoritmalar ve kodlar hakkında yardım ve tartışma - sayfa 1870

 

Birkaç saattir veritabanından veri okumaya çalışıyorum ve yapamıyorum.

İşte testler için EA kodu.

Kısaca. Bir tablo ile bir veritabanı oluşturulur (veritabanı varsa, tablo silinir ve yeniden oluşturulur). Tabloya tek bir satır eklenir.

Daha sonra veritabanı kapatılır ve tekrar açılır. Bu girişin basit bir seçimi yapılır, ancak komut, sorgu sonucunun boş olduğuna dair bir hata döndürür.

IDE aracılığıyla kontrol edildi - her şey aynı istek tarafından seçilir. Bunun bir hata mı yoksa bir özellik mi olduğunu anlayamıyorum?

 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 );
}

İşin sonucu:

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

Ayrıca, tam kodu ekliyorum.

Dosyalar:
testDB_NW.mq5  8 kb
 
Peki, girdi -parametreleri neden bir döngü içinde sıralanamıyor? Neden bizi böyle cezalandırıyorsun?
 
x572intraday # :
Peki, girdi -parametreleri neden bir döngü içinde sıralanamıyor? Neden bizi böyle cezalandırıyorsun?

Ve neden gerekli? Bir sır paylaş...

 
Piyasadan danışmanlar nasıl kurulur? Birden fazla terminalim var.
Markette download'a tıklıyorum, varsayılan olarak yanlış terminal açılıyor. Sildim. Şimdi "indir" düğmesine tıkladıktan sonra hiçbir şey olmuyor
 
Vladimir Makhnin # :
Piyasadan danışmanlar nasıl kurulur? Birden fazla terminalim var.
Markette download'a tıklıyorum, varsayılan olarak yanlış terminal açılıyor. Sildim. Şimdi "indir" düğmesine tıkladıktan sonra hiçbir şey olmuyor

hangi tarayıcı ile indiriyorsun

 
Alexey Viktorov # :

Ve neden gerekli? Bir sır paylaş...

Evet, bir sonraki şubedeydi, uzağa gitmenize gerek yok:

 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;

Her şeyi bir döngü yerine elle LArray dizisine itmek bir köpeğin sevincidir. Ve bu sadece bir örnek. Aslında çok fazla transfer olabilir.

Enum ve ENUM_TIMEFRAMES numaralandırma olasılığının olmaması konusunda genellikle sessizim. Yorgun.
 
x572intraday # :
Enum ve ENUM_TIMEFRAMES numaralandırma olasılığının olmaması konusunda genellikle sessizim.

Bir zamanlar ilgi uğruna benzer bir numaralandırma yapmaya çalıştım:

Ticaret, otomatik ticaret sistemleri ve ticaret stratejilerinin test edilmesi hakkında forum

Hizmet Masası aracılığıyla geliştiricilerle iletişim kurun!

Mihail Matkovskij , 2019.10.05 22:07

Herhangi bir sayıda sabitle sağa / sola kaydırmanız veya yinelemeniz gerekiyorsa çok yardımcı olacaktır. İşte aldıklarım:

 #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 ile ofset:

 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 ile ofset:

 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

Doğru, bu yöntem hala anahtarlı yönteme göre hız kaybediyor.

Yani istersen her şey mümkün!
 
x572intraday # :
Peki, girdi -parametreleri neden bir döngü içinde sıralanamıyor? Neden bizi böyle cezalandırıyorsun?

sorusuna katılıyorum.

Evet ve enum için de: EnumToString işlevi varsa, neden StringToEnum olmasın - inanılmaz derecede zor bir görev var mı?

Numaralandırma değerlerini veritabanında sayı olarak kaydetmek bir seçenek değildir, çünkü daha sonra ortadaki numaralandırmaya yeni bir değer eklerseniz, o kadar, veritabanındaki veriler balkabağına dönüşür ve formda okunamazlar. sayıların, gözlerinle göremezsin.

 

Veritabanı sorgu parametresine açıkça bir NULL değeri iletmek mümkün müdür?

Bu yapı bir derleme hatasına neden olur:

res = DatabaseBind(request, column, NULL );
 
Maksim Emeliashin derleme hatasına neden olur:
DatabaseBind(request, column, "" );