Metatrader Forum | Forex Expert-Advisor | Broker & Forex Tools

Metatrader Forum | Forex Expert-Advisor | Broker & Forex Tools (http://www.expert-advisor.com/forum/index.php)
-   Programmierung MQL4 (http://www.expert-advisor.com/forum/forumdisplay.php?f=220)
-   -   ordersend errror 3 (http://www.expert-advisor.com/forum/showthread.php?t=6885)

berlin 12.01.21 13:25

ordersend errror 3
 
Liste der Anhänge anzeigen (Anzahl: 2)
moin zusammen,

ich habe einen Ea der boxen anhand von einem vorgegebenen zeitrahmen definiert. an den rändern werden pending orders platziert > also klasischer range handel.

jetzt bin ich dabei ihn so umzuschreiben, dass er mehrere boxen tradet. nach vielen versuchen, bin ich jetzt soweit das er die boxen einzeichnet und auch trades eingeht.

das problem ist das er die pending orders ständig öffnet und schliesst und damit dann auch aufhört bevor die ablaufzeit rum ist.

um das problem zu verdeutlichen packe ich in den anhang mal ein screenshot vom chart und die mq4 datei.

vielleicht findet sich hier ja jemand der mir helfen kann das problem zu lösen.

vielen dank schon mal im voraus.

berlin

Indikator-Trading 13.01.21 09:12

Hallo Berlin,

hier ein paar Anmerkungen zu deinem Code:

Die zweite If-Abfrage wird nie True werden, da dies sonst der ersten If-Abfrage widersprechen würde:
if(TimeCurrent() >= rangeStart1)
{
drawRange1();

//reset range variables
if(TimeCurrent() < rangeStart1)
{
rangePoints1 = 0;
rangeHigh1 = 0;
rangeLow1 = 0;
}


In dieser If-Abfrage musst du die Einzelteile in Klammern setzten, sonst wird es nicht so funktionieren, wie du dir das vorstellst. Dies gilt für auch für den Rest von deinem Code
Code:

      if(checkTime1()
        && inRange
        && rangePoints1 >= MinRangePoints && rangePoints1 <= MaxRangePoints
        && counterLong + counterShort < MaxTrades)

Gruß Timo

berlin 13.01.21 16:15

nochmal von vorne :)
 
Liste der Anhänge anzeigen (Anzahl: 1)
timo, vielen dank für deine antwort.

ich habe das ganze noch einmal neu aufgesetzt und folgendes der übersichthalber verändert.

1. aus der ersten if,if anweisung hab ich else if gemacht.
2. mit void box1() und void box2() den void tick bereich übersichtlicher gemacht
3. die boxen ein und ausschaltbar true/false gemacht

damit ist aus meiner sicht jede box deutlich von einander getrennt und es sollte aus meinem bescheidenen verständnis keine korrelationen zwischen den boxen entstehen.

wenn ich die boxen einzeln teste (also jeweils die andere ausschalte) funktioniert es wunderbar.

sind aber beide auf true kommt der ordersend error 3 wieder und er bearbeitet immer nur die erste box sauber. nach abschluss des tages setzt er wohl alles wieder richtig zurück und startet am nächsten tag sauber mit der ersten box und macht dann bei der zweiten box wieder die fehler.

woran liegt das?

im anhang ist die aktualisierte version.

vielen dank und lieben gruss
berlin

berlin 13.01.21 16:21

In dieser If-Abfrage musst du die Einzelteile in Klammern setzten, sonst wird es nicht so funktionieren, wie du dir das vorstellst. Dies gilt für auch für den Rest von deinem Code
Code:

      if(checkTime1()
        && inRange
        && rangePoints1 >= MinRangePoints && rangePoints1 <= MaxRangePoints
        && counterLong + counterShort < MaxTrades)

Gruß Timo[/QUOTE]

aber es ist doch in klammern und innerhalb der klammer mit && getrennt.

wenn du den neuen ea mal in den tester haust und eine box ausstellst siehst du das es genau so funktioniert wie es soll.

Indikator-Trading 13.01.21 22:48

Leider nicht zwingend, hängt auch mal gerne von der Interpretationsqualität des Compilers ab.

Nehmen wir mal nur den diesen Bereich hier:
MaxRangePoints && counterLong + counterShort < MaxTrades

(MaxRangePoints && counterLong) -> Boolsches Und und ergibt ein True/False
(counterShort < MaxTrades) -> Ergibt auch ein True/False

aber was ist dann mit dem + ?

Der Compiler könnte hieraus also (True/False) + (True/False) machen...

Du MUSST sauber programmieren, also so das es keinen Spielraum für Interpretationen gibt.

Ich mache eher zu viele Klammern, aber so ist die richtige Funktion immer vorgegeben:

Code:

 
if(checkTime1() &&
  inRange &&
  (rangePoints1 >= MinRangePoints) &&
  (rangePoints1 <= MaxRangePoints) &&
  ((counterLong + counterShort) < MaxTrades))


Indikator-Trading 13.01.21 22:51

OrderSend Error 3 bedeutet: ERR_INVALID_TRADE_PARAMETERS

Du hast also beim Senden der Order falsche Parameter übergeben. Bei PendingOrders ist das mal schnell der Fall, wenn der Preis über den Level liegt, bei welchem die PendingOrder eigentlich erst ausläsen sollte.

Schau dir also einfach ins Detail an, wann der Error entsteht und lass dir die OrderParameter mit ausgeben.
Gruß Timo

MA-EA 14.01.21 11:54

@ berlin

Nen Haufen Pending Orders platzieren, interessante Idee... :cool:

Dürfte auch nicht allzu schwierig sein... :confused:

Erzähl mal genau wie Du Dir das vorstellst.

Allerdings ist es nicht gerade von Vorteil, dass der Broker jeden Price, SL, TP usw. sehn kann. :(

berlin 14.01.21 13:36

Zitat:

Zitat von MA-EA (Beitrag 44964)
@ berlin

Nen Haufen Pending Orders platzieren, interessante Idee... :cool:

Dürfte auch nicht allzu schwierig sein... :confused:

Erzähl mal genau wie Du Dir das vorstellst.

Allerdings ist es nicht gerade von Vorteil, dass der Broker jeden Price, SL, TP usw. sehn kann. :(

nein, die idee ist:
1. es entsteht eine box innerhalb einer vordefinierten zeit
2. sie bildet ein lokales high und low
3. zum ende der box wird am high eine buystop order und am low eine sellstop order platziert.
4. nach eine definierten zeitraum werden die nicht abgeholten orders gelöscht.

folglich > klassischer range handel

- wenn der ea läuft und nur eine box eingeschaltet ist funktioniert es auch wunderbar.
- wenn aber beide boxen eingeschaltet sind gibt es bei der zweiten box das problem "ordersend error 3" und äussert sich so das er ständig stoporders eröffnet und sofort wieder schliesst. siehe screeshot aus meinem ersten beitrag.

in der zwischenzeit habe ich ihn neu geschrieben/umstrukturiert siehe meinen 2ten beitrag datei "range multibox"

das der broker meine parameter nach platzierung der orders sehen kann, stellt für mich kein problem dar.

berlin 14.01.21 13:50

Zitat:

Zitat von Indikator-Trading (Beitrag 44957)
Leider nicht zwingend, hängt auch mal gerne von der Interpretationsqualität des Compilers ab.

Nehmen wir mal nur den diesen Bereich hier:
MaxRangePoints && counterLong + counterShort < MaxTrades

(MaxRangePoints && counterLong) -> Boolsches Und und ergibt ein True/False
(counterShort < MaxTrades) -> Ergibt auch ein True/False

aber was ist dann mit dem + ?

Der Compiler könnte hieraus also (True/False) + (True/False) machen...

Du MUSST sauber programmieren, also so das es keinen Spielraum für Interpretationen gibt.

Ich mache eher zu viele Klammern, aber so ist die richtige Funktion immer vorgegeben:

Code:

 
if(checkTime1() &&
  inRange &&
  (rangePoints1 >= MinRangePoints) &&
  (rangePoints1 <= MaxRangePoints) &&
  ((counterLong + counterShort) < MaxTrades))


ah, verstehe. hab geltungsbereiche bis jetzt vorwiegend aus der perspektive von geschweiften klammern gesehen. aber mit einer präziseren klammersetzung werden unnötige missverständnisse vermieden.

vielen dank dafür!

berlin 14.01.21 19:53

Zitat:

Zitat von Indikator-Trading (Beitrag 44958)
OrderSend Error 3 bedeutet: ERR_INVALID_TRADE_PARAMETERS

Du hast also beim Senden der Order falsche Parameter übergeben. Bei PendingOrders ist das mal schnell der Fall, wenn der Preis über den Level liegt, bei welchem die PendingOrder eigentlich erst ausläsen sollte.

Schau dir also einfach ins Detail an, wann der Error entsteht und lass dir die OrderParameter mit ausgeben.
Gruß Timo

hey timo,

wie müsste die abfrage genau aussehen?

ich habe folgendes geschrieben:
Print("executeLong2=", rangePoints2,sl,tp,rangeHigh2);

bekomme das zurück:

executeLong2=5225.011570.6511659.4811622.9

das ist nicht so aussagekräftig :)

vielen dank und lieben gruss

MA-EA 14.01.21 22:30

Ähm - könntest Du mal Deinen ganzen Code genau erklären? Wie das ganze Gerät arbeiten soll? :confused:

berlin 15.01.21 09:54

Zitat:

Zitat von MA-EA (Beitrag 44970)
Ähm - könntest Du mal Deinen ganzen Code genau erklären? Wie das ganze Gerät arbeiten soll? :confused:

wie meinst du das?
es ist eine rangebreakout ea der wie folgt arbeitet:
1. es entsteht eine box innerhalb einer vordefinierten zeit 8:45-8:59
2. sie bildet ein lokales high und low
3. zum ende der box wird am high eine buystop order und am low eine sellstop order platziert.
4. nach eine definierten zeitraum werden die nicht abgeholten orders gelöscht. 10-20min nach platzierung der stop orders

das ganze ding funktioniert mit einer box wunderbar. ich möchte allerdings bis zu 8 boxen in eine ea unterbringen. um das zu ermöglichen arbeite ich gerade daran erstmal 2 boxen ohne gegenseitige korrelation laufen zu lassen. wie ersichtlich stosse ich da auf schwierigkeiten im ea.

um überschneidungen zu vermeiden habe ich alle parameter und aus meiner sicht box relevante funktionen so umbenannt, dass es theoretisch keine überschneidungen mehr gibt.

da die boxen einzeln eingeschaltet sauber funktionieren kann ich mir den ordersend error 3 bisher noch nicht erklären.

aktuell bin ich auf der suche nach lernmaterial wie ich am besten auf fehlersuche gehe.

ansonsten denke ich kann dir ein blick in den code bestimmt die reihenfolge/funktionsweise verdeutlichen.

vielen dank und lieben gruss,
berlin

MA-EA 15.01.21 12:15

Lad bitte noch mal die neueste Version hoch. Am besten mit Erklärungen drin. :rolleyes:

AVT 15.01.21 13:06

Zitat:

Zitat von berlin (Beitrag 44968)
ich habe folgendes geschrieben:
Print("executeLong2=", rangePoints2,sl,tp,rangeHigh2);

bekomme das zurück:
executeLong2=5225.011570.6511659.4811622.9

das ist nicht so aussagekräftig

Dann schreibe mal genau dazu, was er printed, anstatt alles hintereinander zu packen, in etwa so:
Code:

Print(" executeLong2:"
      " rangePoints2=",(double)rangePoints2,
      " sl=",(double)sl,
      " tp=",(double)tp,
      " rangeHigh2=",(double)rangeHigh2,
      " current bid=",(double)Bid,
      " current ask=",(double)Ask
    );

AVT

berlin 15.01.21 14:00

verlauf dokumentiert
 
Liste der Anhänge anzeigen (Anzahl: 1)
ich habe den verlauf mal mit dem tester dokumentiert indem ich bei den einzelnen schritten einen screenshot vom chart und vom journal gemacht habe.

im anhang:

-5seitige pdf > auf der letzten seite habe ich dann nochmal die box 2 einzeln geprüft um zu checken ob am code was falsch ist.

der fehler muss im zusammenführen der boxen zu einen ea liegen

- der aktuelle code > habe die klammerreglen von timo da schon übernommen


die pdf ist mir irgendwie abhanden gekommen. hat jetzt eine ewigkeit gedauert...********. die screenshots hab ich noch und werde sie nachher nachreichen.

berlin 15.01.21 14:02

Zitat:

Zitat von AVT (Beitrag 44977)
Dann schreibe mal genau dazu, was er printed, anstatt alles hintereinander zu packen, in etwa so:
Code:

Print(" executeLong2:"
      " rangePoints2=",(double)rangePoints2,
      " sl=",(double)sl,
      " tp=",(double)tp,
      " rangeHigh2=",(double)rangeHigh2,
      " current bid=",(double)Bid,
      " current ask=",(double)Ask
    );

AVT

mega, so eine antwort hab ich gebraucht. sitz jetzt schon den ganzen tag dran. werde wenn ich die pdf doku nochmal geschrieben mal ausprobieren.

vielen dank!

berlin 15.01.21 14:04

Zitat:

Zitat von MA-EA (Beitrag 44976)
Lad bitte noch mal die neueste Version hoch. Am besten mit Erklärungen drin. :rolleyes:

neuste version ist hochgeladen.

werde wenn ich die pdf neu gemacht habe aber nochmal den code mit kommentaren hochladen...

berlin 15.01.21 19:40

Liste der Anhänge anzeigen (Anzahl: 2)
so, jetzt die pdf mit der screenshot doku und der code mit kommentaren...

vielen dank! lieben gruss und einen schönen abend in die runde :)

MA-EA 16.01.21 02:53

Liste der Anhänge anzeigen (Anzahl: 1)
1.
Was hat irgendwelche Order-Sucherei in der Init-Funktion zu suchen? :confused:

2.
Wenn ich das richtig verstehe, willst Du bei bestimmten Highs/Lows Stop-Orders platzieren.

3.
Ist das Ganze irgendwie ganz schön unübersichtlich und zum Teil zu kompliziert geschrieben. Versuch mal, Alles so einfach und übersichtlich zu halten, wies geht.

4.
Habs nich genau gesehn, aber einige Bedingungen werden anscheinend global fest gelegt und sind dann die ganze Ausführung lang gültig, egal was kommt. Kann mich da aber auch irren. :rolleyes:

Edit:Hab jetzt erst mal nur eine "Vereinfachung" vor genommen:
Code:

extern bool TRAILINGSTOP=false;
:rolleyes:

Halte Code möglichst einfach und übersichtlich, aber so eindeutig, dass es zu keinen Missverständissen kommen kann. ;)

Indikator-Trading 16.01.21 08:57

Zitat:

Zitat von MA-EA (Beitrag 44983)
Edit:Hab jetzt erst mal nur eine "Vereinfachung" vor genommen:
Code:

extern bool TRAILINGSTOP=false;
:rolleyes:

Halte Code möglichst einfach und übersichtlich, aber so eindeutig, dass es zu keinen Missverständissen kommen kann. ;)

Schöne Vereinfachung, jetzt lässt sich der EA, welchen du hochgeladen hast, halt nur nicht mehr compilieren...

traderdoc 16.01.21 15:02

Zitat:

Zitat von MA-EA (Beitrag 44983)
1.
Was hat irgendwelche Order-Sucherei in der Init-Funktion zu suchen? :confused:

2.
Wenn ich das richtig verstehe, willst Du bei bestimmten Highs/Lows Stop-Orders platzieren.

3.
Ist das Ganze irgendwie ganz schön unübersichtlich und zum Teil zu kompliziert geschrieben. Versuch mal, Alles so einfach und übersichtlich zu halten, wies geht.

4.
Habs nich genau gesehn, aber einige Bedingungen werden anscheinend global fest gelegt und sind dann die ganze Ausführung lang gültig, egal was kommt. Kann mich da aber auch irren. :rolleyes:

Edit:Hab jetzt erst mal nur eine "Vereinfachung" vor genommen:
Code:

extern bool TRAILINGSTOP=false;
:rolleyes:

Halte Code möglichst einfach und übersichtlich, aber so eindeutig, dass es zu keinen Missverständissen kommen kann. ;)

Die Ratschläge von Dir, @MA-EA, das ist schon eine humoristische Einlage.

traderdoc

berlin 16.01.21 16:25

yea, ich hab den fehler gefunden :) :) :)

der geltungsbereich für den delete orders bereich habe ich jetzt eingeschränkt zwischen

if((TimeCurrent() >= tradingEnd) && (TimeCurrent() <= rangeStart2)) deleteAll()

das wird jetzt zwischen jeder box geschrieben und am ende bei der letzten box die orginal zeile.

hab mir jetzt ein bild von edison über den schreibtisch gehängt um mir zu verdeutlcihen das die nadel ja irgendwo im heuhaufen sein muss :)

wünsche euch ein schönes weekend!


Alle Zeitangaben in WEZ +2. Es ist jetzt 23:54 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