Metatrader Forum | Forex Expert-Advisor | Broker & Forex Tools
Zurück   Metatrader Forum | Forex Expert-Advisor | Broker & Forex Tools > Metatrader 4 > Programmierung MQL4

Programmierung MQL4 Hier gehts rund ums Programmieren in MQL4.

Login
Benutzername:
Kennwort:


Statistik
Themen: 4973
Beiträge: 43258
Benutzer: 7.219
Aktive Benutzer: 81
Links: 84
Wir begrüßen unseren neuesten Benutzer: Hopfen&Malz
Mit 2.475 Benutzern waren die meisten Benutzer gleichzeitig online (16.01.20 um 22:38).
Neue Benutzer:
vor einem Tag
- Hopfen&Mal...
vor 2 Tagen
- frankmicha...
vor einer Woche
- DFeck
vor einer Woche
- bb1107
vor 2 Wochen
- rg-trader

Onlineuser
'Wer ist online' anzeigen Benutzer: 0
Gäste: 266
Gesamt: 266
Team: 0
Team:  
Benutzer:  
Freunde anzeigen

Empfehlungen

Like Tree2Likes
Thema geschlossen
 
Themen-Optionen Thema durchsuchen Ansicht
  #1 (permalink)  
Alt 04.04.15
Mitglied
 
Registriert seit: Oct 2011
Beiträge: 77
Biatsch befindet sich auf einem aufstrebenden Ast
Standard Frage an die Profis

Hi, ich bin gerade am überlegen, was genau die BREAK-Anweisung in folgendem Zusammenhang bewirkt.

Code:
void PlaceArrowUp(int Parameter){
   if(Bedingung1){
      for(int i=1;i<=100;ki){
         if(Bedingung2){
               x++;               
               break;
         }
      }
   }
}
Beendet BREAK hier die gesamte VOID-Funktion, oder nur die zweite IF-Bedingung, oder vieleicht nur die FOR-SCHLEIFE ?
  #2 (permalink)  
Alt 04.04.15
Mitglied
 
Registriert seit: Oct 2011
Beiträge: 77
Biatsch befindet sich auf einem aufstrebenden Ast
Standard

Und noch eine Frage:

Dass man nur eine begrenzte Zahl an indicator_buffers benutzen darf ist mir bewusst.

Aber kann es sein, dass man auch nur eine begrenzte Anzahl an gewöhnlichen Arrays verwenden darf ?
  #3 (permalink)  
Alt 04.04.15
Elite Mitglied
 
Registriert seit: Apr 2011
Beiträge: 2.733
traderdoc befindet sich auf einem aufstrebenden Ast
Standard

Zitat:
Zitat von Biatsch Beitrag anzeigen
Hi, ich bin gerade am überlegen, was genau die BREAK-Anweisung in folgendem Zusammenhang bewirkt.

Code:
void PlaceArrowUp(int Parameter){
   if(Bedingung1){
      for(int i=1;i<=100;ki){
         if(Bedingung2){
               x++;               
               break;
         }
      }
   }
}
Beendet BREAK hier die gesamte VOID-Funktion, oder nur die zweite IF-Bedingung, oder vieleicht nur die FOR-SCHLEIFE ?
Der Befehl break beendet nur die for-Schleife.

"Aber kann es sein, dass man auch nur eine begrenzte Anzahl an gewöhnlichen Arrays verwenden darf?"

Das wäre mir neu. Nur wird die Geschwindigkeitsperformance Deines PCs unter einer Vielzahl von Arrays leiden, v.a. wenn diese mehrdimensional sind und zahlreiche Felder aufweisen.

traderdoc
Biatsch and Ca$hDigger like this.
__________________
Ich erfülle Euch gern Eure EA-, Indikator- und Script-Programmierungswünsche auf Honorarbasis.
  #4 (permalink)  
Alt 22.04.15
Mitglied
 
Registriert seit: Oct 2011
Beiträge: 77
Biatsch befindet sich auf einem aufstrebenden Ast
Standard

Danke für die Antwort, ich frage mich nun, ob es in MQL eine Funktion gibt, die mir die Ableitung einer Indikatorlinie errechnet.

Falls es keine bessere Option gibt, errechne ich einfach die Steigung zwischen 2 nebeneinanderliegenden Punkten.
  #5 (permalink)  
Alt 22.04.15
Elite Mitglied
 
Registriert seit: Apr 2011
Beiträge: 2.733
traderdoc befindet sich auf einem aufstrebenden Ast
Standard

Nein, eine solche Funktion gibt es nicht.

traderdoc
__________________
Ich erfülle Euch gern Eure EA-, Indikator- und Script-Programmierungswünsche auf Honorarbasis.
  #6 (permalink)  
Alt 27.04.15
Mitglied
 
Registriert seit: Oct 2011
Beiträge: 77
Biatsch befindet sich auf einem aufstrebenden Ast
Standard

Beim anwenden meines Indikators habe ich festgestellt, dass er an manchen Stellen nicht die gewünschte Anzeige macht, obwohl der Code keine Syntax-Fehler enthält.

Ist es möglich, dass der Indikator mit anderen Kursdaten arbeitet, als sie im Chart angegeben werden ?

Ich meine gelesen zu haben, dass die Historie zum testen von von EA's von den angezeigten Werten abweicht und dass 2 Historien mit verschiedenen Datentypen existieren, auf die MT4 zugreift.

Meine Frage lautet nun: Kann ich eine Historie downloaden und MT4 so einstellen, dass auch genau diese Historie angezeigt UND mit ihr gerechnet wird ?

Geändert von Biatsch (27.04.15 um 21:30 Uhr)
  #7 (permalink)  
Alt 28.04.15
Elite Mitglied
 
Registriert seit: Apr 2011
Beiträge: 2.733
traderdoc befindet sich auf einem aufstrebenden Ast
Standard

Das Nichtanzeigen von Signalen muß ja nicht zwangsläufig auf Systaxfehler basieren. Oder anders gesagt, ein Systaxfehler würde automatisch zum Versagen der Lauffähigkeit des Indikators führen.

Und es wird nur auf die im entsprechenden Ordner hinterlegte Kurshistorie zurückgegriffen.

Viel wahrscheinlicher könne sein, dass der Indikator auf Daten in einem anderen TimeFrame zugreift und diese mitverarbeitet und dann im Arbeitstimeframe daraufhin keine Signale liefert. Dazu müßte man einen Blick in den Code werfen.

traderdoc
__________________
Ich erfülle Euch gern Eure EA-, Indikator- und Script-Programmierungswünsche auf Honorarbasis.
  #8 (permalink)  
Alt 28.04.15
Mitglied
 
Registriert seit: Oct 2011
Beiträge: 77
Biatsch befindet sich auf einem aufstrebenden Ast
Standard

Ich habe den Code mal etwas reduziert, um nur das Wesentliche zu zeigen.
Die Strategie ist dem ersten Bild zu entnehmen.

Code:
#property indicator_chart_window

#property indicator_buffers 3
#property indicator_color1 LightSeaGreen
#property indicator_color2 LightSeaGreen
#property indicator_color3 LightSeaGreen

extern int    UpperBandPeriod       = 34;
extern int    UpperBandShift        = 0;
extern double UpperBandDeviation    = 2.0;

extern int    MA_Period              = 21;
extern int    MA_Shift               = 0;

extern int    LowerBandPeriod       = 34;
extern int    LowerBandShift        = 0;
extern double LowerBandDeviation    = 2.0;

extern int    LowerBandPierced      = 26; //Anzahl Candles, die vergangan sind, seit das Lower Band unterschritten wurde
extern int    UpperBandPierced      = 26;

//============================= Dummies ======================
double Multiplier;
double AdjustedUpperBand;
double AdjustedMA;
double AdjustedLowerBand;
datetime TimeOld;
double BandDiff   = 0;
bool SetArrowUp   = false;
bool SetArrowDown = false;
int x             = 0;
//============================== Parameters ==================
double dDiff=0;
bool   bArrowPlacedLong  = false;
bool   bArrowPlacedShort = false;
int    MinClose = 0;
int    MaxClose = 0;
int    counterUP = 1;
// ================================= Arrays =====================
double MA[];
double Lower_Band[];

//============================= Place Arrow Up ==== ORIGINAL ======================================
void PlaceArrowUp(int i){
   

   
   if(    (Open[i]    > iMA(NULL,0,21,MA_Shift,MODE_SMA,PRICE_CLOSE,i)) 
       && (Open[i+1]  < iMA(NULL,0,21,MA_Shift,MODE_SMA,PRICE_CLOSE,i+1))
       && (Close[i+1] > iMA(NULL,0,21,MA_Shift,MODE_SMA,PRICE_CLOSE,i+1)) ){
      for(int k=1;k<=26;k++){
         if( Low[i+k] < (iMA(NULL,0,21,MA_Shift,MODE_SMA,PRICE_CLOSE,i+k)-0.02) ){
               x++;
               ObjectCreate("BUY" + x,OBJ_ARROW,0,Time[i],Low[MinClose]);
               ObjectSet   ("BUY" + x,OBJPROP_COLOR,Blue); 
               ObjectSet   ("BUY" + x,OBJPROP_ARROWCODE,SYMBOL_ARROWUP); 
               ObjectSet   ("BUY" + x,OBJPROP_WIDTH,5); 
               ObjectSet   ("BUY" + x,OBJPROP_BACK,true);

               break;
         }
      }
   
   }
}

//================================================ INIT =============================================
int init(){
   int period = Period();

   SetIndexStyle(0,DRAW_LINE);
   SetIndexBuffer(0,MA);
   SetIndexStyle(2,DRAW_LINE);
   SetIndexBuffer(2,Lower_Band);

   SetIndexDrawBegin(1,AdjustedMA+MA_Shift);
   SetIndexDrawBegin(2,AdjustedLowerBand+LowerBandShift+LowerBandPierced);

   return(0);
}
//===================================== ON TICK ===============================================
int start(){
   int counted_bars=IndicatorCounted();
   if(counted_bars<0) return(-1);
   if(counted_bars>0) counted_bars--;
   int uncounted_bars=Bars-counted_bars;

   for(int i=0;i<uncounted_bars;i++){
      if( Time[i] != TimeOld ){
         MA[i]         = iMA(NULL,0,21,MA_Shift,MODE_SMA,PRICE_CLOSE,i);
         Lower_Band[i] = iMA(NULL,0,21,MA_Shift,MODE_SMA,PRICE_CLOSE,i)-0.02;
         MinClose      = iLowest (NULL,0,MODE_CLOSE,6,i);//Kleinster Schlusskurs  

         
         PlaceArrowUp(i);

      }

   }

   return(0);
}
//===================================== DEINIT =================================================
int deinit(){
   ObjectsDeleteAll(); // delete all objects from chart
   return 0;
}


Ich dachte mir ich löse das Problem durch das Setzen eines Flags:
counterUp wird 0, wenn der untere MA unterschritten wurde und wird 1, wenn der obere MA überschritten wurde, aber es verschwinden dann die guten Pfeile. Ich verstehe nicht, warum der Pfeil erst gesetzt wird, wenn der obere MA 2mal durchstoßen wurde.....

Code:
#property indicator_chart_window

#property indicator_buffers 3
#property indicator_color1 LightSeaGreen
#property indicator_color2 LightSeaGreen
#property indicator_color3 LightSeaGreen

extern int    UpperBandPeriod       = 34;
extern int    UpperBandShift        = 0;
extern double UpperBandDeviation    = 2.0;

extern int    MA_Period              = 21;
extern int    MA_Shift               = 0;

extern int    LowerBandPeriod       = 34;
extern int    LowerBandShift        = 0;
extern double LowerBandDeviation    = 2.0;

extern int    LowerBandPierced      = 26; //Anzahl Candles, die vergangan sind, seit das Lower Band unterschritten wurde
extern int    UpperBandPierced      = 26;

//============================= Dummies ======================
double Multiplier;
double AdjustedUpperBand;
double AdjustedMA;
double AdjustedLowerBand;
datetime TimeOld;
double BandDiff   = 0;
bool SetArrowUp   = false;
bool SetArrowDown = false;
int x             = 0;
//============================== Parameters ==================
double dDiff=0;
bool   bArrowPlacedLong  = false;
bool   bArrowPlacedShort = false;
int    MinClose = 0;
int    MaxClose = 0;
int    counterUP = 1;
// ================================= Arrays =====================
double MA[];
double Lower_Band[];

//============================= Place Arrow Up ==== ORIGINAL ======================================
void PlaceArrowUp(int i){
   
   if(counterUP == 0){                                                           //   NEU
   
   if(    (Open[i]    > iMA(NULL,0,21,MA_Shift,MODE_SMA,PRICE_CLOSE,i)) 
       && (Open[i+1]  < iMA(NULL,0,21,MA_Shift,MODE_SMA,PRICE_CLOSE,i+1))
       && (Close[i+1] > iMA(NULL,0,21,MA_Shift,MODE_SMA,PRICE_CLOSE,i+1)) ){
      for(int k=1;k<=26;k++){
         if( Low[i+k] < (iMA(NULL,0,21,MA_Shift,MODE_SMA,PRICE_CLOSE,i+k)-0.02) ){
               x++;
               ObjectCreate("BUY" + x,OBJ_ARROW,0,Time[i],Low[MinClose]);
               ObjectSet   ("BUY" + x,OBJPROP_COLOR,Blue); 
               ObjectSet   ("BUY" + x,OBJPROP_ARROWCODE,SYMBOL_ARROWUP); 
               ObjectSet   ("BUY" + x,OBJPROP_WIDTH,5); 
               ObjectSet   ("BUY" + x,OBJPROP_BACK,true);
               counterUP = 1;                                                    //   NEU
               break;
         }
      }
   }
   }               
}

//================================================ INIT =============================================
int init(){
   int period = Period();

   SetIndexStyle(0,DRAW_LINE);
   SetIndexBuffer(0,MA);
   SetIndexStyle(2,DRAW_LINE);
   SetIndexBuffer(2,Lower_Band);

   SetIndexDrawBegin(1,AdjustedMA+MA_Shift);
   SetIndexDrawBegin(2,AdjustedLowerBand+LowerBandShift+LowerBandPierced);

   return(0);
}
//===================================== ON TICK ===============================================
int start(){
   int counted_bars=IndicatorCounted();
   if(counted_bars<0) return(-1);
   if(counted_bars>0) counted_bars--;
   int uncounted_bars=Bars-counted_bars;

   for(int i=0;i<uncounted_bars;i++){
      if( Time[i] != TimeOld ){
         MA[i]         = iMA(NULL,0,21,MA_Shift,MODE_SMA,PRICE_CLOSE,i);
         Lower_Band[i] = iMA(NULL,0,21,MA_Shift,MODE_SMA,PRICE_CLOSE,i)-0.02;
         MinClose      = iLowest (NULL,0,MODE_CLOSE,6,i);//Kleinster Schlusskurs  
         
         if(Low[i] < Lower_Band[i]) {counterUP = 0;}          //   NEU
         
         PlaceArrowUp(i);

      }

   }

   return(0);
}
//===================================== DEINIT =================================================
int deinit(){
   ObjectsDeleteAll(); // delete all objects from chart
   return 0;
}

Geändert von Biatsch (28.04.15 um 20:12 Uhr)
  #9 (permalink)  
Alt 28.04.15
Elite Mitglied
 
Registriert seit: Apr 2011
Beiträge: 2.733
traderdoc befindet sich auf einem aufstrebenden Ast
Standard

Nun, die Antwort ist, wenn man den Code vor sich hat, meistens ganz einfach. So auch hier:

Code:
void PlaceArrowUp(int i){
   

   
   if(    (Open[i]    > iMA(NULL,0,21,MA_Shift,MODE_SMA,PRICE_CLOSE,i)) 
       && (Open[i+1]  < iMA(NULL,0,21,MA_Shift,MODE_SMA,PRICE_CLOSE,i+1))
       && (Close[i+1] > iMA(NULL,0,21,MA_Shift,MODE_SMA,PRICE_CLOSE,i+1)) ){
      for(int k=1;k<=26;k++){
         if( Low[i+k] < (iMA(NULL,0,21,MA_Shift,MODE_SMA,PRICE_CLOSE,i+k)-0.02) ){
               x++;
               ObjectCreate("BUY" + x,OBJ_ARROW,0,Time[i],Low[MinClose]);
               ObjectSet   ("BUY" + x,OBJPROP_COLOR,Blue); 
               ObjectSet   ("BUY" + x,OBJPROP_ARROWCODE,SYMBOL_ARROWUP); 
               ObjectSet   ("BUY" + x,OBJPROP_WIDTH,5); 
               ObjectSet   ("BUY" + x,OBJPROP_BACK,true);

               break;
         }
      }
   
   }
}
Die fettmarkierten Stellen sagen folgendes aus:

Es wird immer ein Pfeil gesetzt, wenn z.B.!!
1. das Open der Kerze 1 über dem oberen MA liegt und
2. das Open der Vorgängerkerze 2 unter und das Close dieser Kerze über dem oberen MA liegt und
3. von Kerze 2 aus gesehen (incl. dieser) 26 Kerzen nach links irgendwann mal das Low jener Kerze unter dem unteren MA liegt.

Damit sind alle Bedingungen genannt.

Der Pfeil in dem linken gelben Kreis ist ok, weil innerhalb der letzten 26 Kerze mindestens 2 mit dem Low unter dem unteren MA lagen. Die Kerze links neben der Pfeilkerze hat das Open unter und das Close über dem oberen MA und da Open der Pfeilkerze liegt über dem oberen MA also alles palletti!

Aber!!!!!!!, auch der Pfeil in dem linken blauen Kreis ist völlig regelkonform, denn für diese Pfeilkerze gelten dieselben Bedingungen wie für die vorhergenannte, denn auch in diesem Fall befindet sich mindesten 1 Kerze mit dem Low unter der unteren MA, die Kerze links der Pfeilkerze har den oberen MA gekreuzt und das Open der Pfeilkerze liegt über dem oberen MA - auch alles paletti.

Dasselbe gilt für die anderen beiden Pfeile!!

traderdoc
__________________
Ich erfülle Euch gern Eure EA-, Indikator- und Script-Programmierungswünsche auf Honorarbasis.
  #10 (permalink)  
Alt 29.04.15
Mitglied
 
Registriert seit: Oct 2011
Beiträge: 77
Biatsch befindet sich auf einem aufstrebenden Ast
Standard

Deshalb wollte ich ja im 2. Code eine neue Variable einfúhren, die den Wert 0 annimmt, sobald der untere MA durchbrochen wurde.
Sobald der obere MA durchbrochen wird soll ein Pfeil gesetzt werden und diese Variable den Wert 1 annemhen.
Bevor diese Variable nicht wieder auf 0 ist, darf kein weiterer Pfeil gezeichnet werden.

So habe ich das im 2. CODEBLOCK implementieren wollen, aber als Resultat erhalte ich das,was im 2. Bild zu sehen ist.
Thema geschlossen

Lesezeichen

Stichworte
break, break befehl, mql4, programmierung metatrader

Themen-Optionen Thema durchsuchen
Thema durchsuchen:

Erweiterte Suche
Ansicht

Forumregeln
Es ist Ihnen nicht erlaubt, neue Themen zu verfassen.
Es ist Ihnen nicht erlaubt, auf Beiträge zu antworten.
Es ist Ihnen nicht erlaubt, Anhänge hochzuladen.
Es ist Ihnen nicht erlaubt, Ihre Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are aus
Pingbacks are aus
Refbacks are aus




Alle Zeitangaben in WEZ +1. Es ist jetzt 17:28 Uhr.





Suchmaschine - Reisen - Wavesnode - Facebook Forum - Spam Firewall
-----------------------------------------------------------------------------------------------------------------------------
Powered by vBulletin® Version 3.8.5 (Deutsch)
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
Powered by vBCMS® 2.7.0 ©2002 - 2024 vbdesigns.de
SEO by vBSEO 3.6.1
Copyright ©2009 - 2023 by Expert-Advisor.com - Das Metatrader Forum
MetaTrader bzw. MetaTrader 4 und MetaTrader 5 sind eingetragene Marken der MetaQuotes Software Corp.
-----------------------------------------------------------------------------------------------------------------------------