jak wysłać screenshot z Mt4 na email

O jezykach programowania w platformach i nie tylko.
pim
Gaduła
Gaduła
Posty: 97
Rejestracja: 19 lut 2015, 09:52

jak wysłać screenshot z Mt4 na email

Nieprzeczytany post autor: pim »

Hej.

Czy zna ktoś rozwiązanie jak wysłać screenshot z wykresu MT4 na email z poziomu MQLa ?


Kod do robienia screenshotów mam gotowy, obrazki zapisują się w wybranym przez mnie katalogu ale jak spowodować żeby wraz z funkcją SendMail wysłać załącznik ?

Czy potrzebne jest jakieś inne zewnętrzne rozwiązanie ? Rzecz w tym że chcę aby wraz załącznikiem przesłany był konkretny opis wzięty z MQLa.

Awatar użytkownika
Pablo90
Pasjonat
Pasjonat
Posty: 1215
Rejestracja: 10 cze 2007, 15:36

Re: jak wysłać screenshot z Mt4 na email

Nieprzeczytany post autor: Pablo90 »

Niestety nie da się za pomocą funkcji wysyłania maila, tu masz przykładowe rozwiązania: https://forum.mql4.com/30152

pim
Gaduła
Gaduła
Posty: 97
Rejestracja: 19 lut 2015, 09:52

Re: jak wysłać screenshot z Mt4 na email

Nieprzeczytany post autor: pim »

Hej.

W końcu wydumałem rozwiązanie, dzięki Pablo90 za info o blat.exe

Opiszę uproszczone rozwiązanie bo ja mam tak że przenoszę jeszcze pliki po za foldery MT4 (funkcją MoveFileW() )


A więc robimy tak...

Po zainstalowaniu blata z parametrem -install dodajemy sobie nasz serwer smtp oraz port na jakim dziala a także ilośc prób wysyłki.


Tak inicjuje sobie nazwę sreenshota (zeby kazdy byl niepowtarzalny)

Kod: Zaznacz cały

string sym = Symbol();
   int symlen = StringLen(sym);


   string year=TimeYear(TimeLocal());
   if(StringLen(year)<2) year="0"+year;
   string mon=TimeMonth(TimeLocal());
   if(StringLen(mon)<2) mon="0"+mon;
   string day=TimeDay(TimeLocal());
   if(StringLen(day)<2) day="0"+day;
   string hou=TimeHour(TimeLocal());
   if(StringLen(hou)<2) hou="0"+hou;
      string min=TimeMinute(TimeLocal());
   if(StringLen(min)<2) min="0"+min;
   string sec=TimeSeconds(TimeLocal());
   if(StringLen(sec)<2) sec="0"+sec;

   string file_name,old_file,new_file; 

   file_name=sym+"_"+per+"_"+year+"-"+mon+"-"+day+"_"+hou+"-"+min+"-"+sec+".gif";
pod zmienną file_name mam nazwę pliku .gif


Tak robimy screenshota o okrślonej nazwie

Kod: Zaznacz cały

 WindowScreenShot(file_name,240,200,12,4,-1);
gdzie 240,200 rozmiar obrqzka, 12 ilosc swieczek, 4 zoom


Tak inicjujemy sobie subject wysyłanego maila oraz tekst jaki ma się wysyłać

Kod: Zaznacz cały

 string subject = ("TEST ONLY " + dzien + "  " + Symbol() + " BUY "  + "   " + per + "  Time:  " + (TimeToStr(TimeLocal(),TIME_DATE)) + "    "  +(TimeToStr(TimeLocal(),TIME_SECONDS))  );
			        string text = (Symbol() +  " BUY fractal  ,  "  + per + "   Time:  " + (TimeToStr(TimeLocal(),TIME_DATE)) + "    "  +(TimeToStr(TimeLocal(),TIME_SECONDS))  );

Potem inicjuje nazwę pliku html jaki chcę aby został wysłany oraz jego zawartość "body" - tu wkładany jest tekst wiadomości oraz nasz plik .gif

Kod: Zaznacz cały

string name = sym+"_"+per+"_"+year+"-"+mon+"-"+day+"_"+hou+"-"+min+"-"+sec+".html";

string body =  "<html><body><head><title>" + "</title></head>" + text +  "<p> <img src=\"cid:" + file_name + "\"> "+     "</body></html>";

potem zapisujemy calość "body" do naszego pliku .html

Kod: Zaznacz cały

int handle=FileOpen(name, FILE_CSV|FILE_WRITE, ';');
 // if(handle>0)
    {
    Print ("handle= " + handle);
    Print (TerminalInfoString(TERMINAL_DATA_PATH));
    Print ("name= " + name);
     FileWrite(handle, body);
     FileClose(handle);
inicjujemy opcje z jakimi zostanie wywołane polecenie "blat.exe" , definujemy co wysylalmy, do kogo , temat oraz zalaczaly nasz obrazek .gif

Kod: Zaznacz cały

string opcje = "C:\\Forex\\Blat\\" + name + " /html" + " /u ktos@mail.com /pw haslo_do_naszego_SMTP /to dokogos@mail.com ,jesczektos@mail.pl,i_jeszcze_jeden_ktos@mail.us  /i nazwa_widoczna_jako_wysylajacy  /subject \"" + subject + "\""   +  " /embed " + file_name ;
I na koncu coś co zajęło mi najwięcej czasu bo koniecznie chciałem aby plik graficzny był załadowany w srodku wiadomosci html

Kod: Zaznacz cały

ShellExecuteW(0, "Open", "cmd.exe","/C C:\\cos\\gdzies\\wkatalogu\\waszym\\blat.exe " + opcje,"", 9);
jak w powyższym zamienimy /C na /K to okno cmd.exe nam pozostanie i bedziemy mogli sprawdzic czy wszystko dziala poprawnie

ufff... udało się:-)

oczywiście kod jest trochę chaotyczny ale tak na szybko pisze więc można sobie dopasować co się chce...

W ten sposób omijamy funkcję SendMail z MT4 i wysyłamy sobie co chcemy jak chcemy i załączamy co chcemy :-)


składnia blat
http://www.blat.net/syntax/syntax.html

ODPOWIEDZ