Hacer cosas interesantes gratis - página 20

 
DmitriyN: Es algo más.
Te equivocas tu problema de relación de rodilla en zig-zag ha sido resuelto por muchos(no solo ese script ), aunque no lo impongo.
 
Hay que marcar los mínimos de los máximos,
...para encontrar las formas...
y luego tomamos el punto de partida,
busque un movimiento de subida/bajada sin límites,
y luego buscar un palo de porcentajes al lado.

En realidad, es casi un simple zigzag.
Y en lugar de una estaca, puedes construir una distribución-.
la rodilla #X es de la anterior.
 
Vinin:

Los peces no están ahí

Director del estadio (c)

Sí, hay peces allí... Si el movimiento fue de no menos de 60.0 pips y el pullback fue de no menos del 25% - entonces el deslizamiento en los niveles no será más de 2-3 veces ... y entonces puedes usar martini también :-)
 
DmitriyN:
Es un buen chiste, pero al menos comenta tu punto de vista.

Se ha roto mucho en ZZ, y no sólo por mí. Tal vez sea necesario un enfoque diferente. Hace poco terminé el reconocimiento de patrones (con Kohonen) y la toma de decisiones. Por desgracia, el resultado es negativo. Tal vez deberíamos utilizar un enfoque global.
 
GaryKa:
Te equivocas, tu problema de relación de rodillas en zig-zag ha sido resuelto por muchos (no sólo este script), aunque yo no lo impongo.
No se trata de la proporción. La proporción de rodillas es un tema aparte. Me refiero a la búsqueda de la tendencia máxima en el gráfico.
¿Este guión? No entiendo de qué se trata. Al menos explícalo entonces.
 
#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);
} 

Este es un ejemplo de indicador con cuadrados de colores en el gráfico que muestra los movimientos y retrocesos...

usted puede poner cualquier asesor en una carrera de garrapatas, digamos atf 5 o 15 minutos - poner una pausa allí - y poner este indicador en el gráfico visual....

 
Vinin:
No soy el único que se ha roto muchas veces en ZZ. Tal vez sea necesario un enfoque diferente, por supuesto. Hace poco terminé el reconocimiento de patrones (con Kohonen) y la toma de decisiones. Por desgracia, el resultado es negativo. Tal vez deberíamos utilizar un enfoque global.

Víctor, no se trata de zig-zags. Sus problemas son claros. Supongamos que establecemos una definición:

Una tendencia es un movimiento direccional del precio, después del cual el precio retrocede necesariamente un 33% (puede ser otra cifra).

¿Cómo podemos encontrar la longitud máxima de la tendencia en el gráfico de símbolos según esta definición? Esto es lo que debería hacer el script.
Es muy posible que la RZ se pueda aplicar aquí, no lo discuto, pero aún no he visto ese guión.

 
DmitriyN:

TheXpert, te sugiero la idea de un script de investigación

Debe recorrer todo el historial (todas las barras) comenzando con Bars() y terminando con la barra 0. Su propósito es determinar la máxima fuerza de precio permitida para un pullback.

La fuerza se entiende como la distancia H, que el precio debe pasar en cualquier dirección (hacia abajo o hacia arriba) desde el precio inicial
el retroceso F, expresado en porcentaje de la altura H, debe seguir esta distancia:

El objetivo de este script es conocer el valor máximo de la longitud del precio de la tendencia en el historial para un instrumento determinado, con el fin de desarrollar
técnicas de promediación. Preferiblemente, el script especifica la ubicación (fechas) de la tendencia con el tamaño máximo encontrado.

Los datos iniciales del script son los mismos: el porcentaje de retroceso del precio (price drawdown).

Os recuerdo que el pullback (en puntos) es :
- para una tendencia alcista - la diferencia entre el precio máximo y el precio mínimo, que (el mínimo) aparece después del precio máximo;
- para una tendencia bajista (como en la figura anterior): la diferencia entre el valor máximo del precio que aparece después del valor mínimo del precio;
Porcentaje de retroceso (en %) - la relación entre el retroceso en pips y el tamaño de la tendencia en pips, multiplicado por 100%.

Actualmente estoy trabajando en un script de este tipo, pero todavía no he descubierto cómo hacer el algoritmo correctamente.


Ya hice algo así hace un par de años:

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

En realidad, el enfoque correcto es crear un EA y optimizar los niveles de entrada/salida en el probador. Así es como se obtienen las estadísticas.

 
DmitriyN:

Victor, esto no es sobre zig-zags. Todo está claro con sus problemas. Digamos que tenemos una definición:

Una tendencia es un movimiento de precios dirigido seguido del obligatorio retroceso del 33% del precio (puede ser otra cifra).

¿Cómo podemos encontrar la longitud máxima de la tendencia en el gráfico de símbolos basándonos en esta definición? Esto es lo que debería hacer el script.
Es muy posible que se pueda aplicar un FZ aquí, no lo discuto, pero aún no he visto ese guión.


Si no se trata de una gZ, es usted quien debe formularla.

no se necesita mucho para hacer un dibujo.

 
DmitriyN:

Víctor, no se trata de zig-zags. Sus problemas son claros. Digamos que nos fijamos una definición:

Una tendencia es un movimiento de precios dirigido, tras el cual se produce necesariamente un retroceso del 33% del precio (puede haber otra cifra).

¿Cómo podemos encontrar la longitud máxima de la tendencia en el gráfico de símbolos basándonos en esta definición? Esto es lo que debería hacer el script.
Es muy posible que se pueda aplicar un FZ aquí, no lo discuto, pero aún no he visto ese guión.


Había un indicador que trabajaba en fracciones (porcentajes). Una de las variantes de XMA, pero difícilmente podré encontrarla. Sin embargo, no lo he analizado.