System z użyciem bazy danych

O jezykach programowania w platformach i nie tylko.
Awatar użytkownika
reptile
Maniak
Maniak
Posty: 2799
Rejestracja: 13 gru 2008, 13:48

Nieprzeczytany post autor: reptile »

green7 pisze:W bazie masz tabelę o nazwie ticksinmysql natomiast w kodzie używasz tabeli ticks.
Powinieneś zmienić nazwę tabeli w mysql'u na ticks.
kod mql łatwiej zmienić, czyli

Kod: Zaznacz cały

query = StringConcatenate("insert into TicksInMySQL(margin,freemargin,date,ask,bid,symbol,equity)
Komentarzem opatrzyłem ten kawałek, czyli powyższy insert jest wystarczający?

Kod: Zaznacz cały

//string table= "TicksInMySQL" 
log

Kod: Zaznacz cały

2010.06.20 19:04:50	TicksInMySQLx EURUSD,H1: initialized
2010.06.20 19:04:50	TicksInMySQLx EURUSD,H1: connected
2010.06.20 19:04:50	TicksInMySQLx EURUSD,H1: allocated
2010.06.20 19:04:50	TicksInMySQLx EURUSD,H4: uninit reason 3
2010.06.20 19:04:50	TicksInMySQLx EURUSD,H4: deinitialized
2010.06.20 19:04:42	TicksInMySQLx EURUSD,H4: initialized
2010.06.20 19:04:42	TicksInMySQLx EURUSD,H4: connected
2010.06.20 19:04:42	TicksInMySQLx EURUSD,H4: allocated
2010.06.20 19:04:41	TicksInMySQLx EURUSD,H4: loaded successfully
2010.06.20 19:04:36	Compiling 'TicksInMySQLx'
2010.06.20 19:04:27	Compiling 'TicksInMySQLx'
R.E.P.T.I.L.E. - Robotic Electronic Person Trained for Infiltration and Logical Exploration (off-line,only e-mail)

green7
Maniak
Maniak
Posty: 2060
Rejestracja: 16 sty 2008, 18:44

Nieprzeczytany post autor: green7 »

No i ok. Jak wyniki - działa ?
Green
Obrazek
Obrazek

Awatar użytkownika
reptile
Maniak
Maniak
Posty: 2799
Rejestracja: 13 gru 2008, 13:48

Nieprzeczytany post autor: reptile »

green7 pisze:No i ok. Jak wyniki - działa ?
Trochę inaczej zrobione, ale działa :D

W sumie nie wiem jaka różnica i co lepiej (expert czy indyk), ale przerobiłem na wskaźnik i powstał jakiś "mix" - efekt taki jak chciałem.

Stary kod, który się tu od początku przewija ciągle mnie "zaskakuje" przy kompilacji i w sumie nie działa (nawet jak się dobrze skompiluje).
Podejrzewam, że to values w query coś jest nie tegas.

Kod: Zaznacz cały

#include <libmysql.mqh>

int mysql;
//+------------------------------------------------------------------+
//| expert initialization function                                   |
//+------------------------------------------------------------------+
int init()
  {
   mysql = mysql_init(mysql);
   if(mysql != 0)
       Print("allocated");
   string host = "localhost";
   string user = "root";
   string password = "";
   string DB = "forex";
   int clientflag = 0;
   int port = 3306;
   string socket = "";
   string table= "TicksInMySQL"
   int res = mysql_real_connect(mysql,host,user,password,DB,port,socket,clientflag);
   int err = GetLastError();
   if(res == mysql)
       Print("connected");
   else
       Print("error=", mysql, " ", mysql_errno(mysql), " ");
   return(0);
  }
//+------------------------------------------------------------------+
//| expert deinitialization function                                 |
//+------------------------------------------------------------------+
int deinit()
  {
   mysql_close(mysql);
//----
   return(0);
  }
//+------------------------------------------------------------------+
//| expert start function                                            |
//+------------------------------------------------------------------+
int start()
  {
   string query = "";
   int length = 0;
   query = StringConcatenate("insert into" ,table,"(margin,freemargin,date,ask,bid,symbol,equity) values(",
                             AccountMargin(), ",", AccountFreeMargin(), ","",
                             TimeToStr(CurTime(), TIME_DATE|TIME_SECONDS), "",",
                             NormalizeDouble(Ask, 4), ",", NormalizeDouble(Bid, 4),
                             ","", Symbol(), "",", AccountEquity(), ");");
   length = StringLen(query);
   mysql_real_query(mysql, query, length);
   int myerr = mysql_errno(mysql);
   if(myerr > 0)
       Print("error=",myerr);
  } 
include/libmysql.mqh

Kod: Zaznacz cały

/*
 * libmysql interface for MT4
 */
#import "libmysql.dll"
int mysql_init(int db);
int mysql_errno(int TMYSQL);
int mysql_real_connect(int TMYSQL, string host, string user, string password,
                       string DB,int port,int socket,int clientflag);
int mysql_real_query(int TMSQL, string query, int length);
void mysql_close(int TMSQL);
#import
log z kompilatora

Kod: Zaznacz cały

Compiling 'TicksInMySQLx.mq4'...	
'res' - variable not defined	\experts\TicksInMySQLx.mq4 (20, 8)
'res' - variable not defined	\experts\TicksInMySQLx.mq4 (22, 7)
'table' - variable not defined \experts\TicksInMySQLx.mq4 (44, 44)

Z działającego kodu mam tak

Kod: Zaznacz cały

query=StringConcatenate("insert into ",table," set symbol=\'",Symbol(),


"\',open="+Open[0]+
",high="+High[0]+
",low="+Low[0]+
",close="+Close[0]+
",volume="+Volume[0]+

",ask="+Ask+",bid="+Bid+
  
Szukałem lepszej metody na wrzucanie do tabeli, wyżej wystarczy mi dodawać co chce lub usuwać komentarzem :roll:
Łatwo się pogubić z tymi " ' \ , itd :)

Dzięki za pomoc. :wink:
Nie masz wymaganych uprawnień, aby zobaczyć pliki załączone do tego posta.
R.E.P.T.I.L.E. - Robotic Electronic Person Trained for Infiltration and Logical Exploration (off-line,only e-mail)

Awatar użytkownika
nufnuf
Stały bywalec
Stały bywalec
Posty: 81
Rejestracja: 23 wrz 2008, 13:09

Nieprzeczytany post autor: nufnuf »

Kod: Zaznacz cały

'res' - variable not defined   \experts\TicksInMySQLx.mq4 (20, 8)
'res' - variable not defined   \experts\TicksInMySQLx.mq4 (22, 7) 
Te błędy masz z powodu braku średnika po wcześniejszej instrukcji.

Masz też błąd w strukturze bazy:

Kod: Zaznacz cały

CREATE TABLE IF NOT EXISTS `ticksinmysql` (
  `id` int(10) unsigned NOT NULL AUTO_INCREMENT,
  `margin` varchar(45) NOT NULL,
  `freemargin` varchar(45) NOT NULL,
  `date` datetime NOT NULL,
  `Ask` varchar(45) NOT NULL,
  `Bid` varchar(45) NOT NULL,
  `symbol` varchar(45) NOT NULL,
  `equity` varchar(45) NOT NULL,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=latin1 AUTO_INCREMENT=1 ;
Jeśli zapisujemy liczby typu double, takie jak Ask, Equity czy Open, używamy typu DOUBLE a nie typu tekstowego VARCHAR.

Dla zapisu i analizy danych, lepiej jest zamiast "ENGINE=InnoDB" wybrać "ENGINE=MyISAM", bo szybciej działa.

Awatar użytkownika
reptile
Maniak
Maniak
Posty: 2799
Rejestracja: 13 gru 2008, 13:48

Nieprzeczytany post autor: reptile »

Mam baze mysql ściągam dane kolumny:

id;data+time ;unixtime(nieużywana); 3 znaki waluty; nazwa

10838 rekordów

rysuje linie poziome (wszystkie) dla daty

No i mam śmieci na liście obiektów tzn.. obiekty jakby nie związane z baza .. na liście występują jako krzaczki itp.. część obiektów ma time unxia początkowy (obiektu nie widać)
Czy to normalne przy takiej ilości rekordów i danych czy tez błąd z powodu dużej ilości transferowanych danych? Może ktoś już podobny problem przechodził?
R.E.P.T.I.L.E. - Robotic Electronic Person Trained for Infiltration and Logical Exploration (off-line,only e-mail)

Awatar użytkownika
reptile
Maniak
Maniak
Posty: 2799
Rejestracja: 13 gru 2008, 13:48

Nieprzeczytany post autor: reptile »

Problem, który opisałem wyżej i tutaj

to problem jakiegoś błędu w bibliotece libmysql.dll
- zapisy są poprawne, odczyt często przekazuje śmieci (potwierdzone, również przez innych)
- jest jakiś problem z mysql_num_rows(result) i chyba kodowaniem lub dekodowaniem
- jest też słaba obsługa nietypowych błędów co już było tutaj wspominane

Czy ktoś ma jakieś inne sprawdzone biblioteki lub wraper ?
Bo w nowej wersji mt4 to już w ogóle problem..
http://www.forex.nawigator.biz/dyskusje ... 778#290778
R.E.P.T.I.L.E. - Robotic Electronic Person Trained for Infiltration and Logical Exploration (off-line,only e-mail)

ODPOWIEDZ