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)
-   -   EA lässt nur einen offenen Trade im Metatrader 4 zu. (http://www.expert-advisor.com/forum/showthread.php?t=6666)

VARO_TRADING 17.05.20 12:52

EA lässt nur einen offenen Trade im Metatrader 4 zu.
 
Hallo an diese geniale Trader Gemeinde.

Ich bin einer der neuen aus der letzten Woche.
Zuerst mal an alle Profis hier ein großes Lob für die ganzen super Tipps hier im Forum. Da ist ein Anfänger so wie ich es bin sehr froh drüber.

Ich trade seit ca. einem Jahr so wie es die Freizeit zulässt mit dem typischen Anfänger Erfolg. Ich habe seit diesem Jahr einige EAs ausprobiert welche mal besser mal überhaupt nicht funktionieren wollten. Ich habe mich versucht mit den ganzen Fachbegriffen und Programmierungen zu beschäftigen und habe letztlich mit etwas Unterstützung den hier aufgeführten EA programmiert.

Er funktioniert so gesehen auch schon recht gut und ich bin damit zufrieden. Jedoch lässt er nur 1 offenen Trade im Metatrader 4 zu. Andere Qährungspaare können bei einem offen Teade und verfügbaren Signal nicht öffnen.

Ich habe schon einige Beiträge hier im Forum ausprobiert. Aber das will immer noch nicht funktionieren.

Ich hoffe es kann mir hier jemand helfen.

Grüße an alle hier.

QUELLTEXT:


void OnTick()
{

// Erstelle ein Signal
string signal="";

// Definition des EA
double K0=iStochastic(_Symbol,_Period,5,3,3,MODE_SMA,0,MO DE_MAIN,0);
double D0=iStochastic(_Symbol,_Period,5,3,3,MODE_SMA,0,MO DE_SIGNAL,0);
double K1=iStochastic(_Symbol,_Period,5,3,3,MODE_SMA,0,MO DE_MAIN,1);
double D1=iStochastic(_Symbol,_Period,5,3,3,MODE_SMA,0,MO DE_SIGNAL,1);

//Verkaufssignal
if ((K0>56)&&(D0>56))
if ((D1>K0)&&(D1<K1))
{
signal="Verkaufen";
}

//Kaufssignal
if ((K0<44)&&(D0<44))
if ((D1<K0)&&(D1>K1))
{
signal="Kaufen";
}*

// Kaufe 2 Microlot
if(signal=="Kaufen" && OrderIsOpen==true)
OrderSend(_Symbol,OP_BUY,0.02,Ask,3,Ask-120*_Point,Ask+54*_Point,NULL,0,0,Green);

// Verkaufe 2 Mikrolot
if(signal=="Verkaufen" && OrderIsOpen==true)
OrderSend(_Symbol,OP_SELL,0.02,Bid,3,Bid+120*_Poin t,Bid-54*_Point,NULL,0,0,Red);

// Chart Ausgabe fuer das Signal
Comment("Das aktuelle Signal ist: ",signal);

}

traderdoc 17.05.20 13:49

Es ist eben immer besser, wenn der gesamte Code geschrieben wird, weil
ein wichtiges Detail vorenthalten wurde:

Wo wird das Flag

OrderIsOpen==true

gesetzt?

Wenn das auf false steht, dann kann auch nur eine Order geöffnet werden.

Mal nebenbei: Von der Wortwahl her ist das natürlich nicht logisch zu schreiben,
OrderIsOpen==true und dann soll eine Order geöffnet werden, weil OrderIsOpen ja bedeutet, es ist bereits eine Order offen.

Besser wäre die Formulierung gewesen:

OrderIsOpen==false

Das hätte jetzt allerdings nicht das Problem der einmaligen Orderöffnung gelöst.
D.h. sollen mehrere Orders geöffnet werden können, dann sollte OrderIsOpen ganz wegfallen.

traderdoc

VARO_TRADING 18.05.20 00:55

Hi.

Das mit OrderIsOpen=truhe war einer der Versuche in der Hoffnung es würde funktionieren. So wie er jetzt unten steht habe ich Ihn aktuell im Einsatz. Statt OrdersIsOpen steht da OrdersTotal()=0

Aber da lässt er eben nur einen offenen Trade zu. Erst wenn dieser durch TP oder SL geschlossen wurde und ein anderes Paar erhält ein Signal, dann öffnet das andere Paar ein Signal. Lasse ich aber OrdersTotal weg, dann öffnet er immer so lange Trdes bis kein Signal mehr gegeben wird. Das geht im schlimmsten Fall bis ins unendliche.

Ich weiß nicht wie ich es eingrenzen kann.

Da gibt es doch sicher einen Weg. Bitte. :(

Gruß Peter

void OnTick()
{

// Erstelle ein Signal
string signal="";

// Definition des EA
double K0=iStochastic(_Symbol,_Period,5,3,3,MODE_SMA,0,MO DE_MAIN,0);
double D0=iStochastic(_Symbol,_Period,5,3,3,MODE_SMA,0,MO DE_SIGNAL,0);
double K1=iStochastic(_Symbol,_Period,5,3,3,MODE_SMA,0,MO DE_MAIN,1);
double D1=iStochastic(_Symbol,_Period,5,3,3,MODE_SMA,0,MO DE_SIGNAL,1);

//Verkaufssignal
if ((K0>56)&&(D0>56))
if ((D1>K0)&&(D1<K1))
{
signal="Verkaufen";
}

//Kaufssignal
if ((K0<44)&&(D0<44))
if ((D1<K0)&&(D1>K1))
{
signal="Kaufen";
}*

// Kaufe 2 Microlot
if(signal=="Kaufen" && OrdersTotal()==0)
OrderSend(_Symbol,OP_BUY,0.02,Ask,3,Ask-120*_Point,Ask+54*_Point,NULL,0,0,Green);

// Verkaufe 2 Mikrolot
if(signal=="Verkaufen" && OrdersTotal()=0)
OrderSend(_Symbol,OP_SELL,0.02,Bid,3,Bid+120*_Poin t,Bid-54*_Point,NULL,0,0,Red);

// Chart Ausgabe fuer das Signal
Comment("Das aktuelle Signal ist: ",signal);

}

Indikator-Trading 18.05.20 06:09

Ich kann mir nicht vorstellen dass dein Code fehlerfrei kompilieren kann. Nach der geschweiften Klammer des Kaufsignals steht ein * Zeichen, was da mal absolut nichts zu suchen hat

VARO_TRADING 18.05.20 06:46

Hi.

Stimmt. Das gehört da nicht hin. Das muss beim kopieren des Quellcodes passiert sein.

Hast Du eine Lösung für mein Problem?

Gruß Peter

Indikator-Trading 18.05.20 07:52

Ja, einfache Lösung:
Du lässt es nicht zu, dass mehr als ein Trade offen ist.

Nimm "OrdersTotal()==0" aus deinen if-Abfragen, und dann sollte das funktionieren. OrdersTotal() gibt dir alles an was du offen hast, also auch Trades und PendingOrders welche in anderen Symbolen aktiv sind.

TraumExperte 18.05.20 08:26

Hallo Peter,

Du kannst das schon mit dem bool Flag machen. Nur den musste halt auch irgendwo definierne und ändern. am besten in Kombination mit dem

Returnwert der Ordersend().

Also

if(signal=="Kaufen" && OrderIsOpen==false){
ticket = OrderSend(...);

if (ticket >0 ) OrderIsOpen= true;
}

Mit dieser Triviallösung würde der EA nur einmal aus diesem Chart handeln. Insoweit wäre das Problem mit verschieden Charts gelöst. Solange das System sauber läuft.

Gruß

Traumexperte

VARO_TRADING 18.05.20 08:57

Hi.

Danke für die schnelle Antwort.

Also benötige ich genau Deinen Vorschlag?
Oder muss ich da im Detail noch mehr definieren?

Muss ich das an einer bestimmten Stelle setzen?
Sorry. Bin da noch nicht so fit.

Gruß Peter

TraumExperte 18.05.20 09:35

Hallo Peter,

ob das nun 100% für Dich passt weiss ich nicht. Hängt davon ab was Du vorhast. Und ich übernehme auch keine Gewähr dafür was Du mit dem Codeschnipsel anfängst. Er soll Dir einfach nur helfen zu lernen. Also der Code dient nur zu Ausbildungszwecken.

Du musst auf jedenfall noch int ticket und auch Dein bool Flag deklarieren. GGf die Sell Variante anpassen. Du findest schon heraus an welchen Stelle dies zu tun ist. Kleine Hausaufgabe ;-)




Gruß TraumExperte

Indikator-Trading 18.05.20 09:42

Code:

  for(int k = OrdersTotal() - 1; k >= 0; k--)
      if(OrderSelect(k, SELECT_BY_POS,MODE_TRADES)) 
        if(OrderSymbol() == Symbol() && OrderMagicNumber() == MagicNumber)
          return; // Eine Order ist für dieses Symbol bereits offen!

Erklärung:
Du durchsuchst alle Orders (auch PendingOrders) und selektierst sie. Ist das Symbol identisch mit dem aus deinem Chart und die MagicNumber ebenfalls gleich, dann wird keine neue Order in dem Symbol geöffnet, andere Orders können aber durchaus in anderen Symbolen erfolgen.
Wichtig: Gib am besten für jeden EA in jedem Symbol eine neue MagicNumber mit. Wenn du z.B. irgendwann einmal 2 Systeme auf dem DAX laufen lässt (eins in M5 und eins in M15 z.B.), dann dient die MagicNumber zum Unterscheiden dieser Orders


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