Jump to content


Photo
- - - - -

Free Pascal


Wichtiger Hinweis für Besucher der Community!

Das Erstellungsdatum des von Dir aufgerufenen Themas liegt bereits einige Zeit zurück. Wir möchten darauf hinweisen, den Inhalt der Diskussion auf seine Aktualität hin zu prüfen. Weitere Informationen findest Du auf dieser Seite.

  • Please log in to reply
59 replies to this topic

#1 mtbf40

mtbf40

    Floor Broker

  • Addict
  • PipPipPipPipPipPip
  • 256 posts
  • 1493 thanks
  • Wohnsitz:LE

Posted 11 January 2012 - 02:16 PM

Hallo an alle Free-Pascaler,

habe folgendes Problem:
ich möchte eine dll etwickeln die mir alle Trades aus der History in eine GUI schreibt. Mit den Daten möchte ich dann weiterarbeiten.

zu Testzwecken habe ich bis jetzt folgendes:

DLL:
library orderhist;{$mode objfpc}{$H+}uses  Classes  { you can add units after this };type  TOrderHist = array[0..7] of string;// function parameters declared as var will accept pointers.procedure VarsByReference(var oh: TOrderHist) ; stdcall;var  Datei : TextFile;begin  // now let's make some changes to the variables  Assign (Datei, 'C:/Tools/mt4log.log');  ReWrite (Datei);  writeln(Datei,oh[7]);  close(Datei);end;exports  VarsByReference;beginend.

MT4:
//#include <common_functions.mqh>#import "orderhist.dll"   void VarsByReference(string& oh[]);#importint start(){// retrieving info from trade history   int k,i,hstTotal=HistoryTotal();   int HistoryOrderType;    int HistoryOrderTicket;    int HistoryOrderCloseTime;   double HistoryOrderClosePrice;   int HistoryOrderOpenTime;   double HistoryOrderOpenPrice;   double HistoryOrderOpenProfit;   double HistoryOrderOpenStopLoss;	   string HistoryOrder[8];	   for(i=0;i<hstTotal;i++)   {  	if(OrderSelect(i,SELECT_BY_POS,MODE_HISTORY)==false)  	{ 		Print("Access to history failed with error (",GetLastError(),")"); 		break;  	}	HistoryOrder[0]=OrderCloseTime();	HistoryOrder[1]=OrderClosePrice();	HistoryOrder[2]=OrderOpenTime();	HistoryOrder[3]=OrderOpenPrice();	HistoryOrder[4]=OrderProfit();	HistoryOrder[5]=OrderStopLoss();	HistoryOrder[6]=OrderTicket();	HistoryOrder[7]=OrderSymbol();			int count=ArraySize(HistoryOrder);	for(k=0; k<count; k++)	{   		//log("OrderHistoryOutput_"+k,HistoryOrder[k]);   		Print("blabla_"+k);	} 	VarsByReference(HistoryOrder);   }}

Resultat:
die DLL legt zwar die log-Datei an!! schreibt aber nur irgend welche Zeichen rein und blässt die Datei auf 100'erte MB's auf - ich muß dann schleunigst MT4 schließen, sonst legt die mir noch den Server lahm. Das mql-Skript läuft als Script im MT4.

Wer weiß was hier schief läuft??

ProgrammIDE ist Lazarus

Edited by mtbf40, 11 January 2012 - 02:17 PM.

  • 0

Thanked by 7 Members:
whipsaw , RAiNWORM , Kleinerbroker , Henrik , Bull68 , Der Wolf , Vola

#2 Bull68

Bull68

    Floor Broker

  • *_skilled
  • 1,377 posts
  • 8645 thanks

Posted 11 January 2012 - 03:29 PM

Hi,

ich würde mir erstmal "hstTotal" anzeigen lassen, vllt läuft da schon was schief und die Schleife wird zu gross.

Also erstmal schauen, ob die Schleife korrekt arbeitet.

Dann könnte bei der Übergabe des Strings was schief laufen.

Muss man Step bei Step eingrenzen.


  • 0
Wer meint alles sei zu jeder Zeit in den Kursen eingepreist, hat den Laden leider noch nicht verstanden!

Happy Trading - Ralf

Thanked by 7 Members:
whipsaw , RAiNWORM , Kleinerbroker , Der Wolf , Vola , Henrik , ronner

#3 mtbf40

mtbf40

    Floor Broker

  • Addict
  • PipPipPipPipPipPip
  • 256 posts
  • 1493 thanks
  • Wohnsitz:LE

Posted 11 January 2012 - 03:41 PM

Hi,

ich würde mir erstmal "hstTotal" anzeigen lassen, vllt läuft da schon was schief und die Schleife wird zu gross.

Also erstmal schauen, ob die Schleife korrekt arbeitet.

Dann könnte bei der Übergabe des Strings was schief laufen.

Muss man Step bei Step eingrenzen.


die Schleife funktioniert - habe mir das mit dem Logging ausgeben lassen - über <common_functions.mqh>
was ich jetzt gesehen habe ist, die DLL schreibt nur Space-Zeichen (Hex 20)
  • 0

Thanked by 7 Members:
whipsaw , RAiNWORM , Kleinerbroker , Der Wolf , Henrik , ronner , Bull68

#4 Bull68

Bull68

    Floor Broker

  • *_skilled
  • 1,377 posts
  • 8645 thanks

Posted 11 January 2012 - 03:53 PM

OK,

dann schreib in HistoryOrder[7] mal was anderes rein, weil nur der String wird ja in die Datei geschrieben.

HistoryOrder[7] = "Test"
//HistoryOrder[7]=OrderSymbol();

oder sowas, wenn dann nur Leerzeichen drin stehen, stimmt was mit "OrderSymbol()" nicht, bzw mit dem Ticket.

  • 0
Wer meint alles sei zu jeder Zeit in den Kursen eingepreist, hat den Laden leider noch nicht verstanden!

Happy Trading - Ralf

Thanked by 7 Members:
whipsaw , RAiNWORM , Kleinerbroker , Der Wolf , Vola , Henrik , ronner

#5 Der Wolf

Der Wolf

    Floor Broker

  • *_skilled
  • 311 posts
  • 2081 thanks
  • Wohnsitz:Oberfranken

Posted 11 January 2012 - 08:51 PM

Hallo an alle Free-Pascaler,

habe folgendes Problem:
ich möchte eine dll etwickeln die mir alle Trades aus der History in eine GUI schreibt. Mit den Daten möchte ich dann weiterarbeiten.


Bin kein Free-Pascaler.
Hätte evtl. einen anderen Lösungsansatz: erstmal eine .csv-Datei mit Hilfe der MQL-Filefunktionen erzeugen.

Danach manuell die Pascal-DLL aufrufen, die die .csv-Datei einliest.
Erst wenn das klappt dann evtl. Erweitern auf direkten Aufruf der DLL aus dem MQL-Skript.
  • 0
Gruß, Der Wolf

Achtung Ohrwurm: http://www.speculationblues.com/

Thanked by 9 Members:
whipsaw , RAiNWORM , Henrik , WOGO , Bull68 , ronner , mtbf40 , Kleinerbroker , Vola

#6 wh

wh

    Floor Broker

  • *_skilled
  • 555 posts
  • 3767 thanks
  • Wohnsitz:Neubrandenburg

Posted 11 January 2012 - 09:49 PM

Ich bin mal zu faul ne Erklärung zu schreiben.
Ich denke 7bit kann das ein wenig besser.

http://www.forexfact...ad.php?t=219576

Schaue mal nach 32bit und 64bit.
Schaue mal nach passing value by reference.
Value kann in diesem Fall ein Integer, Double, String
bzw. auch ein Array sein.
Schaue auch mal hier: http://www.lazarus.f...p?topic=13607.0 und http://wiki.lazarus...._to_C_Routines.
  • 1
Causality is the relationship between an event (the cause) and a second event (the effect), where the second event is a consequence of the first.

Thanked by 8 Members:
whipsaw , RAiNWORM , Henrik , Vola , Bull68 , Der Wolf , mtbf40 , ronner

#7 mtbf40

mtbf40

    Floor Broker

  • Addict
  • PipPipPipPipPipPip
  • 256 posts
  • 1493 thanks
  • Wohnsitz:LE

Posted 11 January 2012 - 10:21 PM

erst einmal Danke für die Antworten - muß jetzt erst einmal alles sondieren - wo ich wahrscheinlich das Problem sehe ist, das die dll eine 64bit-compillierte ist. Muß jetzt mal die 32bit Version von Lazarus installieren, denn auf meinem Laptop und auf dem MT4 Server laufen jeweils Win7 64bit mit Lazarus 64bit

FALLS jemand eine Lösung "geschrieben" hat - möge er sie nur für sich behalten!! :plorar1::spank:
  • 0

Thanked by 6 Members:
whipsaw , RAiNWORM , ronner , Henrik , Vola , Der Wolf

#8 mtbf40

mtbf40

    Floor Broker

  • Addict
  • PipPipPipPipPipPip
  • 256 posts
  • 1493 thanks
  • Wohnsitz:LE

Posted 13 January 2012 - 10:09 AM

so - habe jetzt Lazarus-Versionen für 32bit und 64bit parallel installiert!
DLL 32bit kompilliert und peng Datei >1GB :schimpf:

was ich bis jetzt herausgefunden habe ist folgendes: die meisten Konstrukte von DLL<-> MT4 laufen so: MT4 ruft Funktion aus DLL auf-> DLL macht was -> gibt Ergebnis zurück an MT4
ich möchte aber dies machen: MT4 ruft Funktion aus DLL auf-> DLL macht was -> schreibt Ergebnisin eine Datei

Ich habe keinen blassen Schimmer warum er nur 0x20 Zeichen reinschießt. :washer:

Habe das ganze mal mit dem Procmon (Sysinternals) verfolgt - da sieht man wie die Zeichen in nano-Sekunden reinschießen. Ich muß dann MT4 schließen um nicht meinen Server lahm zu legen. Ich habe den Eindruck das der MT4 das Skript "hält", obwohl es ja ein Skript ist und nur einmal aufgerufen wird und das wars dann. Denn das Skript wird erst geschlossen, wenn ich MT4 (terminal.exe) schließe - und zwar als letzte Aktion!!!
Würde ja gern mal einen Screenshot zeigen - kann aber nix hochladen Fehler 407
  • 0

Thanked by 6 Members:
whipsaw , RAiNWORM , Der Wolf , ronner , Licens , Vola

#9 Vola

Vola

    Nur noch Pivot Cluster Traderin

  • *_skilled
  • 6,249 posts
  • 36818 thanks
  • Wohnsitz:aktuell in CH

Posted 13 January 2012 - 10:25 AM

Würde ja gern mal einen Screenshot zeigen - kann aber nix hochladen Fehler 407

Da wir uns ja im rechtsfreien Raum bewegen (kein Mod anwesend)
Was für einen Datei Typ willst du hochladen ?

jpeg, PNG usw. geht bei mir einwandfrei.
  • 0

Gruß Vola
Ich zähle lieber bis 4
Alle von mir gemachten Aussagen und Antworten auf Fragen entsprechen lediglich meiner persönlichen Meinung und stellen keinerlei Rechts- und Anlageberatung oder ähnliches dar


Thanked by 5 Members:
whipsaw , RAiNWORM , Der Wolf , ronner , Licens

#10 mtbf40

mtbf40

    Floor Broker

  • Addict
  • PipPipPipPipPipPip
  • 256 posts
  • 1493 thanks
  • Wohnsitz:LE

Posted 13 January 2012 - 10:48 AM

Da wir uns ja im rechtsfreien Raum bewegen (kein Mod anwesend)
Was für einen Datei Typ willst du hochladen ?

jpeg, PNG usw. geht bei mir einwandfrei.


png-File - 299k


mt4_dll.png
Das hochladen dieser Datei wurde übersprungen. (Fehler IO)


Edited by mtbf40, 13 January 2012 - 10:49 AM.

  • 0

Thanked by 6 Members:
whipsaw , RAiNWORM , Der Wolf , ronner , Licens , Vola

#11 Vola

Vola

    Nur noch Pivot Cluster Traderin

  • *_skilled
  • 6,249 posts
  • 36818 thanks
  • Wohnsitz:aktuell in CH

Posted 13 January 2012 - 10:59 AM

Hmm, da müssen andere ran, ich könnte den identischen Dateinamen hochladen.
  • 0

Gruß Vola
Ich zähle lieber bis 4
Alle von mir gemachten Aussagen und Antworten auf Fragen entsprechen lediglich meiner persönlichen Meinung und stellen keinerlei Rechts- und Anlageberatung oder ähnliches dar


Thanked by 5 Members:
whipsaw , RAiNWORM , Der Wolf , ronner , Licens

#12 mtbf40

mtbf40

    Floor Broker

  • Addict
  • PipPipPipPipPipPip
  • 256 posts
  • 1493 thanks
  • Wohnsitz:LE

Posted 13 January 2012 - 11:15 AM

Hmm, da müssen andere ran, ich könnte den identischen Dateinamen hochladen.


bin mal auf einen anderen rechner gegangen...

man beachte den Zeitsprung!! mit Pfeil markiert.. :blackjack:

Attached Files


Edited by mtbf40, 13 January 2012 - 11:16 AM.

  • 0

Thanked by 4 Members:
whipsaw , RAiNWORM , ronner , Vola

#13 wh

wh

    Floor Broker

  • *_skilled
  • 555 posts
  • 3767 thanks
  • Wohnsitz:Neubrandenburg

Posted 13 January 2012 - 11:25 AM

Dez Hex Okt ASCII
32 0x20 040 SP

Code 0x20 (SP) ist das Leerzeichen.
Da geht immer noch etwas schief.
Es gibt zwei Ansätze Daten zws. zwei
unterschiedlichen Systemen zu schaufeln.

Pass By Reference :In Pass by reference address of the variable is passed to a function. Whatever changes made to the formal parameter will affect to the actual parameters- Same memory location is used for both variables.(Formal and Actual)-- it is useful when you required to return more then 1 valuesPass By Value:- In this method value of the variable is passed. Changes made to formal will not affect the actual parameters.- Different memory locations will be created for both variables. - Here there will be temporary variable created in the function stack which does not affect the original variable. 

Metatrader ist 32bit und es wird wohl keine 64bit Version geben. Wenn dem nicht so ist, nehme ich diese Aussage zurück.
Du mußt auf jedem Fall Pascal mit 32bit kompelieren.

Warum schreibt du dir nicht erstmal eine kleine C-Anwendung. Metatrader ist, glaube ich, in Delphi geschrieben. Vielleicht
auch mal ein kleines Delphi Programm. Beispiele gibt es sicher im Netz.
  • 0
Causality is the relationship between an event (the cause) and a second event (the effect), where the second event is a consequence of the first.

Thanked by 6 Members:
whipsaw , RAiNWORM , Der Wolf , ronner , WOGO , Vola

#14 mtbf40

mtbf40

    Floor Broker

  • Addict
  • PipPipPipPipPipPip
  • 256 posts
  • 1493 thanks
  • Wohnsitz:LE

Posted 13 January 2012 - 01:23 PM

Metatrader ist 32bit und es wird wohl keine 64bit Version geben. Wenn dem nicht so ist, nehme ich diese Aussage zurück.
Du mußt auf jedem Fall Pascal mit 32bit kompelieren.

ist doch alles mit 32bit kompiliert !! :palomitas:

Warum schreibt du dir nicht erstmal eine kleine C-Anwendung. Metatrader ist, glaube ich, in Delphi geschrieben. Vielleicht
auch mal ein kleines Delphi Programm. Beispiele gibt es sicher im Netz.


Wenn Metatrader in Delphi programmiert ist, sollte es auf jeden Fall reibungslos funktionieren, denn Freepascal (Lazarus) ist nahezu Delphi kompatibel!
  • 0

Thanked by 5 Members:
whipsaw , RAiNWORM , Der Wolf , Vola , ronner

#15 Bull68

Bull68

    Floor Broker

  • *_skilled
  • 1,377 posts
  • 8645 thanks

Posted 13 January 2012 - 07:01 PM

"HistoryOrder" würde ich mal als "static" deklarieren, ist aber nur ein Versuch, weil Du ja dennoch verschieden Zeigerformate hast (32bit zu 64bit).
  • 0
Wer meint alles sei zu jeder Zeit in den Kursen eingepreist, hat den Laden leider noch nicht verstanden!

Happy Trading - Ralf

Thanked by 5 Members:
Der Wolf , whipsaw , RAiNWORM , ronner , Vola

#16 RAiNWORM

RAiNWORM

    Floor Broker

  • Developer
  • 909 posts
  • 6489 thanks
  • Wohnsitz:NRW

Posted 15 January 2012 - 03:13 PM

Wer weiß was hier schief läuft??

1. Dein rewrite überschreibt die Datei immer wieder. Wahrscheinlich willst du doch die Datei ergänzen, oder?
2. Die String-Typen sind nicht kompatibel. Und ein Array von Strings ist eine ganz andere Hausnummer (Zeiger auf eine Liste von Zeigern).

Ich habe etwa einen Monat gebraucht, um Strings auszutauschen (Delphi-DLL) und ich bezeichne mich eigentlich als recht guten Programmierer.

Was ist ein String? Die Variable beinhaltet einen Zeiger auf das erste Byte. Jedes Byte repräsentiert einen character. Der String endet mit Byte-Wert 00. Blöd ist nur, dass Free Pascal oder Delphi unter dem Typ String etwas vollkommen anderes verstehen. Das erste Byte ist hier die Länge des Strings. Dann folgen die Characters. Seit einigen Versionen werden die jedoch Unicode gespeichert, sodass ein Zeichen <> einem Byte ist.

Lösung:
Übergib einen Zeiger auf das erste Zeichen. Dies wird durch den "normalen" string-Typ von MT4 veranlasst. Auf DLL-Seite empfängst du diesen Zeiger und baust dir deinen String byteweise selbst zusammen. Danach kannst du frei agieren. Das mit dem String-Array würde ich lassen, da es noch komplexer wird und auch anderweitig abbildbar wäre.

Möchtest du selber probieren oder Codebeispiele? :palomitas:
  • 2
Wer in die Fußstapfen eines anderen Tritt, wird niemals überholen...

Thanked by 8 Members:
Henrik , Der Wolf , WOGO , wh , Bull68 , whipsaw , Vola , ronner

#17 mtbf40

mtbf40

    Floor Broker

  • Addict
  • PipPipPipPipPipPip
  • 256 posts
  • 1493 thanks
  • Wohnsitz:LE

Posted 15 January 2012 - 08:23 PM

1. Dein rewrite überschreibt die Datei immer wieder. Wahrscheinlich willst du doch die Datei ergänzen, oder?
2. Die String-Typen sind nicht kompatibel. Und ein Array von Strings ist eine ganz andere Hausnummer (Zeiger auf eine Liste von Zeigern).

Ich habe etwa einen Monat gebraucht, um Strings auszutauschen (Delphi-DLL) und ich bezeichne mich eigentlich als recht guten Programmierer.

Was ist ein String? Die Variable beinhaltet einen Zeiger auf das erste Byte. Jedes Byte repräsentiert einen character. Der String endet mit Byte-Wert 00. Blöd ist nur, dass Free Pascal oder Delphi unter dem Typ String etwas vollkommen anderes verstehen. Das erste Byte ist hier die Länge des Strings. Dann folgen die Characters. Seit einigen Versionen werden die jedoch Unicode gespeichert, sodass ein Zeichen <> einem Byte ist.

Lösung:
Übergib einen Zeiger auf das erste Zeichen. Dies wird durch den "normalen" string-Typ von MT4 veranlasst. Auf DLL-Seite empfängst du diesen Zeiger und baust dir deinen String byteweise selbst zusammen. Danach kannst du frei agieren. Das mit dem String-Array würde ich lassen, da es noch komplexer wird und auch anderweitig abbildbar wäre.

Möchtest du selber probieren oder Codebeispiele? :palomitas:


danke für die Hinweise. :cura1-1:
habe jetzt mal folgendes versucht:
Änderungen in DLL: cdecl deklariert und Type PChar

Änderungen in MT4:
HistoryOrder[0]="Test";
HistoryOrder[1]="Test1";


library orderhist;{$mode objfpc}{$H+}uses  Windows,Classes  { you can add units after this };type  TOrderHist = array[0..7] of PChar;// function parameters declared as var will accept pointers.//procedure VarsByReference(var oh: TOrderHist) ; stdcall;procedure VarsByReference(var oh: TOrderhist) ; cdecl;var  Datei : TextFile;begin  // now let's make some changes to the variables  Assign (Datei, 'C:/Tools/mt4log.log');  ReWrite (Datei);  writeln(Datei,oh[1]);  close(Datei);end;exports  VarsByReference;beginend.

Resultat: die DLL schreibt jetzt zumindest Test!! rein - trotzdem alles merkwürdig - vor allem: wieso "funktioniert" es plötzlich mit cdecl?? :white_flag:

Fazit: würde gern mal ein paar Code-Schnipsel bekommen

mtbf40
  • 0

Thanked by 7 Members:
Henrik , Der Wolf , RAiNWORM , WOGO , ronner , Vola , wh

#18 wh

wh

    Floor Broker

  • *_skilled
  • 555 posts
  • 3767 thanks
  • Wohnsitz:Neubrandenburg

Posted 15 January 2012 - 08:33 PM

Schaue mal hier: http://de.wikibooks...._Pascal:_Zeiger

Zeiger verweist anders auf deinen Speicher.
  • 0
Causality is the relationship between an event (the cause) and a second event (the effect), where the second event is a consequence of the first.

Thanked by 7 Members:
Henrik , Der Wolf , RAiNWORM , mtbf40 , WOGO , ronner , Vola

#19 RAiNWORM

RAiNWORM

    Floor Broker

  • Developer
  • 909 posts
  • 6489 thanks
  • Wohnsitz:NRW

Posted 16 January 2012 - 07:57 PM

Fazit: würde gern mal ein paar Code-Schnipsel bekommen


Dann bastel mal hier mit.

MT4:
#import "meine.dll"    void an_dll(string send); #import//+------------------------------------------------------------------+//| expert start function                                            |//+------------------------------------------------------------------+int start()  {   string strSend;   strSend = Symbol()+";"+Bid+";"+Ask+";"+TimeToStr(TimeCurrent(), TIME_DATE|TIME_SECONDS);    an_dll(strSend);   return(0);  }//+------------------------------------------------------------------+

Delphi (ich hoffe, es passt auch für FreePascal)
uses  ...type  Tbytes = array [0..200] of byte;procedure an_dll(cc : Tbytes); stdcall;var strText : String;    ii : integer;begin  strText := '';  for ii := 0 to 200 do  begin    strText := strText + chr(cc[ii]);    if cc[ii] = 00 then break;  end;      try    MessageDlg(strText, mtWarning, [mbOK], 0);  except on e : exception do    begin      MessageDlg(e.Message, mtError, [mbOK], 0);    end;  end;end;exports  an_dll; begin ;end.

Das wäre ein Beispiel für call by value mit statischer Speicherreservierung für die Übergabe und simpler Umsetzung. Ist übrigens auch ein schönes Beispiel, wie Exploits entstehen können (Übergabe von mehr als 200 Byte und dadurch Überschreiben des Speichers mit Malware-Code).
  • 0
Wer in die Fußstapfen eines anderen Tritt, wird niemals überholen...

Thanked by 5 Members:
Der Wolf , Bull68 , WOGO , ronner , Vola

#20 mtbf40

mtbf40

    Floor Broker

  • Addict
  • PipPipPipPipPipPip
  • 256 posts
  • 1493 thanks
  • Wohnsitz:LE

Posted 16 January 2012 - 11:40 PM

Dann bastel mal hier mit.

Das wäre ein Beispiel für call by value mit statischer Speicherreservierung für die Übergabe und simpler Umsetzung. Ist übrigens auch ein schönes Beispiel, wie Exploits entstehen können (Übergabe von mehr als 200 Byte und dadurch Überschreiben des Speichers mit Malware-Code).


Danke RAiNWORM für den Code! :nyam1:

wenn mal alles auf Anhieb klappen würde - jetzt findet das :badtaste_:-Programm (Lazarus) den Identifier <MessageDlg> nicht :head:
mache für heute Schluß - morgen ist auch noch ein Tag fürs "blöd" werden

Edited by mtbf40, 16 January 2012 - 11:42 PM.

  • 0

Thanked by 4 Members:
Der Wolf , ronner , RAiNWORM , Vola

Wichtiger Hinweis für Besucher der Community!

Das Erstellungsdatum des von Dir aufgerufenen Themas liegt bereits einige Zeit zurück. Wir möchten darauf hinweisen, den Inhalt der Diskussion auf seine Aktualität hin zu prüfen. Weitere Informationen findest Du auf dieser Seite.


0 user(s) are reading this topic

0 members, 0 guests, 0 anonymous users