Wie programmiert man? - Seite 304

 

...

1. Nein, es macht keinen Sinn, dies zu überprüfen, da Sie meist viel mehr Balken haben, als Sie für einen gleitenden Durchschnitt benötigen, um sich zu "stabilisieren". Es handelt sich nicht um einen alten Fehler, sondern um eine einfache Überprüfung, wie viele Balken in der Historie vorhanden sind.

2. Ja. Denken Sie daran, dass iClose() (und die ähnlichen iOpen(), iHigh() und iLow()) Funktionen sind, während Close[],Open,High[],Low[] ein einfaches Array mit viel, viel schnellerem Zugriff auf die Werte ist.

zzz:
Hallo, ich bin neu in der Programmierung, aber nicht neu im Handel. Ich habe eine Zeit lang nichts gepostet und jetzt, da ich mit der Entwicklung meines EA begonnen habe, habe ich viele Fragen. Ich habe zunächst mit der Erstellung eines Indikators begonnen, und wenn er das tut, was ich will, werde ich weitergehen. Ich habe alle Handbücher gelesen, die ich finden konnte, und jetzt ist es an der Zeit, dass ich mit der Programmierung weitermache.

Tut mir leid, wenn dies der falsche Thread ist - bitte lassen Sie mich wissen, wo ich solche Fragen dann posten soll.

Ich habe 2, wahrscheinlich, grundlegende Fragen für jetzt, bitte:

1. In vielen Indikatoren, die MAs verwenden, sehe ich Linien, die überprüfen, wie viele Balken auf dem Chart sind. Wenn ich also MA200 benötige und der Chart nur, sagen wir, 100 Balken hat, würde dann iMA200 funktionieren? Ich denke ja - ich habe es überprüft und jeder MA wird ohne Probleme auf jedem Chart gezeichnet, also denke ich, dass dies ein alter Fehler ist, den Metaquotes jetzt behoben hat. Macht es also Sinn, zu prüfen, wie viele Balken im Chart vorhanden sind, um den MA zu zeichnen oder die iMA-Funktion zu verwenden?

2. Was ist der Unterschied zwischen Close und iClose? Soweit ich weiß, kann Close nur den Abschluss der Balken im aktuellen Chart zurückgeben, während iClose jeden Abschluss eines beliebigen Währungspaares und eines beliebigen Zeitrahmens zurückgeben kann. Und in beiden Fällen muss ich, um den letzten geschlossenen Balken zu erhalten, den Index [1] verwenden. Sehe ich das richtig?

Ich danke Ihnen.
 

DoubleStochastic für MT4, echte DoubleStochastic

Hallo Leute - neuer MT4 Benutzer.

Ich habe Schwierigkeiten, den DoubleStochastic-Indikator für MT4 zu finden. Es war mein Lieblingsindikator auf der VTT-Plattform. Und ich meine die ECHTE DoubleStochastic - nicht die Bressert Double Stochastic, die ganz andere Indikationen liefert als die originale DoubleStochastic. Siehe angehängte Datei - Double von VTT gibt ein bisschen andere Indikationen als Double von MT4:

Kann mir jemand helfen, VTT'2 DoubleStochastic in MT4 zu kodieren? Hier ist VTT Code und Logik:

Fast %K = ((Today's Close - Lowest Low in %K Periods) / (Highest High in %K Periods - Lowest Low in %K Periods)) * 100

Slowing %K = N-periodischer gleitender Durchschnitt von Fast %K

Double %K = ((Heutige Verlangsamung %K - Niedrigste Verlangsamung %K in %K Perioden) / (Höchstes Hoch der Verlangsamung %K in %K Perioden - Niedrigste Verlangsamung %K in %K Perioden)) * 100

Double Slowing %K = N-periodischer gleitender Durchschnitt von Double %K

%D = einfacher gleitender 3-Perioden-Durchschnitt von Double Slowing %K

und der Code selbst:

St:= Mov(((C-LLV(L,K))/(HHV(H,K)-LLV(L,K)))*100,Sl,Mt);

DSt:= Mov(((St-LLV(St,K))/(HHV(St,K)-LLV(St,K)))*100,Sl,Mt);

DStD:= Mov(DSt,D,MtD);

Kennt sich jemand mit MT4 aus?

Ich habe mich so sehr an die Version von VTT gewöhnt, dass ich keine andere verwenden kann.

 

...

gmailer

Ich habe eine doppelte Stochastik hier gepostet: https: //www.mql5.com/en/forum/177239/page28 (um alle Versionen der Stochastik an einem Ort zu haben)

Ich denke, dass es das ist, was Sie suchen

gmailer:
Hallo Leute - neuer MT4 Benutzer.

Ich habe Mühe, den DoubleStochastic-Indikator für MT4 zu finden. Es war mein Lieblingsindikator auf der VTT-Plattform. Und ich meine die ECHTE DoubleStochastic - nicht die Bressert Double Stochastic, die eine völlig andere Anzeige als die originale DoubleStochastic liefert. Siehe angehängte Datei - Double von VTT gibt ein bisschen andere Indikationen als Double von MT4:

Kann mir jemand helfen, VTT'2 DoubleStochastic in MT4 zu kodieren? Hier ist VTT Code und Logik:

Fast %K = ((Today's Close - Lowest Low in %K Periods) / (Highest High in %K Periods - Lowest Low in %K Periods)) * 100

Slowing %K = N-periodischer gleitender Durchschnitt von Fast %K

Double %K = ((Heutige Verlangsamung %K - Niedrigste Verlangsamung %K in %K Perioden) / (Höchstes Hoch der Verlangsamung %K in %K Perioden - Niedrigste Verlangsamung %K in %K Perioden)) * 100

Double Slowing %K = N-periodischer gleitender Durchschnitt von Double %K

%D = einfacher gleitender 3-Perioden-Durchschnitt von Double Slowing %K

und der Code selbst:

St:= Mov(((C-LLV(L,K))/(HHV(H,K)-LLV(L,K)))*100,Sl,Mt);

DSt:= Mov(((St-LLV(St,K))/(HHV(St,K)-LLV(St,K)))*100,Sl,Mt);

DStD:= Mov(DSt,D,MtD);

Kennt sich jemand mit MT4 aus?

Ich habe mich so sehr an die Version von VTT gewöhnt, dass ich keine andere verwenden kann.
 

^ Danke - das könnte es sein. Wissen Sie, wie man die "grünen und rosafarbenen Punkte" am unteren und oberen Rand loswird?

 

Danke, mladen. Das macht Sinn.

 

Hallo zusammen,

Ich kämpfe, um einen Weg zu finden, um einen Handel auszulösen, wenn meine Stochastik-Linie kreuzt innerhalb der overbrought(80) oder oversold(20) Region. Ich bin in der Lage, einen Handel auszulösen, wenn meine Linie kreuzt, aber ich bin nicht in der Lage, sie so einzustellen, dass sie NUR dann einen Handel auslöst, wenn sie sich in der überkauften oder überverkauften Region befindet. Hat jemand eine Idee, wie ich das anstellen kann, oder gibt es einen anderen Ort, an dem ich mich informieren kann?

Ich bin auf einige Seiten gestoßen, die etwas über die Einstellung einiger Werte auf 20,1 und 80,1 sagen, aber nichts weiter.

Bitte helfen Sie mir, etwas Licht ins Dunkel zu bringen. Vielen Dank!

Mit freundlichen Grüßen

Terrance

 

...

Terrance,

Hier ist ein Thread mit einem praktischen Code, der als Beispiel für das, was Sie brauchen, verwendet werden könnte: https: //www.mql5.com/en/forum/179114

tkuan77:
Hallo zusammen,

Ich habe Schwierigkeiten, einen Weg zu finden, wie ich einen Handel auslösen kann, wenn meine Stochastik-Linie den überkauften (80) oder überverkauften (20) Bereich kreuzt. Ich kann einen Handel auslösen, wenn sich meine Linie kreuzt, aber ich kann sie nicht so einstellen, dass sie NUR dann einen Handel auslöst, wenn sie sich in der überkauften oder überverkauften Region befindet. Hat jemand eine Idee, wie ich das anstellen kann, oder gibt es einen anderen Ort, an dem ich mich informieren kann?

Ich bin auf einige Seiten gestoßen, die etwas über die Einstellung einiger Werte auf 20,1 und 80,1 sagen, aber nichts weiter.

Bitte helfen Sie mir, etwas Licht ins Dunkel zu bringen. Vielen Dank!

Mit freundlichen Grüßen

Terrance
 

Hallo, ich habe die Funktionen korrigiert und bin jetzt zufrieden damit. Sieht gut aus. Allerdings enthält das Protokoll der Handelsergebnisse, wenn ich einen Backtest durchführe, nur 1 Kaufauftrag. Ich denke, es könnte mit meiner GetLots-Funktion zu tun haben, aber ich bin mir trotz mehrmaligem Überprüfen nicht sicher. Könnten Sie einen Blick darauf werfen und mir Bescheid geben, wenn Sie etwas finden, das nicht stimmt? Danke!

//--- Funktion zur Berechnung von Lots für Long-Positionen

double GetLotsLong (int NiedrigRisiko, int HochRisiko, double SLDistanceLong, int LastOpenTicket, int LastTicket)

{

RefreshRates();

double MinLots, MaxLots, LotStep;

int LotDigit = 2;

double LotsLong = 0;

MinLots = NormalizeDouble(MarketInfo(Symbol(), MODE_MINLOT), 2); // Lots müssen normalisiert werden, um LotStep zu berücksichtigen.

MaxLots = NormalizeDouble(MarketInfo(Symbol(), MODE_MAXLOT), 2); // Bei der Normalisierung wird nicht gerundet, sondern der Teil des Loses abgeschnitten, der größer als LotStep ist.

LotStep = NormalizeDouble(MarketInfo(Symbol(), MODE_LOTSTEP), 2); // Auf diese Weise ist das Risiko etwas geringer.

if (MarketInfo(Symbol(), MODE_DIGITS) == 3 || MarketInfo(Symbol(), MODE_DIGITS) == 5) SLDistanceLong *= 10.0;

wenn (LotStep == 1.00) LotDigit = 0;

wenn (LotStep == 0.10) LotDigit = 1;

wenn (LotStep == 0.01) LotDigit = 2;

if (GetWinLossPreviousLong (LastOpenTicket, LastTicket, WinLossPreviousLong) == "W")

{

if (Kontostand() > AccountFreeMargin())

LotsLong = NormalizeDouble(AccountFreeMargin() * (HighRisk / 100) / (SLDistanceLong * MarketInfo (Symbol(), MODE_TICKVALUE)), LotDigit);

else LotsLong = NormalizeDouble(Kontostand() * (HohesRisiko / 100) / (SLDistanceLong * MarketInfo (Symbol(), MODE_TICKVALUE)), LotDigit);

}

LotsLong = NormalizeDouble(NormalizeDouble(LotsLong / LotStep, 0) * LotStep, LotDigit);

LotsLong = MathMax(MathMin(LotsLong, MaxLots), MinLots);

return (LotsLong);

if (GetWinLossPreviousLong (LastOpenTicket, LastTicket, WinLossPreviousLong) == "L")

{

if (Kontostand() > KontoFreierSpielraum())

LotsLong = NormalizeDouble(AccountFreeMargin() * (LowRisk / 100) / (SLDistanceLong * MarketInfo (Symbol(), MODE_TICKVALUE)), LotDigit);

else LotsLong = NormalizeDouble(Kontostand() * (NiedrigRisiko / 100) / (SLDistanceLong * MarketInfo (Symbol(), MODE_TICKVALUE)), LotDigit);

}

LotsLong = NormalizeDouble(NormalizeDouble(LotsLong / LotStep, 0) * LotStep, LotDigit);

LotsLong = MathMax(MathMin(LotsLong, MaxLots), MinLots);

return (LotsLong);

}

 

...

GetLots() in der Form, wie ich es gepostet habe, ist getestet und funktioniert wie es sollte. Es besteht keine Notwendigkeit, sie zu ändern. Verwenden Sie sie als Funktion, die die Losgröße zum Zeitpunkt der Auftragseröffnung bestimmt. Lassen Sie den Rest der Logik außen vor (diese Funktion sollte nur das tun: die Auftragsgröße in Abhängigkeit von Risiko, Stop Loss und aktuellem Kontostand ermitteln).

Ohne den Rest des Codes kann ich Ihnen nicht helfen. Das wäre so, als ob ich durch ein winziges Loch schauen und die ganze Welt sehen könnte. Unmöglich. Wenn Sie den Rest des Codes geheim halten wollen, kann ich Ihnen nur mit dem Code helfen, den Sie hier posten, und ich wiederhole: Seien Sie versichert, dass GetLots() in der ursprünglichen Form funktioniert, wie es sollte, und dass es in seiner ursprünglichen Form verwendet werden sollte.

Wenn Sie die Funktion mit variablen Ergebnissen verwenden möchten, ändern Sie das Risiko oder den Stop-Loss dynamisch ("entscheiden" Sie sich für das Risiko oder den Stop-Loss im Code vor GetLots() und rufen Sie die Funktion dann mit diesem geänderten Risiko oder Stop-Loss auf - die Funktion wird für die gegebenen veränderten Eingaben korrekt berechnen).

crsnape@btinternet.com:
Hallo, ich habe die Funktionen korrigiert und bin jetzt zufrieden damit. Sieht gut aus. Allerdings enthält das Protokoll der Handelsergebnisse bei meinem Backtest nur 1 Kaufauftrag. Ich denke, es könnte an meiner Funktion GetLots liegen, aber ich bin mir trotz mehrmaligem Überprüfen nicht sicher. Könnten Sie einen Blick darauf werfen und mir Bescheid geben, wenn Sie etwas finden, das nicht stimmt? Vielen Dank!

//--- Funktion zur Berechnung von Lots für Long-Positionen

double GetLotsLong (int NiedrigRisiko, int HochRisiko, double SLDistanceLong, int LastOpenTicket, int LastTicket)

{

RefreshRates();

double MinLots, MaxLots, LotStep;

int LotDigit = 2;

double LotsLong = 0;

MinLots = NormalizeDouble(MarketInfo(Symbol(), MODE_MINLOT), 2); // Lots müssen normalisiert werden, um LotStep zu berücksichtigen.

MaxLots = NormalizeDouble(MarketInfo(Symbol(), MODE_MAXLOT), 2); // Bei der Normalisierung wird nicht gerundet, sondern der Teil des Loses, der größer als LotStep ist, abgeschnitten.

LotStep = NormalizeDouble(MarketInfo(Symbol(), MODE_LOTSTEP), 2); // Auf diese Weise ist das Risiko etwas geringer.

if (MarketInfo(Symbol(), MODE_DIGITS) == 3 || MarketInfo(Symbol(), MODE_DIGITS) == 5) SLDistanceLong *= 10.0;

wenn (LotStep == 1.00) LotDigit = 0;

wenn (LotStep == 0.10) LotDigit = 1;

wenn (LotStep == 0.01) LotDigit = 2;

if (GetWinLossPreviousLong (LastOpenTicket, LastTicket, WinLossPreviousLong) == "W")

{

if (Kontostand() > AccountFreeMargin())

LotsLong = NormalizeDouble(AccountFreeMargin() * (HighRisk / 100) / (SLDistanceLong * MarketInfo (Symbol(), MODE_TICKVALUE)), LotDigit);

else LotsLong = NormalizeDouble(Kontostand() * (HohesRisiko / 100) / (SLDistanceLong * MarketInfo (Symbol(), MODE_TICKVALUE)), LotDigit);

}

LotsLong = NormalizeDouble(NormalizeDouble(LotsLong / LotStep, 0) * LotStep, LotDigit);

LotsLong = MathMax(MathMin(LotsLong, MaxLots), MinLots);

return (LotsLong);

if (GetWinLossPreviousLong (LastOpenTicket, LastTicket, WinLossPreviousLong) == "L")

{

if (Kontostand() > KontoFreierSpielraum())

LotsLong = NormalizeDouble(AccountFreeMargin() * (LowRisk / 100) / (SLDistanceLong * MarketInfo (Symbol(), MODE_TICKVALUE)), LotDigit);

else LotsLong = NormalizeDouble(Kontostand() * (NiedrigRisiko / 100) / (SLDistanceLong * MarketInfo (Symbol(), MODE_TICKVALUE)), LotDigit);

}

LotsLong = NormalizeDouble(NormalizeDouble(LotsLong / LotStep, 0) * LotStep, LotDigit);

LotsLong = MathMax(MathMin(LotsLong, MaxLots), MinLots);

return (LotsLong);

}
 

Hallo mladen, ich stimme Ihnen voll und ganz zu. Die von Ihnen bereitgestellte Funktion GetLots funktioniert so, wie sie sollte; ich habe sie als Teil meines Codes getestet und sie hat funktioniert.

Ich habe Änderungen daran vorgenommen, weil ich meine Risikoperamter ändern möchte, je nachdem ob ich gewinne oder verliere. Ich habe den bestehenden Code im Grunde ausgearbeitet (oder es zumindest versucht), indem ich zusätzliche Regeln für das Geldmanagement eingebaut habe.

Ich kann ehrlich sagen, dass mein Code nicht geheim ist; ich bin sicher, dass viele andere das, was ich zu tun versuche, in Betracht gezogen und in Code umgesetzt haben; aber ich nehme an, dass es ein Element der Privatsphäre gibt, weil ich persönlich so viel Zeit in die Entwicklung investiert habe.

Ich werde meinen Code immer wieder überprüfen, denn ich möchte natürlich versuchen, alle Probleme selbst zu lösen, da ich stolz darauf bin, Dinge von Grund auf zu lernen und zu tun.

Aber ich verstehe Ihren letzten Absatz; ich werde eine "Risiko"-Variable verwenden und dieses Risiko bei der Ausgabe einer Funktion entsprechend ändern.

Wie auch immer, vielen Dank für Ihre Antwort, dieses Forum wäre nicht dasselbe ohne Sie; Sie haben mir schon unzählige Male geholfen.

Prost :-)