System z użyciem bazy danych

O jezykach programowania w platformach i nie tylko.
Alkar
Stały bywalec
Stały bywalec
Posty: 31
Rejestracja: 12 lut 2007, 17:21

Nieprzeczytany post autor: Alkar »

necro pisze:Czy myśleliście o bazie w której znajdowały by sie informacje dotyczące danych makro (wprowadzane przez interfejs www), wraz z ich prognozom i "zasięgiem",dane mogły by być nanoszone
na wykres za pomocą skryptu w mql ?
Takie dane są łatwo dostępne na ForexFactory w xml-u,korzystam z nich w swoim skrypcie.
W tym wskaźniku jest wyświetlanie najbliższego ogłoszenia :
Nie masz wymaganych uprawnień, aby zobaczyć pliki załączone do tego posta.

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

Nieprzeczytany post autor: reptile »

http://www.shmuma.ru/mt4-sqlite.html
* autor projektu COT w mt4

Załóżmy, że mam różne BAZY DANYCH (jak w temacie) mysql czy inne.

Chciałbym teraz robiąc Zapytanie SQL (MySQL) tworzyć własne "indeksy" lub wykresy. Miałby to być jakiś typ Data Deed'u.
Pytanie jak to najlepiej zrobić? Chodzi mi o exportowanie tych danych do mt4 ...w csv? Może ma ktoś lepsze pomysły?
R.E.P.T.I.L.E. - Robotic Electronic Person Trained for Infiltration and Logical Exploration (off-line,only e-mail)

wredniaha
Uczestnik
Uczestnik
Posty: 3
Rejestracja: 08 cze 2009, 13:49

Nieprzeczytany post autor: wredniaha »

Witam!

Jakiś czas temu stwierdziłem że bardzo przydał by mi się logger do MQL - coś na podobieństwo Log4Net, w mniejszej skali oczywiście. Zacząłem od bazy na MySQL, stworzyłem cały komponent w oparciu o MySQL api libmysql.dll. Wszystko niestety działało b. niestabilnie i powoli - po prostu przy zapisie dużej ilości informacji (najczęściej w trakcie backtestów ale także niestety kilkukrotnie na koncie live) libmysql.dll co jakiś czas wyrzucał wyjątek, którego nie da się obsłużyć w MT4 więc całe środowisko się wywalało. Miał też problemy z odnawianiem połączenia do serwera MySQL jeśli te wygasło. Przeryłem cały net, przeanalizowałem sprawę kilkukrotnie i się poddałem.
Podszedłem do problemu inaczej - stworzyłem WCF service oraz do niego klienta w C#, który zapisuje logi do DB, następnie napisałem wrapper w C++ który wywołuje z MT4. Teraz właśnie to testuje i jak na razie testy wychodzą b. dobrze, wszystko działa szybko i stabilnie, baza na MySQL.
Tak więc api MySQL da się użyć ale IMO nie w EA który jest uruchomiony na koncie live na którym też traidujemy.

Dodano po 53 minutach:
reptile pisze:http://www.shmuma.ru/mt4-sqlite.html
* autor projektu COT w mt4

Załóżmy, że mam różne BAZY DANYCH (jak w temacie) mysql czy inne.

Chciałbym teraz robiąc Zapytanie SQL (MySQL) tworzyć własne "indeksy" lub wykresy. Miałby to być jakiś typ Data Deed'u.
Pytanie jak to najlepiej zrobić? Chodzi mi o exportowanie tych danych do mt4 ...w csv? Może ma ktoś lepsze pomysły?
import danych z csv bądź innych źródeł masz opisany tu: http://forum.mql4.com/8618.

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

Nieprzeczytany post autor: reptile »

Kod: Zaznacz cały

2010.06.16 21:57:33	TicksInMySQL EURUSD,M30: cannot load library 'libmysql.dll' (error 126)
taki log z mt4 experts
http://forum.mql4.com/6744

podpowiedz nic mi nie mówi ... walczył już ktoś z tym problemem?

EDIT: odpowiedz w AD.1



kod:

Kod: Zaznacz cały

//+------------------------------------------------------------------+
//|                                                 TicksInMySQL.mq4 |
//|                      Copyright © 2006, MetaQuotes Software Corp. |
//|                                        http://www.metaquotes.net |
//+------------------------------------------------------------------+
#property copyright "Copyright © 2006, MetaQuotes Software Corp."
#property link      "http://www.metaquotes.net"

#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
int mysql;
//+------------------------------------------------------------------+
//| expert initialization function                                   |
//+------------------------------------------------------------------+
int init()
  {
   mysql = mysql_init(mysql);
   if(mysql != 0) 
       Print("allocated");
   string host = "localhost";
   string user = "user";
   string password = "pwd";
   string DB = "mt4";
   int clientflag = 0;
   int port = 3306;
   string socket = "";
   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 ticks(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);
  }
//+------------------------------------------------------------------+


Dodano po 23 godzinach 12 minutach:


AD.1
fryk pisze:A wiec aby moc korzystac z dobrodziejstw bazy danych MySQL nalezy zainstalowac i uruchomic serwer np lokalnie (mysql.com). Nastepnie skopiowac biblioteke "libmysql.dll" z katalogu MYSQL/bin/ do MT4/experts/include.
MT4/experts/libraries - przynajmniej u mnie wtedy coś się dzieje

Kod: Zaznacz cały

21:57:27 TicksInMySQL EURUSD,M30: cannot load library 'libmysql.dll' (error 126)
ale dalej jakaś masakra ..

Kod: Zaznacz cały

21:57:27 TicksInMySQL EURUSD,M30: expert stopped
21:57:27 TicksInMySQL EURUSD,M30: initialized
23:52:28 TicksInMySQL EURUSD,M30: shutdown by timeout
23:52:28 TicksInMySQL EURUSD,M30: terminated by timeout
23:52:31 TicksInMySQL EURUSD,H1: function 'mysql_init' call from dll 'libmysql.dll' not confirmed
23:52:31 TicksInMySQL EURUSD,H1: expert stopped
23:52:31 TicksInMySQL EURUSD,H1: initialized
23:52:33 TicksInMySQL EURUSD,H1: shutdown by timeout
23:52:42 TicksInMySQL EURUSD,H1: terminated by timeout
23:52:44 TicksInMySQL EURUSD,M30: allocated
23:52:49 TicksInMySQL EURUSD,M30: error=61621128 1045 
23:52:49 TicksInMySQL EURUSD,M30: initialized
23:53:12 TicksInMySQL EURUSD,M30: shutdown by timeout
23:53:12 TicksInMySQL EURUSD,M30: terminated by timeout
23:53:12 TicksInMySQL EURUSD,H1: allocated
23:53:12 TicksInMySQL EURUSD,H1: error=61621128 1045 
23:53:12 TicksInMySQL EURUSD,H1: initialized
23:53:15 TicksInMySQL EURUSD,H1: error=2006
23:53:50 TicksInMySQL EURUSD,H1: error=2006
23:54:02 Compiling 'TicksInMySQL'
23:54:02 TicksInMySQL EURUSD,H1: terminated by timeout
23:54:13 TicksInMySQL EURUSD,H1: function 'mysql_close' call from dll 'libmysql.dll' not confirmed
23:54:13 TicksInMySQL EURUSD,H1: expert stopped
23:54:13 TicksInMySQL EURUSD,H1: deinitialized
23:54:13 TicksInMySQL EURUSD,H1: uninit reason 3
23:54:29 TicksInMySQL EURUSD,H4: allocated
23:54:29 TicksInMySQL EURUSD,H4: error=61621128 1045 
23:54:29 TicksInMySQL EURUSD,H4: initialized
23:54:31 TicksInMySQL EURUSD,H4: error=2006
23:54:34 TicksInMySQL EURUSD,H4: shutdown by timeout
23:54:43 TicksInMySQL EURUSD,H4: terminated by timeout
23:54:46 TicksInMySQL EURUSD,H1: allocated
23:54:46 TicksInMySQL EURUSD,H1: error=61621128 1045 
23:54:46 TicksInMySQL EURUSD,H1: initialized
23:58:50 TicksInMySQL EURUSD,H1: deinitialized
23:58:50 TicksInMySQL EURUSD,H1: uninit reason 2
23:58:50 TicksInMySQL EURUSD,H1: loaded successfully
23:58:51 TicksInMySQL EURUSD,H1: allocated
23:59:04 TicksInMySQL EURUSD,H1: error=96708080 1045 
23:59:04 TicksInMySQL EURUSD,H1: initialized
23:59:04 TicksInMySQL EURUSD,H1: error=2006
23:59:14 TicksInMySQL EURUSD,H1: error=2006
23:59:18 TicksInMySQL EURUSD,H1: error=2006
23:59:20 TicksInMySQL EURUSD,H1: error=2006
wredniaha pisze:Miał też problemy z odnawianiem połączenia do serwera MySQL jeśli te wygasło. Przeryłem cały net, przeanalizowałem sprawę kilkukrotnie i się poddałem.
mt4 się często sypie ... okienko z listą .dll :(

Chyba biblioteka trochę mało przyjazna .. używa jej ktoś bez problemów?
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 »

Brak mi czasu na pisanie na forum, ale widzę że ciekawy temat.
Niechcący zahaczamy tutaj o tzw. dll-hell, wynaleziony przez Microsoft w 1992.
Lista dodatkowych plików, których potrzebuje libmysql.dll:
  • msvcrt.dll
    advapi32.dll
    ntdll.dll
    rpcrt4.dll
    ws2_32.dll
    ws2help.dll
    wsock32.dll
Znajdź je i wrzuć do katalogu (wraz z libmysql.dll):
[MT4]\experts\libraries\

Nie załączam tych plików, bo nie jestem w stanie ustalić legalności ich rozpowszechniania, gdyż czytając licencje Microsoftu, po pierwszych zdaniach robi mi sie niedobrze.
Zwykle zakładam, że w przypadku Microsoftu nic nie jest legalne, oprócz kupowania ich wytworów i nalepiania ich nalepek.

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

Nieprzeczytany post autor: green7 »

reptile pisze:Lista dodatkowych plików, których potrzebuje libmysql.dll:
Wszystkie biblioteki jakie wymieniasz są w systemie, nie ma konieczności więc ich doinstalowywania (no może ewentualnie brakować czasem msvcrt.dll - ale raczej na 90% jest).

Tutaj bardziej problem jest chyba z brakiem instalacji serwera mysql lub brakiem biblioteki libmysql (należałoby by sprawdzić czy takowa znajduje się w katalogu windows\system32 lub w katalogu Experts\libraries terminala). Ewentualnie problemy może jeszcze sprawiać zgodność definicji w dll'u z nagłówkami w mqlu (być może zmieniono parametry wywołania dla jakieś funkcji w nowszych wersjach mysql'a).
Green
Obrazek
Obrazek

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

Mt4, Mql4 - baza danych mysql

Nieprzeczytany post autor: reptile »

green7 pisze:Tutaj bardziej problem jest chyba z brakiem instalacji serwera mysql lub brakiem biblioteki libmysql (należałoby by sprawdzić czy takowa znajduje się w katalogu windows\system32 lub w katalogu Experts\libraries terminala)
Odczyt z mysql'a mi działa (już kiedyś z tym robiłem) i mt4 pobiera mi z bazy co chce ale zapis się nie do niej nie udaje (wtedy nie było potrzeby).. mt4 od razu robi "crash" po uruchomieniu EA :evil:
nufnuf pisze:Lista dodatkowych plików, których potrzebuje libmysql.dll:

msvcrt.dll
advapi32.dll
ntdll.dll
rpcrt4.dll
ws2_32.dll
ws2help.dll
wsock32.dll

Znajdź je i wrzuć do katalogu (wraz z libmysql.dll):
[MT4]\experts\libraries\
sprawdzę, jeszcze z tym ...

nufnuf pisze:Zwykle zakładam, że w przypadku Microsoftu nic nie jest legalne, oprócz kupowania ich wytworów i nalepiania ich nalepek.
kombinuje z instalacją MS SQL (2008 R2 - ale też coś pod górkę mi idzie z samą instalacją :| )
Może inna biblioteka prościej by rozwiązała problem.
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 »

Green7, nie ma co teoretyzować, problem jest z gatunku podstawowych - zwykły brak dll'a. Reptile musi tylko dojść którego brakuje.
reptile pisze:kombinuje z instalacją MS SQL
MySql jest lepszy, bo pozwala użyć silnika beztransakcyjnego, co bardzo przyspiesza działanie.
Do celów gromadzenia danych i analizy transakcyjność jest zbędna.

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

mysql <> mql4

Nieprzeczytany post autor: reptile »

green7 pisze:Wszystkie biblioteki jakie wymieniasz są w systemie, nie ma konieczności więc ich doinstalowywania (no może ewentualnie brakować czasem msvcrt.dll - ale raczej na 90% jest).
Skopiowałem ten plik i mt4 przestał się "sypać" ale usunąłem go i też się już nie sypie (nie wiem czemu) :mrgreen:
Ale mam już nowe logi do wyżej wklejonego kodu, jakiś postęp jest..

Kod: Zaznacz cały

2010.06.20 17:39:27	TicksInMySQL2 EURUSD,H4: error=77199696 1049 
2010.06.20 17:39:27	TicksInMySQL2 EURUSD,H4: allocated
2010.06.20 17:39:27	TicksInMySQL2 EURUSD,H1: uninit reason 3
2010.06.20 17:39:27	TicksInMySQL2 EURUSD,H1: deinitialized
2010.06.20 17:39:24	TicksInMySQL2 EURUSD,H1: initialized
2010.06.20 17:39:24	TicksInMySQL2 EURUSD,H1: error=77199696 1049 
2010.06.20 17:39:24	TicksInMySQL2 EURUSD,H1: allocated
2010.06.20 17:39:24	TicksInMySQL EURUSD,H1: removed
2010.06.20 17:39:24	TicksInMySQL EURUSD,H1: uninit reason 1
2010.06.20 17:39:24	TicksInMySQL EURUSD,H1: deinitialized
2010.06.20 17:39:23	TicksInMySQL2 EURUSD,H1: loaded successfully

Dalej..

W bazie forex mam tabelę TicksInMySQL, czyli deklaruję takie coś ... a może inaczej?

Kod: Zaznacz cały

string table= "TicksInMySQL";

Kod: Zaznacz cały

#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
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 ticks(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);
  }
Jak przerobiony powinien być kod mql dla query żeby insert mógł być prawidłowo zrealizowany dla wskazanej tabeli?

Kod: Zaznacz cały

-- phpMyAdmin SQL Dump
-- version 3.2.4
-- http://www.phpmyadmin.net
--
-- Host: localhost
-- Czas wygenerowania: 20 Cze 2010, 18:37
-- Wersja serwera: 5.1.41
-- Wersja PHP: 5.3.1

SET SQL_MODE="NO_AUTO_VALUE_ON_ZERO";

--
-- Baza danych: `forex`
--

-- --------------------------------------------------------

--
-- Struktura tabeli dla  `ticksinmysql`
--

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 ;

--
-- Zrzut danych tabeli `ticksinmysql`
--

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)

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

Nieprzeczytany post autor: green7 »

W bazie masz tabelę o nazwie ticksinmysql natomiast w kodzie używasz tabeli ticks.
Powinieneś zmienić nazwę tabeli w mysql'u na ticks.
Green
Obrazek
Obrazek

ODPOWIEDZ