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

Trading111 20.09.16 09:13

Problemchen (Kreuzung MAs)
 
Liste der Anhänge anzeigen (Anzahl: 2)
Hallo,
eine kurze Frage zu meinem programmierten EA. Es geht um die Kreuzung von e MAs. Der EA funtioniert und läuft - allerdings wirft die Kontrolle auf dem Diagramm Fragen auf. Manchmal wird richtig buy/sell gesetzt und manchmal nicht (siehe Bild). #13 wird buy geordert, obwohl sell geordert werden müsste. Und bei #11 ist es auch fehlerhaft.
Ich habe erst angefangen mit mql - vielleicht kann mir ja einer helfen.

Die Abfrage ist eigentlich korrekt:
// Buy Signal
if(MA_lang < MA_kurz && MA_lang_Vorperiode >=MA_kurz_Vorperiode)

Dennoch muss er ja irgendwie bei der Abfrage auf falsche Werte zugreifen. Ich weiß auch nicht wie man die Parameter aktuell anzeigen lassen kann - also wie in matlab z.B. - da konnte ich es immer kontrollieren.
Da komme ich derzeit einfach nicht weiter.
Falls einer antwortet - danke schonmal

VG
Sven

MA-EA 20.09.16 11:01

Zitat:

Zitat von Trading111 (Beitrag 35840)
// Buy Signal
if(MA_lang < MA_kurz && MA_lang_Vorperiode >=MA_kurz_Vorperiode)

Versteh ich gerade nicht. :confused: Widerspricht sich das nicht?

Trading111 20.09.16 11:16

Zitat:

Zitat von MA-EA (Beitrag 35849)
Versteh ich gerade nicht. :confused: Widerspricht sich das nicht?

also Danke auf jeden Fall für die Antwort.....
Kaufsignal wenn: zur aktuellen Periode der Wert des langsamen MAs (MA(30) hier) kleiner ist als der des schnellen MAs (MA(8) hier) - und zusätzlich in der Periode davor der Wert vom MA(30) aber größer war als der vom MA(8)......

also gerade der Wechsel stattgefunden hat und der schnelle jetzt über dem langsamen liegt.............also für mich erscheint das noch als richtig oder wo siehst du da das Problem?.....der erste Teil in der Bedingung ist die aktuelle Periode und danch kommt die Periode davor......



P.S.:ich bin für jeden Einwurf dazu dankbar

traderdoc 20.09.16 12:23

Da widerspricht sich gar nichts.

Wenn ich es richtig gelesen habe, willst Du die Kreuzung auf der aktuellen! Kerze ausnutzen. Da rate ich immer ab, weil es häufig falsch-positive Signale gibt, denn während des Kerzenaufbaus kommt es häufig wieder zur Revidierung der Kreuzung und das evtl. mehrmals innerhalb der aktuellen Kerze.

Prinzipiell löst man die Erkennung der Kreuzung genau über die Betrachtung der Indikatorwerte zu zwei verschiedenen Perioden.

Demnach für Buy:
if (MA0_Lang < MA0_Kurz && MA1_Lang >= MA1_Kurz)

bzw. für Sell:
if (MA0_Lang > MA0_Kurz && MA1_Lang <= MA1_Kurz)

So, nun musst Du nur noch die entsprechenden MA-Werte, ermittelt aus der iMA() oben einsetzen und gut ist.
Will man die Kreuzung auf der letzten geschlossenen Kerze betrachten, dann bedeutet die 0 (aktuelle Kerze) dann die 1 (letzte geschlossene Kerze) und die 1 wird zur 2 (vorletzte geschlossene Kerze).

traderdoc

Trading111 20.09.16 16:19

Zitat:

Zitat von traderdoc (Beitrag 35852)
Da widerspricht sich gar nichts.

Wenn ich es richtig gelesen habe, willst Du die Kreuzung auf der aktuellen! Kerze ausnutzen. Da rate ich immer ab, weil es häufig falsch-positive Signale gibt, denn während des Kerzenaufbaus kommt es häufig wieder zur Revidierung der Kreuzung und das evtl. mehrmals innerhalb der aktuellen Kerze.

Prinzipiell löst man die Erkennung der Kreuzung genau über die Betrachtung der Indikatorwerte zu zwei verschiedenen Perioden.

Demnach für Buy:
if (MA0_Lang < MA0_Kurz && MA1_Lang >= MA1_Kurz)

bzw. für Sell:
if (MA0_Lang > MA0_Kurz && MA1_Lang <= MA1_Kurz)

So, nun musst Du nur noch die entsprechenden MA-Werte, ermittelt aus der iMA() oben einsetzen und gut ist.
Will man die Kreuzung auf der letzten geschlossenen Kerze betrachten, dann bedeutet die 0 (aktuelle Kerze) dann die 1 (letzte geschlossene Kerze) und die 1 wird zur 2 (vorletzte geschlossene Kerze).

traderdoc


Danke für die ANtwort traderdoc. Im festsetzen der iMAs habe ich das aber glaube schon so beachtet wie du das meintest......

// Marktdaten ermitteln
double MA_lang = iMA(NULL,0,MA_lang,0,0,0,1);
double MA_lang_Vorperiode = iMA(NULL,0,MA_lang,0,1,0,2);
double MA_kurz = iMA(NULL,0,MA_kurz,0,0,0,1);
double MA_kurz_Vorperiode = iMA(NULL,0,MA_kurz,0,1,0,2);


1 für die vorherige und die 2 für die davor......ich glaube es muss an etwas anderem liegen...

SusanneH 20.09.16 17:02

Zitat:

Zitat von Trading111 (Beitrag 35858)
Danke für die ANtwort traderdoc. Im festsetzen der iMAs habe ich das aber glaube schon so beachtet wie du das meintest......

// Marktdaten ermitteln
double MA_lang = iMA(NULL,0,MA_lang,0,0,0,1);
double MA_lang_Vorperiode = iMA(NULL,0,MA_lang,0,1,0,2);
double MA_kurz = iMA(NULL,0,MA_kurz,0,0,0,1);
double MA_kurz_Vorperiode = iMA(NULL,0,MA_kurz,0,1,0,2);


1 für die vorherige und die 2 für die davor......ich glaube es muss an etwas anderem liegen...

Ist das nur ein Codebeispiel oder ist das Echtcode aus deinem EA?
Denn du verwendest die Variable MA_lang / MA_kurz für 2 unterschiedliche Dinge.
double MA_lang = iMA(NULL,0,MA_lang,0,0,0,1);

Trading111 20.09.16 17:25

Zitat:

Zitat von SusanneH (Beitrag 35859)
Ist das nur ein Codebeispiel oder ist das Echtcode aus deinem EA?
Denn du verwendest die Variable MA_lang / MA_kurz für 2 unterschiedliche Dinge.
double MA_lang = iMA(NULL,0,MA_lang,0,0,0,1);

Hallo Susanne,

ja das ist aus dem Echtcode - ich glaube dafür kamen Warnhinweise (in gelben Dreiecken) aber keine richtigen Fehlermeldungen. Meinen Sie das es so richtig ist?......aber jetzt kommt immer noch ein gelbes Dreieck: 'declaration of 'MA_lang' hides global declaration' .......

// Marktdaten ermitteln
double MA_lang = iMA(NULL,0,int (MA_lang),0,0,0,1);
double MA_lang_Vorperiode = iMA(NULL,0,int (MA_lang),0,0,0,2);
double MA_kurz = iMA(NULL,0,int (MA_kurz),0,0,0,1);
double MA_kurz_Vorperiode = iMA(NULL,0,int (MA_kurz),0,0,0,2);

also die Fehlermeldung erscheint jetzt für die hier 1. und 3. Zeile.....das meinst du bestimmt in irgendeiner Form oder?

Trading111 20.09.16 18:03

achso entsprechend meiner Vorlage muss ich glaube vorne MAlang und MAkurz schreiben (also ohne Unterstrich)

und nach dem Gleichzeichen in der Fkt. iMA steht es mit Unterstrich also....MA_lang und MA_kurz...........

ja das könnte auch das Problem sein.....ich probiere es mal aus....

MA-EA 20.09.16 18:17

Er soll also erst öffnen, wenn der Schnelle den langsamen gerade erst überholt hat. Dann wird es aber oft passieren, dass er nen Trend
verschläft oder erst zu spät einsteigt. Lass diese Regel raus.

An den Unterstrichen wirds nicht liegen.

traderdoc 20.09.16 18:48

Zitat:

Zitat von MA-EA (Beitrag 35862)
Er soll also erst öffnen, wenn der Schnelle den langsamen gerade erst überholt hat. Dann wird es aber oft passieren, dass er nen Trend
verschläft oder erst zu spät einsteigt. Lass diese Regel raus.

An den Unterstrichen wirds nicht liegen.

Schneller als auf der aktuellen Kerze die Kreuzung zu ermitteln, geht nicht. Jedoch das Problem der Kreuzung auf der aktuellen Kerze habe ich weiter unten beschrieben.

Ganz einfach, der Code muß wie folgt lauten:

Code:

double MA_lang            = iMA(NULL,0,MA_Periode_lang,0,0,0,1);
double MA_lang_Vorperiode = iMA(NULL,0,MA_Periode_lang,0,0,0,2);
double MA_kurz            = iMA(NULL,0,MA_Periode_kurz,0,0,0,1);
double MA_kurz_Vorperiode = iMA(NULL,0,MA_Periode_kurz,0,0,0,2);

Und in Deiner Angabe MA(80) wäre dann die MA_Periode eben 80.
D.h. Du benötigst eine MA_Periode_kurz und eine MA_Periode_lang. Fertig!

traderdoc

Trading111 21.09.16 11:04

Liste der Anhänge anzeigen (Anzahl: 1)
Zitat:

Zitat von traderdoc (Beitrag 35863)
Und in Deiner Angabe MA(80) wäre dann die MA_Periode eben 80.
D.h. Du benötigst eine MA_Periode_kurz und eine MA_Periode_lang. Fertig!

traderdoc

Danke für die Antwort Traderdoc. Es hat mir geholfen und ich hab es so umgesetzt. Er setzt jetzt schon zuerst beim Kreuzen die richtige Order - aber nach dem Teke Profit setzt er gleich die nächste Order ohne, dass tatsächlich eine Kreuzung stattgefunden hat (siehe Bild). Da kann ja nicht sein.
Beim kompilieren kommen aber nur noch Wrnhinweise 'implicit conversion from string to number'. Aber das kann doch nicht der Grund sein oder doch?

Code:

#property copyright "Copyright 2016, MetaQuotes Software Corp."
#property link      "https://www.mql5.com"
#property version  "1.00"
#property strict
//+------------------------------------------------------------------+
//| Expert initialization function                                  |
//+------------------------------------------------------------------+
extern int MA_Periode_lang = 30;
extern int MA_Periode_kurz = 8;
extern double HandelsLots = 0.1, SL_prozent = 0.5, TP_prozent = 1.5;
extern int MagicNummer = 12345;
extern int OrdersTotal;

// Globale Variable
datetime PeriodenStartZeit;
bool NeuePeriodeBegonnen,LongSignal,ShortSignal;
int LongOrder, ShortOrder;
//void Sleep(int milliseconds);
//int TimeWaiting = 0;

int OnInit()
  {
//---
    PeriodenStartZeit = Time[0];
//---
  return(INIT_SUCCEEDED);
  }
//+------------------------------------------------------------------+
//| Expert deinitialization function                                |
//+------------------------------------------------------------------+
void OnDeinit(const int reason)
  {
//---
 
  }
//+------------------------------------------------------------------+
//| Expert tick function                                            |
//+------------------------------------------------------------------+
//void OnTick()
//  {
//---
 
//  }
//+------------------------------------------------------------------+

// expert function
int start ()
{
  // Überprüfen ob neuer Periodenbeginn vorliegt
  if(PeriodenStartZeit != Time[0])
      {
        NeuePeriodeBegonnen = true;
        PeriodenStartZeit = Time[0];
      }
  else NeuePeriodeBegonnen = false;
     
  // Marktdaten ermitteln
  double MA_lang            = iMA(NULL,0,MA_Periode_lang,0,0,0,1);
  double MA_lang_Vorperiode = iMA(NULL,0,MA_Periode_lang,0,0,0,2);
  double MA_kurz            = iMA(NULL,0,MA_Periode_kurz,0,0,0,1);
  double MA_kurz_Vorperiode = iMA(NULL,0,MA_Periode_kurz,0,0,0,2);
 
  if (LongSignal == false && ShortSignal == false)
  {
  // Handelssignale ermitteln
      if(NeuePeriodeBegonnen == true)
      {
        // Buy Signal
        if(MA_lang < MA_kurz && MA_lang_Vorperiode >= MA_kurz_Vorperiode)
            {
              LongSignal = true;
            }
        else LongSignal = false;
               
        // Sell Signal
        if(MA_lang > MA_kurz &&  MA_lang_Vorperiode <= MA_kurz_Vorperiode)
        {
            ShortSignal = true;
        }
        else ShortSignal =false;
      }
      else
      {
        LongSignal = false;
        ShortSignal = false;
      }
 
    }
 
  // LongSignale umsetzen
  if (LongSignal == true)
  {
      // eventuell Short Order schließen   
      if (ShortOrder>0)
      {
          if (OrderSelect(ShortOrder,SELECT_BY_TICKET) == 0)
          {
              bool ShortOrderGeclosed = OrderClose(ShortOrder,HandelsLots,Ask,10,Blue);
              if (ShortOrderGeclosed == true) ShortOrder = 0;
          }
      }
      while (LongOrder <= 0)
      {
        LongOrder = OrderSend(Symbol(),OP_BUY, HandelsLots,Ask,10,0,"MAXing Long",MagicNummer,0,Green);
      }
  }
  if (ShortSignal == true)
  {
      // eventuell Long Order schließen   
      if (LongOrder>0)
      {
          if (OrderSelect(LongOrder,SELECT_BY_TICKET) == true)
          {
              bool LongOrderGeclosed = OrderClose(LongOrder,HandelsLots,Bid,10,Blue);
              if (LongOrderGeclosed == true) LongOrder = 0;
          }
      }
      while (ShortOrder <= 0)
      {
        ShortOrder = OrderSend(Symbol(),OP_SELL, HandelsLots,Bid,10,0,"MAXing Short",MagicNummer,0,Red);
      }
  }
 
 /*  // SL Long Deals setzen
  if (OrderSelect(LongOrder,SELECT_BY_TICKET) == true)
  {
      if (OrderCloseTime() == 0 && OrderStopLoss()==0)
      {
        double StopLoss = NormalizeDouble(OrderOpenPrice()/(1+(SL_prozent/100)),Digits);
        bool OrderAngepasst = OrderModify(OrderTicket(),OrderOpenPrice(),StopLoss,OrderTakeProfit(),0,Yellow);
      }
  }
 
  // SL Short Deals setzen
  if (OrderSelect(ShortOrder,SELECT_BY_TICKET) == true)
  {
      if (OrderCloseTime() == 0 && OrderStopLoss()==0)
      {
        double StopLoss = NormalizeDouble(OrderOpenPrice()*(1+(SL_prozent/100)),Digits);
        bool OrderAngepasst = OrderModify(OrderTicket(),OrderOpenPrice(),StopLoss,OrderTakeProfit(),0,Yellow);
      }
  } */
 
  // TP Long Deals setzen
  if (OrderSelect(LongOrder,SELECT_BY_TICKET) == true)
  {
      if (OrderCloseTime() == 0 && OrderTakeProfit()==0)
      {
        double TakeProfit = NormalizeDouble(OrderOpenPrice()*(1+(TP_prozent/100)),Digits);
        bool OrderAngepasst = OrderModify(OrderTicket(),OrderOpenPrice(),OrderStopLoss(),TakeProfit,0,Orange);
      }
  }
 
  // TP Short Deals setzen
  if (OrderSelect(ShortOrder,SELECT_BY_TICKET) == true)
  {
      if (OrderCloseTime() == 0 && OrderTakeProfit()==0)
      {
        double TakeProfit = NormalizeDouble(OrderOpenPrice()/(1+(TP_prozent/100)),Digits);
        bool OrderAngepasst = OrderModify(OrderTicket(),OrderOpenPrice(),OrderStopLoss(),TakeProfit,0,Orange);
      }
  }
 
  // Ticketnummern nach Closing zurücksetzen
  if (OrderSelect(LongOrder,SELECT_BY_TICKET) == true)
  {
      if (OrderTicket()>0 && OrderCloseTime()>0) LongOrder = 0;
  }
 
  if (OrderSelect(ShortOrder,SELECT_BY_TICKET) == true)
  {
      if (OrderTicket()>0 && OrderCloseTime()>0) ShortOrder = 0;
  }
  return(0);   
}


MA-EA 22.09.16 12:11

Wenn nach dem Schließen durch TP/SL die Öffnungsbedingungen
immer noch gegeben sind... Poste mal Bilder zum besseren Verständnis.

Trading111 22.09.16 19:20

Liste der Anhänge anzeigen (Anzahl: 1)
Zitat:

Zitat von MA-EA (Beitrag 35899)
Wenn nach dem Schließen durch TP/SL die Öffnungsbedingungen
immer noch gegeben sind... Poste mal Bilder zum besseren Verständnis.

Hallo MA-EA - danke für die Antwort. Ja ich glaube es könnte daran liegen. Ich probiere schon etwas jetzt dort zu modifizieren. Also es ist auffällig, dass immer direkt nach dem TP sofort wieder die gleiche Ordereröffnet wird. Die Bedingungen dazu bestehen zu der Zeit noch (siehe Bild). Nur wie erwähnt ich bin erst Anfänger und deswegen ist das bei mir noch nicht so schnell umgesetzt.

hier sind noch mal meine Bedingungen im Code:

if (LongSignal == false && ShortSignal == false)
{
// Handelssignale ermitteln
if(NeuePeriodeBegonnen == true)
{
// Buy Signal
if(MA_lang < MA_kurz && MA_lang_Vorperiode >= MA_kurz_Vorperiode)
{
LongSignal = true;
}
else LongSignal = false;

// Sell Signal
if(MA_lang > MA_kurz && MA_lang_Vorperiode <= MA_kurz_Vorperiode)
{
ShortSignal = true;
}
else ShortSignal =false;
}
else
{
LongSignal = false;
ShortSignal = false;
}

MA-EA 22.09.16 22:02

Mit dem TP ist das so ne Sache. Er wird nach diesem immer
wieder ne neue Order öffnen, solange entsprechende Bedingungen
gegeben sind. Versuch vielleicht z.B. nen Buy ohne TP zu schließen
wenn

Close Bar 1 < MA_kurz.


Buy öffnen wenn

Close Bar 1 > MA_kurz && MA_kurz > MA_lang

Umgedreht mit Sells. Dann kann er mal verschnaufen bzw.
Seitwärtsphasen auslassen.

Wobei ich immer noch nicht ganz kapiere, was das mit der
Vorperiode soll. :confused: Kannst Du das mal mit Chart-Bildern erklären?

Trading111 23.09.16 10:17

Liste der Anhänge anzeigen (Anzahl: 2)
Zitat:

Zitat von MA-EA (Beitrag 35908)
Mit dem TP ist das so ne Sache. Er wird nach diesem immer
wieder ne neue Order öffnen, solange entsprechende Bedingungen
gegeben sind. Versuch vielleicht z.B. nen Buy ohne TP zu schließen
wenn

Close Bar 1 < MA_kurz.


Buy öffnen wenn

Close Bar 1 > MA_kurz && MA_kurz > MA_lang

Umgedreht mit Sells. Dann kann er mal verschnaufen bzw.
Seitwärtsphasen auslassen.

Wobei ich immer noch nicht ganz kapiere, was das mit der
Vorperiode soll. :confused: Kannst Du das mal mit Chart-Bildern erklären?



Mit der Vorperiode meine ich die Periode, die genau vor der anderen Vergleichsperiode kommt - deswegen ist bei Vorperiode der Shift auf 2 gesetzt und bei den anderen auf 1 (siehe unten in rot)


double MA_lang = iMA(NULL,0,MA_Periode_lang,0,0,0,1);
double MA_lang_Vorperiode = iMA(NULL,0,MA_Periode_lang,0,0,0,2);
double MA_kurz = iMA(NULL,0,MA_Periode_kurz,0,0,0,1);
double MA_kurz_Vorperiode = iMA(NULL,0,MA_Periode_kurz,0,0,0,2);


Im Bild sieht man dass die sich da genau kreuzen - nach dem TP wird sofort die neue Order eröffnet (siehe 2. Bild). Das komische ist aber, dass doch dort garnicht die gesamte Bedingung erfüllt ist also Der rote Teil ist nicht erfüllt aus meiner Sicht:

// Buy Signal
if(MA_lang < MA_kurz && MA_lang_Vorperiode >= MA_kurz_Vorperiode)

schon komisch :)

SusanneH 23.09.16 11:39

Ich habe jetzt nur kurz drübergelesen über deinen Code, aber auf den ersten Blick würde ich sagen, dass du dein LongSignal / ShortSignal zurücksetzen musst.

Du checkst die Bedingung mit
if (LongSignal == false && ShortSignal == false)
{....}
und setzt nur dort drinnen die Signale zurück.
Wenn du aber bereits LongSignal=true hast, ein Trade eröffnet wird, dieser per TP geschlossen wird, kommt sofort der nächste Trade da LongSignal=true ist. (noch immer)

Trader6666 23.09.16 19:59

hab auch nur über den thread geschaut, aber ich bin mir sicher dass Susanne recht hat.

Wenn immer wieder neue Order eröffnet werden, dann nur weil die EntrySignale nicht zurück gesetzt werden oder die Variable einfach falsch ist. Glaub damit hat jeder Neuling zu kämpfen, kenn das auch ganz gut. Versuchs mal so:

Code:

  double MA_lang            = iMA(NULL,0,MA_Periode_lang,0,0,0,1);
  double MA_lang_Vorperiode = iMA(NULL,0,MA_Periode_lang,0,0,0,2);
  double MA_kurz            = iMA(NULL,0,MA_Periode_kurz,0,0,0,1);
  double MA_kurz_Vorperiode = iMA(NULL,0,MA_Periode_kurz,0,0,0,2);

if(BarCount != Bars)
  {
    if(/*Regel Kreuzung Long*/)
  {
    //OrderSend Long rein hauen
  }
    if(/* Regel Kreuzung Short*/)
  {
    //OrderSend Short rein hauen
  }
  BarCount = Bars;
  }

so fragst du die Einstiegssignale nur einmal pro neuer Kerze ab, was bei Kreuzungen ja auch eher sinn macht. So sparst du dir auch das rücksetzten der Signale. Must oben eben nur noch BarCount initialisieren oberhalb von start(). Bedeutet du setzt einfach folgende Zeile hin : int BarCount =0 ;

Es gibt zich Tutorials zu C++. Würd dir empfehlen erst mal Basics zu lernen bevor du weiter machst, denn dann tust du dich nicht so schwer, das hält doppelt und dreifach auf.Wenn man nicht weiß wofür int, double oder string steht,dann macht das echt keinen Sinn. Bin auch kein Profi also quereinsteiger und tuh mich oft trotz einigem Wissen noch schwer. Gelernte Programmierer haben es eben leichter :o

LG


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