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

dieter23 07.06.16 22:01

Kerzenwechsel
 
Hallo,
1. wie kann ich einen Kerzenwechsel d.h. long Kerze nach short Kerze u. umgekehrt abfragen.

2. nach Eröffnen eines Trades soll nach z.B. 4 Kerzen die Position wieder geschlossen werden.

Bitte um Hilfe.
Gruß Dieter

traderdoc 07.06.16 22:15

zu1.)
Long- zu Short-Kerze:

if (Close[2] > Open[2] && Close[1] < Open[1])

Short- zu Long-Kerze:

if (Close[2] < Open[2] && Close[1] > Open[1])

zu 2.)
if (Time[0] > OrderOpenTime() + 4*Period()*60)

traderdoc

dieter23 08.06.16 08:40

Danke für die schnelle Antwort
LG
Dieter

dieter23 08.06.16 12:09

Hab mal versucht das Schließen der Order in den Ea einzubauen. Klappt leider nicht.Wo ist der Fehler?


extern int StopLoss=50;
extern int TakeProfit=50;

//+------------------------------------------------------------------+

void start()
{
double SL,TP;
int i,Total;
int Dig=MarketInfo(Symbol(),MODE_DIGITS);
int order_ticket;
//+------------------------------------------------------------------+

Total=OrdersTotal();
if(Total>0)
{
for(i=Total-1; i>=0; i--)
{
if(OrderSelect(i, SELECT_BY_POS, MODE_TRADES)==true)
{
if(OrderSymbol()==Symbol() && OrderType()==OP_SELL && OrderStopLoss()==0 && OrderTakeProfit()==0)
{


if(StopLoss>0)SL=OrderOpenPrice()+StopLoss*Point;e lse SL=0;
if(TakeProfit>0)TP=OrderOpenPrice()-TakeProfit*Point;else TP=0;
OrderModify(OrderTicket(),OrderOpenPrice(),Normali zeDouble(SL,Dig),NormalizeDouble(TP,Dig),0,CLR_NON E);
if (Time[0] > OrderOpenTime() + 2*Period()*60)

OrderClose(OrderTicket(),0.1,Bid,3,0);
return(0);


}
if(OrderSymbol()==Symbol() && OrderType()==OP_BUY && OrderStopLoss()==0 && OrderTakeProfit()==0)
{
if(StopLoss>0)SL=OrderOpenPrice()-StopLoss*Point;else SL=0;
if(TakeProfit>0)TP=OrderOpenPrice()+TakeProfit*Poi nt;else TP=0;
OrderModify(OrderTicket(),OrderOpenPrice(),Normali zeDouble(SL,Dig),NormalizeDouble(TP,Dig),0,CLR_NON E);
if (Time[0] > OrderOpenTime() + 2*Period()*60)

OrderClose(OrderTicket(),0.1,Ask,3,0);
return(0);

}
}
}
}
}

traderdoc 08.06.16 15:29

"Klappt leider nicht" ist zwar das Endergebnis Deiner Beobachtung, mit der man aber manchmal sehr wenig anfangen kann. In diesem Falle ist der Fehler offensichtlich, dass bei OrderClose() die BuyOrder mit dem Bid und die SellOrder mit dem Ask geschlossen werden muß! Vorausgesetzt die Lotgröße beträgt tatsächlich 0.1.

Also, wenn irgendwas nicht klappt, dann gibt es in der Regel auch eine Fehlermeldung des MT4 im Terminal unter Reiter "Expert". Und in diesem Falle bin ich mir sicher, dass da stand: INVALID_PRICE.

traderdoc

dieter23 08.06.16 16:47

habe Bid und Ask getauscht, Order wird nicht beendet, läuft einfach weiter .
Beim Kompilieren erscheint keine Fehlermeldung nur Warnings.
Gruß
Dieter

traderdoc 08.06.16 17:06

Nein, ich meine nicht beim Compilieren, sondern wenn der EA im Chart läuft, werden alle Fehlermeldungen im Terminal unter dem Reiter "Expert" aufgelistet. Wenn der EA also zum erwarteten Zeitpunkt nicht schließt könnte da eine Meldung stehen.

Und dann nimm bitte zum Schreiben des Codes den Button # über dem Textfeld. Den Code kann man dann viel besser lesen.

Desweiteren wird der EA dann die Orders nicht schließen, weil über

if(OrderSymbol()==Symbol() && OrderType()==OP_SELL && OrderStopLoss()==0 && OrderTakeProfit()==0)

in diesen Teil nur eingesprungen wird, wenn auch tatsächlich SL und TP 0 sind. Das aber darunter der SL und TP in der Order gesetzt werden, würde beim nächsten Tick nicht mehr die Bedingung erfüllt sein und damit würde die Zeile

OrderClose(OrderTicket(),0.1,Bid,3,0);

nicht durchlaufen werden - also auch kein Close.

Es macht sich gut, immer an bestimmten Stellen ein Print("Irgendetwas"); einzufügen. Dann sieht man im Reiter Expert des Terminals nämlich, wo der EA langgelaufen ist und wo eben nicht.

traderdoc

dieter23 08.06.16 18:13

ok, hat geklappt. Jetzt noch Punkt 1. Umkehrkerze einbauen. Wo kann man die Abfrage am besten einbauen?
Danke im vorraus
Dieter

traderdoc 08.06.16 18:19

Am Anfang mittels:

Code:

//global datetime OldBar; deklarieren
if (OldBar != Time[0]) {
  //Abfrage und evtl. Aktion oder Variablensetzung zur späteren Verarbeitung
  OldBar = Time[0]
}

Diese if-Abfrage wird nur einmal am Anfang der Kerze durchlaufen.

traderdoc

dieter23 08.06.16 19:13

verstehe ich jetzt nicht. Wird mit dieser Abfrage festgestellt ob ein Kerzenwechsel vorliegt?

traderdoc 08.06.16 19:39

Ja klar. Da nur nach einem Kerzenwechsel die letzte und vorletzte Kerze abgefragt werden muß, braucht diese Abfrage auch nur einmalig pro Kerze sein.

traderdoc

dieter23 09.06.16 18:12

hab mal die Long Routine soweit hingebracht, daß das Opening bei Kerzenwechsel funktioniert, nur das Schließen geht nicht, d. h. die Position wird sofort geschlossen. Im Terminal wird angezeigt: invalid ticket for OrderClose function.

Code:
extern double Lot=0.01;
extern int StopLoss=6;
extern int TakeProfit=10;
int Multiplier;
int i=0;

int zaehler;
int MagicNumber=1234;
double TPValue,SLValue;

//+------------------------------------------------------------------+

void OnInit() {
Multiplier = 1;
if(Digits == 3 || Digits == 5) Multiplier = 10;
if(Digits == 6) Multiplier = 100;
if(Digits == 7) Multiplier = 1000;

TakeProfit *= Multiplier;
StopLoss *= Multiplier;

TPValue = NormalizeDouble(TakeProfit * Point, Digits);
SLValue = NormalizeDouble(StopLoss * Point, Digits);

}

void start()
{
int ticket;
string comment="Expiration v2 (Long)";
//+------------------------------------------------------------------+
int offeneorders=0;
int anzahlorders=OrdersTotal();

if (Close[2] < Open[2] && Close[1] > Open[1])
{
for(zaehler=0; zaehler<anzahlorders; zaehler++)
{
OrderSelect(zaehler, SELECT_BY_POS, MODE_TRADES);
if(OrderSymbol()==Symbol())
{
offeneorders++;
}
}

if(offeneorders==0)

{
ticket=OrderSend(Symbol(),OP_BUY,Lot,Ask,3,Ask-SLValue,Ask+TPValue,comment,0,0,Blue);
}
if (Time[0] > OrderOpenTime() + 4*Period()*60)
{
OrderClose(ticket,Lot,Bid,3,0);
}
}
return(0);
}

traderdoc 09.06.16 20:11

Ich habe mir mal erlaubt, den Code per #-Button so darzustellen, dass man ihn auch lesen kann. So sollte das in Zukunft immer geschrieben werden, sonst kann ihn keiner helfen!

Code:

extern double Lot=0.01;
extern int StopLoss=6;
extern int TakeProfit=10;
int Multiplier;
int i=0;

int zaehler;
int MagicNumber=1234;
double TPValue,SLValue;

//+------------------------------------------------------------------+

void OnInit() {
  Multiplier = 1;
  if(Digits == 3 || Digits == 5) Multiplier = 10;
  if(Digits == 6) Multiplier = 100;
  if(Digits == 7) Multiplier = 1000;

  TakeProfit *= Multiplier;
  StopLoss *= Multiplier;

  TPValue = NormalizeDouble(TakeProfit * Point, Digits);
  SLValue = NormalizeDouble(StopLoss * Point, Digits);
}

void start() {
  int ticket;
  string comment="Expiration v2 (Long)";
  //+------------------------------------------------------------------+
  int offeneorders=0;
  int anzahlorders=OrdersTotal();

  if (Close[2] < Open[2] && Close[1] > Open[1]) {
      for(zaehler=0; zaehler<anzahlorders; zaehler++) {
        OrderSelect(zaehler, SELECT_BY_POS, MODE_TRADES);
        if(OrderSymbol()==Symbol()) {
            offeneorders++;
        }
      }

      if(offeneorders==0) {
        ticket=OrderSend(Symbol(),OP_BUY,Lot,Ask,3,Ask-  SLValue,Ask+TPValue,comment,0,0,Blue);
      }
      if (Time[0] > OrderOpenTime() + 4*Period()*60) {
        OrderClose(ticket,Lot,Bid,3,0);
      }
  }
  return(0);
}

So kann das Programm nicht funktionieren.
Ich habe Einiges umgestellt und v.a. über Funktionsaufrufe den Code strukturiert und die SellOpen-Funktion eingebaut.

Code:

extern double Lot=0.01;
extern int StopLoss=6;
extern int TakeProfit=10;
int Multiplier;
int i=0;
int OffeneOrders;
int MagicNumber=1234;
double TPValue, SLValue;
string Comment = "Expiration v2 (Long)";

//+------------------------------------------------------------------+

int OnInit() {
  Multiplier = 1;
  if(Digits == 3 || Digits == 5) Multiplier = 10;
  if(Digits == 6) Multiplier = 100;
  if(Digits == 7) Multiplier = 1000;

  TakeProfit *= Multiplier;
  StopLoss *= Multiplier;

  TPValue = NormalizeDouble(TakeProfit * Point, Digits);
  SLValue = NormalizeDouble(StopLoss * Point, Digits);

  return(INIT_SUCCEEDED);
}

void OnTick() {
  CheckOrders();
  CheckOpening();
}

void CheckOrders() {
  bool ret;
  OffeneOrders = 0;
  for(int i = OrdersTotal()-1; i >= 0; i--) {
      if (OrderSelect(i, SELECT_BY_POS, MODE_TRADES)) {
        if(OrderSymbol() == Symbol()) {
            if (OrderType() == OP_BUY) {
                if (Time[0] > OrderOpenTime() + 4*Period()*60) {
                  ret = OrderClose(OrderTicket(), OrderLots(), Bid, 3, 0);
                  if (ret) continue;
              }
            }
            if (OrderType() == OP_SELL) {
                if (Time[0] > OrderOpenTime() + 4*Period()*60) {
                  ret = OrderClose(OrderTicket(), OrderLots(), Ask, 3, 0);
                  if (ret) continue;
              }
            }
            OffeneOrders++;
        }
      }
  }
}

void CheckOpening() {
  if (Close[2] < Open[2] && Close[1] > Open[1]) {
      if(OffeneOrders == 0) {
        int ticket = OrderSend(Symbol(), OP_BUY, Lot, Ask, 3, Ask-SLValue, Ask+TPValue, Comment, 0, 0, Blue);
      }
  }
  if (Close[2] > Open[2] && Close[1] < Open[1]) {
      if(OffeneOrders == 0) {
        int ticket = OrderSend(Symbol(), OP_SELL, Lot, Bid, 3, Bid+SLValue, Bid-TPValue, Comment, 0, 0, Green);
      }
  }
}

Viel Erfolg!

traderdoc

dieter23 09.06.16 20:26

DANKE ! !
werde es gleich ausprobieren.
LG
Dieter

dieter23 10.06.16 16:47

Hallo traderdoc,
klappt prima, jetzt wollte ich noch, daß wenn die Position geschlossen wird, er nicht sofort in die laufende Kerze wieder eröffnet.
Gruß
Dieter23

traderdoc 10.06.16 17:12

Code:

datetime OldBar;

void OnTick() {
  if (OldBar != Time[0]) {
      CheckOpening();
      OldBar = Time[0];
  }
  CheckOrders();
}

Ich summiere mal das Honorar schon mal langsam auf.

traderdoc

dieter23 10.06.16 17:18

vielleicht erinnern Sie sich noch an mich, Sie haben mir vor ca. 2 Jahre einen Bot programmiert. Name devisen-scalper, der martingalmäßig nachkauft über RSI Signal. Lief eine Weile sehr gut, dann hat er mir mein Konto geplättet.
Gruß
Dieter23

traderdoc 10.06.16 17:45

Ja natürlich. Das ist natürlich sehr schade, lag jedoch nicht an meinem Teil der Programmierung. Der Hauptteil des EAs war fremdgecodet, was auch nicht bedeutet, dass da die Ursache zu suchen sei. Ein Handelssystem auf Martingale-Basis ist immer ein heißes Eisen, mit viel Potential nach oben, aber eben auch nach unten.

Wenn es wieder mal was zu programmieren gibt, dann sagen Sie einfach Bescheid.

traderdoc

dieter23 10.06.16 18:44

Ja klar, Ihre Programmierung war spitze. War halt sehr riskant mit Martingale.
Wenn ich wieder Hilfe brauche melde ich mich.Ok.
LG
Dieter23


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