Делаем интересности бесплатно - страница 20

 
DmitriyN: Это что-то другое.
Вы ошибаетесь вашу задачку о соотношение колен зиг-зага многие решали (не только тот скрипт ), хотя не навязываю.
 
Нужно разметить минимумы максимумы,
придумать критерии нахождения фигур-
а дальше берем начальную точку,
ищем безоткатное движение вверх/вниз,
а потом ищем рядом палку указанных процентов.

Собственно, это почти простой зигзаг.
И вместо кол-ва можно строить распределение-
сколько колено №Х составляет от предыдущего.
 
Vinin:

Рыбы там нет

Директор стадиона (с)

Да есть там рыба... главное чтоб движение было не менее 60.0 пунктов и откат не менее 25% - тогда расколбас на отложках уровней составит не более 2-3 раз... а тут и мартини можно применить :-)
 
DmitriyN:
Шутка конечно хорошая, но вы хоть прокомментируйте вашу точку зрения.

На ЗЗ много было сломано копий, и не только мной. Может конечно нужен другой подход. Я недавно закончил распознавание паттернов (с помошью Кохонена) и принятие решений. К сожалению результат отрицательный. Может надо просто использовать комплексный подход.
 
GaryKa:
Вы ошибаетесь вашу задачку о соотношение колен зиг-зага многие решали (не только этот скрипт), хотя не навязываю.
Не в соотношении дело. Соотношение колен - отдельная тема. Я про поиск на графике максимального тренда.
Скрипт этот? Я вообще не пойму что-там зачем и к чему. Хоть объясните тогда.
 
#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);
} 

вот примерный индикатор показывающий цветными квадратиками на графике движения и откатики...

можно поставить на тиковый прогон любого советника, условно тф 5 или 15 минут - поставить там паузу - и на визуал график накинуть этот индикатор....

 
Vinin:
На ЗЗ много было сломано копий, и не только мной. Может конечно нужен другой подход. Я недавно закончил распознавание паттернов (с помошью Кохонена) и принятие решений. К сожалению результат отрицательный. Может надо просто использовать комплексный подход.

Виктор, речь не о зиг-загах. С ихними проблемами всё ясно. Смотрите, допустим, что мы задались определением:

Тренд - это направленное движение цены, после которого обязательно происходит откат цены на 33% (может быть другая цифра).

Как исходя из такого определения найти максимальную длину тренда на графике инструмента? Вот это и должен делать скрипт.
Вполне возможно, что здесь можно применить ЗЗ, я не спорю, но пока я такого скрипта не видел.

 
DmitriyN:

TheXpert, предлагаю вам идею исследовательского скрипта

Он должен проходится по всей истории (по всем барам) начиная с Bars() и заканчивая баром 0. Его цель - определить предельно допустимую прочность цены на откат.

Под прочностью пониматся расстояние H, которое должна пройти цена в какую либо сторону (вниз или вверх) от стартовой цены, таким образом, чтобы после прохождения
этого расстояния обязательно последовал откат F, выраженный в процентах от высоты H:

Цель этого скрипта - получение сведений о максимальном значении ценовой длины тренда на истории для данного инструмента, для разработки
стратегий по технологиям усреднения. Желательно, чтобы скрипт указывал место (даты) тренда с максимальным найденным размером.

Исходное данное для скрипта одно - процент отката цены (просадка цены).

Напомню, что откат (в пунктах) - это :
- для восходящего тренда - разница между максимальной ценой и минимальной ценой, которая (минимальная) появляется после максимальной;
- для нисходящего тренда (как на рисунке выше) - разница между максимальным значением цены, которая появляется после минимального значения цены;
Процентный откат (в %) - отношение отката в пунктах к размеру тренда в пунктах, умноженное на 100%.

Сейчас сам работаю над таким скриптом, но пока не соображу как правильно составить алгоритм.


Что-то в этом роде уже делал пару лет назад:

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

Вообще-то, правильный подход это создать ЕА и оптимизировать в тестере уровни входа/выхода. Вот и получите статистику.

 
DmitriyN:

Виктор, речь не о зиг-загах. С ихними проблемами всё ясно. Смотрите, допустим, что мы задались определением:

Тренд - это направленное движение цены, после которого обязательно происходит откат цены на 33% (может быть другая цифра).

Как исходя из такого определения найти максимальную длину тренда на графике инструмента? Вот это и должен делать скрипт.
Вполне возможно, что здесь можно применить ЗЗ, я не спорю, но пока я такого скрипта не видел.


если не зз, то формулировать вам

нарисовать то картинку не долго

 
DmitriyN:

Виктор, речь не о зиг-загах. С ихними проблемами всё ясно. Смотрите, допустим, что мы задались определением:

Тренд - это направленное движение цены, после которого обязательно происходит откат цены на 33% (может быть другая цифра).

Как исходя из такого определения найти максимальную длину тренда на графике инструмента? Вот это и должен делать скрипт.
Вполне возможно, что здесь можно применить ЗЗ, я не спорю, но пока я такого скрипта не видел.


Был индикатор, который в долях (процентах) работал. Один из вариантов ХMA, но найти его врядли смогу. Хотя анализом его работы не занимался.
Причина обращения: