Faire des choses intéressantes gratuitement - page 20

 
DmitriyN: C'est autre chose.
Vous avez tort, votre problème de ratio de genoux en zig-zag a été résolu par beaucoup(pas seulement ce script ), bien que je ne l'impose pas.
 
Vous devez marquer les minima des maxima,
trouver les critères pour trouver les formes-
et ensuite on prend le point de départ,
cherchez un mouvement de hausse ou de baisse sans retenue,
et cherchez ensuite un bâton de pourcentages à côté.

En fait, c'est presque un simple zigzag.
Et au lieu d'un pieu, vous pouvez construire une distribution-.
à quel point le genou #X est différent du précédent.
 
Vinin:

Les poissons ne sont pas là

Directeur du stade (c)

Oui, il y a des poissons là-bas... Si le mouvement n'a pas été inférieur à 60,0 pips et que le repli n'a pas été inférieur à 25 % - alors le glissement sur les niveaux ne sera pas plus de 2 à 3 fois ... et vous pouvez aussi utiliser le martini :-)
 
DmitriyN:
C'est une bonne blague, mais commentez au moins votre point de vue.

Beaucoup de choses ont été cassées sur ZZ, et pas seulement par moi. Peut-être qu'une approche différente est nécessaire. J'ai récemment terminé la reconnaissance des formes (avec Kohonen) et la prise de décision. Malheureusement, le résultat est négatif. Peut-être que nous devrions simplement utiliser une approche globale.
 
GaryKa:
Vous avez tort, votre problème de rapport de genou en zig-zag a été résolu par beaucoup (pas seulement ce script), bien que je ne l'impose pas.
Ce n'est pas une question de ratio. Le rapport entre les genoux est un sujet distinct. Je veux dire la recherche de la tendance maximale sur le graphique.
Ce scénario ? Je ne comprends pas de quoi il s'agit. Expliquez-le au moins alors.
 
#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);
} 

Voici un exemple d'indicateur avec des carrés de couleur sur le graphique montrant les mouvements et les pullbacks...

vous pouvez mettre n'importe quel conseiller sur un tick run, disons atf 5 ou 15 minutes - mettez-y une pause - et mettez cet indicateur sur le graphique visuel.....

 
Vinin:
Je ne suis pas le seul à avoir été brisé plusieurs fois sur ZZ. Peut-être qu'une approche différente est nécessaire, bien sûr. J'ai récemment terminé la reconnaissance des formes (avec Kohonen) et la prise de décision. Malheureusement, le résultat est négatif. Peut-être que nous devrions simplement utiliser une approche globale.

Victor, il ne s'agit pas de zig-zags. Leurs problèmes sont clairs. Supposons que nous établissions une définition :

Une tendance est un mouvement de prix directionnel, après lequel le prix recule nécessairement de 33% (cela peut être un autre chiffre).

Comment trouver la longueur maximale de la tendance sur le graphique des symboles selon cette définition ? C'est ce que le script devrait faire.
Il est tout à fait possible que RZ puisse être appliqué ici, je ne le conteste pas, mais je n'ai pas encore vu un tel scénario.

 
DmitriyN:

TheXpert, je vous propose l'idée d'un script de recherche

Il doit parcourir l'ensemble de l'historique (toutes les barres) en commençant par Bars() et en terminant par la barre 0. Son but est de déterminer la force maximale admissible du prix pour un pullback.

La force est comprise comme la distance H, que le prix devrait franchir dans n'importe quelle direction (vers le bas ou vers le haut) à partir du prix de départ.
le recul F, exprimé en pourcentage de la hauteur H, doit respecter cette distance :

Le but de ce script est de connaître la valeur maximale de la longueur du prix de la tendance sur l'historique pour un instrument donné, afin d'élaborer
techniques de calcul de la moyenne. De préférence, le script spécifie l'emplacement (les dates) de la tendance avec la taille maximale trouvée.

Les données initiales du script sont les mêmes - le pourcentage de recul du prix (price drawdown).

Je vous rappelle que le pullback (en points) est de :
- pour une tendance à la hausse - la différence entre le prix maximum et le prix minimum, qui (le minimum) apparaît après le prix maximum ;
- pour une tendance à la baisse (comme dans la figure ci-dessus) - la différence entre la valeur de prix maximale qui apparaît après la valeur de prix minimale ;
Pourcentage de pullback (en %) - le rapport entre le pullback en pips et la taille de la tendance en pips, multiplié par 100%.

Je travaille actuellement sur un tel script moi-même, mais je n'ai pas encore trouvé comment faire l'algorithme correctement.


J'ai déjà fait quelque chose comme ça il y a quelques années :

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

En fait, l'approche correcte consiste à créer un EA et à optimiser les niveaux d'entrée/sortie dans le testeur. C'est comme ça qu'on obtient les statistiques.

 
DmitriyN:

Victor, il ne s'agit pas de zig-zags. Tout est clair avec leurs problèmes. Ecoutez, disons que nous avons une définition :

Une tendance est un mouvement de prix dirigé suivi d'un recul obligatoire de 33% (il peut s'agir d'un autre chiffre).

Comment peut-on trouver la longueur maximale de la tendance sur le graphique des symboles en se basant sur cette définition ? C'est ce que le script devrait faire.
Il est peut-être possible d'appliquer un FZ ici, je ne le conteste pas, mais je n'ai pas encore vu un tel scénario.


Si ce n'est pas un gZ, c'est à vous de le formuler.

il ne faut pas grand-chose pour faire un dessin.

 
DmitriyN:

Victor, il ne s'agit pas de zig-zags. Leurs problèmes sont clairs. Ecoutez, disons que nous nous fixons une définition :

Une tendance est un mouvement de prix dirigé, après lequel le prix recule nécessairement de 33% (peut être un autre chiffre).

Comment peut-on trouver la longueur maximale de la tendance sur le graphique des symboles en se basant sur cette définition ? C'est ce que le script devrait faire.
Il est peut-être possible d'appliquer un FZ ici, je ne le conteste pas, mais je n'ai pas encore vu un tel scénario.


Il y avait un indicateur qui travaillait en fractions (pourcentages). C'était une des variantes de XMA, mais je ne pourrai guère la trouver. Mais je ne l'ai pas analysé.