Conversion MQL4 – Jurik CFB
Forums › ProRealTime forum Français › Support ProBuilder › Conversion MQL4 – Jurik CFB
- This topic has 8 replies, 2 voices, and was last updated 3 years ago by Bruno Carnazzi.
-
-
01/14/2021 at 5:39 PM #157870
Bonjour,
J’ai trouvé le code MQL4 suivant, correspondant à l’indicateur Composite Fractal Behavior de Mark Jurik.
Est-il possible de le convertir en langage Probuilder (le code a l’air complexe) ?
Voici le code :
123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297//+------------------------------------------------------------------+//| cfb.mq4 |//| mladen |//+------------------------------------------------------------------+#property copyright "mladen"#property link "mladenfx@gmail.com"#property indicator_separate_window#property indicator_buffers 1#property indicator_color1 Red#property indicator_minimum 0//////////extern string _ = "Parameters";extern int Depth = 3;extern int Price = PRICE_WEIGHTED;extern int BarsToCount = 1000;extern int Smooth = 8;extern int SmoothResultPeriod = 5;extern double SmoothSpeed = 3.0;extern bool SmoothAdaptive = true;//////////double buffer1[];double storec[][5];double stored[][35];string IndicatorFileName;bool CalculatingCFB=false;int Depths[] = {2,3,4,6,8,12,16,24,32,48,64,96,128,192};//+------------------------------------------------------------------+//| |//+------------------------------------------------------------------+//////////int init(){SetIndexBuffer(0,buffer1);//////////CalculatingCFB = (_=="CalculateCFB");if (!CalculatingCFB){Depth = MathMax(MathMin(Depth,7),1)+7;SmoothResultPeriod = MathMax(SmoothResultPeriod,1);SmoothSpeed = MathMax(SmoothSpeed,-1.5);SetIndexDrawBegin(0,Depths[Depth-1]);}//////////IndicatorFileName = WindowExpertName();IndicatorShortName("cfb ("+(Depth-7)+")");return(0);}int deinit() { return(0); }//+------------------------------------------------------------------+//| |//+------------------------------------------------------------------+//////////int start(){double avg;int counted_bars=IndicatorCounted();int i,k,r,limit;if(counted_bars < 0) return(-1);if(counted_bars > 0) counted_bars--;limit = Bars-counted_bars;if (BarsToCount>100)limit = MathMin(limit,BarsToCount+192);//////////if (CalculatingCFB){if (ArrayRange(storec,0) != Bars) ArrayResize(storec,Bars);for(i=limit, r=Bars-i-1; i>=0; i--, r++) buffer1[i] = calculateCFB(i,r,Depth);return(0);}if (ArrayRange(stored,0) != Bars) ArrayResize(stored,Bars);//////////if (BarsToCount>100) SetIndexDrawBegin(0,Bars-BarsToCount);for(i=limit, r=Bars-i-1; i>=0; i--, r++){double suma = 0;double sumb = 0;double cfb = 0;double evenCoef = 1;double oddCoef = 1;//////////for (k=Depth-1; k>=0; k--){stored[r][k] = iCustom(NULL,0,IndicatorFileName,"CalculateCFB",Depths[k],Price,BarsToCount,0,i);stored[r][k+14] = stored[r-1][k+14] + (stored[r][k]-stored[r-Smooth][k])/Smooth;if ((k%2)==0){ avg = oddCoef * stored[r][k+14]; oddCoef = oddCoef * (1 - avg); }else { avg = evenCoef * stored[r][k+14]; evenCoef = evenCoef * (1 - avg); }suma += avg*avg*Depths[k];sumb += avg;}//////////if (sumb != 0) cfb = suma/sumb;if (SmoothResultPeriod>1)buffer1[i] = iAverage(cfb,SmoothResultPeriod,SmoothSpeed,SmoothAdaptive,r,28);else buffer1[i] = cfb;}//////////return(0);}//+------------------------------------------------------------------+//| |//+------------------------------------------------------------------+//////////#define _prices 0#define _roc 1#define _value1 2#define _value2 3#define _value3 4////////double calculateCFB(int i, int r, int depth){storec[r][_prices] = iMA(NULL,0,1,0,MODE_SMA,Price,i);//////////storec[r][_roc] = MathAbs(storec[r][_prices] - storec[r-1][_prices]);storec[r][_value1] = storec[r-1][_value1] - storec[r-depth][_roc] + storec[r][_roc];storec[r][_value2] = storec[r-1][_value2] - storec[r-1][_value1] + storec[r][_roc]*depth;storec[r][_value3] = storec[r-1][_value3] - storec[r-1-depth][_prices] + storec[r-1][_prices];double dividend = MathAbs(depth*storec[r][_prices]-storec[r][_value3]);//////////if (storec[r][_value2] != 0)return( dividend / storec[r][_value2]);else return(0.00);}//+------------------------------------------------------------------+//| |//+------------------------------------------------------------------+//////////#define E1 0#define E2 1#define E3 2#define E4 3#define E5 4#define E6 5#define res 6//////////double iAverage(double price, double averagePeriod, double const, bool adaptive, int r, int s){double e1=stored[r-1][E1+s]; double e2=stored[r-1][E2+s];double e3=stored[r-1][E3+s]; double e4=stored[r-1][E4+s];double e5=stored[r-1][E5+s]; double e6=stored[r-1][E6+s];//////////if (adaptive && (averagePeriod > 1)){double minPeriod = averagePeriod/2.0;double maxPeriod = minPeriod*5.0;int endPeriod = MathCeil(maxPeriod);double signal = MathAbs((price-stored[r-endPeriod][res+s]));double noise = 0.00000000001;for(int k=1; k<endPeriod; k++) noise=noise+MathAbs(price-stored[r-k][res+s]);averagePeriod = ((signal/noise)*(maxPeriod-minPeriod))+minPeriod;}//////////double alpha = (2.0+const)/(1.0+const+averagePeriod);e1 = e1 + alpha*(price-e1); e2 = e2 + alpha*(e1-e2); double v1 = 1.5 * e1 - 0.5 * e2;e3 = e3 + alpha*(v1 -e3); e4 = e4 + alpha*(e3-e4); double v2 = 1.5 * e3 - 0.5 * e4;e5 = e5 + alpha*(v2 -e5); e6 = e6 + alpha*(e5-e6); double v3 = 1.5 * e5 - 0.5 * e6;//////////stored[r][E1+s] = e1; stored[r][E2+s] = e2;stored[r][E3+s] = e3; stored[r][E4+s] = e4;stored[r][E5+s] = e5; stored[r][E6+s] = e6;stored[r][res+s] = price;return(v3);}Merci
01/14/2021 at 6:13 PM #157876Description de l’indicateur et images svp.
Merci de renseigner votre pays dans votre page de profile également.
Pour une demande de conversion, merci d’utiliser ce formulaire la prochaine fois : https://www.prorealcode.com/free-code-conversion/ (disponible dans le menu Help du site).
01/15/2021 at 6:11 AM #157905Bonjour Nicolas,
C’est noté, c’est ma première utilisation de ce forum, merci pour votre indulgence.
Alors une petite traduction de la présentation anglaise de l’indicateur :
“Certaines tendances du marché sont le résultat de cycles sous-jacents, d’autres non. Utiliser des indicateurs dont les formules supposent toujours l’existence de ces cycles, c’est comme patiner sur de la glace fine : une catastrophe en attente de se produire.
Par exemple, une approche populaire pour ajuster dynamiquement la vitesse (longueur) des indicateurs techniques classiques, comme une moyenne mobile, consiste à lier la vitesse à la longueur de cycle dominante du marché (DCL). De cette façon, si la longueur du cycle est longue, la vitesse de la moyenne mobile est automatiquement ralentie. Malheureusement, l’approche DCL pour ajuster la longueur de l’indicateur est problématique lorsque le marché n’a pas de véritable cycle dominant. Pendant ces périodes, la DCL estime la longueur des “cycles fantômes”, produisant des valeurs sans signification qui peuvent sérieusement dégrader la performance d’un système commercial.
Pour éviter ce problème, nous avons conçu un indicateur qui ne présuppose pas la présence de cycles de marché. Jurik Reseach a découvert, dès 1996, comment les fractales pouvaient facilement évaluer la durée de la tendance du marché. Le nouvel indicateur, appelé CFB (Composite Fractal Behavior), fonctionne bien, que la série chronologique des prix comporte ou non des composantes cycliques.
Le graphique ci-dessous montre l’indice CFB sous les barres de prix. Plus la durée de la tendance augmente, plus l’indice est important. Lorsque la tendance s’arrête, l’indice diminue. Le CFB peut mesurer la durée de la tendance jusqu’à 192 barres.”
Un gif animé est joint en guise d’illustration.
L’idée de cet indicateur, si j’ai bien compris, c’est de calculer automatiquement le paramètre “période” propre à de nombreux indicateurs.
On peut s’en servir comme tel, ce qui n’est pas mon intention, ou bien simplement, en tant que confirmation de la tendance sur accroissement de la valeur et essouflement sur sa réduction.
Merci,
01/15/2021 at 11:20 AM #15793801/24/2021 at 3:27 PM #159266Bonjour Nicolas,
Hum, j’ai l’impression qu’il n’y a pas de support des tableaux à dimensions multiples dans PRT v11. Du coup, à moins de complètement refactoriser le code, ça me semble compromis non ?
01/25/2021 at 7:28 AM #159316Il faudrait bien rentrer dans le détail du code, mais je dirai qu’à longueur de ligne fixe (et uniquement dans ce cas), un accès par double indice d’un tableau à deux dimensions se linéarise facilement.
Expression en pseudo-code :
array[i][j] = arrray[i+j]
Ne fonctionne que pour des longueurs de ligne fixe
01/26/2021 at 9:14 AM #159453ça n’est souvent pas utile dans le cas de ce type de code (du même auteur), la multi dimension n’est pas indispensable puisque sous ProBuilder on va tracer l’indicateur en lisant l’historique, puis en temps réel, contrairement à ce qui se fait sous MT4 très souvent, c’est à dire faire une boucle sur tout l’historique en temps réel (à chaque tick) et c’est ce à quoi sert la première dimension ici, contenir le numéro de la bougie.
01/26/2021 at 9:35 AM #159458en effet, après m’être plongé dans le code, sans une deuxième dimension, ça sera vraiment très complexe et hasardeux, elle est donc réellement utile ici ! Notamment à cause de la fonction “calculateCFB(int i, int r, int depth)”, désolé mais j’y passerai beaucoup trop de temps sans être certain d’obtenir un résultat satisfaisant 🙁
01/26/2021 at 3:16 PM #159499Je comprends, pas de soucis Nicolas.
Merci
-
AuthorPosts
Find exclusive trading pro-tools on