Hilfe bei der Codierung - Seite 39

 

Ich habe diese Codezeile geschrieben.

int TriggerChart = PERIOD_H4;

int FastMACDPeriod = 12;

int SlowMACDPeriod = 26 ;

int SignalPeriod = 9;

MacdCurrent = iMACD(Symbol(), TriggerChart, FastMACDPeriod,SlowMACDPeriod,SignalPeriod, PRICE_CLOSE, MODE_MAIN, 1);

Mit diesen eingefügten Variablen frage ich mich, ob der EA in der Lage ist, zu erkennen, dass TriggerChart "int timeframe" ist, und die anderen für die int periods verwendet werden? Könnte es sein, dass er dort, wo sie alle zusammen sind, zum Beispiel TriggerChart und FastMACDPeriod ansieht und denkt, dass sie beide mit int timeframe zu tun haben und verwirrt wird? An welchem Punkt erkennt der EA, welche Variable für welchen Teil des iMACD gilt?

 

...

Kurz gesagt: Nein, es kann nicht verwirrt werden (Computer sind gut darin, sie denken nicht, sondern führen immer wieder dieselben Dinge aus, ohne sie zu interpretieren) Nur Programmierer kommen von Zeit zu Zeit durcheinander

Wenn man eine Funktion aufruft, akzeptiert sie Parameter in einer bestimmten Reihenfolge (z.B.: der erste Parameter ist das Symbol, der zweite ist der Zeitrahmen,,,, und so weiter) Es ist völlig relevant, wie man die Variablen deklariert (typisiert), wenn man eine Funktion aufruft: sie werden strikt in Abhängigkeit von ihrem Platz in der Aufrufliste der Parameter verwendet

crsnape@btinternet.com:
Ich habe diese Code-Zeile geschrieben.

int TriggerChart = PERIOD_H4;

int FastMACDPeriod = 12;

int LangsamMACDPeriode = 26 ;

int SignalPeriod = 9;

MacdCurrent = iMACD(Symbol(), TriggerChart, FastMACDPeriod,SlowMACDPeriod,SignalPeriod, PRICE_CLOSE, MODE_MAIN, 1);

Mit diesen Variablen eingefügt ich frage mich, ob der EA in der Lage ist, zu identifizieren, dass TriggerChart ist "int timeframe", und die anderen für die int Perioden verwendet? Könnte es sein, dass dort, wo sie alle zusammen sind, es zum Beispiel TriggerChart und FastMACDPeriod betrachtet und denkt, dass sie beide mit int timeframe zu tun haben und verwirrt wird? An welchem Punkt erkennt der EA, welche Variable für welchen Teil des iMACD gilt?
 

Danke mladen. Klingt logisch.

Mit diesem Code habe ich BarsGV als 0 in der Funktion int init() deklariert. Aber, wie du richtig sagst, wenn ich einen Fehler bekomme, gibt es immer noch false zurück. Ich dachte nur, dass ich, anstatt es in int init() als 0 zu deklarieren, es stattdessen auf 1 zurücksetzen könnte. Was meinen Sie dazu? Ich habe einen 200SMA und wenn Bars kleiner als 200 ist, wird hier sowieso ein Fehler angezeigt.

Also stattdessen:

int init()

{

//---

GlobalVariableSet (BarsGV, 0);

//---

return(0);

}

DIES IST UNTER INT START()

if ((GlobalVariableGet (BarsGV) == 0) || (GlobalVariableGet (BarsGV) < Bars))

{

GlobalVariableSet(HasOrderedGV, false);

GlobalVariableSet(BarsGV, Bars);

}

//--- Prüfen, ob eine Long-Position (BUY) möglich ist

wenn (GlobalVariableGet (HasOrderedGV) == false)

{

Wechseln Sie zu diesem:

int init()

{

//---

GlobalVariableSet (BarsGV, 1);

//---

return(0);

}

DIES IST UNTER INT START()

if (GlobalVariableGet (BarsGV) == 0);

{

Print("Fehler bei globaler Variable BarsGV", GetLastError());

return(0);

}

if (GlobalVariableGet (BarsGV) < Bars)

{

GlobalVariableSet(HasOrderedGV, false);

GlobalVariableSet(BarsGV, Bars);

}

//--- Prüfen, ob eine Long-Position (BUY) möglich ist

wenn (GlobalVariableGet (HasOrderedGV) == false)

{

Was meinen Sie dazu?

 

...

Ändern Sie es in dieses :

int BarsGV;

bool HasOrderedGV;

int init()

{

//---

BarsGV=0;

HasOrderedGV=false;

//---

return(0);

}

THIS IS UNDER INT START()

if (BarsGV < Bars)

{

HasOrderedGV=false;

BarsGV=Bars;

}

//--- Check for long position (BUY) possibility

if (HasOrderedGV == false)

{[/PHP]

That way you are going to avoid other EA interference and you will keep the variables to only one instance of Ea (they can not mix at all). Much better to do it that way (even from the speed of execution point of view). But you still risk of opening a new order on a same bar this way. The best way is to use a function to count orders opened at the current bar and then allow or disallow ner order opening

Here is a function that can do that (it will check currently opened as well as already closed orders if they have been opened on a current bar) :

bool uniqueOnBar(int MagicNumber)

{

datetime startTime = Time[0];

datetime endTime = startTime+60*Period();

for (int i=OrdersTotal()-1; i>=0; i--)

{

if (!OrderSelect(i,SELECT_BY_POS,MODE_TRADES)) continue;

if (OrderSymbol() != Symbol()) continue;

if (OrderMagicNumber() != MagicNumber) continue;

if (OrderOpenTime()endTime) continue;

return(false);

}

for (i=OrdersHistoryTotal()-1; i>=0; i--)

{

if (!OrderSelect(i,SELECT_BY_POS,MODE_HISTORY)) continue;

if (OrderSymbol() != Symbol()) continue;

if (OrderMagicNumber() != MagicNumber) continue;

if (OrderOpenTime()endTime) continue;

return(false);

}

return(true);

}

Checking would be very simple :

[PHP]if (uniqueOnBar(MagicNumber)) .... you can open an a new order

Auf diese Weise würden Sie nicht von irgendwelchen Variablen abhängen, sondern nur von den Aufträgen, und das ist der einzige 100% zuverlässige Weg

crsnape@btinternet.com:
Danke mladen. Klingt logisch.

Mit diesem Code habe ich BarsGV als 0 in der Funktion int init() deklariert. Aber, wie Sie richtig sagen, wenn ich einen Fehler bekomme, gibt es immer noch false zurück. Ich dachte nur, dass ich, anstatt es in int init() auf 0 zu setzen, es stattdessen auf 1 zurücksetzen könnte. Was meinen Sie dazu? Ich habe einen 200SMA und wenn Bars kleiner als 200 ist, wird hier sowieso ein Fehler angezeigt.

Also stattdessen:

int init()

{

//---

GlobalVariableSet (BarsGV, 0);

//---

return(0);

}

DIES IST UNTER INT START()

if ((GlobalVariableGet (BarsGV) == 0) || (GlobalVariableGet (BarsGV) < Bars))

{

GlobalVariableSet(HasOrderedGV, false);

GlobalVariableSet(BarsGV, Bars);

}

//--- Prüfen, ob eine Long-Position (BUY) möglich ist

wenn (GlobalVariableGet (HasOrderedGV) == false)

{

Wechseln Sie zu diesem:

int init()

{

//---

GlobalVariableSet (BarsGV, 1);

//---

return(0);

}

DIES IST UNTER INT START()

if (GlobalVariableGet (BarsGV) == 0);

{

Print("Fehler bei globaler Variable BarsGV", GetLastError());

return(0);

}

if (GlobalVariableGet (BarsGV) < Bars)

{

GlobalVariableSet(HasOrderedGV, false);

GlobalVariableSet(BarsGV, Bars);

}

//--- Prüfen, ob eine Long-Position (BUY) möglich ist

wenn (GlobalVariableGet (HasOrderedGV) == false)

{

Was meinen Sie dazu?
 

Superstar. Danke!

 

Hallo mladen,

dieser Teil:

datetime EndTime = StartTime + 60 * Period();

Period() ist in diesem Fall der Zeitrahmen des Charts. Also sagen wir H4 (240) * 60, weil EndTime in Sekunden aufgezeichnet wird, also Konvertierung von 240Minuten in Sekunden, um mit den Minuten von Period (240) zu entsprechen?

Verstehe ich das richtig?

Könnte es auch so geschrieben werden:

datetime EndTime = (StartTime / 60) + Period();?

 

...

Ja, Sie lesen es richtig

Was die andere Form betrifft: Sie können diese nicht verwenden, da OrderOpenTime() ein Standard-Datetime-Format hat, was bedeutet, dass Sie in EndTime die Anzahl der seit dem 1. Januar 1970 vergangenen Sekunden angeben müssen, und so wie Sie es geschrieben haben, würde es Minuten enthalten - Metatrader würde annehmen, dass es sich dabei um Sekunden handelt, und es würde falsche Ergebnisse liefern

crsnape@btinternet.com:
Hallo mladen,

Dieser Teil:

datetime EndTime = StartTime + 60 * Period();

Period() ist in diesem Fall der Zeitrahmen des Charts. Sagen wir also H4 (240) * 60, weil EndTime in Sekunden aufgezeichnet wird, also Konvertierung von 240 Minuten in Sekunden, um mit den Minuten von Period (240) zu korrespondieren?

Verstehe ich das richtig?

Könnte es auch geschrieben werden:

datetime EndTime = (StartTime / 60) + Period();?
 

Hallo mladen, wählt die for-Schleife hier die zuletzt geöffnete oder schwebende Order aus?

bool UniqueOnBar (int MagicNumber)

{

datetime StartTime = Time[0];

datetime EndTime = StartTime + 60 * Period (TriggerChart);

for (int i = OrdersTotal() - 1; i >= 0; i--)

{

if (!OrderSelect (i, SELECT_BY_POS, MODE_TRADES)) continue;

if (OrderSymbol() != Symbol()) continue;

if (OrderMagicNumber() != MagicNumber) continue;

if (OrderOpenTime() endTime) continue;

return(false);

}

Also, wo das Ausrufezeichen als 'not' interpretiert wird, denke ich, dass dies in meinem Fall nicht richtig ist, weil ich möchte:

- Die zuletzt geöffnete oder schwebende Order auswählen, also ! entfernen, um OrderSelect?

- OrderSymbol() soll dasselbe sein wie Symbol()

- OrderMagicNumber() soll gleich MagicNumber sein, also...bleibt dies:

intTriggerChart= PERIOD_H4;

int MagicNumber = 42;

bool UniqueOnBar (int MagicNumber)

{

datetime StartTime = Time[0];

datetime EndTime = StartTime + 60 * Period(TriggerChart);

for (int i = OrdersTotal() - 1; i >= 0; i--)

{

if (OrderSelect (i, SELECT_BY_POS, MODE_TRADES)) continue;

wenn (OrderSymbol() == Symbol()) fortfahren;

if (OrderMagicNumber() == MagicNumber) continue;

if (OrderOpenTime() endTime) continue;

return(false);

}

 

Mein Versehen Ich erkenne jetzt, dass seine, wenn der Ausdruck wahr zurückgibt, dass keine geöffneten Aufträge auf aktuelle Bar abgeholt werden

 

...

Ja, so ist es. Wenn sie also tru zurückgibt, können Sie eine neue Order eröffnen.

Wenn Sie außerdem einen anderen Zeitrahmen als den aktuellen Zeitrahmen testen möchten, ob eine Order im aktuellen Bar des Zielzeitrahmens geöffnet wurde, kann die Funktion in etwas wie das folgende geändert werden:

bool UniqueOnBar (int MagicNumber, int timeFrame=0)

{

if (timeFrame==0) timeFrame=Period();

datetime StartTime = iTime(NULL,timeFrame,0);

datetime EndTime = StartTime + 60*timeFrame;

for (int i=OrdersTotal()-1; i>=0; i--)

{

if (OrderSelect(i,SELECT_BY_POS,MODE_TRADES)) continue;

if (OrderSymbol() == Symbol()) continue;

if (OrderMagicNumber() == MagicNumber) continue;

if (OrderOpenTime() EndTime) continue;

return(false);

}

return(true);

}

[/PHP]

And then the call to it would be for your example 2 posts ago

[PHP]if (UniqueOnBar(MagicNumber,TriggerChart) ... open an order

PS: Sie haben die Prüfung auf geschlossene Orders aus dem Beispiel entfernt. Wenn Sie auch die geschlossenen Orders überprüfen möchten, dann verwenden Sie den zweiten Teil der ursprünglichen Form der Funktion.

crsnape@btinternet.com:
Mein Versehen Ich weiß jetzt, dass, wenn der Ausdruck "true" zurückgibt, keine offenen Orders auf dem aktuellen Bar abgeholt werden.
Grund der Beschwerde: