Zum Inhalt springen
View in the app

A better way to browse. Learn more.

#T/N/X/T

A full-screen app on your home screen with push notifications, badges and more.

To install this app on iOS and iPadOS
  1. Tap the Share icon in Safari
  2. Scroll the menu and tap Add to Home Screen.
  3. Tap Add in the top-right corner.
To install this app on Android
  1. Tap the 3-dot menu (⋮) in the top-right corner of the browser.
  2. Tap Add to Home screen or Install app.
  3. Confirm by tapping Install.

Free Pascal

Geschrieben

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;

begin
end.

 

MT4:

//#include <common_functions.mqh>


#import "orderhist.dll"
  void VarsByReference(string& oh[]);
#import


int 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

Bearbeitet von mtbf40

  • Antworten 59
  • Aufrufe 13,1Tsd
  • Erstellt
  • Letzte Antwort

Top-Benutzer in diesem Thema

Most Popular Posts

  • 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 H

  • Ich bin mal zu faul ne Erklärung zu schreiben. Ich denke 7bit kann das ein wenig besser.   http://www.forexfactory.com/showthread.php?t=219576   Schaue mal nach 32bit und 64bit. Schaue mal nach passin

  • Wo steht, dass er die DLL erfolgreich laden konnte? Mit debuggen wird es schwer, außer du nutzt IDA Pro, SyserDebugger oder SoftIce. Damit bekommst du nahezu alles gedebuggt. Aber damit würde ich gar

Veröffentlichte Bilder

Featured Replies

Geschrieben
  • Autor

Hallo,

 

habe bei meinem Projekt jetzt festgestellt das Daten "verloren" gehen.

...

...

...

Die Basis dafür ist MTEC von RAiNWORM

 

naja, das kommt davon, wenn man Software übernimmt, diese dann anpasst und bei dem Rest nicht genau hinschaut oder durchblickt - RAiNWORM hat nämlich einen Parameter bei dem die Länge der Daten bestimmt wird... und meine Daten waren einfach länger und so wurde der Rest glatt "abgeschnitten"

Geschrieben
  • Autor

Hallo,

 

hat schon mal jemand einen Erfolg erziehlt und mit <GetDlgItemText> einen Wert aus einer Edit Box bekommen?

 

procedure winDlgTest.DoRun;
var
Msg: String;
Buffer1: Array[0..20] of Char;
Buffer2: Array[0..255] of Char;
wnd, txt,Text: integer;
begin
{
1838012 - WinHandle (Window Class #32770)
1127 - ID von Edit Box
}
wnd := GetDlgItem(1838012,1127); -> erhalte Wert
txt := GetDlgItemText(wnd, 1127, Buffer1, 256); {-> kein Wert}
txt := GetDlgItemText(1838012, 1127, Buffer1, 256); {-> kein Wert}
Text := GetWindowText(wnd,Buffer2, 256);
Msg := Buffer2[0];
Terminate;
end;

Geschrieben

RAiNWORM hat nämlich einen Parameter bei dem die Länge der Daten bestimmt wird... und meine Daten waren einfach länger und so wurde der Rest glatt "abgeschnitten"

Entschuldigung wink2.gif Bei Datenübergaben arbeite ich immer mit Begrenzungen, um Overflow-Attacken vorzubeugen.

Bei TCP/IP muss man auf Empfangsseite aufpassen, da die Daten beliebig packetiert werden können und somit in mehreren Schüben ankommen können. Dabei besteht auch ein Unterschied zwischen LAN und Internet, was die Packetgrößen anbelangt.

 

Zum Debuggen der DLL: da die von MT aufgerufen wird, hast du mit "normalen", praktikablen Mitteln keine Chance. Du müsstest dann zu Low-Level-Debuggern übergehen. Das macht dann aber keinen Spass und kostet unnötig Zeit.

 

Mich würde mal was ganz anderes interessieren: was baust du da eigentlich? biggrin.gif

Geschrieben
  • Autor

Zum Debuggen der DLL: da die von MT aufgerufen wird, hast du mit "normalen", praktikablen Mitteln keine Chance. Du müsstest dann zu Low-Level-Debuggern übergehen. Das macht dann aber keinen Spass und kostet unnötig Zeit.

zum debuggen benutze ich <OutputDebugString> - ist ganz praktisch

 

 

Mich würde mal was ganz anderes interessieren: was baust du da eigentlich? biggrin.gif

...einen TradeManager - mit dem ich meine Trades überwachen und vor allem auswerten kann. Der erste Schritt ist das initialisieren, d.h. wenn ich Trades eröffnen will zeigt er mir verschieden Werte an - siehe Anhang

 

Was ich am Ende will ist ein Tool zum auswerten aller Trades von verschiedenen Accounts (Brokern) ... und vielleicht noch ein paar Dinge mehr

post-2251-0-53767800-1346517987_thumb.png

  • 1 Monat später...
Geschrieben
  • Autor

Hallo an alle Datenbank-Profis,

 

ich hab da mal'ne Frage

 

Ich habe eine DB (Sqlite) mit verschiedenen Tabellen (siehe Anhang).

Jetzt möchte ich folgendes erreichen:

 

z.B. in der TM_HistoryOrders gibt es die Spalte <TradeTyp> - diese wird mittels <OrderType()> Metatrader gefüllt - diese Funktion gibt aber nur Zahlen aus (1-5)

Ich habe mir dann gedacht eine weitere Tabelle anzulegen - TM_OrderTypes - diese soll eine referenzierende Tabelle sein. Jetzt habe ich mit Primärschlüsseln und Fremdschlüsseln (Foreign Keys) herumexperimentiert und komme nicht weiter. Als Ergebnis dieser ganzen Aktion möchte ich, dass in der Spalte <Trade_Typ> buy od. sell od. sell Limit ... steht

Wie kann ich das in der DB realisieren??

MTEC.zip

Geschrieben

Also wenn du in einer tabelle eine int-Spalte TradeTyp hast, wird in der Spalte nie buy oder sell stehen.

Du kannst aber beim auslesen der tabelle nicht die tabelle selbst sondern ein JOIN nehmen

 

ala "SELECT * FROM (TM_HistoryOrders JOIN TM_OrderTypes using (TM_HistoryOrders.TradeTyp ==TM_OrderTypes.typeId))"

 

damit kombinierst du die zwei tabellen derart, das zu TM_HistoryOrders Spalten von TM_OrderTypes (für die Ausgabe) hinzugefügt werden. Und zwar genau die Zeile von TM_OrderTypes in der der entsprechende Wert von TM_HistoryOrders.TradeTyp passt.

 

also zB

TM_HistoryOrders:

id | TradeTyp | ....

1 | 2 | orderinfo1...

2 | 1 | orderinfo2....

 

TM_OrderTypes:

typeid | name

1 | BUY

2 | SELL

3 | BUY_LIMIT

....

 

dann gibt das JOIN folgenden Output (sortierung "zufällig")

id | TradeTyp | .... | name

1 | 2 | orderinfo1... | SELL

2 | 1 | orderinfo2.... | BUY

 

damit das ganze auch recht schnell geht, sollte natürlich bei den OrderTypes die typeID der PrimaryKey oder zumindest ein Index sein.

Geschrieben

Du kannst aber beim auslesen der tabelle nicht die tabelle selbst sondern ein JOIN nehmen

Das wäre die saubere Lösung. Alternativ könntest du mit dem CASE-Statement arbeiten:

 

 

The CASE expression

 

A CASE expression serves a role similar to IF-THEN-ELSE in other programming languages.

...

  • CASE x WHEN w1 THEN r1 WHEN w2 THEN r2 ELSE r3 END
  • CASE WHEN x=w1 THEN r1 WHEN x=w2 THEN r2 ELSE r3 EN

Quelle

 

ala "SELECT * FROM (TM_HistoryOrders JOIN TM_OrderTypes using (TM_HistoryOrders.TradeTyp ==TM_OrderTypes.typeId))"

Ist das Standard-SQL? Ansonsten müsste es meines Erachtens anstatt "using" "on" genommen werden und an Stelle von "==" "=".

Geschrieben

Ist das Standard-SQL? Ansonsten müsste es meines Erachtens anstatt "using" "on" genommen werden und an Stelle von "==" "=".

 

Nö, das war "as i remember" SQLite ;) hast Recht es is "ON", hab noch gewusst das eines für liste von spalten ist und eines für die Bedingung... Das "==" is halt schon so automatisch bei Vergleichen http://www.tom-next.de/community//public/style_emoticons/default/moveaway.gif

 

bzgl Case: wenn es nur genau eine Abfrage ist, gehts so, aber dann wärs fast besser es als "switch" in den Code zu packen, weil bei 6 Möglichkeiten wird das CASE ein bissl unübersichtlich

Geschrieben
  • Autor
... danke erst einmal für die Tips - ich habe das jetzt direkt im Code eingearbeitet - werde bestimmt wieder auf euch zukommen , wenn es um Views oder Trigger geht... Wenn ich eine "vorzeigbare" Version habe, werde ich sie mal hier reinstellen...

Dein Kommentar

Du kannst jetzt schreiben und Dich später registrieren. Wenn Du ein Konto hast, melde Dich jetzt an, um unter Deinem Benutzernamen zu schreiben.

Gast
Auf dieses Thema antworten...

Account

Navigation

Suche

Suche

Configure browser push notifications

Chrome (Android)
  1. Tap the lock icon next to the address bar.
  2. Tap Permissions → Notifications.
  3. Adjust your preference.
Chrome (Desktop)
  1. Click the padlock icon in the address bar.
  2. Select Site settings.
  3. Find Notifications and adjust your preference.