Ücretsiz olarak ilginç şeyler yapıyoruz - sayfa 20

 
DmitriyN : Bu başka bir şey.
Zig-zag dizlerinin oranıyla ilgili probleminiz hakkında yanılıyorsunuz, çoğu bunu çözdü ( sadece bu senaryo değil ), ben empoze etmesem de.
 
Minimumları, maksimumları işaretlemeniz gerekir,
rakamları bulmak için kriterler bulmak-
ve sonra başlangıç noktasını alıyoruz,
yukarı / aşağı geri tepmeyen bir hareket arıyor,
ve sonra yanında belirtilen yüzdelerin bir çubuğunu ararız.

Aslında bu neredeyse basit bir zikzak.
Ve saymak yerine bir dağıtım oluşturabilirsiniz-
X diz numarası öncekinden ne kadar.
 
Vinin :

balık yok

Stadyum direktörü (c)

Evet, orada balık var... asıl mesele, hareketin en az 60.0 puan ve en az %25'lik bir geri dönüş olması gerektiğidir - o zaman seviye tortularındaki kıymık 2-3 kattan fazla olmayacaktır... ve burada bir martini kullanabilirsiniz :-)
 
DmitriyN :
Şaka kesinlikle iyi, ama en azından kendi bakış açınız hakkında yorum yapıyorsunuz.

ZZ'de birçok kopya kırıldı ve sadece benim tarafımdan değil. Belki farklı bir yaklaşıma ihtiyaç vardır. Yakın zamanda örüntü tanımayı (Kohonen'in yardımıyla) ve karar vermeyi tamamladım. Maalesef sonuç olumsuz. Belki de sadece entegre bir yaklaşım kullanmanız gerekir.
 
GaryKa :
Yanılıyorsun, pek çoğu, zikzak dizlerin oranıyla ilgili sorununuzu çözdü (sadece bu senaryo değil), ben onu empoze etmeme rağmen.
Oranla ilgili değil. Diz oranı ayrı bir konudur. Grafikte maksimum trendi bulmaktan bahsediyorum.
Bu komut dosyası mı? Neden ve neden anlamıyorum. Lütfen açıklayın o zaman.
 
#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 );
} 

İşte grafikte renkli karelerde hareketi ve geri çekilmeleri gösteren örnek bir gösterge...

Herhangi bir Expert Advisor'ı, koşullu olarak TF 5 veya 15 dakika - orada bir duraklama koyun - ve bu göstergeyi görsel tabloya koyabilirsiniz.

 
Vinin :
ZZ'de birçok kopya kırıldı ve sadece benim tarafımdan değil. Belki farklı bir yaklaşıma ihtiyaç vardır. Yakın zamanda örüntü tanımayı (Kohonen'in yardımıyla) ve karar vermeyi tamamladım. Maalesef sonuç olumsuz. Belki de sadece entegre bir yaklaşım kullanmanız gerekir.

Victor, bu zikzaklarla ilgili değil. Sorunları ile her şey açıktır. Bakın, diyelim ki bir tanımımız var:

Trend, yönlü bir fiyat hareketidir ve sonrasında %33'lük bir fiyat geri dönüşü (belki farklı bir rakam) meydana gelir .

Bu tanıma göre enstrüman tablosunda maksimum trend uzunluğu nasıl bulunur? Senaryonun yapması gereken bu.
ZZ'nin burada uygulanabilmesi oldukça mümkün, tartışmıyorum ama şu ana kadar böyle bir script görmedim.

 
DmitriyN :

TheXpert, size bir araştırma senaryosu fikri sunuyorum

Çubuklardan () başlayan ve 0 çubuğu ile biten tüm geçmişi (tüm çubuklar üzerinde) gözden geçirmelidir. Amacı, izin verilen maksimum geri çekilme fiyat gücünü belirlemektir.

Güç, fiyatın başlangıç fiyatından herhangi bir yönde (yukarı veya aşağı) geçmesi gereken H mesafesi olarak anlaşılır, böylece geçtikten sonra
bu mesafeyi mutlaka H yüksekliğinin yüzdesi olarak ifade edilen bir geri alma F takip etmiştir:

Bu komut dosyasının amacı, geliştirme için bu enstrüman için geçmişteki fiyat trend uzunluğunun maksimum değeri hakkında bilgi edinmektir.
ortalama teknolojiler üzerine stratejiler. Komut dosyasının, bulunan maksimum boyutla trendin konumunu (tarihlerini) belirtmesi istenir.

Komut dosyası için ilk veriler birdir - fiyat geri alma yüzdesi (fiyat düşüşü).

Size geri dönüşün (puan olarak) olduğunu hatırlatmama izin verin:
- bir yükseliş trendi için - maksimum fiyattan sonra (minimum) görünen maksimum fiyat ile minimum fiyat arasındaki fark;
- düşüş trendi için (yukarıdaki şekilde olduğu gibi) - minimum fiyat değerinden sonra görünen maksimum fiyat değeri arasındaki fark;
Yüzde düzeltme (% olarak) - puan cinsinden geri çekilmenin, puan cinsinden eğilimin boyutuna oranı, %100 ile çarpılır.

Şimdi kendim böyle bir komut dosyası üzerinde çalışıyorum, ancak algoritmayı nasıl doğru bir şekilde oluşturacağımı hala çözemiyorum.


Birkaç yıl önce şöyle bir şey yapmıştım:

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

Aslında doğru yaklaşım, bir EA oluşturmak ve test cihazında giriş/çıkış seviyelerini optimize etmektir. Burada istatistikleri alırsınız.

 
DmitriyN :

Victor, bu zikzaklarla ilgili değil. Sorunları ile her şey açıktır. Bakın, diyelim ki bir tanımımız var:

Trend, yönlü bir fiyat hareketidir ve sonrasında %33'lük bir fiyat geri dönüşü (belki farklı bir rakam) meydana gelir .

Bu tanıma göre enstrüman tablosunda maksimum trend uzunluğu nasıl bulunur? Senaryonun yapması gereken bu.
ZZ'nin burada uygulanabilmesi oldukça mümkün, tartışmıyorum ama şu ana kadar böyle bir script görmedim.


zz değilse, o zaman sana formüle et

o resmi uzun süre çiz

 
DmitriyN :

Victor, bu zikzaklarla ilgili değil. Sorunları ile her şey açıktır. Bakın, diyelim ki bir tanımımız var:

Trend, yönlü bir fiyat hareketidir ve sonrasında %33'lük bir fiyat geri dönüşü (belki farklı bir rakam) meydana gelir .

Bu tanıma göre enstrüman tablosunda maksimum trend uzunluğu nasıl bulunur? Senaryonun yapması gereken bu.
ZZ'nin burada uygulanabilmesi oldukça mümkün, tartışmıyorum ama şu ana kadar böyle bir script görmedim.


Hisselerde (yüzdelerde) işe yarayan bir gösterge vardı. XMA seçeneklerinden biri, ancak bulamıyorum. Her ne kadar çalışmalarının analizi meşgul olmasa da.
Neden: