Unentgeltlich interessante Dinge tun - Seite 20

 
DmitriyN: Es ist etwas anderes.
Sie irren sich, Ihr Zickzack-Knieverhältnis-Problem ist von vielen gelöst worden(nicht nur von diesem Skript ), obwohl ich es nicht aufdränge.
 
Sie müssen die Minima der Maxima markieren,
die Kriterien für die Suche nach den Formen auszuarbeiten.
und dann nehmen wir den Startpunkt,
eine ungebremste Aufwärts-/Abwärtsbewegung zu erwarten,
und suchen Sie dann daneben nach einer Prozentzahl.

Eigentlich ist es fast ein einfacher Zickzackkurs.
Und anstelle eines Pfahls kann man auch einen Verteiler bauen.
wie viel das Knie #X von dem vorherigen ist.
 
Vinin:

Die Fische sind nicht da

Direktor des Stadions (c)

Ja, es gibt dort Fische... Wenn die Bewegung war nicht weniger als 60,0 Pips und der Pullback war nicht weniger als 25% - dann ist der Schlupf auf den Ebenen wird nicht mehr als 2-3 mal ... und dann kann man auch Martini verwenden :-)
 
DmitriyN:
Es ist ein guter Witz, aber kommentieren Sie wenigstens Ihren Standpunkt.

Bei ZZ wurde viel kaputt gemacht, und zwar nicht nur von mir. Vielleicht ist ein anderer Ansatz erforderlich. Ich habe vor kurzem die Mustererkennung (mit Kohonen) und die Entscheidungsfindung abgeschlossen. Leider ist das Ergebnis negativ. Vielleicht sollten wir einfach einen umfassenden Ansatz wählen.
 
GaryKa:
Sie irren sich, Ihr Zickzack-Knieverhältnis-Problem ist von vielen gelöst worden (nicht nur von diesem Skript), obwohl ich es nicht aufdränge.
Es geht nicht um das Verhältnis. Das Verhältnis zwischen den Knien ist ein separates Thema. Ich meine die Suche nach dem maximalen Trend auf dem Chart.
Dieses Drehbuch? Ich verstehe nicht, worum es dabei geht. Dann erklären Sie es wenigstens.
 
#property copyright "Copyright c 2003"
#property link ""

#property indicator_chart_window
//---- input parameters
extern color LabelFontColor = Lime;
extern int LabelFontSize = 8;

//---- buffers
// Счётчик для всяких функций
int i = 0;
// Счётчик для уникальных имён
double NUN=0;
// Уникальное имя текстового объекта
int Rmm1=0; string MM1Im; string MM1; double MM1Mi = 100;double MM1Ma = 0;
int Rmm2=0; string MM2Im; string MM2; double MM2Mi = 100;double MM2Ma = 0;
int Otk1=0; string Ot1; double Ot1Mi = 100;double Ot1Ma = 0; // первая откатка в 25%
int Otl1=0; string Ol1; double Ol1Mi = 100;double Ol1Ma = 0; // первая откатка в 25%
int Otl2=0; string Ol2; double Ol2Mi = 100;double Ol2Ma = 0; // первая откатка в 25%
int Teik=0; string Te; double TeMi = 100;double TeMa = 0; // первая откатка в 25%
int Stop=0; string St; double StMi = 100;double StMa = 0; // первая откатка в 25%

string cSt1; double cSt1Mi = 100;double cSt1Ma = 0; // первая откатка в 25%
string cTe1; double cTe1Mi = 100;double cTe1Ma = 0; // первая откатка в 25%
string Ot2; double Ot2Mi = 100;double Ot2Ma = 0; // первая откатка в 25%
string St2; double St2Mi = 100;double St2Ma = 0; // первая откатка в 25%
string Te2; double Te2Mi = 100;double Te2Ma = 0; // первая откатка в 25%
string cSt2; double cSt2Mi = 100;double cSt2Ma = 0; // первая откатка в 25%
string cTe2; double cTe2Mi = 100;double cTe2Ma = 0; // первая откатка в 25%



//общая часть наименований текстовых объектов
string _BareSize = "NC5_";

int KolVo_Barov = 0;// колво баров...

// Направление сделки
// 0 - ищем Минимум на графике... после которого Максимум имеется не менее 60 пипсов...
// 1 - нашли такой Максимум - теперь ищем Откатку в 0.25 или Новый Максимум..
int NapSd = 0;
int NapSd1 = 0;
//
double Mn001=100,Ma001=0;
double Mn002=100,Ma002=0;
double Mn003=100,Ma003=0;


//+------------------------------------------------------------------+
//| Custom indicator initialization function |
//+------------------------------------------------------------------+
int init() {
DeleteBarSizeLabels();
return(0);
}
//+------------------------------------------------------------------+
void DeleteBarSizeLabels() {
int ArrSize = 0;
int i;
string ObjectsColl[20000];
for(i = 0; i < ObjectsTotal(); i++) {
//сформируем массив удаляемых объектов - только построенных данным идикатором
if(StringFind(ObjectName(i), _BareSize, 0) != -1){
ObjectsColl[ArrSize] = ObjectName(i);
ArrSize++;
}
}
//удаляем согласно списку
for(i = 0; i < ArrSize; i++) ObjectDelete(ObjectsColl[i]);
}
//+------------------------------------------------------------------+
//| Custor indicator deinitialization function |
//+------------------------------------------------------------------+
int deinit() {
Print("Deintit Indikatora");
DeleteBarSizeLabels();
return(0);
}
//+------------------------------------------------------------------+
//| Custom indicator iteration function |
//+------------------------------------------------------------------+
int start() {
int counted_bars = IndicatorCounted(); //
int limit;
double i1;// чем кончился день..
double i3;// чем кончился день..
string i2 = "";
int stavka = 1;
int napstv = 0;
int Lott =0;
int prz=0; // признак продолжения ставки
double Res1 = 0;// итог сделки в пипсах
double Res2 = 0;// итог сделки в пипс*лоты
double Res3 = 0;// итог сделок
double Res4 = 0;// положительный итог сделок
double BaksRos = 0;// скоко дней бакс рос
double CeOtk = 0;// цена открытия сделки с учётом спреда...
double MaksiSt = 0;// Максимальная ставка
double teik = 0;
double loss = 0;

double Size; // итог сделки в пипах
int Explic = MathPow(10, MarketInfo(Symbol(), MODE_DIGITS));
int Pr1 =0; 
for( i = Bars-20; i >= 0; i--) {
NapSd = NapSd1;
//+------------------------------------------------------------------+
//| Поиск Нового МИНИМУМА
//+------------------------------------------------------------------+
if (NapSd == 0 || NapSd == 1 || NapSd == 2 ) {
if (Low[i] < MM1Mi) {
// нашли новый минимум
// надо нарисовать границы поиска максимума...
MM1Mi = Low[i];
MM1Ma = Low[i]+250*Point;
// определим новые имена для рисования Квадрата поиска
MM1Im = _BareSize + DoubleToStr(NUN,0); NUN++;
MM1 = _BareSize + DoubleToStr(NUN,0); NUN++;
ObjectCreate(MM1Im, OBJ_TEXT, 0, Time[i+1], High[i] + 10*Point);
ObjectSetText(MM1Im, "Поиск New Min" ,LabelFontSize, "Arial",Snow);// LightCyan);
ObjectSet(MM1Im, OBJPROP_ANGLE,90);
// Рисуем КВАДРАТ поиска Максимума
ObjectCreate(MM1, OBJ_RECTANGLE, 0, Time[i+1], MM1Mi, Time[i], MM1Ma);
ObjectSet(MM1,OBJPROP_COLOR, Teal);
Rmm1 = 0;
Rmm2 = 0;
Otk1 = 0;
Otl1 = 0;
Otl2 = 0;
Teik = 0;
NapSd = -1; NapSd1 = 1; // поиск Движухи в 60 пипов
}
}
//+------------------------------------------------------------------+
//| поиск Движухи в 60 пипов
//+------------------------------------------------------------------+
if (NapSd == 1 ) ObjectSet(MM1,OBJPROP_TIME2, Time[i]);
if (NapSd == 2 ) ObjectSet(MM1,OBJPROP_TIME2, Time[i]);
if (NapSd == 3 ) ObjectSet(MM1,OBJPROP_TIME2, Time[i]);
if (Otk1 == 1 ) ObjectSet(Ot1,OBJPROP_TIME2, Time[i]);
if (Otl2 == 1 ) ObjectSet(Ol2,OBJPROP_TIME2, Time[i]);
if (Otl1 == 1 ) ObjectSet(Ol1,OBJPROP_TIME2, Time[i]);
if (Teik == 1) ObjectSet(Te,OBJPROP_TIME2, Time[i]);
if (Teik == 1) ObjectSet(St,OBJPROP_TIME2, Time[i]);
//+------------------------------------------------------------------+
//| поиск Движухи в 60 пипов
//+------------------------------------------------------------------+
if (NapSd == 1 && High[i] >= MM1Ma) {
// перерисовываем нижний квадрант
MM1Ma = High[i];
MM1 = _BareSize + DoubleToStr(NUN,0); NUN++;
ObjectCreate(MM1, OBJ_RECTANGLE, 0, Time[i], MM1Mi, Time[i-1], MM1Mi+30*Point);
ObjectSet(MM1,OBJPROP_COLOR, Teal);
// рисуем квадрат 0.25 движухи
Otk1 = 1; Otl2 = 0; Rmm1 = 0; Rmm2 = 0; Teik = 0;
Ot1 = _BareSize + DoubleToStr(NUN,0); NUN++;
Res1 = Explic * (MM1Ma - MM1Mi);
Res1 = Res1 * 0.25;
Ot1Ma = MM1Ma; Ot1Mi = Ot1Ma - Res1*Point;
ObjectCreate(Ot1, OBJ_RECTANGLE, 0, Time[i], MM1Ma,Time[i-1], Ot1Mi);
ObjectSet(Ot1,OBJPROP_COLOR, DarkViolet);
NapSd = -1; NapSd1 = 1; // движуха найдена - ищем откатку
}
//+------------------------------------------------------------------+
//| поиск Откатки движухи в 0,25
//+------------------------------------------------------------------+
if (NapSd == 1 && Otk1 == 1 && Low[i] <= Ot1Mi) {
// откатка найдена - выставляем отложенный ордер
Teik = 0; Otk1 = 0; ObjectSet(Ot1,OBJPROP_TIME2, Time[i]);
Otl2 = 1;
Ol2 = _BareSize + DoubleToStr(NUN,0); NUN++;
Ol2Ma = Ot1Ma;
Ol2Mi = Ot1Mi;
ObjectCreate(Ol2, OBJ_RECTANGLE, 0, Time[i], Ol2Ma, Time[i-1], Ol2Mi); ObjectSet(Ol2,OBJPROP_COLOR, LightSeaGreen);
NapSd = -1; NapSd1 = 2; //движуха найдена - выставляем отложенный ордер
}
//+------------------------------------------------------------------+
//| если выставлен отложенный ордер №2
//| то проверяем не ципанула ли его цена Снизу вверх
//| выставляем Тейк и Лосс
//+------------------------------------------------------------------+
if (Otl2 == 1 && High[i] >= Ol2Ma) {
Otl2 = 0;
Teik = 1;
Te = _BareSize + DoubleToStr(NUN,0); NUN++;
TeMa = Ol2Ma; TeMi = Ol2Mi;
ObjectCreate(Te, OBJ_RECTANGLE, 0, Time[i], TeMa, Time[i-1], TeMi);
ObjectSet(Te,OBJPROP_COLOR, Blue);
Res1 = Explic * (TeMa - TeMi);
St = _BareSize + DoubleToStr(NUN,0); NUN++;
StMa = Ol2Ma + Res1*Point; StMi = Ol2Ma;
ObjectCreate(St, OBJ_RECTANGLE, 0, Time[i], StMa, Time[i-1], StMi);
ObjectSet(St,OBJPROP_COLOR, Crimson);
i--; NapSd = -1; NapSd1 = 3; // выставили Настоящий ордер с Тейком и Лоссом
} 
//+------------------------------------------------------------------+
//| если выставлен отложенный ордер №2
//| то проверяем не ципанула ли его цена Сверху вниз
//| выставляем Тейк и Лосс
//+------------------------------------------------------------------+
if (Otl1 == 1 && Low[i] <= Ol1Ma) {
Otl1 = 0; Teik = 1;
Te = _BareSize + DoubleToStr(NUN,0); NUN++;
TeMa = Ol1Ma; TeMi = Ol1Mi;
ObjectCreate(Te, OBJ_RECTANGLE, 0, Time[i], TeMa, Time[i-1], TeMi);
ObjectSet(Te,OBJPROP_COLOR, Blue);
Res1 = Explic * (TeMa - TeMi);
St = _BareSize + DoubleToStr(NUN,0); NUN++;
StMa = Ol1Ma + Res1*Point; StMi = Ol1Ma;
ObjectCreate(St, OBJ_RECTANGLE, 0, Time[i], StMa, Time[i-1], StMi);
ObjectSet(St,OBJPROP_COLOR, Crimson);
i--; NapSd = -1; NapSd1 = 4; // выставили Настоящий ордер с Тейком и Лоссом

}
//+------------------------------------------------------------------+
//| если сработал Тейк
//+------------------------------------------------------------------+
if (Teik == 1 && Low[i] <= TeMi) {
ObjectSet(Te,OBJPROP_TIME2, Time[i-1]);
MM1Im = _BareSize + DoubleToStr(NUN,0); NUN++;
ObjectCreate(MM1Im, OBJ_TEXT, 0, Time[i+1], High[i] + 2*Point);
ObjectSetText(MM1Im, "tp=" ,LabelFontSize, "Arial",Snow);
ObjectSet(MM1Im, OBJPROP_ANGLE,90);
Rmm1 = 0;
Rmm2 = 0;
Otk1 = 0;
Otl1 = 0;
Otl2 = 0;
Teik = 0;
MM1Ma = 0;
MM1Mi = 100;
i--;
i--;
NapSd = -1; NapSd1 = 0;
}
//+------------------------------------------------------------------+
//| если сработал СТОП лосс
//+------------------------------------------------------------------+
if (NapSd == 3 && Teik == 1 && High[i] >= StMa) {
ObjectSet(St,OBJPROP_TIME2, Time[i]);

MM1Im = _BareSize + DoubleToStr(NUN,0); NUN++;
ObjectCreate(MM1Im, OBJ_TEXT, 0, Time[i+1], High[i] + 2*Point);
ObjectSetText(MM1Im, "sL=" ,LabelFontSize, "Arial",Snow);
ObjectSet(MM1Im, OBJPROP_ANGLE,90);

Otl1 = 1;
Ol1 = _BareSize + DoubleToStr(NUN,0); NUN++;
Ol1Ma = Ot1Ma;
Ol1Mi = Ot1Mi;
Rmm1 = 0;
MM1Ma = High[i];
MM2 = _BareSize + DoubleToStr(NUN,0); NUN++;
ObjectCreate(MM2, OBJ_RECTANGLE, 0, Time[i], MM1Mi, Time[i-1], MM1Mi+30*Point); ObjectSet(MM2,OBJPROP_COLOR, Teal);
ObjectCreate(Ol1, OBJ_RECTANGLE, 0, Time[i], Ol1Ma, Time[i-1], Ol1Mi); ObjectSet(Ol1,OBJPROP_COLOR, LightSeaGreen);
// рисуем квадрат 0.25 движухи
Otk1 = 1; Otl2 = 0; Rmm1 = 0; Rmm2 = 1; Teik = 0;
Ot1 = _BareSize + DoubleToStr(NUN,0); NUN++;
Res1 = Explic * (MM1Ma - MM1Mi);
Res1 = Res1 * 0.25;
Ot1Ma = MM1Ma; Ot1Mi = Ot1Ma - Res1*Point;
ObjectCreate(Ot1, OBJ_RECTANGLE, 0, Time[i], MM1Ma,Time[i-1], Ot1Mi);
ObjectSet(Ot1,OBJPROP_COLOR, DarkViolet);
NapSd = -1; NapSd1 = 1;
}
}
//----
return(0);
} 

Hier ist ein Beispielindikator mit farbigen Quadraten auf dem Chart, die Bewegungen und Pullbacks anzeigen...

Sie können einen beliebigen Advisor auf einen Tick-Lauf setzen, sagen wir auf 5 oder 15 Minuten - dort eine Pause einlegen - und diesen Indikator auf das visuelle Diagramm setzen....

 
Vinin:
Ich bin nicht der Einzige, der bei ZZ schon oft kaputt gegangen ist. Vielleicht ist aber auch ein anderer Ansatz erforderlich. Ich habe vor kurzem die Mustererkennung (mit Kohonen) und die Entscheidungsfindung abgeschlossen. Leider ist das Ergebnis negativ. Vielleicht sollten wir einfach einen umfassenden Ansatz wählen.

Victor, hier geht es nicht um Zick-Zack-Kurse. Ihre Probleme sind klar. Nehmen wir an, dass wir eine Definition festlegen:

Ein Trend ist eine gerichtete Kursbewegung, nach der der Kurs zwangsläufig um 33 % zurückgeht (es kann auch eine andere Zahl sein).

Wie lässt sich nach dieser Definition die maximale Länge des Trends auf dem Symboldiagramm ermitteln? Dies sollte das Skript tun.
Es ist durchaus möglich, dass RZ hier angewendet werden kann, das bestreite ich nicht, aber ich habe ein solches Skript noch nicht gesehen.

 
DmitriyN:

TheXpert, ich schlage Ihnen die Idee eines Forschungsskripts vor

Es sollte die gesamte Historie (alle Balken) durchlaufen, beginnend mit Bars() und endend mit Balken 0. Sein Zweck ist es, die maximal zulässige Kursstärke für einen Pullback zu bestimmen.

Unter der Stärke versteht man den Abstand H, den der Kurs in beliebiger Richtung (nach unten oder oben) vom Ausgangskurs aus durchlaufen sollte
der Rückzug F, ausgedrückt als Prozentsatz der Höhe H, muss diesem Abstand entsprechen:

Der Zweck dieses Skripts ist es, den maximalen Wert der Preislänge des Trends in der Historie für ein bestimmtes Instrument zu kennen, um die
Mittelungstechniken. Vorzugsweise gibt das Skript den Ort (Daten) des Trends mit der gefundenen maximalen Größe an.

Die Ausgangsdaten für das Skript sind die gleichen - der Prozentsatz des Preisrückgangs (Price Drawdown).

Ich möchte Sie daran erinnern, dass der Pullback (in Punkten) ist:
- bei einem Aufwärtstrend - die Differenz zwischen dem Höchstkurs und dem Mindestkurs, der (der Mindestkurs) nach dem Höchstkurs erscheint;
- bei einem Abwärtstrend (wie in der obigen Abbildung) - die Differenz zwischen dem maximalen Kurswert, der nach dem minimalen Kurswert erscheint;
Prozentualer Pullback (in %) - das Verhältnis des Pullbacks in Pips zur Größe des Trends in Pips, multipliziert mit 100%.

Ich arbeite derzeit selbst an einem solchen Skript, habe aber noch nicht herausgefunden, wie man den Algorithmus richtig macht.


So etwas habe ich schon vor ein paar Jahren gemacht:

https://www.mql5.com/ru/forum/116407

Der richtige Ansatz besteht darin, einen EA zu erstellen und die Einstiegs- und Ausstiegsebenen im Tester zu optimieren. So erhält man die Statistiken.

 
DmitriyN:

Victor, hier geht es nicht um Zick-Zack-Kurse. Bei ihren Problemen ist alles klar. Nehmen wir an, wir haben eine Definition:

Ein Trend ist eine gerichtete Kursbewegung, auf die der obligatorische Kursrückgang von 33 % folgt (es kann auch eine andere Zahl sein).

Wie lässt sich auf der Grundlage dieser Definition die maximale Länge des Trends im Symboldiagramm ermitteln? Dies sollte das Skript tun.
Es mag durchaus möglich sein, hier eine FZ anzuwenden, das bestreite ich nicht, aber ich habe ein solches Skript noch nicht gesehen.


Wenn es kein GZ ist, müssen Sie es selbst formulieren.

Es braucht nicht viel, um ein Bild zu zeichnen.

 
DmitriyN:

Victor, hier geht es nicht um Zick-Zack-Kurse. Ihre Probleme sind klar. Nehmen wir an, wir setzen uns eine Definition:

Ein Trend ist eine gerichtete Kursbewegung, nach der es zwangsläufig zu einem 33%igen Kursrückgang kommt (es kann auch eine andere Zahl sein).

Wie lässt sich auf der Grundlage dieser Definition die maximale Länge des Trends im Symboldiagramm ermitteln? Dies sollte das Skript tun.
Es mag durchaus möglich sein, hier eine FZ anzuwenden, das bestreite ich nicht, aber ich habe ein solches Skript noch nicht gesehen.


Es gab einen Indikator, der mit Brüchen (Prozentsätzen) arbeitete. Eine der XMA-Varianten, aber ich werde sie kaum finden können. Ich habe sie jedoch nicht analysiert.