Zum Inhalt springen
View in the app

A better way to browse. Learn more.

#T/N/X/T

A full-screen app on your home screen with push notifications, badges and more.

To install this app on iOS and iPadOS
  1. Tap the Share icon in Safari
  2. Scroll the menu and tap Add to Home Screen.
  3. Tap Add in the top-right corner.
To install this app on Android
  1. Tap the 3-dot menu (⋮) in the top-right corner of the browser.
  2. Tap Add to Home screen or Install app.
  3. Confirm by tapping Install.

Problem beim Auslesen eines Custom Indicators

Geschrieben

Hallo zusammen,

 

Ich möchte einen EA programmieren der aus einem Custom Indicator (ADX-Crossing) ein Buy oder Sell Signal ausliest und dementsprechend Positionen aufbaut. Leider verstehe ich nicht wie man im EA die Variable vom Custom Indikator ausliest... Daran scheitert es bereits... :( Die Suche habe ich bereits benutzt, und auch Themen gefunden die dieses Gebiet behandeln, aber bisher bin ich noch auf keine Lösung gekommen.

 

Hättet ihr einen Lösungsvorschlag, bzw. eine Erklärung? Das wäre super, und würde mir sehr weiterhelfen.

 

Indikator ADX Crossing

 

#property indicator_chart_window
#property indicator_buffers 2
#property indicator_color1 Lime
#property indicator_color2 Red

//---- input parameters
extern int ADXbars=14;
extern int CountBars=350;

//---- buffers
double val1[];
double val2[];
double b4plusdi,nowplusdi,b4minusdi,nowminusdi;

//+------------------------------------------------------------------+
//| Custom indicator initialization function						 |
//+------------------------------------------------------------------+
int init()
 {
  string short_name;
//---- indicator line
  IndicatorBuffers(4);
  SetIndexStyle(0,DRAW_ARROW);
  SetIndexArrow(0,108);
  SetIndexStyle(1,DRAW_ARROW);
  SetIndexArrow(1,108);
  SetIndexBuffer(0,val1);
  SetIndexBuffer(1,val2);
//----
  return(0);
 }
//+------------------------------------------------------------------+
//| AltrTrend_Signal_v2_2											|
//+------------------------------------------------------------------+
int start()
 {   
 
  bool buy,sell;
  if (CountBars>=Bars) CountBars=Bars;
  SetIndexDrawBegin(0,Bars-CountBars);
  SetIndexDrawBegin(1,Bars-CountBars);
  int i,shift,counted_bars=IndicatorCounted();


  //---- check for possible errors
  if(counted_bars<0) return(-1);

  //---- initial zero
  if(counted_bars<1)
 {
  for(i=1;i<=CountBars;i++) val1[CountBars-i]=0.0;
  for(i=1;i<=CountBars;i++) val2[CountBars-i]=0.0;
 } 

for (shift = CountBars; shift>=0; shift--) 
{ 

b4plusdi=iADX(NULL,0,ADXbars,PRICE_CLOSE,MODE_PLUSDI,shift-1);
nowplusdi=iADX(NULL,0,ADXbars,PRICE_CLOSE,MODE_PLUSDI,shift);
b4minusdi=iADX(NULL,0,ADXbars,PRICE_CLOSE,MODE_MINUSDI,shift-1);
nowminusdi=iADX(NULL,0,ADXbars,PRICE_CLOSE,MODE_MINUSDI,shift); 
if (b4plusdi>b4minusdi && nowplusdi<nowminusdi)
{
  val1[shift]=Low[shift]-5*Point;
//val1[0]=1;
}else{
  //val1[0]=0;
}
if (b4plusdi<b4minusdi && nowplusdi>nowminusdi) 
{
  val2[shift]=High[shift]+5*Point;
//val2[0]=1;
}else{
  //val2[0]=0;
}


}
  return(0);
 }
//+------------------------------------------------------------------+

 

EA

 

//---- input parameters
extern double	Lots=0.1;
extern double	StopLoss=0.00040;
//---- input parameters
extern int ADXbars=14;
extern int CountBars=350;

//---- buffers
double val1[];
double val2[];
double b4plusdi,nowplusdi,b4minusdi,nowminusdi;
//+------------------------------------------------------------------+
//| expert initialization function								   |
//+------------------------------------------------------------------+
int init()
 {
//---- 
  
//----
  return(0);
 }
//+------------------------------------------------------------------+
//| expert deinitialization function								 |
//+------------------------------------------------------------------+
int deinit()
 {
//---- 
  
//----
  return(0);
 }

//+------------------------------------------------------------------+
//| expert start function											|
//+------------------------------------------------------------------+
int start()
 {
 int A=14;
 int C=350;
 int buy = iCustom(NULL,0,"ADX Crossing",A,C,0,0);
 int sell = iCustom(NULL,0,"ADX Crossing",A,C,1,0);
 
 Print ("Buy: ",buy);
 Print ("Sell: ",sell);

  return(0);
 }
//+------------------------------------------------------------------+

 

Meine kläglichen VErsuche habe ich bereits ausgeklammert :(

 

Grüße

Heinz E.

Bearbeitet von Heinz E.

Featured Replies

Geschrieben

Hallo Heinz,

 

Zuerstmal Hilfe zuer Selbsthilfe ;) :

Wenn du den Indikator auf einen Chart ziehst und dann ins Datenfenster schaust (Strg + D) siehst du welche "Linien" der Indikator zeichnet (vor allem wieviele und welche Werte sie wann haben).

Diese Werte kannst du (wie du es schon richtig versucht hast) per iCustom(...) auslesen wobei der vorletzte Parameter angibt welche Linie dich interessiert (durchnummeriert, startend bei 0) und der letzte Parameter gibt an von welchem Bar (als Offset vom aktuellen, also aktueller Bar = 0 etc) du den Wert willst.

 

 

In deinem Fall ist die "Linie" vom Indikator keine wirkliche Linie (sondern nur die paar Punkte) aber dich interessiert hier ja auch nicht welchen Wert der Punkt hat, sondern ob es einen Punkt gibt (Wert != 0) oder eben keinen (Wert = 0).

Hilft dir das weiter?

 

 

Die Suche habe ich bereits benutzt, und auch Themen gefunden die dieses Gebiet behandeln,

:wub:

Geschrieben
  • Autor

Hallo Mythos,

 

Vielen Dank für deine Hilfe! Mittlerweile glaube ich zu verstehen, wie das mit dem Aufrufen funktioniert. Leider habe ich ein Problem meine Variable buy und sell geben mir jeweils eine Sehr große Zahl zurück:

 

2010.01.23 20:28:31 2009.01.09 19:15 ADX_Self EURUSD,M15: Buy zum Kurs von 2147483647

 

In dieser Variable sollte aber drin stehen: z.B 1.4532. Desweiteren spuckt er 2147483647 das jede neue Bar aus...

Sowohl in der buy als auch in der sell Variable :(

Also doch noch nicht so verstanden? Ich meine der Custom Indikator Aufruf ist doch richtig? Habe die 0 beim ersten Ind. Aufruf angegeben, da Sie so im Indikator definiert und initialsiert wird.

 

Nun bin ich wieder mit meinem Latein am Ende, und hoffe sehr das ihr mir helfen könnt.

 

Grüße

Heinz

 

PS: Code nun wie folgt ...

//+------------------------------------------------------------------+
//| expert start function											|
//+------------------------------------------------------------------+
int start()
 {
 int A=14;
 int C=350;
 double buy = iCustom(NULL,0,"ADX Crossing",A,C,0,0);
 double sell = iCustom(NULL,0,"ADX Crossing",A,C,1,0);
 
 if(buy != 0.0) Print ("Buy zum Kurs von ",buy);
 if(sell != 0.0) Print ("Sell zum Kurs von ",sell);

  return(0);
 }
//+------------------------------------------------------------------+

Geschrieben

eiei, das is/war aber ein fieser Fehler...

 

Der Wert den du rauskriegst ist der EMPTY_VALUE, warum du in rauskriegst: du greifst immer auf den wert des aktuellen Bars zu (ob das sinnvoll ist, ist eine andere Frage), schau dir mal im Indikator an, was passiert wenn du den Wert für den aktuellen Bar (also shift = 0) berechnest. Fällt dir was auf? ;) (wenn du mit "b4" "before" meinst dann ist shift-1 die falsche Richtung, der vorige Bar ist shift+1 ;)

 

Aufruf vom Indi etc. "passt". Ich würd überlegen ob shift 0 wirklich Sinn macht, der Wert ändert sich ja noch. Und dein Debugoutput "...zum Preis von " ist hoffentlich nur so geschrieben, weil der Wert den der Indi ausgibt ist ja nur auf dem Preislevel damit der Punkt direkt über/unter den Bar gezeichnet wird oder?

Geschrieben

Hallo Heinz,mal ne frage wo rufst du den einen externen Indikator auf.?

oder verstehe ich da was falsch.

Gruß Karlos

Geschrieben

Externe Indikatoren ruft man mit iCustom auf:

http://docs.mql4.com/indicators/iCustom

 

#include kann man nutzen, wenn man den Quelltext aus einem externen File (bspw. *.mqh) einlesen will - bspw. wenn man gewisse Grundbausteine nutzt, die man dann einfach immer einbindet. Falls einem der Quelltext nicht "lesbar" vorliegt (bspw. *.dll oder *.ex4), man aber auf eine im File enthaltene Funktion zurück greifen will, sollte man sich #import mal näher anschauen.

Dein Kommentar

Du kannst jetzt schreiben und Dich später registrieren. Wenn Du ein Konto hast, melde Dich jetzt an, um unter Deinem Benutzernamen zu schreiben.

Gast
Auf dieses Thema antworten...

Account

Navigation

Suche

Suche

Configure browser push notifications

Chrome (Android)
  1. Tap the lock icon next to the address bar.
  2. Tap Permissions → Notifications.
  3. Adjust your preference.
Chrome (Desktop)
  1. Click the padlock icon in the address bar.
  2. Select Site settings.
  3. Find Notifications and adjust your preference.