우리는 재미있는 것을 무료로 만듭니다 - 페이지 20

 
DmitriyN : 그것은 다른 것입니다.
당신은 지그재그의 무릎 비율에 대한 문제에 대해 잘못 알고 있습니다. 많은 사람들이 그것을 ( 그 스크립트뿐만 아니라 ) 해결했지만 부과하지는 않습니다.
 
최소값, 최대값을 표시해야 합니다.
수치를 찾는 기준을 제시하다-
그런 다음 출발점을 잡습니다.
비반동 위/아래 움직임을 찾고,
그런 다음 그 옆에 표시된 백분율의 막대를 찾습니다.

사실 이것은 거의 단순한 지그재그입니다.
계산 대신 배포판을 구축할 수 있습니다.
무릎 번호 X가 이전 것보다 얼마나 많은지.
 
Vinin :

물고기가 없다

경기장 감독 (c)

예, 거기에 물고기가 있습니다... 가장 중요한 것은 이동이 최소 60.0 포인트와 최소 25%의 롤백이어야 한다는 것입니다. 그러면 레벨 예금의 파편이 2-3배를 넘지 않을 것입니다... 여기에 마티니를 사용할 수 있습니다 :-)
 
DmitriyN :
농담은 확실히 좋지만 적어도 당신의 관점에 대해 논평합니다.

ZZ에서 나뿐만 아니라 많은 사본이 손상되었습니다. 아마도 다른 접근 방식이 필요할 것입니다. 나는 최근에 패턴 인식(Kohonen의 도움으로)과 의사 결정을 완료했습니다. 불행히도 결과는 부정적입니다. 통합 접근 방식을 사용해야 할 수도 있습니다.
 
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 );
} 

다음은 차트의 색상이 지정된 사각형으로 움직임과 후퇴를 보여주는 예시 지표입니다...

모든 Expert Advisor를 틱 실행에 둘 수 있습니다. 조건부로 TF 5 또는 15분 - 거기에 일시 중지를 넣고 이 표시기를 시각적 차트에 놓을 수 있습니다....

 
Vinin :
ZZ에서 나뿐만 아니라 많은 사본이 손상되었습니다. 아마도 다른 접근 방식이 필요할 것입니다. 나는 최근에 패턴 인식(Kohonen의 도움으로)과 의사 결정을 완료했습니다. 불행히도 결과는 부정적입니다. 통합 접근 방식을 사용해야 할 수도 있습니다.

빅터, 지그재그에 관한 것이 아닙니다. 그들의 문제로 모든 것이 명확합니다. 정의가 있다고 가정해 보겠습니다.

추세는 방향성 가격 움직임이며, 그 후 33%의 가격 롤백 (다른 수치일 수 있음)이 발생합니다 .

이 정의를 기반으로 기기 차트 에서 최대 추세 길이를 찾는 방법은 무엇입니까? 이것이 스크립트가 해야 할 일입니다.
ZZ가 여기에 적용될 수 있다는 것은 꽤 가능성이 있습니다. 나는 논쟁하지 않지만 지금까지 그런 스크립트를 본 적이 없습니다.

 
DmitriyN :

Xpert, 나는 당신에게 연구 스크립트의 아이디어를 제안합니다

막대 ()에서 시작하여 막대 0으로 끝나는 전체 기록 (모든 막대에 대해)을 거쳐야 합니다. 그 목적은 최대 허용 가능한 철회 가격 강도를 결정하는 것입니다.

강도는 가격이 시작 가격에서 모든 방향(위 또는 아래)으로 통과해야 하는 거리 H로 이해되므로 통과 후
이 거리는 반드시 높이 H의 백분율로 표시되는 롤백 F가 뒤따랐습니다.

이 스크립트의 목적은 개발을 위해 이 상품의 이력에 대한 가격 추세 길이의 최대값에 대한 정보를 얻는 것입니다.
평균 기술에 대한 전략. 스크립트는 발견된 최대 크기로 추세의 위치(날짜)를 나타내는 것이 바람직합니다.

스크립트의 초기 데이터는 가격 롤백(가격 하락)의 비율인 1입니다.

롤백(포인트)은 다음과 같습니다.
- 상승 추세 의 경우 - 최고 가격과 최저 가격의 차이(최소)는 최고 가격 뒤에 나타납니다.
- 하락 추세 의 경우(위 그림과 같이) - 최저 가격 값 이후에 나타나는 최고 가격 값의 차이;
퍼센트 되돌림(%) - 100%를 곱한 포인트 추세의 크기에 대한 포인트 되돌림의 비율입니다.

지금은 그러한 스크립트를 직접 작성하고 있지만 알고리즘을 올바르게 구성하는 방법을 여전히 알 수 없습니다.


나는 몇 년 전에 이런 일을 했습니다.

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

실제로 올바른 접근 방식은 EA를 만들고 테스터에서 진입/종료 수준을 최적화하는 것입니다. 여기에서 통계를 얻습니다.

 
DmitriyN :

빅터, 지그재그에 관한 것이 아닙니다. 그들의 문제로 모든 것이 명확합니다. 정의가 있다고 가정해 보겠습니다.

추세는 방향성 가격 움직임이며, 그 후 33%의 가격 롤백 (다른 수치일 수 있음)이 발생합니다 .

이 정의를 기반으로 기기 차트에서 최대 추세 길이를 찾는 방법은 무엇입니까? 이것이 스크립트가 해야 할 일입니다.
ZZ가 여기에 적용될 수 있다는 것은 꽤 가능성이 있습니다. 나는 논쟁하지 않지만 지금까지 그런 스크립트를 본 적이 없습니다.


zz가 아니면 공식화하십시오.

오랫동안 그 그림을 그리다

 
DmitriyN :

빅터, 지그재그에 관한 것이 아닙니다. 그들의 문제로 모든 것이 명확합니다. 정의가 있다고 가정해 보겠습니다.

추세는 방향성 가격 움직임이며, 그 후 33%의 가격 롤백 (다른 수치일 수 있음)이 발생합니다 .

이 정의를 기반으로 기기 차트에서 최대 추세 길이를 찾는 방법은 무엇입니까? 이것이 스크립트가 해야 할 일입니다.
ZZ가 여기에 적용될 수 있다는 것은 꽤 가능성이 있습니다. 나는 논쟁하지 않지만 지금까지 그런 스크립트를 본 적이 없습니다.


주식(백분율)에서 작동하는 지표가 있었습니다. XMA 옵션 중 하나지만 거의 찾을 수 없습니다. 그의 작업에 대한 분석은 참여하지 않았지만.
사유: