Dane z MT4 do programu w C++ w czasie rzeczywistym
-
- Bywalec
- Posty: 7
- Rejestracja: 07 mar 2011, 02:31
Dane z MT4 do programu w C++ w czasie rzeczywistym
witam,
mam pewien problem : mam do napisania program który będzie pobierał dane z serwera ( np . MT4 ) i później je odpowiednio przerabiał itp. Napisałem już sobie wersje która pobiera dane z pliku .csv, ale nie mam pojęcia jak się zabrać za tą z pobieraniem danych w czasie rzeczywistym.
Jakieś wskazówki ?
mam pewien problem : mam do napisania program który będzie pobierał dane z serwera ( np . MT4 ) i później je odpowiednio przerabiał itp. Napisałem już sobie wersje która pobiera dane z pliku .csv, ale nie mam pojęcia jak się zabrać za tą z pobieraniem danych w czasie rzeczywistym.
Jakieś wskazówki ?
http://www.forexfactory.com/showthread.php?t=125117
Osobiście preferuję ładowanie .dll do kodu MQL i pliki mapowane w pamięci które tworzą wspólny bufor dla aplikacji i MT4 .
Spotkałem też rozwiązanie z socket -ami .
Osobiście preferuję ładowanie .dll do kodu MQL i pliki mapowane w pamięci które tworzą wspólny bufor dla aplikacji i MT4 .
Spotkałem też rozwiązanie z socket -ami .
Nie spiesz się , zawsze zdążysz stracić .
-
- Bywalec
- Posty: 7
- Rejestracja: 07 mar 2011, 02:31
- Pierz Andrzej
- Przyjaciel Forum
- Posty: 1200
- Rejestracja: 02 lip 2006, 14:17
napisane jest to w MQL4 .....
ale jezeli piszesz w C++ czy C# to nie powinienes miec wiekszych problemow z przelozeniem tego kodu
w pierszej czesci masz jakich funkcji bedziesz uzywal z biblioteki kernel32
kilka zmiennych i definicji
pozniej zainicjowanie polaczenia
a na koncu dwie funkcje zapisujaca i odczytujaca do utworzonego polacznia
........
jezeli chcesz miec komunikacje miedzy swoja aplikacja a MT4 .
to niestety musisz napisac cos w MQL4
co tej komunikacji pomoze ....
bezposrednio z serwerem MT4 sie nie polaczysz ... a jak juz sie polaczysz to napewno nie zrobisz tego legalnie i nie bedzie to proste ....
jak mi to wytlumaczyl jeden z kolegow programistow bedzie to baaardzo kosztowne i wymagalo nie lada umiejetnosci programistycznych .... cza bedzie rozpracowac protokol mt4
a jak uslyszalem od kolejnego programisty to nawet jak juz rozpracujesz ten protokol to nie bedziesz mial gwarancji ze pochodzi Ci jeden dzien czy dluzej
pzdr Andrzej
ale jezeli piszesz w C++ czy C# to nie powinienes miec wiekszych problemow z przelozeniem tego kodu

w pierszej czesci masz jakich funkcji bedziesz uzywal z biblioteki kernel32
kilka zmiennych i definicji
pozniej zainicjowanie polaczenia
a na koncu dwie funkcje zapisujaca i odczytujaca do utworzonego polacznia

........
jezeli chcesz miec komunikacje miedzy swoja aplikacja a MT4 .
to niestety musisz napisac cos w MQL4

bezposrednio z serwerem MT4 sie nie polaczysz ... a jak juz sie polaczysz to napewno nie zrobisz tego legalnie i nie bedzie to proste ....
jak mi to wytlumaczyl jeden z kolegow programistow bedzie to baaardzo kosztowne i wymagalo nie lada umiejetnosci programistycznych .... cza bedzie rozpracowac protokol mt4
a jak uslyszalem od kolejnego programisty to nawet jak juz rozpracujesz ten protokol to nie bedziesz mial gwarancji ze pochodzi Ci jeden dzien czy dluzej

pzdr Andrzej
z poważaniem
Andrzej Pierz
FOREX-SERVICE
Andrzej Pierz
FOREX-SERVICE
-
- Bywalec
- Posty: 7
- Rejestracja: 07 mar 2011, 02:31
ok, dzięki za odpowiedź.
żeby wszystko było jasne, bo nie za bardzo się orientuję w tym temacie - jeżeli już będę pisał w MQL4 to mam to pisać w tym MetaEditorze który jest w pakiecie z MT4 tak ?
i potem ten program odpalam razem z MT4 i mój program w C++ będzie wymagał tego żeby MT4 był uruchomiony ?
żeby wszystko było jasne, bo nie za bardzo się orientuję w tym temacie - jeżeli już będę pisał w MQL4 to mam to pisać w tym MetaEditorze który jest w pakiecie z MT4 tak ?
i potem ten program odpalam razem z MT4 i mój program w C++ będzie wymagał tego żeby MT4 był uruchomiony ?
- Pierz Andrzej
- Przyjaciel Forum
- Posty: 1200
- Rejestracja: 02 lip 2006, 14:17
-
- Bywalec
- Posty: 7
- Rejestracja: 07 mar 2011, 02:31
ok powracam z niewielką (ale zawsze) wiedzą :
napisałem coś takiego na podstawie tych tutoriali
http://www.metatrader.info/node/152
http://www.metatrader.info/node/150
, ale nie chce mi to działać tzn nic się nie dzieje.
stowrzyłem taką małą dll- kę w Visual express c++ 2010
demo.cpp
demo.mqh
demo.mq4
jakieś sugestie ?
nie wiem czy w ogóle dobrze się staram, bo chciałbym, żeby mql przy wykryciu nowej wartości (nie ticku tylko wartości ale to już mam gotowe) wysyłał zestaw wartości (open,low,high, close) do dll (c++ ?? )
napisałem coś takiego na podstawie tych tutoriali
http://www.metatrader.info/node/152
http://www.metatrader.info/node/150
, ale nie chce mi to działać tzn nic się nie dzieje.
stowrzyłem taką małą dll- kę w Visual express c++ 2010
demo.cpp
Kod: Zaznacz cały
#include "stdafx.h"
//#include "demo.h"
#define MT4_EXPFUNC __declspec(dllexport)
#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif
//CDemoApp theApp;
MT4_EXPFUNC void __stdcall Hello(char* say)
{
MessageBoxA(NULL, say, "demo",NULL);
}
Kod: Zaznacz cały
#import "demo.dll"
void Hello(string say);
#import
Kod: Zaznacz cały
#include <demo.mqh>
int start()
{
Hello ("Hello World!");
return(0);
}
nie wiem czy w ogóle dobrze się staram, bo chciałbym, żeby mql przy wykryciu nowej wartości (nie ticku tylko wartości ale to już mam gotowe) wysyłał zestaw wartości (open,low,high, close) do dll (c++ ?? )
Jak wrzucasz strategię na wykres musisz zezwolić jej na używanie funkcji zawartych w .dll .
Opcja znajduje się w zakładce Ogólne
Zabezpieczenie ->Umożliw Import DLL
Lub w głównym menu Narzędzia ->Opcje->Strategie .
Jeśli tego nie zrobisz , kod będzie się wykonywał ale zignoruje funkcje .dll .
Biblioteka powinna znajdować się w katalogu Experts\libraries instalacji MT4
Plik 'demo.mqh' w katalogu Experts\include instalacji MT4
lub możesz go wkleić bezpośrednio do EA :
Opcja znajduje się w zakładce Ogólne

Lub w głównym menu Narzędzia ->Opcje->Strategie .
Jeśli tego nie zrobisz , kod będzie się wykonywał ale zignoruje funkcje .dll .
Biblioteka powinna znajdować się w katalogu Experts\libraries instalacji MT4
Plik 'demo.mqh' w katalogu Experts\include instalacji MT4
lub możesz go wkleić bezpośrednio do EA :
Kod: Zaznacz cały
#import "demo.dll"
void Hello(string say);
#import
int start()
{
Hello ("Hello World!");
return(0);
}
Nie spiesz się , zawsze zdążysz stracić .
Ja zrobiłem sobie tak, przy każdej nowej świeczce zapisuję z MT4 jakieś dane do pliku tekstowego. Cały czas mam w tle uruchomiony mój program w C/C++, który sprawdza (co 1/3 sekundy), czy zmieniła się zawartość tego pliku testowego. Jeśli tak, to przetwarza dane z niego i wrzuca wynik do innego pliku. Strategia w MT4 przy każdym ticku sprawdza ten plik z wynikiem z programu i reaguje odpowiednio.
Nie korzystam z żadnych bibliotek, bo jeszcze nie jestem chyba na tyle biegły w tych kwestiach.
Nie korzystam z żadnych bibliotek, bo jeszcze nie jestem chyba na tyle biegły w tych kwestiach.
"W Bogu wszelkie nasze bogactwo."
-
- Bywalec
- Posty: 7
- Rejestracja: 07 mar 2011, 02:31
@Blackhole
Czy mógłbyś zarzucić tutaj kodem który będzie wykonywał moją funkcję exportującą ( tak jak napisałeś ) co określony czas ? ( i przy okazji żeby sprawdzał ostatnią świeczkę )
nie potrafię jakoś tego znaleźć
jeżeli komuś miało by to pomóc to tu wrzucam kod który exportuje dane do pliku .csv
Czy mógłbyś zarzucić tutaj kodem który będzie wykonywał moją funkcję exportującą ( tak jak napisałeś ) co określony czas ? ( i przy okazji żeby sprawdzał ostatnią świeczkę )
nie potrafię jakoś tego znaleźć

jeżeli komuś miało by to pomóc to tu wrzucam kod który exportuje dane do pliku .csv
Kod: Zaznacz cały
//+------------------------------------------------------------------+
//| RSI_to_File.mq4 |
//| Copyright © 2007, MetaQuotes Software Corp. |
//| http://www.metaquotes.ru/ |
//+------------------------------------------------------------------+
#property copyright "Copyright © 2007, MetaQuotes Software Corp."
#property link "http://www.metaquotes.ru/"
#property show_inputs
//string SymbolsArray[13]={"","USDCHF","GBPUSD","EURUSD","USDJPY","AUDUSD","USDCAD","EURGBP","EURAUD","EURCHF","EURJPY","GBPJPY","GBPCHF"};
string SymbolsArray[2]={"","EURGBP"};
//+------------------------------------------------------------------+
//| string SymbolByNumber |
//+------------------------------------------------------------------+
string GetSymbolString(int Number)
{
//----
string res="";
res=SymbolsArray[Number];
//----
return(res);
}
//+------------------------------------------------------------------+
//+------------------------------------------------------------------+
int PeriodNumber(int number)
{
int per_min;
switch (number)
{
case 0: per_min=PERIOD_M1;break;
case 1: per_min=PERIOD_M5;break;
case 2: per_min=PERIOD_M15;break;
case 3: per_min=PERIOD_M30;break;
case 4: per_min=PERIOD_H1;break;
case 5: per_min=PERIOD_H4;break;
default: per_min=PERIOD_D1;break;
}
return(per_min);
}
//+------------------------------------------------------------------+
//+------------------------------------------------------------------+
void RSI_output(string SymbolName,int PeriodMinutes)
{
int size=iBars(SymbolName,PeriodMinutes);
//----
if (size==0) return;
int handle=FileOpen(SymbolName+PeriodMinutes+"_RSI.csv",FILE_WRITE|FILE_CSV);
if (handle<0) return;
FileWrite(handle,"Time seconds;Time;Open;Low;High;Close;Volume;RSI");
for (int i=size-1;i>=0;i--)
{
FileWrite(handle,iTime(SymbolName,PeriodMinutes,i),TimeToStr(iTime(SymbolName,PeriodMinutes,i))
,iOpen(SymbolName,PeriodMinutes,i),iLow(SymbolName,PeriodMinutes,i),iHigh(SymbolName,PeriodMinutes,i)
,iClose(SymbolName,PeriodMinutes,i),iVolume(SymbolName,PeriodMinutes,i),iCustom(SymbolName,PeriodMinutes,"RSI",0,i));
}
FileClose(handle);
//----
return;
}
//+------------------------------------------------------------------+
//| script program start function |
//+------------------------------------------------------------------+
int start()
{
int SymbolCounter,PeriodCounter;
//----
for (SymbolCounter=1;SymbolCounter<3;SymbolCounter++)
{
for (PeriodCounter=0;PeriodCounter<=6;PeriodCounter++)
{
//Print("NewBar on ",GetSymbolString(SymbolCounter),PeriodNumber(PeriodCounter),"M");
RSI_output(GetSymbolString(SymbolCounter),PeriodNumber(PeriodCounter));
}
}
//----
return(0);
}
//+------------------------------------------------------------------+