Wie programmiert man? - Seite 302

 

...

Ja, das können Sie

Die einzige Einschränkung ist, dass Sie nicht in einen "zirkulären Aufruf" geraten, der in einer toten Schleife enden würde. Ansonsten gibt es keine Einschränkungen für Funktionsaufrufe.

crsnape@btinternet.com:
Guter Punkt. Ich werde mir das mal ansehen.

Eine Frage zu Funktionen: Ist es möglich, eine Funktion innerhalb einer Funktion aufzurufen? Ich habe z.B. diese Funktion:

string GetWinLossPreviousShort (int LastOpenTicket, string WinLossPreviousShort)

{

if (... etc

Dann rufe ich sie später auf:

double GetLotsLong (int NiedrigRisiko, int HochRisiko, double SLDistanceLong, string GetWinLossPreviousShort)
 

Ich habe folgenden Code eingegeben, um die zuletzt geöffnete Bestellung abzurufen:

//--- Funktion zur Berechnung der Ticketnummer der zuletzt geöffneten Bestellung

int LastOpenTicket()

{

datetime lastTime = 0;

int lastTicket = -1; // Keine geöffnet.

int pos;

for (pos = OrdersTotal() - 1; pos >= 0; pos--)

if (OrderSelect(pos, SELECT_BY_POS) // Nur meine Bestellungen w/

&& OrderMagicNumber() == MagicNumber // meine magische Zahl

&& OrderSymbol() == Symbol() // und mein Paar.

&& OrderOpenTime() > lastTime)

{

lastTime = OrderOpenTime();

lastTicket = OrderTicket();

}

return (lastTicket);

}

Es handelt sich um eine Funktion, die von meiner GetLots-Funktion aufgerufen wird - der Compiler ist fehlerfrei, aber wenn ich einen Backtest durchführe, ist der Ergebnisbereich völlig leer. Keine Trades. Liegt das daran, dass der erste Handel keinen vorherigen Handel hat, auf den der obige Code zurückgreifen kann?

Im Journal werden die externen Variablen geladen (von denen die magische Zahl 42 geladen wird, aber in meinem Code ist es 42552...?), aber danach kommt nichts mehr.

 

...

Wie lautet die Deklaration Ihrer magischen Zahl ( es sollte int MagicNumber sein; )

crsnape@btinternet.com:
Ich habe diesen Code eingegeben, um die zuletzt geöffnete Order abzurufen:

//--- Funktion zur Berechnung der Ticketnummer der zuletzt geöffneten Bestellung

int LastOpenTicket()

{

datetime lastTime = 0;

int lastTicket = -1; // Keine geöffnet.

int pos;

for (pos = OrdersTotal() - 1; pos >= 0; pos--)

if (OrderSelect(pos, SELECT_BY_POS) // Nur meine Bestellungen w/

&& OrderMagicNumber() == MagicNumber // meine magische Zahl

&& OrderSymbol() == Symbol() // und mein Paar.

&& OrderOpenTime() > lastTime)

{

lastTime = OrderOpenTime();

lastTicket = OrderTicket();

}

return (lastTicket);

}

Es handelt sich um eine Funktion, die von meiner GetLots-Funktion aufgerufen wird - der Compiler ist fehlerfrei, aber wenn ich einen Backtest durchführe, ist der Ergebnisbereich völlig leer. Keine Trades. Liegt das daran, dass der erste Handel keinen vorherigen Handel hat, auf den der obige Code zurückgreifen kann?

Im Journal kommt es zum Laden der externen Variablen (von denen es die magische Zahl 42 lädt, aber in meinem Code ist es 42552...?), aber danach nichts mehr.
 

Ja, es ist int MagicNumber = 42557

 

...

Dann kann ich nicht sagen, aus dem Code, den Sie gepostet, warum ist es tun falsch (warum ist es falsch MagicNumber zum Beispiel erhalten). Der Code sollte funktionieren, wenn es eine Bestellung mit bestimmten MagicNumber geöffnet ist (es geht zu Schleife durch geöffnete Aufträge) Wenn es keine geöffneten Aufträge oder die MagicNumbers und Symbole nicht übereinstimmen, wird es -1 zurückgeben (wie Sie es erwarten), so dass der Code korrekt ist (getestet es jetzt, und es funktioniert wie es sollte)

Tut mir leid, aber das ist alles, was ich mit dem von Ihnen geposteten Code machen kann

crsnape@btinternet.com:
Ja, es ist int MagicNumber = 42557
 

Was würde in dem Fall passieren, dass keine vorherige Bestellung geöffnet wurde und dies die erste ist? Ich weiß, dass er -1 zurückgibt, aber würde der Code EA nicht ausgeführt werden, weil meine Funktion GetLots auf dem Aufruf der zuletzt geöffneten Bestellscheinnummer beruht.

 

Wenn es sich auf das Vorhandensein von mindestens einem zuvor geöffneten Auftrag stützt, wird es fehlschlagen

Fügen Sie etwas wie das folgende in Ihre Bedingung ein:

if (LetzteOffeneBestellung()==-1)

... dann können Sie die Order öffnen, wenn alle anderen Bedingungen erfüllt sind

sonst

... prüfen Sie die zuletzt geöffnete Order wie zuvor plus die restlichen Bedingungen

(ich tippe jetzt einfach mal wild drauf los, wie Sie Ihre EA-Bedingungen geschrieben haben)

crsnape@btinternet.com:
Was würde in dem Fall passieren, dass keine vorherige Order geöffnet wurde und dies die erste ist? Ich weiß, dass es -1 zurückgibt, aber würde der Code EA nicht ausgeführt werden, weil meine Funktion GetLots auf den Aufruf der letzten geöffneten Bestellung Ticketnummer angewiesen ist.
 

Hallo Mladen,

wissen Sie, wie man einen Handel eröffnet, wenn die Stochastik-Linie das Niveau 20 oder 80 kreuzt?

Z.B..

Wenn sich die Stochastik auf dem Niveau 20 (überverkauft) kreuzt, Long

Wenn sich die Stochastik bei Level 80 (überkauft) kreuzt, Short

Mit freundlichen Grüßen

Ryan

 

Ich habe ein paar Zeilen zu diesem Code hinzugefügt - dies ist, was die LastOpenTicket() Funktion verwendet, aber es mag es immer noch nicht. Ich habe die Option -1 hinzugefügt. Erscheint Ihnen hier etwas falsch?

//--- Ermitteln, ob der vorherige Verkaufsauftrag profitabel ist

string GetWinLossPreviousShort (int LastOpenTicket, string WinLossPreviousShort)

{

if (OrderSelect(LastOpenTicket(), SELECT_BY_TICKET, MODE_TRADES) == TRUE)

{

if (OrderProfit() > 0 && OrderType() == OP_SELL)

{

WinLossPreviousShort = "W";

return (WinLossPreviousShort);

}

if ((OrderProfit() < 0 && OrderType() == OP_SELL) || LastOpenTicket() == -1)

{

WinLossPreviousShort = "L";

return (WinLossPreviousShort);

}

}

}

 

...

Warum fügen Sie nicht ein weiteres mögliches Ergebnis dieser Funktion hinzu: so etwas wie wenn LastOpenTicket() == -1 dann WinLossPreviousShort="Na"

crsnape@btinternet.com:
Ich habe diesem Code ein paar Zeilen hinzugefügt - das ist es, was die Funktion LastOpenTicket() verwendet, aber es mag sie immer noch nicht. Ich habe die Option -1 hinzugefügt. Erscheint Ihnen hier etwas falsch?

//--- Ermitteln, ob der vorherige Verkaufsauftrag profitabel ist

string GetWinLossPreviousShort (int LastOpenTicket, string WinLossPreviousShort)

{

if (OrderSelect(LastOpenTicket(), SELECT_BY_TICKET, MODE_TRADES) == TRUE)

{

if (OrderProfit() > 0 && OrderType() == OP_SELL)

{

WinLossPreviousShort = "W";

return (WinLossPreviousShort);

}

if ((OrderProfit() < 0 && OrderType() == OP_SELL) || LastOpenTicket() == -1)

{

WinLossPreviousShort = "L";

return (WinLossPreviousShort);

}

}

}
Grund der Beschwerde: