Nützliche Funktionen von KimIV - Seite 98

 
Hallo Igor! 09.05.2008 17:10 auf Seite 17. 17 Sie haben die Korrelationsfunktion beschrieben. Können Sie die Korrelationsfunktion mit Hilfe der Pearson-Formel beschreiben?
 

Hallo Igor!

Könnten Sie den e-OpenByTime EA ändern oder einen neuen schreiben, oder einen fertigen vorschlagen :)))

Ich brauche einen EA, der die Pausen in verschiedenen Richtungen zu X Zeit von N Pips aus dem Preis setzt!

 

Hallo, Igor!

Haben Sie ein Skript, das horizontale Liniensegmente bei X und Y Pips vom Signal zeichnet?

Lassen Sie mich das erklären: Es gibt Kauf-/Verkaufssignale (sich kreuzende Muwings, Fraktale usw.).

Das Skript setzt 4 Parameter, zum Beispiel:

- 300 Pips bis zum Stop,

- 500 Pips zum Mitnehmen,

- 10 Balken = Länge der Balken,

- wo und wie man die Signale nimmt - Bezugnahme auf den Signalindikator, Einfügen von Bedingungen für Signale... Über diesen Punkt sollte man nachdenken!

Das Skript zeichnet 2 Linien auf jedes Kaufsignal:

1) den ersten ("Stop") um 300 Pips unter dem Eröffnungskurs des Signalbalkens;

2) die zweite ("Take") um 500 Punkte höher als der Eröffnungskurs des Signalbalkens

3) Die Zeilen beginnen mit dem Signalbalken und enden mit dem 10.

Bei den Verkaufssignalen verhält es sich genauso, nur die Einzüge der Linien sind umgekehrt.

Ich denke, dass eine solche Visualisierung für eine vorläufige Einschätzung von "Signal-Stopp" nützlich sein wird.

Mit freundlichen Grüßen, Vadim.

 

Hallo Igor!

Frage 1.

Es gibt einen Fehler 138 in Ihrer OpenPosition()-Funktion - ERR_REQUOTE wird pausiert:

if (err!=135) Sleep(1000*7.7);

Obwohl in der Dokumentation empfohlen wird, die Daten zu aktualisieren und erneut zu versuchen, sofort (der Preis verlässt, möchte ich eine Position so bald wie möglich zu öffnen))).

Möge es also richtig sein:

if (err!=135 && err!=138) Sleep(1000*7.7);?

Oder übersehe ich vielleicht etwas?

Frage 2.

Wie kann ich den Slippage-Parameter in der Funktion OrderSend() korrekt mit 5 Punkten angeben, wenn meine Brokerfirma (Alpari) 5 Dezimalstellen angibt?

- "50"?

- oder "5"?

 
slavamir писал(а) >>

Frage 1.

In Ihrer Funktion OpenPosition() wird der Fehler 138 - ERR_REQUOTE angehalten:

if (err!=135) Sleep(1000*7.7);

Obwohl in der Dokumentation empfohlen wird, die Daten zu aktualisieren und erneut zu versuchen, sofort (der Preis verlässt, möchte ich eine Position so bald wie möglich zu öffnen))).

Möge es also richtig sein:

if (err!=135 && err!=138) Sleep(1000*7.7);?

Ja, das ist in Ordnung! Man kann es auch so machen... Ich danke Ihnen!

slavamir schrieb >>

Frage 2.

Bitte sagen Sie mir, wie ich den Slippage-Parameter in der Funktion OrderSend() korrekt auf 5 Punkte setzen kann, wenn meine Brokerfirma (Alpari) 5 Dezimalstellen angibt.

- "50"?

- Oder ist es "5"?

5
 

Hallo Igor,

könnten Sie bitte helfen, Ihre Funktion GetProfitFromDateInCurrency() zu verfeinern. Ich brauche es, um den Gewinn von sogar nur geschlossenen Aufträgen zu berechnen. Ich verwende die Teilschließung (Aufteilung) von Aufträgen und die Funktion CloseBy, um den Restbetrag eines bestehenden Auftrags zu schließen. Um festzustellen, ob eine gerade oder ungerade Anzahl von Aufträgen abgeschlossen wurde, verwende ich die Formel:

double x, y; --------------------------------- Angenommen
x=MathFloor(OrderLots()/0.02); --------- a. Wenn Lose 0.04/0.02=2 --- b. Wenn Lose 0.03/0.02=1
y=x*0.02; ---------- a. 2*0,02=0,04 --- б. 1*0,02=0,02
if (y==OrderLots()) ---------- а. 0.04==0.04 --- b. 0.02!=0.04
XLots=y; Wenn gleich, dann bekommt XLots den Wert von y

Das funktioniert (ich konnte mir keine bessere Möglichkeit vorstellen, in gerade/ungerade zu teilen und habe keinen Hinweis bekommen, als ich fragte).

Als Nächstes der eigentliche Funktionsaufruf (den ich aus dem Ihren gemacht habe)
ClOrdProf=GetProfitFromDateInCurrency("", -1, -1, XTime, XLots);

Und mein vergeblicher Versuch, Ihrer Funktion die Bedingung hinzuzufügen, dass der Gewinn berechnet werden muss, wenn die Lots gerade sind:

double GetProfitFromDateInCurrency(string sy="", int op=-1, int mn=-1, datetime dt=0, double lt=-1)
{
double p=0;
int i, k=OrdersHistoryTotal();

if (sy=="0") sy=Symbol();
for (i=0; i<k; i++) {
if (OrderSelect(i, SELECT_BY_POS, MODE_HISTORY)) {
if ((OrderSymbol()==sy || sy==") && (op<0 || OrderType()==op)) {
if (OrderType()==OP_BUY || OrderType()==OP_SELL) {
if (mn<0 || OrderMagicNumber()==mn) {
if (dt<OrderCloseTime()) {
if (OrderLots()==lt) {
p+=OrderProfit()+OrderCommission()+OrderSwap();
}
}
}
}
}
}
}
return(p);
}

Es will nicht zählen.
1. Bin ich irgendwo in der Funktion falsch?
2. Könnte die Tatsache, dass Aufträge durch OrdCloseBy geschlossen werden, einen Einfluss haben?

 
Nehmen wir an, dass der Parameter int lt in der Funktion GetProfitFromDateInCurrency() drei Flag-Werte annimmt
-1 alle Aufträge, 0 - gerade Lots, 1 - ungerade Lots, dann
ersetzen
if (OrderLots()==lt) {
p+=OrderProfit()+OrderCommission()+OrderSwap()

}

bis

if (lt == -1){
p+=OrderProfit
()+OrderCommission()+OrderSwap();
} else {
int test = OrderLors() * 100;
if (lt == test % 2) {
p+=OrderProfit()+OrderCommission()+OrderSwap();
} else {
p+=OrderProfit()+OrderCommission()+OrderSwap();
}
}
 
keekkenen писал(а) >>
Nehmen wir an, in der Funktion int lt der Funktion GetProfitFromDateInCurrency() nimmt der Parameter drei Flag-Werte an


Danke, Ihre Methode der Losberechnung durch Modulo ist richtig, ich werde sie später anwenden... Aber es stellt sich heraus, dass die Funktion, die ich verfeinert habe, funktioniert... in gewisser Weise. Ich habe Alert hinzugefügt, um die Änderungen von "p+=" zu sehen, und es wird alles korrekt berechnet. Aber der Wert ClOrdProf, aus dem wir die Informationen entnehmen wollen, wird nicht angezeigt: Alert ("ClOrdProf= ",ClOrdProf);. Im Code sieht das so aus:
int start()
{
........................
bool
ClOrdProf=false; //logischer Wert
........................
ClOrdProf=GetProfitFromDateInCurrency(",-1,-1,XTime,XLots); //Funktionsaufruf
wenn (ClOrdProf==true)
Alert ("ClOrdProf=",ClOrdProf); - es wird nicht im Protokoll aktualisiert
.........................
return; //Beenden von start()
}
// Funktion zur Berechnung des Gewinns bei geschlossenen Aufträgen
double GetProfitFromDateInCurrency(string sy="", int op=-1, int mn=-1, datetime dt=0, double lt=-1)
{
double p=0;
int i, k=OrdersHistoryTotal();

if (sy=="0") sy=Symbol();
for (i=0; i<k; i++) {
if (OrderSelect(i, SELECT_BY_POS, MODE_HISTORY)) {
wenn ((OrderSymbol()==sy || sy==") && (op<0 || OrderType()==op)) {
if (OrderType()==OP_BUY || OrderType()==OP_SELL) {
if (mn<0 || OrderMagicNumber()==mn) {
if (dt<OrderCloseTime()) {
if (OrderLots()==lt) {
p+=OrderProfit()+OrderCommission()+OrderSwap();
Alert ("p= ", p); - aktualisiert im Protokoll
}
}
}
}
}
}
}
zurück(p);
}
Ich kann nicht herausfinden, was los ist...

 

Lustig, nicht wahr, lustig... lustig für dich und sogar für mich...(Wladimir Semjonowitsch)
Ursprünglich ist ClOrdProf kein bool, sondern ein double. Und es sollte "if (ClOrdProf>0 || ClOrdProf<0)" geben - der zweite Teil, beginnend mit "or", für die Zählung im Falle eines negativen Gewinns...was ich als "gewaschenes Auge" bezeichne - habe selbst nicht gleich gesehen, was an der Oberfläche liegt.
Dank an keekkenen für die Hilfe bei der Berechnung der ungeraden/geraden Lose.
Dank an Igor für die Möglichkeit, seine Funktion zu verbessern.

 
KimIV >>:

Функция TicketNearPos().

Эта функция возвращает тикет ближайшей к рынку позиции. В качестве критерия "близости" позиции выступает минимум расстояния в пунктах между ценой открытия позиции и текущей рыночной ценой. Отбор учитываемых позиций задаётся внешними параметрами:

  • sy - Наименование рыночного инструмента. Если задать этот параметр, то функция учтёт позиции только заданного инструмента. Значение по умолчанию - "" означает любой рыночный инструмент. Значение NULL означает текущий инструмент.
  • op - Торговая операция, тип позиции. Допустимые значения: OP_BUY, OP_SELL или -1. Значение по умолчанию -1 означает любую позицию.
  • mn - Идентификатор позиции, MagicNumber. Значение по умолчанию -1 означает любой идентификатор.
ЗЫ. Во вложении скрипт для тестирования функции TicketNearPos().
if (pp == 0) 
{return (ti);}
Ich habe einen Fehler in der Funktion TypeNearPos festgestellt, wenn die Bedingung erfüllt ist:
Marktpreis = Preis der offenen Order, dann wird diese Order von dieser Funktion nicht mehr berücksichtigt.
Ich musste diese einfache Bedingung in den Code einfügen.
Diese Bedingung wird auch bei den ähnlichen Funktionen TypeNearPos() und PriceOpenNearPos() hilfreich sein.