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)
-   -   verstehe diesen Code nicht so ganz (http://www.expert-advisor.com/forum/showthread.php?t=6710)

AVT 30.06.20 14:29

verstehe diesen Code nicht so ganz
 
Könnte mir bitte jemand helfen, diesen Code zu "übersetzen", es hakt da am Verständnis bei mir.
Code:

//global:
extern string TimeFrame="Current time frame";
bool  returnBars;
bool  calculateValue;

//Umwandlung:
string sTfTable[] = {"M1","M5","M15","M30","H1","H4","D1","W1","MN"};
int    iTfTable[] = {1,5,15,30,60,240,1440,10080,43200};
int stringToTimeFrame(string tfs)
{
  StringToUpper(tfs);
  for(int i=ArraySize(iTfTable)-1; i>=0; i--)
      if(tfs==sTfTable[i] || tfs==""+iTfTable[i])
        return(MathMax(iTfTable[i],Period()));
  return(Period());
}

//int init(): die ersten 3 Zeilen
returnBars    = (TimeFrame=="returnBars");    if(returnBars)    return(0);
calculateValue = (TimeFrame=="calculateValue"); if(calculateValue) return(0);
timeFrame      = stringToTimeFrame(TimeFrame);

Ich verstehe nicht, was diese Angaben "returnBars" und "CalculateValue" sollen, TimeFrame ist eine Benutzereingabe und keiner würde auf die Idee kommen, so was da rein zu schreiben, noch dazu wo der Vegleich == erfordert. Und was soll das return(0)? - der ganze Rest wie das Setzen von Buffern usw. wird weggelassen? Und wie kann dann stringToTimeFrame funktionieren?

Die Logik dahinter kapiere ich einfach nicht.
Kann jemand mir helfen? Danke. AVT

traderdoc 30.06.20 15:43

Is klar, den kann man auch nicht verstehen, wenn nicht der Rest des Codes geliefert wird.
In welcher Funktion steht

returnBars = (TimeFrame=="returnBars"); if(returnBars) return(0);
calculateValue = (TimeFrame=="calculateValue"); if(calculateValue) return(0);
timeFrame = stringToTimeFrame(TimeFrame);

"returnBars" bzw. "calculateValue" werden sicher nicht der Variablen TimeFrame zugewiesen.

Im Endeffekt soll aus der Funktion stringToTimeFrame() das Ergebnis generiert werden, das größerer oder das aktuelle TimeFrame zurückzugeben.

Nein, mit diesem Schnipsel kann man nix anfangen.

traderdoc

AVT 30.06.20 16:17

Zitat:

Zitat von traderdoc (Beitrag 43990)
Is klar, den kann man auch nicht verstehen, wenn nicht der Rest des Codes geliefert wird.
In welcher Funktion steht

returnBars = (TimeFrame=="returnBars"); if(returnBars) return(0);
calculateValue = (TimeFrame=="calculateValue"); if(calculateValue) return(0);
timeFrame = stringToTimeFrame(TimeFrame);

"returnBars" bzw. "calculateValue" werden sicher nicht der Variablen TimeFrame zugewiesen.

Im Endeffekt soll aus der Funktion stringToTimeFrame() das Ergebnis generiert werden, das größerer oder das aktuelle TimeFrame zurückzugeben.
traderdoc

Danke für Deine Antwort, traderdoc.
Ich dachte, das wäre aus der Code-Kopie ersichtlich: das sind die ersten Zeilen in der "int init()" Funktion, mit anderen Worten, so beginnt das, was wir jetzt als Anfang der Funktion "int OnInit()" setzen würden - davor stehen nur interne, globale Variablen. Danach wird im ganzen Code nur noch mit den returnBars, calculateValue und timeFrame rumhantiert, darum will/muß ich verstehen, was diese ersten Zeilen in init() eigentlich sollen :confused:

(Daß die stringToTimeFrame Funktion solche Angaben wie "M1" in die dazughörige Minuteneinheit umwandelt, ist mir schon klar.)

Also um mal anzufangen:
returnBars = (TimeFrame=="returnBars"); heißt,
die bool Variable "returnBars" ist true, wenn die (extern string) TimeFrame "returnBars" lautet und false wenn sie anders lautet.
Und wenn sie true ist, dann wird init() als Erfolg beendet ?? (wenn ich mich recht erinnere, hieß return(0), bei init() alles ok).
So jedenfalls meine Lesart - und die daraus resultierenden Probleme.

Ich hoffe, das ist jetzt klarer. AVT

traderdoc 30.06.20 18:21

Ja und was hat nun "returnBars" und "calculateValue" mit der Sinnhaftigkeit des Namens der Variablen TimeFrame zu tun?

Womit beschäftigst Du Dich denn?

Ich bin raus hier.

traderdoc

AVT 30.06.20 19:52

Zitat:

Zitat von traderdoc (Beitrag 43993)
Ja und was hat nun "returnBars" und "calculateValue" mit der Sinnhaftigkeit des Namens der Variablen TimeFrame zu tun?
Womit beschäftigst Du Dich denn?
Ich bin raus hier.

Das ist ein Indikator (nicht von mir) und wenn ich im Berechnungscode so was habe - in der Funktion int start():
Code:

int i,r,counted_bars=IndicatorCounted();
 if(counted_bars<0) return(-1);
 if(counted_bars>0) counted_bars--;
 int limit=MathMin(Bars-counted_bars,Bars-1);
 if(returnBars) { arrUSD[0]=limit; return(0); }

if(calculateValue || timeFrame==Period())
{ // .... mach Berechnungen }

for(i=limit,r=Bars-i-1; i>=0; i--,r++)
{
  int y=iBarShift(NULL,timeFrame,Time[i]);
  if(USD) arrUSD[i] = iCustom(NULL,
                              timeFrame,indicatorFileName,
                              "calculateValue",
                              SymbolsPrefix,SymbolsSuffix,MaMethod,MaFast,MaSlow,Price,USD,0,y);
  if(!Interpolate || y==iBarShift(NULL,
                                  timeFrame,
                                  Time[i-1])) continue;
  if(USD) interpolate(arrUSD,iTime(NULL,
                                  timeFrame,y),i);
}

und eine Extra Funktion:
Code:

int getLimit(int limit,string tsymbol)
{
  if(tsymbol!=Symbol())
  limit=MathMax( MathMin( Bars-1,
                          iCustom(tsymbol,
                          timeFrame,indicatorFileName,
                        "returnBars",0,0)*timeFrame/Period()),
                limit
              );
  return(limit);
}

dann frage ich mich natürlich, wann wo und wie diese Sachen definiert werden; und dabei stoße ich dann auf diese fragwürdigen Festlegungen in init() - und genau die kapier ich nicht.

Aber ich kann verstehen, daß Du raus bist. Ich bin es ehrlich gesagt auch - ist wohl mal wieder so eine Art Code so zu verkomplizieren, daß keiner weiß, was gemeint ist.
Also entweder ich schreib das Ding von Grund auf neu oder ich klopp es in die Tonne - macht keinen Sinn mit etwas zu arbeiten, was man nicht versteht.
Danke für Deine Mühe. :) AVT

Anja 05.07.20 17:39

Der Schlüssel scheint zu sein, dass TimeFrame extern ist und daher irgendein String dort drin stehen kann.

Dieser String kann z.B. lauten "M1", 1 , "returnBars" oder "calculateValue" und setzt je nach diesem Wert dann die Periode, die von der aktuellen abweichen kann und mit der dann wohl gerechnet wird.

return(0); wird vermutlich benutzt um zu bestimmen, dass ein Wert für die Periode ermittelt werden konnte. Das folgende bedeutet also, steht "returnBars" extern in TimeFrame, also true, dann konnte eine Periode ermittelt werden und springe raus mit return (0), da hier nichts mehr zu tun ist:

returnBars = (TimeFrame=="returnBars"); if(returnBars) return(0);

"Current time frame" halte ich für einen Wert ohne Bedeutung für die Programmlogik.

AVT 06.07.20 23:14

Zitat:

Zitat von Anja (Beitrag 44012)
Der Schlüssel scheint zu sein, dass TimeFrame extern ist und daher irgendein String dort drin stehen kann.
....
"Current time frame" halte ich für einen Wert ohne Bedeutung für die Programmlogik.

Danke Anja für Deine Antwort. :)
Ehrlich gesagt halte ich den ganzen Code für ziemlich daneben; wenn ich mal Zeit habe, werde ich den vielleicht noch mal ansehen - aber wie schon gesagt, ist wohl eher was für die Tonne (ich hab eigentlich genug bessere Indis).
AVT


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