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.

MQL Library mit Standardfunktionen

Geschrieben

Soda, ich start hier einfach mal das Projekt "StandardLib". Sobald ein Admin den Upload freischaltet gibts meine kleine Lib mit sage und schreibe 2 Funktionen im Downloadbereich einfach mal als Diskussionsgrundlage.

 

SVN halte ich für sinnvoll, aber ich denke, der Download-Bereich sollte es auch tun und mehr Leute verstehen es auch, zumal es auch nicht so hoch frequentiert ist (oder wie der Chef immer so schön sagt: "Hier bei tom-next ticken die Uhren langsamer"). Es wird wahrscheinlich darauf hinauslaufen, dass jeder so "sein Baby" hat und die anderen es lediglich testen und eventuell Bugs rückmelden.

 

Ich denke mit SVN wirds erst sinnvoll wenn wir wirklich mehrere Coder sind die daran arbeiten. Solange nur eine handvoll dran arbeitet könnts mit einem file klappen.

 

Vor allem dürfte das Hauptziel mal sein die notwendigen Funktionen zu finden.

Wie ich das bis jetzt sehe, haben wir hier viele "Betatester" die wissen was es können soll und ein paar coder, die das dann produzieren.

 

Also: Was soll in so eine Standardlib rein? Was codet ihr immer wieder und denkt euch jedesmal "das hab ich doch schon mal geschrieben"?

 

Kurz was schon drin ist:

TBOrderSend: Als Extension zu OrderSend. TBOrderSend kann man die "rohen" Werte geben und es gleich diese "sinnvoll" an die notwendige Genauigkeit an (also rundet Preise zum nächsten vollen Tick auf oder ab, gleicht die Lotsize an etc.) Passt auch Stops und TPs an falls sie zu nah am Entryprice liegen (anhand der Stoplevel vom MArketINfo). Zusätzlich noch eine Überprüfung der Expiration auf sinnhaftigkeit und schickt dann die Order los.

Kommt trotzdem ein Error versucht er es immer wieder mit kleinem Errorhandling: Requote und Wartezeit bei Serverbusy... Im Erfolgsfall retouniert sie das OrderTicket, sonst den negativen Fehlercode.

 

TBOrderModify macht im Prinzip das gleiche nur für OrderModify (und noch nicht wirklich kommentiert)

 

zur Namensgebung: ich hab sie TradeBox genannt und deswegen alle Funktionen daraus mit dem Präfix TB versehen.

 

Und ja, beim coden ist mein Englisch teils unter aller Sau ;)

  • Antworten 108
  • Aufrufe 1,8Tsd
  • Erstellt
  • Letzte Antwort

Top-Benutzer in diesem Thema

Most Popular Posts

  • Freut mich wenn dir die Tradebox hilft.   für alle Funktionen wirds eine lange liste. Am Anfang der TradeBox is eine lange Liste mit allen vorhandenen Funktionen. Zum Code, deiner ist fast korrekt (es

  • Zum lösen des Problems bin ich offensichtlich zu spät, aber die Frage kann ich beantworten ;) Es gibt grundsätzlich den Unterschied zwischen include und import:   Bei include holt sich der Compiler zu

  • // Copyright (C) 2009 // Markus Kuegerl <kuegerl.markus@gmx.net> // // All rights reserved. // // Redistribution and use in source and binary forms, with or without // modification, are per

Veröffentlichte Bilder

Featured Replies

Geschrieben

@Mythos :

 

von Deinem Download bin ich absolut begeistert . Und ich Danke sehr .

 

 

Den wahren Wert Deiner Lib habe ich erst heute richtig verstanden ( ich war schon 2 oder 3 mal hier, wohl immer zu oberflächlich geblieben ) . Und ich bin in diesem Thread "gelandet" , nachdem mich meine kontinuierlichen Error´s bei der Preisfindung insbesondere im Zusammenhang mit OrderModify heute mal wieder zur Verzweiflung getrieben . Und ich habe durch Search dann über ein paar Umwege hierher gefunden und den Thread nun komplett durchgearbeitet .

Den Code habe ich zum Teil gesichtet, genug gesehen um zu verstehen , dass dort Sequenzen sind, die meine Probleme (und solche die ich noch garnicht kannte) wohl alle lösen wird .

 

Also möchte ich Dein Tool gerne nutzen , um ein für alle mal meine Ruhe zu haben . Dazu möchte ich dieses gerne in meinen aktuellen EA , Ernten 4.1. , einbinden .

 

Nun habe ich bis heute noch keine Lib genutzt und den Post #77 vermutlich auch deshalb noch nicht ganz verstanden .Bislang arbeite ich so, dass ich verschiedene in sich geschlossene Programmteile in Includes auslagere (so wie ich vor vielen Jahren Subroutinen geschrieben habe) .

 

Wärest Du so freundlich die Sequenz im EA zu posten , die alle Funktionen des Tools (oder mindestens die für das Ordermanagment) für den EA aktiviert ?

 

Oder muss ich genauso coden ? =>

 

#import "TradeBox.ex4"
 int TBSendOrder(string symbol,int cmd,double volume,double price,int slippage,double stoploss,double takeprofit, string comment,int magic, datetime expiration,int max_retries);
 void TBSetInformationLevel(int val);
 double TBGetVersionNumber();
#import

 

Und dann kann ich TBOrderSend , TBSetinformationLevel und TBGetVersionNumber aufrufen ....... aber auch nur diese drei .

 

Möchte ich zum Beispiel noch Ordermodify durchführen , dann muss ich noch die Zeile

 

int tbModifyOrder(int ticket,double price,double stoploss,double takeprofit, datetime expiration, bool trail = false)

 

an beliebiger Stelle zwischen den beiden " #import " einfügen .

 

Ist das so richtig verstanden ?

 

Nun gibt es interne Funktionen in Deinem Tool .... verstehe ich richtig, dass diese in keinem Fall meine (oft globalen) Variablen beeinflußen ? Ist eine Lib also ein Programm, dass von meinem EA garnichts weiss . Ist Dein Tool , eine Lib , im Prinzip eine Erweiterung des Compiler ... die Funktionen , die ich im Import definiere , eine Erweiterung des Befehlssatzes von MQL 4 ?

 

Mit freundlichen Grüßen

 

Kleinerbroker

Geschrieben
  • Autor

Freut mich wenn dir die Tradebox hilft.

 

Wärest Du so freundlich die Sequenz im EA zu posten , die alle Funktionen des Tools (oder mindestens die für das Ordermanagment) für den EA aktiviert ?

für alle Funktionen wirds eine lange liste. Am Anfang der TradeBox is eine lange Liste mit allen vorhandenen Funktionen. Zum Code, deiner ist fast korrekt (es waren ein paar kleine Fehler in #77 die ich dank dir korrigieren konnte ;)

 

#import "lTradeBox.ex4"
 int tbSendOrder(string symbol,int cmd,double volume,double price,int slippage,double stoploss,double takeprofit, string comment,int magic, datetime expiration,int max_retries);
 int tbModifyOrder(int ticket,double price,double stoploss,double takeprofit, datetime expiration, bool trail);
int tbCloseOrder(int ticket,double lots,int slipage,int max_retries);
void tbSetStop(int iOrderTicket,double dStopLoss,bool bHidden,int iSlippage,int iMaxRetries);
void tbSetTP(int iOrderTicket,double dTakeProfit,bool bHidden,int iSlippage,int iMaxRetries);
void tbSetInformationLevel(int val);
 double tbGetVersionNumber();
#import

 

(wenn du die Parameter mit vorhandenen defaultwerten (zb max retries) im import weglässt werden die defaultwerte verwendet)

 

Wie du richtig erkannt hast kannst du damit die so eingebundenen Funktionen aufrufen, bei allen anderen wird der Compiler laut schreien.

Weitere Funktionen einfach durch einfügen der Funktionsdeklaration (so wie sie in der Funktionsliste am Anfang der TradeBox steht) dazupacken (genau so wie du es für tbModifyOrder vorgeschlagen hast. Die Defaultwerte für die Parameter müssen nicht angegeben werden (stören aber nicht).

 

Nun gibt es interne Funktionen in Deinem Tool .... verstehe ich richtig, dass diese in keinem Fall meine (oft globalen) Variablen beeinflußen ? Ist eine Lib also ein Programm, dass von meinem EA garnichts weiss . Ist Dein Tool , eine Lib , im Prinzip eine Erweiterung des Compiler ... die Funktionen , die ich im Import definiere , eine Erweiterung des Befehlssatzes von MQL 4 ?

Der Vollständigkeitshalber: es gibt eigentlich keine internen Funktionen. Es gibt Funktionen die für die externe Verwendung gedacht sind, und solche die eigentlich für die interne gedacht sind. Man könnte aber auch die "internen" Funktionen per import laden und verwenden.

 

Ja, die lib ist ein in sich geschlossenes "Programm" das nach außen über die Funktionen "Schnittstellen" liefert. Die TradeBox hat selber globale Variablen, aber weder die TB ändert die globalen Variablen des EA noch umgekehrt. Schwierig wird es nur wenn du im EA Funktionen deklarierst die du gleichzeitig auch von der TB importierst (also die gleich heißen), deswegen haben die TB-Funktionen alle den "tb"-Präfix.

Kurz gesagt ja: Die TB weiß nichts von deinem EA und dein EA weiß von der TB nur das sie die importierten Funkionen liefert.

 

Die GlobalVariables von MT (für mich sind globale Variablen die Variablen die global im EA definiert sind) könnten theoretisch von einer Lib aus verändert werden, die TB selber verwendet aber keine GlobalVariables und pfuscht da also sicher niemandem rein ;)

Man kann es als Erweiterung des Befehlssatzes von MQL4 sehen ja. nur eben open source ;)

 

Falls weitere Fragen auftreten einfach melden. Du darfst den Code natürlich auch gern an deine Bedürfnisse anpassen. Theoretisch sollten inzwischen keine Bugs mehr vorhanden sein, aber bitte trotzdem erstmal in Demo testen.

 

lg

Geschrieben

@Mythos ,

 

:top: das Tool ist so toll , wie ich gehofft hatte !

 

Und nun arbeite ich natürlich auch damit =>

 

1.) tbSetInformationLevel

 

Meine Probleme der falschen Preise gelöst . Neue kommen auf ( 4002 hatte ich noch garnicht :loungelizard:) und nun will ich die Ausgabefunktion des Tools aktivieren .

EDIT um 17:14 =>

Dazu importiere ich erstmal

void tbSetInformationLevel(int val)

, setze "val" auf einen der möglichen Zahlenwerte zwischen -1 und 4 und das alles nur einmal , nämlich in meiner eigenen Init() .

 

Stimmt doch , oder ?

 

2.) tbModifyOrder

 

Ich mag es farbig und habe verschiedene Stellen in meinem EA die aus unterschiedlichen Gründen, meine Trades modifizieren . Um dies kenntlich zu machen, rufe ich von den verschiedenen Stellen im EA mit jeweils anderen Farben den OrderModify() auf . Der tbModifyOrder hat das noch nicht vorgesehen, aber wenn ich sowohl im EA als auch in der ersten Zeile der LIB-Funktion und schlussendlich in dem eigentlichen OrderModiy (dort gemäß MQL Syntax) die Farbe implementiere, dann ist auch das gelöst. Weiter muss nämlich nichts gemacht werden .

 

Stimmt doch , oder ?

 

:Howdy:

 

KB

 

PS.: Mensch Mythos, was ich an Stunden verbraten habe, um die Fehler überhaupt zu finden, ganz zu schweigen von der Fehlerursachensuche in Folge .....hätte ich nur schon früher ....:pfue:

Geschrieben
  • Autor

Stimmt doch , oder ?

 

Stimmt doch , oder ?

zweimal ja.

 

An die Farben hab ich gar nicht gedacht, ich hab die selber noch nie verwendet...:pfue:

 

Edit: habs gleich mal selber auch eingebaut und als Version 1.19 hochgeladen. Habs die neuen Parameter ans Ende gestellt mit den MQL-Defaultwerten damits abwärtskompatibel bleibt.

 

.....hätte ich nur schon früher ....:pfue:

freut mich wenns dir hilft. Besser spät als nie. So bin ich zumindest nicht der einzige (der ewig Fehler gesucht hat die andere schon lang behoben haben) ;)

  • 3 Jahre später...
Geschrieben

Frage Zusammenspiel EAKitchen und lTradeBox

Frage: die Kitchen importiert die lTradeBox, die lTradeBox importiert die stdlib.

 

Eigentlich denke ich, es reicht, iin meinem eigenen EA dann nur die kitchen importieren.

Aber die erste Fehlermeldung kommt schon beim kompilieren: ErrorDescription() function not defined.

Muss ich doch in meinem EA jede Datei einzeln importieren und die Funktionen auch einzeln im import-Befehl benennen?

Geschrieben

Sorry, jetzt habe ich meinen Fehler begriffen, ich hatte noch ein überflüssige ErrorDesription() im eigentlichen EA stehen, die dort natürlich keiene sinn mehr macht, weil sie ja von der lTradeBox erledigt wird.

Trotzdem begreife ich noch nicht so ganz, wann bzw. wie die Funktionen auch über mehrere import-Ebenen weitergereicht werden.

Geschrieben

Eigentlich denke ich, es reicht, iin meinem eigenen EA dann nur die kitchen importieren.

Ab und zu regnet es Grips vom Himmel, diesmal stand ich im richtigen Regen - verzeiht mir die viel zu dummen Posts.

Geschrieben
  • Autor

Trotzdem begreife ich noch nicht so ganz, wann bzw. wie die Funktionen auch über mehrere import-Ebenen weitergereicht werden.

 

Zum lösen des Problems bin ich offensichtlich zu spät, aber die Frage kann ich beantworten ;)

Es gibt grundsätzlich den Unterschied zwischen include und import:

 

Bei include holt sich der Compiler zur kompilierzeit einfach das entsprechende file und kopiert den Inhalt an die Stelle des include bevor er das file kompiliert. Und das macht er rekursiv, sprich wenn wir diese 3 Dateien haben:

a.mqh:

 

void  a() {}

b.mqh:

 

include "a.mqh"
 
void b() {}

und c.mqh:

 

void c() {}
 
include "b.mqh"
 
void d() {}

 

dann macht der compiler aus c.mqh vor dem compilieren das:

 

 

void c() {}
 
void a() {}
 
void  b() {}
 
void d() {}

und kompiliert das.

 

Bei import ist es ein bissl anders. Importiert werden ja nicht source files sondern bereits kompilierte binaries. Das kompilieren läuft verständnissmäßig so ab: Für jede Funktion die der Kompiler findet (deklaration oder definition ist hier erstmal egal), legt er sich eine Referenz ab. Sprich er merkt sich "es gibt die funktion a()", findet er auch noch die Definition der Funktion (also nicht nur void a(); sondern inklusive dem funktions-body) so speichert er sich zusätzlich zum "es gibt die funktion a()" auch noch ein "und SO sieht sie aus" dazu. (natürlich nicht in source code sondern bereits kompiliert).

Überall wo er dann im Code den aufruf von a() findet, setzt er im ersten Schritt die Referenz auf a() die er sich zuerst erstellt hat ein.

Im zweiten Schritt (dem sogenannten linker) werden nun diese Referenzen im code mit den gespeicherten Funktionen verlinkt (deswegen linker ;), findet er bei einer verwendeten Funktion keinen body, so gibts einen linker-error.

 

Eine library ist jetzt sozusagen ein zwischending, sie bietet genau diese Tabelle an Funktionsreferenzen für den linker. Sprich der Kompiler startet bei den neuen sourcefiles nicht mit einer leeren Tabelle sondern lädt zunächst die Funktionen, welche aus der library zur Verfügung gestellt werden. Dadurch können diese direkt im neuen Source verwendet bzw. verlinkt werden.

Verwendet eine library nun eine andere library, so ist die resultierende Funktionstabelle nach dem kompilieren der Library entsprechend die Kombination der verwendeten library + die neuen Funktionen der kompilierten library wodurch alles verwendet werden kann.

 

Ich hoff das war nicht zu verwirrend und ich hab keinen Blödsinn erzählt ;)

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.