Dane z MT4 do programu w C++ w czasie rzeczywistym

O jezykach programowania w platformach i nie tylko.
lordmonkey
Bywalec
Bywalec
Posty: 7
Rejestracja: 07 mar 2011, 02:31

Dane z MT4 do programu w C++ w czasie rzeczywistym

Nieprzeczytany post autor: lordmonkey »

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 ?

dulf
Pasjonat
Pasjonat
Posty: 399
Rejestracja: 24 kwie 2010, 15:13

Nieprzeczytany post autor: dulf »

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 .
Nie spiesz się , zawsze zdążysz stracić .

lordmonkey
Bywalec
Bywalec
Posty: 7
Rejestracja: 07 mar 2011, 02:31

Nieprzeczytany post autor: lordmonkey »

dzięki za odpowiedź.

nie rozumiem tego kodu, czy to jest w ogóle kod C++ czy przypadkiem to jest kod do MT4? (przepraszam jeżeli to pytanie zabrzmi głupio )
Czy ktoś ma jakieś inne propozycje ?

Awatar użytkownika
Pierz Andrzej
Przyjaciel Forum
Przyjaciel Forum
Posty: 1200
Rejestracja: 02 lip 2006, 14:17

Nieprzeczytany post autor: Pierz Andrzej »

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
z poważaniem
Andrzej Pierz
FOREX-SERVICE

lordmonkey
Bywalec
Bywalec
Posty: 7
Rejestracja: 07 mar 2011, 02:31

Nieprzeczytany post autor: lordmonkey »

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 ?

Awatar użytkownika
Pierz Andrzej
Przyjaciel Forum
Przyjaciel Forum
Posty: 1200
Rejestracja: 02 lip 2006, 14:17

Nieprzeczytany post autor: Pierz Andrzej »

tak w MetaEditorze cza napisac Program ktory bedzie wysylal interesujace Cie dane do Twojej aplikacji czy to za posrednictwem biblioteki czy bezposrednio z kodu mql...
i tak podczas komunikacji bedzie musial byc uruchomiony terminal MT4

pzdr Andrzej
z poważaniem
Andrzej Pierz
FOREX-SERVICE

lordmonkey
Bywalec
Bywalec
Posty: 7
Rejestracja: 07 mar 2011, 02:31

Nieprzeczytany post autor: lordmonkey »

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

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);
}
demo.mqh

Kod: Zaznacz cały

#import "demo.dll"
   void Hello(string say);
#import
demo.mq4

Kod: Zaznacz cały

#include <demo.mqh>

int start()
  {
   Hello ("Hello World!");
   return(0);
  }
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++ ?? )

dulf
Pasjonat
Pasjonat
Posty: 399
Rejestracja: 24 kwie 2010, 15:13

Nieprzeczytany post autor: dulf »

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 :

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ć .

Awatar użytkownika
Blackhole
Stały bywalec
Stały bywalec
Posty: 86
Rejestracja: 30 lis 2007, 08:06

Nieprzeczytany post autor: Blackhole »

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.
"W Bogu wszelkie nasze bogactwo."

lordmonkey
Bywalec
Bywalec
Posty: 7
Rejestracja: 07 mar 2011, 02:31

Nieprzeczytany post autor: lordmonkey »

@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

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

ODPOWIEDZ