Hedge EA
Liste der Anhänge anzeigen (Anzahl: 1)
Hallo.
Ich glaube, jetzt braucht das Teil wirklich nen eigenes Thema. Hab, wie gesagt, eine Art Hedge-EA am Testen. Siehe Anhang. Soll ständig im selben WP gleichzeitig Long und Short investiert sein. Sobald die Order einer Richtung geschlossen wurde, weil sie durch den SL oder TP ging, soll sofort die nächste Order in die selbe Richtung geöffnet werden. Das klappt im Gegensatz zu vorherigen Versionen auch einigermaßen gut. :rolleyes: Leider aber anscheinend nur vormittags. :confused: Bei einigen WP hat er heute nur bis 9 oder 10 Uhr geöffnet und danach irgendwie gar nix mehr gemacht. Oder lag das vielleicht doch an zu hohen Spreads? Er durfte nen max Spr. von 20 akzeptieren. 2. hab ich was eingebaut, was den OrderProfit() der letzten geschlossenen Order auslesen soll. Wenn der >0.0 war, soll zu den Lots ein einstellbarer Wert dazu addiert werden. Er hat sie zwar auch erhöht, aber absolut nicht so, wie er sollte. Er sollte um 0.01 jedes mal erhöhen, wenn die letzte Order Gewinn gemacht hat. Er hat aber irgendwie jedes Mal mehrere ganze Lots dazu gerechnet! :eek: Flippt das Ding total aus oder was? Die Beschreibung ist vielleicht nicht so einfach zu verstehen, aber Fehler sind ja eigentlich keine im Code oder doch? Code:
extern double LotsBuy=0.01; Code:
//============================================================================================================= |
Liste der Anhänge anzeigen (Anzahl: 1)
Hallo.
Warum spielen die Lots verrückt und warum öffnet er nur ein paar Mal Orders wie er soll und tut dann anscheinend gar nix mehr? :confused: |
Liste der Anhänge anzeigen (Anzahl: 1)
Hat/te Jemand nen Demo-Konto bei ActivTrades? Ganz egal, wie ich den EA schreibe, es gibt immer wieder lange Pausen beim Order öffnen. Aber so richtig kann er ja nur funktionieren, wenn er ständig Long und Short im selben WP ist. Ich kanns mir eigentlich nur noch so erklären, dass ActivTrades doch irgendwelche Begrenzungen hat, was das Hedgen und Scalpen angeht.
Oder gibts doch irgendwelche Fehler im Code? Irgendwas, was zwar nicht wirklich falsch ist, aber eben trotzdem dafür sorgt, dass der EA nicht so läuft, wie er soll? Code:
//============================================================================================================= |
So genau habe ich jetzt deinen Code nicht analysiert. Aber du solltest dir mal überlegen, wann genau dein Programm was machen muss. Deine Funktion für Lotserhöhung kann so, wie du das programmiert hast, mehrmals für die gleiche Order aufgerufen werden. Mach mal Prints in dein Programm und guck dir das an.
Mach das doch genau nur dann, wenn du feststellst, dass deine Buy oder Sell-Order in TP oder SL gelaufen ist. Jetzt kann bei bei jedem Tick Lotserhöhung aufgerufen werden, wenn Orderopen nicht ausgeführt wurde, aus welchem Grund auch immer. Meine Programme prüfen bei jedem OrderSend, ob alles richtig abgelaufen ist und wiederholen dann den Befehl, wenn nötig. Und das bis zu einer einzustellenden Anzahl Wiederholungen. Und wenns nicht geht, dann schau ich dafür, dass nicht bei jedem Tick etwas gemacht wird, das ich nicht will. Ich habe z.B. auch sowas drin vor der OrdeEröffnung while(IsTradeContextBusy()) Sleep(10); Du machst auch bei jedem Tick Dinge, die unnötig sind, z.B. Min Lotsize, TP und SL einstellen |
Noch ein Rat:
Bau sowas in deinen Code ein: Code:
#include <stderror.mqh> Aber ganz genau weiss ich auch nicht, wann das passiert. Dein Code ist nicht so programmiert, dass er sicher läuft, wenn Fehler passieren. Da musst du schon selber suchen. Wenn du Prints in dein Programm einbaust, sieht du in der Console ja, wann was abläuft. Es gibt genügend Beispiele im Netz, wie man sicheren Code programmiert und wie man Fehler abfängt. Merk dir: Errorhandling ist etwas vom Wichtigsten bei sauberer Programmierung. Und du machst da genau nichts. |
Liste der Anhänge anzeigen (Anzahl: 1)
Ich vermute, dass die Lots verrückt spielen, weil sie in der selben Anweisung erst abgefragt und im nächsten Schritt verändert werden... In C++ könnte man das vielleicht als ne Art Überladen bezeichnen. :rolleyes:
Aber selbst wenn man das mit extra Variablen hin bekommen sollte, ist das Kernproblem des EA, dass er nicht ständig im Markt ist wie er soll, sondern immer wieder lange Pausen macht... |
Nein, deine Vermutung mit 'Ueberlagerung' ist totaler Blödsinn.
Der Fehler liegt da: if(OrderSelect(TiBuy,SELECT_BY_TICKET,MODE_HISTORY)) MODE_HISTORY geht nur bei SELECT_BY_POS Steht auch so in der Doku: pool=MODE_TRADES [in] Optional order pool index. Used when the selected parameter is SELECT_BY_POS. It can be any of the following values: MODE_TRADES (default)- order selected from trading pool(opened and pending orders), MODE_HISTORY - order selected from history pool (closed and canceled order). So wie du jetzt abfragst, wird Lotsize bei jedem Tick erhöht, sobald OrderProfit > 0 ist. Auch wenn du das korrigierst, wird Lotsize nie erhöht, weil deine Ticketnummer jeweils die aktuelle TicketNr ist, nicht die der letzten Order. Du musst das dann machen, wenn du feststellst, dass deine Order in den TP gelaufen ist, nicht nachdem du eine neue Order eröffnet hast. Wie du das genau machst, musst jetzt aber selber herausfinden. Ich habe wenig Lust, dir diesen EA so zu programmieren, dass er läuft. Zumal die Strategie eh nicht funktioniert. Ich habs soeben nochmals laufen lassen, diesmal mit EURUSD. Er ist immer im Markt drin, aber natürlich nur mit Lotsize 0.01. Hast du eingebaut, was ich dir empfohlen habe? Mach doch mal ein paar Print ins Porgramm. Oder weisst du ev. nicht, wie man solche Prints sieht: Ansicht / Terminal, dann unten Experten anklicken und dann siehst du schön, was abläuft, auch, warum er keine Order eröffnet. So läufts jedenfalls, und es macht auch immer Orders auf. Wenn du den Experten startest, macht er beim ersten Tick BuyOrder auf, beim zweiten Tick SellOrder. Willst du das so? Nochmals: Ueberleg dir genau, was du wann machen willst, und mach nicht bei jedem Tick Dinge, die du nicht willst und Anderes nicht, was du gerne möchtest. Kleiner Tip: nach return(TiBuy); gehts erst beim nächsten Tick weiter. Code:
//============================================================================================================= |
Du fragst OrderHistory total falsch ab.
So etwa gehts nämlich, und du machst die Abfrage in der History nur 1 x pro Order: Code:
int LastBuy = 0; |
Ich habe noch was vergessen, in die Antwort einzufügen. Int LastBuy und LastSel musst natürlich nach Order Eröffnung füllen, z.B. so:
Code:
//============================================================================================================= |
Liste der Anhänge anzeigen (Anzahl: 1)
Hallo.
Mit den ganzen Fehlermeldungen muss ich mich noch mal beschäftigen. Code:
if( IsTradeContextBusy()==true )Sleep(Sl_MS); Code:
while( IsTradeContextBusy()==true )Sleep(Sl_MS); Wie wählt man die zuletzt geschlossene Order aus? Überall steht was Anderes. :confused: Wie gesagt soll, wenn die letzte geschlossene Order Gewinn gemacht hat, die Lots in die jeweilige Richtung erhöht werden. Also wenn z.B. der letzte Buy mit 0.1 Lot mit Gewinn geschlossen wurde, soll der nächste Buy z.B. um 0.1 Lot erhöht, also mit 0.2 Lot raus geschickt werden. Wenn der wieder Gewinn macht, soll der Buy danach wieder um 0.1 Lot auf 0.3 Lot erhöht werden und immer so weiter. Muss beim Index oder bei dieser Nummer nun 0 oder j oder was sonst eingetragen werden, um rauszufinden, ob die letzte Order in eine Richtung Gewinn gemacht hat? :confused: Code:
//============================================================================================================= |
Alle Zeitangaben in WEZ +2. Es ist jetzt 11:41 Uhr. |
Powered by vBulletin® Version 3.8.5 (Deutsch)
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
SEO by vBSEO 3.6.1
Powered by vBCMS® 2.7.0 ©2002 - 2024 vbdesigns.de
Copyright ©2009 - 2023 by Expert-Advisor.com - Das Metatrader Forum