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)
-   -   Pivot-EA (http://www.expert-advisor.com/forum/showthread.php?t=4671)

Nici 06.01.16 12:47

Pivot-EA
 
Hey!

folgendes Problem: Der EA soll eine Long-Order eröffnen, sobald die Pivotlinie von unten nach oben durchkreuzt wird.
Um das dem EA zu sagen, dachte ich mir dass eine Buy-Order eröffnet werden soll, wenn der Askpreis über der Pivotlinie liegt und gleichzeitig die letzten 10 Hochs unter dieser Linie...
Doch leider funktioniert es nicht so wie gedacht. In den ganzen Backtest kann ich nicht nachvollziehen, warum genau jetzt eine Order platziert wird, wenn der Ask-Preis doch unter der Pivotlinie liegt und die letzten 10 Kerzen ebenfalls??

Danke schon mal für Eure Hilfe!

http://www.directupload.net/file/d/4...7xtf8v_png.htm


Code:

//Buy Order       
  //Long Signal 1
      if(Ask>Pivot)
        {
        LongSignal1 = true;
        }
      else
        {
        LongSignal1 = false;
        }
  //Long Signal 2   
      if(iHighest(Symbol(),0,MODE_HIGH,10)<Pivot)
        {
        LongSignal2 = true;
        }
      else
        {
        LongSignal2 = false;
        }
   
  //Buy-Order plaziezen   
    if(LongSignal1=true && LongSignal2==true)
        {
        Order=OrderSend(Symbol(),OP_BUY,0.1,Ask,5,StopLossLevel,TakeProfitLevel);
        }


traderdoc 06.01.16 13:41

1. entweder über die Kreuzung bzgl. des Close der letzten geschlossenen Kerze:

//Buy Order
if(price1 < Pivot && Ask > Pivot) {
Order=OrderSend(Symbol(),OP_BUY,0.1,Ask,5,StopLoss Level,TakeProfitLevel);
}

Oder
2. rein über das aktuelle Kreuzen mittels des aktuellen Kurses, wie bereits von Dir beschrieben:

//Buy Order
if(Ask > Pivot) {
Order=OrderSend(Symbol(),OP_BUY,0.1,Ask,5,StopLoss Level,TakeProfitLevel);
}

Dass der EA dann nicht mehrere Orders öffnet, wird über die Abfrage geregelt, ob bereits eine Buy- oder SellOrder offen ist.

traderdoc

Nici 06.01.16 14:14

Zitat:

Zitat von traderdoc (Beitrag 32429)
1. entweder über die Kreuzung bzgl. des Close der letzten geschlossenen Kerze:

//Buy Order
if(price1 < Pivot && Ask > Pivot) {
Order=OrderSend(Symbol(),OP_BUY,0.1,Ask,5,StopLoss Level,TakeProfitLevel);
}

Oder
2. rein über das aktuelle Kreuzen mittels des aktuellen Kurses, wie bereits von Dir beschrieben:

//Buy Order
if(Ask > Pivot) {
Order=OrderSend(Symbol(),OP_BUY,0.1,Ask,5,StopLoss Level,TakeProfitLevel);
}

Dass der EA dann nicht mehrere Orders öffnet, wird über die Abfrage geregelt, ob bereits eine Buy- oder SellOrder offen ist.

traderdoc

Würde hier der EA nicht permanent neue Orders eröffnen, solange der Kurs über dem Pivot ist? (bzw. sobald der SL/TP erreicht ist, eine neue Position eröffnen solange der Kurs über dem Pivot ist?)

traderdoc 06.01.16 16:18

Zitat:

Zitat von Nici (Beitrag 32431)
Würde hier der EA nicht permanent neue Orders eröffnen, solange der Kurs über dem Pivot ist? (bzw. sobald der SL/TP erreicht ist, eine neue Position eröffnen solange der Kurs über dem Pivot ist?)

Ich hatte doch im letzten Satz geschrieben:

"Dass der EA dann nicht mehrere Orders öffnet, wird über die Abfrage geregelt, ob bereits eine Buy- oder SellOrder offen ist."

D.h. es wird vor der Orderöffnung eingebaut:

if (!BuyOrderOffen) { //d.h. der EA springt nur dann in die Öffnungsroutine, wenn keine BuyOrder offen ist. Das kann nach Belieben verfeinert werden.
.....
}

traderdoc

Nici 06.01.16 16:51

Zitat:

Zitat von traderdoc (Beitrag 32433)
Ich hatte doch im letzten Satz geschrieben:

"Dass der EA dann nicht mehrere Orders öffnet, wird über die Abfrage geregelt, ob bereits eine Buy- oder SellOrder offen ist."

D.h. es wird vor der Orderöffnung eingebaut:

if (!BuyOrderOffen) { //d.h. der EA springt nur dann in die Öffnungsroutine, wenn keine BuyOrder offen ist. Das kann nach Belieben verfeinert werden.
.....
}

traderdoc

Keine Angst, ich habe genau gelesen und diese Funktion war bereits von Anfang an eingebaut.
Ich meine folgendes:
Der Kurs ist über dem Pivot --> Buy-Order wird eröffnet.
Der Kurs erreicht den Takeprofit --> Position wird geschlossen ABER sofort wieder eine neue eröffnet, da der Kurs IMMER NOCH über dem Pivot ist.

Es soll aber nur eine Positon eröffnet werden, wenn das Pivot-Level von unten nach oben durchkreuzt wird...das ist mein Problem.^^

Nici 06.01.16 17:13

Zitat:

Zitat von Nici (Beitrag 32435)
Keine Angst, ich habe genau gelesen und diese Funktion war bereits von Anfang an eingebaut.
Ich meine folgendes:
Der Kurs ist über dem Pivot --> Buy-Order wird eröffnet.
Der Kurs erreicht den Takeprofit --> Position wird geschlossen ABER sofort wieder eine neue eröffnet, da der Kurs IMMER NOCH über dem Pivot ist.

Es soll aber nur eine Positon eröffnet werden, wenn das Pivot-Level von unten nach oben durchkreuzt wird...das ist mein Problem.^^

Habs gelöst :). Für diejenigen, die es auch interessiert:
Code:

//Buy-Order platzieren wenn Ask über Pivot, aber nicht mehr als 10 Ticks   
    if(Ask>Pivot && Ask<Pivot+0.0001)
        {
        Order=OrderSend(Symbol(),OP_BUY,0.1,Ask,10,StopLossLevel,TakeProfitLevel);
        }


traderdoc 06.01.16 17:43

Das sehe ich nicht als optimale Lösung:
Code:

//Buy-Order platzieren wenn Ask über Pivot, aber nicht mehr als 10 Ticks   
if(Ask>Pivot && Ask<Pivot+0.0001) {
  Order=OrderSend(Symbol(),OP_BUY,0.1,Ask,10,StopLossLevel,TakeProfitLevel;
}

Weil dann immer wenn der Ask in diesem Kursbereich ist, eine neue BuyOrder geöffnet wird, egal ob schon eine offen ist oder durch SL oder TP geschlossen wurde, sofern der Kurs sich dann wieder in diesen Bereich bewegt.


Bei meinem Code fehlt?? plötzlich die Zuweisung:
double price1 = Close[1];
oder gleich in die Abfrage integrieren.

Code:

if(Close[1] < Pivot && Ask > Pivot) {
  Order=OrderSend(Symbol(),OP_BUY,0.1,Ask,5,StopLoss Level,TakeProfitLevel);
}

Hier wird nur die Abfrage nach der offenen Order dazugefügt:

Code:

if (!BuyOrderIsOpen) {
  if(Close[1] < Pivot && Ask > Pivot) {
      Order=OrderSend(Symbol(),OP_BUY,0.1,Ask,5,StopLoss Level,TakeProfitLevel);
  }
}

und nun muß noch die an entsprechender Stelle ermittelte Closezeit "LastOrderCloseTime" der letzten Order verarbeitet werden:

Code:

if (!BuyOrderIsOpen) {
  if (Time[0] > LastOrderCloseTime) {
      if(Close[1] < Pivot && Ask > Pivot) {
        Order=OrderSend(Symbol(),OP_BUY,0.1,Ask,5,StopLoss Level,TakeProfitLevel);
      }
  }
}

So, nun wird der EA nur einmalig eine BuyOrder öffnen, sobald das Close der letzten geschlossenen Kerze unter dem Pivot lag und der aktuelle Ask erstmalig über dem Pivot liegt. Will man nicht das Close nehmen, sondern das High, dann wird anstelle Close[1] einfach High[1] eingesetzt.
Eine nächstes Open gäbe es nur, wenn auf einer der nächsten Kerzen nach! der OrderCloseKerze wieder der Kurs von unterhalb des Pivot dann über den Pivot erstmalig steigt.

traderdoc

Nici 06.01.16 20:15

Erstmal vielen Dank für deine Hilfe!!

Leider funktioniert dein Vorschlag nicht, dass nur maximal eine Order eröffnet wird.
Der Tipp mit Close[1] war dagegen genial! Danke!!
Habe es jetzt so gelöst:
Code:

// maximal eine Position offen
      if(OrdersTotal()>0)
      {
        return(0);
      }
//Buy Order       
  //Buy-Order platzieren   

      if(High[1] < Pivot && Ask > Pivot)
        {
        Order=OrderSend(Symbol(),OP_BUY,0.1,Ask,5,StopLossLevel,TakeProfitLevel);
        }


traderdoc 06.01.16 22:03

Zitat:

Zitat von Nici (Beitrag 32438)
Erstmal vielen Dank für deine Hilfe!!
Leider funktioniert dein Vorschlag nicht, dass nur maximal eine Order eröffnet wird.

Warum nicht, was hast Du beobachtet?
Sind die Variablen BuyOrderIsOpen und LastOrderCloseTime ordnungsgemäß! ermittelt worden? Kannst Du den Code dazu hier reinstellen?

Die Abfrage if (!BuyOrderIsOpen) wird definitv! false ergeben, wenn BuyOrderIsOpen = true ist. Und die ist dann true, wenn über OrderSelect() eine
offene BuyOrder, die zum jeweiligen Chart gehört, auf dem der EA läuft, ermittelt wird.

traderdoc

Nici 07.01.16 18:35

Zitat:

Zitat von traderdoc (Beitrag 32439)
Warum nicht, was hast Du beobachtet?
Sind die Variablen BuyOrderIsOpen und LastOrderCloseTime ordnungsgemäß! ermittelt worden? Kannst Du den Code dazu hier reinstellen?

Die Abfrage if (!BuyOrderIsOpen) wird definitv! false ergeben, wenn BuyOrderIsOpen = true ist. Und die ist dann true, wenn über OrderSelect() eine
offene BuyOrder, die zum jeweiligen Chart gehört, auf dem der EA läuft, ermittelt wird.

traderdoc

Hier mein Code
Code:

  for(int i=0;i<OrdersTotal();i++)
{
   
   
  if(OrderSelect(i,SELECT_BY_TICKET,MODE_TRADES)>0)
  {
  BuyOrderIsOpen=true;
  }
  else
    {
    BuyOrderIsOpen=false;
    }
  //LastOrderCloseTime
 
  if(OrderSelect(i,SELECT_BY_TICKET,MODE_HISTORY))
    {
    LastOrderCloseTime = OrderCloseTime();
    }
}   
  //Buy
  if (!BuyOrderIsOpen)
  {
      if (Time[0] > LastOrderCloseTime)
      {
            if(High[1] < Pivot && Ask > Pivot)
              {
                  ticket=OrderSend(Symbol(),OP_BUY,0.1,Ask,5,StopLossLevel,TakeProfitLevel);
              }
      }
    }

Ab einem bestimmten Zeitpunkt werden keine Orders mehr eröffnet, obwohl die Bedingungen erfüllt sind.
Bei meiner Version funktioniert es dagegen.
Vielleicht findest du ja meinen Fehler...

traderdoc 07.01.16 19:00

Ja, der Fehler liegt in mehreren Details.

Es muß lauten:
Code:

BuyOrderIsOpen=false;
SellOrderIsOpen=false;
for(int i = OrdersTotal()-1; i >= 0; i--) {
  if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES)>0) {
      if(OrderSymbol() == Symbol() && OrderMagicNumber == MagicNumber) {
        if (OrderType() == OP_BUY)  {
            BuyOrderIsOpen=true;
            break;
        } 
        if (OrderType() == OP_SELL) {
            SellOrderIsOpen=true;
            break;
        }
      }
  }
}

LastOrderCloseTime = 0;
for(i = OrdersTotal()-1; i >= 0; i--) { 
  if(OrderSelect(i,SELECT_BY_POS,MODE_HISTORY)) {
      if(OrderSymbol() == Symbol() && OrderMagicNumber == MagicNumber) {
          if (OrderType == OP_BUY || OrderType() == OP_SELL) {
            LastOrderCloseTime = OrderCloseTime();
            break;
          }
      }
  }
}
   
//Buy
if (!BuyOrderIsOpen) {
  if (Time[0] > LastOrderCloseTime) {
      if(High[1] < Pivot && Ask > Pivot) {
        ticket=OrderSend(Symbol(),OP_BUY,0.1,Ask,5,StopLossLevel,TakeProfitLevel, "",MagicNumber);
      }
  }
}

Hier
if(OrderSelect(i,SELECT_BY_TICKET,MODE_TRADES)>0)
muß statt SELECT_BUY_TICKET SELECT_BUY_TRADES
stehen. Ansonsten müßte für i die Tickenummer angegeben werden und nicht die Orderposition in der Orderliste.
Desweiteren sollte mindestens nach dem Chartsymbol und ggf. nach der MagicNumber abgefragt werden. Wenn es keine gibt, dann muß diese Variable wieder aus dem OrderSend gelöscht werden und auch in den Abfragen.
Die Selektion nach dem Chartsymbol ist zwingend notwendig, weil sonst alle offenen bzw. geschlossnenen Orders durchsucht werden.
Das break ist wichtig, damit, von oben gezählt, nur die letzte Order betrachtet wird.

traderdoc

kamü 09.01.16 10:36

Hallo Nici,
wenn der EA funktioniert, würde mich mal ein Backtest interessieren.

Ich handle auch nach Pivot z. B. den EUR/USD im 4 Stundenchart,
allerdings manuell.

kamü

Nici 10.01.16 13:50

Zitat:

Zitat von kamü (Beitrag 32466)
Hallo Nici,
wenn der EA funktioniert, würde mich mal ein Backtest interessieren.

Ich handle auch nach Pivot z. B. den EUR/USD im 4 Stundenchart,
allerdings manuell.

kamü

Hallo!

Das beste Ergebnis welches ich im Backtest erzielen konnte war, dass das Konto nichts verlor.
Kurzfristig waren natürlich auch tolle Gewinne drinnen, aber langfristig funktionierte es bei mir nicht...
Habe es mit verschieden großen SL und TP probiert, fixem und prozentualem Risiko, verschiedenen CRVs, automatisches Break-Even-Ziehen bei 1R, usw.
Was ich nicht probiert habe, ist das der SL auf der letzten Unterstützung bzw. Widerstand war und auf Grund dessen auch ein Trade geschlossen wird.

Ich denke, dass man sich mehr auf U+W sowie die Trendrichtung konzentrieren sollte, kann das aber noch nicht beweisen.
Nächster EA soll genau danach handeln, jedoch macht mir momentan die Definition von einer Korrektur noch ziemlich zu schaffen...:confused:

Habe im Netz einen kostenloses EA gefunden, der nach Pivot handelt und auch um einiges professioneller ist als meiner (aber offensichtlich auch keine phänomenalen Gewinne abwirft, da er sonst nicht frei verfügbar wäre...)
Kannst du dir bei Interesse ja mal an anschauen :)

http://tradarz.com/expert-advisor-do...ot-panther.php

LG
Nici

Drosselbart 14.01.16 21:41

Ich handel manuell und da klappt es. 'Kann den Fehler auch nicht finden.


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