Aide au codage - page 176

 

paramètres par défaut, 3.0 et 10

 
k3rn3l:
paramètres par défaut, 3.0 et 10

Dans ce cas, il suffit de remplacer la ligne suivante :

ExtMapBuffer1 = Close * Beta1 - iClose(Symbol2, NULL, iShift2) * Beta2;[/PHP]

with this

[PHP]ExtMapBuffer1 = iCustom(Symbol2,0,"Supertrend",3,10,0,iShift2);

Je suppose que le nom de l'indicateur est "Supertrend".

 

Je ne veux pas remplacer, je veux intégrer le code supertrend dans cet indicatore, et le supertrend intégré est calculé sur l'indicateur ExtMapBuffer1....

 
k3rn3l:
Je ne veux pas remplacer, je veux intégrer le code supertrend dans cet indicatore, et le supertrend intégré est calculé sur l'indicateur ExtMapBuffer1...

k3rn3l

Je crains de ne pas comprendre ce que signifie "intégrer".

Pourriez-vous m'expliquer davantage ?

 

Je veux dire quelque chose comme ça :

#property indicator_separate_window

#property indicator_buffers 3

#property indicator_color1 DodgerBlue

#property indicator_color2 Lime

#property indicator_color3 Red

double TrendUp[], TrendDown[], ExtMapBuffer1[];

int changeOfTrend;

extern int Nbr_Periods = 10;

extern double Multiplier = 3.0;

extern double Beta1 = 1.0;

extern string Symbol2 = "GER30";

extern double Beta2 = 1.0;

//+------------------------------------------------------------------+

//| Custom indicator initialization function |

//+------------------------------------------------------------------+

int init()

{

//---- indicators

SetIndexStyle(0,DRAW_LINE);

SetIndexBuffer(0,ExtMapBuffer1);

SetIndexBuffer(1, TrendUp);

SetIndexStyle(1, DRAW_LINE, STYLE_SOLID, 2);

SetIndexBuffer(2, TrendDown);

SetIndexStyle(2, DRAW_LINE, STYLE_SOLID, 2);

IndicatorShortName(Symbol() + " " + Beta1 + " " + Symbol2 + " " + Beta2);

//----

return(0);

}

//+------------------------------------------------------------------+

//| Custom indicator deinitialization function |

//+------------------------------------------------------------------+

int deinit()

{

//----

//----

return(0);

}

//+------------------------------------------------------------------+

//| Custom indicator iteration function |

//+------------------------------------------------------------------+

int start()

{

int limit, i, flag, flagh, trend[5000];

double up[5000], dn[5000], medianPrice, atr;

int counted_bars = IndicatorCounted();

//---- check for possible errors

if(counted_bars < 0) return(-1);

//---- last counted bar will be recounted

if(counted_bars > 0) counted_bars--;

limit=Bars-counted_bars;

//Print(limit);

//----

if(Bars<1) return(0);

int j = Bars-counted_bars -1;

while(j >=0) {

int iShift2 = iBarShift(Symbol2, 0, Time[j], false);

ExtMapBuffer1[j] = Close[j] * Beta1 - iClose(Symbol2, NULL, iShift2) * Beta2;

for (i = Bars; i >= 0; i--) {

TrendUp = EMPTY_VALUE;

TrendDown = EMPTY_VALUE;

atr = iATR(NULL, 0, Nbr_Periods, i);

//Print("atr: "+atr);

medianPrice = ExtMapBuffer1[j]/2;

//Print("medianPrice: "+medianPrice);

up=medianPrice+(Multiplier*atr);

//Print("up: "+up);

dn=medianPrice-(Multiplier*atr);

//Print("dn: "+dn);

trend=1;

if (Close>up) {

trend=1;

if (trend == -1) changeOfTrend = 1;

//Print("trend: "+trend);

}

else if (Close<dn) {

trend=-1;

if (trend == 1) changeOfTrend = 1;

//Print("trend: "+trend);

}

else if (trend==1) {

trend=1;

changeOfTrend = 0;

}

else if (trend==-1) {

trend=-1;

changeOfTrend = 0;

}

if (trend0) {

flag=1;

//Print("flag: "+flag);

}

else {

flag=0;

//Print("flagh: "+flag);

}

if (trend>0 && trend<0) {

flagh=1;

//Print("flagh: "+flagh);

}

else {

flagh=0;

//Print("flagh: "+flagh);

}

if (trend>0 && dn<dn)

dn=dn;

if (trendup)

up=up;

if (flag==1)

up=medianPrice+(Multiplier*atr);

if (flagh==1)

dn=medianPrice-(Multiplier*atr);

//-- Draw the indicator

if (trend==1) {

TrendUp=dn;

if (changeOfTrend == 1) {

TrendUp = TrendDown;

changeOfTrend = 0;

}

}

else if (trend==-1) {

TrendDown=up;

if (changeOfTrend == 1) {

TrendDown = TrendUp;

changeOfTrend = 0;

}

}

}

WindowRedraw();

}

//----

return(0);

}

//+------------------------------------------------------------------+

 
k3rn3l:
Je veux dire quelque chose comme ceci :

#property indicator_separate_window

#property indicator_buffers 3

#property indicator_color1 DodgerBlue

#property indicator_color2 Lime

#property indicator_color3 Red

double TrendUp[], TrendDown[], ExtMapBuffer1[];

int changeOfTrend;

extern int Nbr_Periods = 10;

extern double Multiplier = 3.0;

extern double Beta1 = 1.0;

extern string Symbol2 = "GER30";

extern double Beta2 = 1.0;

//+------------------------------------------------------------------+

//| Custom indicator initialization function |

//+------------------------------------------------------------------+

int init()

{

//---- indicators

SetIndexStyle(0,DRAW_LINE);

SetIndexBuffer(0,ExtMapBuffer1);

SetIndexBuffer(1, TrendUp);

SetIndexStyle(1, DRAW_LINE, STYLE_SOLID, 2);

SetIndexBuffer(2, TrendDown);

SetIndexStyle(2, DRAW_LINE, STYLE_SOLID, 2);

IndicatorShortName(Symbol() + " " + Beta1 + " " + Symbol2 + " " + Beta2);

//----

return(0);

}

//+------------------------------------------------------------------+

//| Custom indicator deinitialization function |

//+------------------------------------------------------------------+

int deinit()

{

//----

//----

return(0);

}

//+------------------------------------------------------------------+

//| Custom indicator iteration function |

//+------------------------------------------------------------------+

int start()

{

int limit, i, flag, flagh, trend[5000];

double up[5000], dn[5000], medianPrice, atr;

int counted_bars = IndicatorCounted();

//---- check for possible errors

if(counted_bars < 0) return(-1);

//---- last counted bar will be recounted

if(counted_bars > 0) counted_bars--;

limit=Bars-counted_bars;

//Print(limit);

//----

if(Bars<1) return(0);

int j = Bars-counted_bars -1;

while(j >=0) {

int iShift2 = iBarShift(Symbol2, 0, Time[j], false);

ExtMapBuffer1[j] = Close[j] * Beta1 - iClose(Symbol2, NULL, iShift2) * Beta2;

for (i = Bars; i >= 0; i--) {

TrendUp = EMPTY_VALUE;

TrendDown = EMPTY_VALUE;

atr = iATR(NULL, 0, Nbr_Periods, i);

//Print("atr: "+atr);

medianPrice = ExtMapBuffer1[j]/2;

//Print("medianPrice: "+medianPrice);

up=medianPrice+(Multiplier*atr);

//Print("up: "+up);

dn=medianPrice-(Multiplier*atr);

//Print("dn: "+dn);

trend=1;

if (Close>up) {

trend=1;

if (trend == -1) changeOfTrend = 1;

//Print("trend: "+trend);

}

else if (Close<dn) {

trend=-1;

if (trend == 1) changeOfTrend = 1;

//Print("trend: "+trend);

}

else if (trend==1) {

trend=1;

changeOfTrend = 0;

}

else if (trend==-1) {

trend=-1;

changeOfTrend = 0;

}

if (trend0) {

flag=1;

//Print("flag: "+flag);

}

else {

flag=0;

//Print("flagh: "+flag);

}

if (trend>0 && trend<0) {

flagh=1;

//Print("flagh: "+flagh);

}

else {

flagh=0;

//Print("flagh: "+flagh);

}

if (trend>0 && dn<dn)

dn=dn;

if (trendup)

up=up;

if (flag==1)

up=medianPrice+(Multiplier*atr);

if (flagh==1)

dn=medianPrice-(Multiplier*atr);

//-- Draw the indicator

if (trend==1) {

TrendUp=dn;

if (changeOfTrend == 1) {

TrendUp = TrendDown;

changeOfTrend = 0;

}

}

else if (trend==-1) {

TrendDown=up;

if (changeOfTrend == 1) {

TrendDown = TrendUp;

changeOfTrend = 0;

}

}

}

WindowRedraw();

}

//----

return(0);

}

//+------------------------------------------------------------------+

Ensuite, déclarez un autre tampon (par exemple ExtMapBuffer2) et utilisez iCustom() pour récupérer les valeurs de la super tendance dans ce nouveau tampon (quelque chose comme ceci :

ExtMapBuffer2[i] =iCustom(Symbol2,0,"Supertrend",3,10,0,iShift2) ;

 

Merci Maintenant, j'ai ceci... Pouvez-vous m'aider à corriger les erreurs ?

#property indicator_separate_window

#property indicator_buffers 2

#property indicator_color1 Yellow

#property indicator_color2 FireBrick

#property indicator_color3 Green

#property indicator_color4 Blue

#property indicator_width1 1

#property indicator_width2 2

#property indicator_width3 2

#property indicator_style1 STYLE_DOT

// Indicator parameters

extern int SuperTrend.Period=10;

extern double SuperTrend.Multiplier=3.0;

extern string Symbol2 = "GBPUSD";

// Global module varables

double gadUpBuf[];

double gadDnBuf[];

double gadSuperTrend[];

double Spread[];

//-----------------------------------------------------------------------------

// function: init()

// Description: Custom indicator initialization function.

//-----------------------------------------------------------------------------

int init() {

SetIndexStyle(0, DRAW_LINE);

SetIndexBuffer(0, Spread);

SetIndexStyle(1, DRAW_LINE);

SetIndexBuffer(1, gadSuperTrend);

SetIndexLabel(1, "SuperTrend");

SetIndexStyle(2, DRAW_LINE);

SetIndexBuffer(2, gadDnBuf);

SetIndexLabel(2, "SuperTrend Down");

SetIndexStyle(3, DRAW_LINE);

SetIndexBuffer(3, gadUpBuf);

SetIndexLabel(3, "SuperTrend Up");

IndicatorShortName(INDICATOR_NAME+"["+SuperTrend.Period+";"+DoubleToStr(SuperTrend.Multiplier,1)+"]");

return(0);

}

//-----------------------------------------------------------------------------

// function: deinit()

// Description: Custom indicator deinitialization function.

//-----------------------------------------------------------------------------

int deinit() {

return (0);

}

///-----------------------------------------------------------------------------

// function: start()

// Description: Custom indicator iteration function.

//-----------------------------------------------------------------------------

int start() {

int iNewBars, iCountedBars, i;

double dAtr,dUpperLevel, dLowerLevel;

// Get unprocessed ticks

iCountedBars=IndicatorCounted();

if(iCountedBars < 0) return (-1);

if(iCountedBars>0) iCountedBars--;

iNewBars=Bars-iCountedBars;

Spread = Close / iClose(Symbol2, NULL, i) ;

for(i=iNewBars; i>=0; i--) {

// Calc SuperTrend

dAtr = iATR(NULL, 0, SuperTrend.Period, i);

dUpperLevel=Spread/2+SuperTrend.Multiplier*dAtr;

dLowerLevel=Spread/2-SuperTrend.Multiplier*dAtr;

// Set supertrend levels

if (Close>gadSuperTrend && Close<=gadSuperTrend) {

gadSuperTrend=dLowerLevel;

}

else if (Close=gadSuperTrend) {

gadSuperTrend=dUpperLevel;

}

else if (gadSuperTrend<dLowerLevel)

gadSuperTrend=dLowerLevel;

else if (gadSuperTrend>dUpperLevel)

gadSuperTrend=dUpperLevel;

else

gadSuperTrend=gadSuperTrend;

// Draw SuperTrend lines

gadUpBuf=EMPTY_VALUE;

gadDnBuf=EMPTY_VALUE;

if (Close>gadSuperTrend || (Close==gadSuperTrend && Close>gadSuperTrend))

gadUpBuf=gadSuperTrend;

else if (Close<gadSuperTrend || (Close==gadSuperTrend && Close<gadSuperTrend))

gadDnBuf=gadSuperTrend;

}

return(0);

}

//+------------------------------------------------------------------+

 
k3rn3l:
Merci Maintenant, j'ai ceci... Pouvez-vous m'aider à corriger les erreurs ?

#property indicator_separate_window

#property indicator_buffers 2

#property indicator_color1 Yellow

#property indicator_color2 FireBrick

#property indicator_color3 Green

#property indicator_color4 Blue

#property indicator_width1 1

#property indicator_width2 2

#property indicator_width3 2

#property indicator_style1 STYLE_DOT

// Indicator parameters

extern int SuperTrend.Period=10;

extern double SuperTrend.Multiplier=3.0;

extern string Symbol2 = "GBPUSD";

// Global module varables

double gadUpBuf[];

double gadDnBuf[];

double gadSuperTrend[];

double Spread[];

//-----------------------------------------------------------------------------

// function: init()

// Description: Custom indicator initialization function.

//-----------------------------------------------------------------------------

int init() {

SetIndexStyle(0, DRAW_LINE);

SetIndexBuffer(0, Spread);

SetIndexStyle(1, DRAW_LINE);

SetIndexBuffer(1, gadSuperTrend);

SetIndexLabel(1, "SuperTrend");

SetIndexStyle(2, DRAW_LINE);

SetIndexBuffer(2, gadDnBuf);

SetIndexLabel(2, "SuperTrend Down");

SetIndexStyle(3, DRAW_LINE);

SetIndexBuffer(3, gadUpBuf);

SetIndexLabel(3, "SuperTrend Up");

IndicatorShortName(INDICATOR_NAME+"["+SuperTrend.Period+";"+DoubleToStr(SuperTrend.Multiplier,1)+"]");

return(0);

}

//-----------------------------------------------------------------------------

// function: deinit()

// Description: Custom indicator deinitialization function.

//-----------------------------------------------------------------------------

int deinit() {

return (0);

}

///-----------------------------------------------------------------------------

// function: start()

// Description: Custom indicator iteration function.

//-----------------------------------------------------------------------------

int start() {

int iNewBars, iCountedBars, i;

double dAtr,dUpperLevel, dLowerLevel;

// Get unprocessed ticks

iCountedBars=IndicatorCounted();

if(iCountedBars < 0) return (-1);

if(iCountedBars>0) iCountedBars--;

iNewBars=Bars-iCountedBars;

Spread = Close / iClose(Symbol2, NULL, i) ;

for(i=iNewBars; i>=0; i--) {

// Calc SuperTrend

dAtr = iATR(NULL, 0, SuperTrend.Period, i);

dUpperLevel=Spread/2+SuperTrend.Multiplier*dAtr;

dLowerLevel=Spread/2-SuperTrend.Multiplier*dAtr;

// Set supertrend levels

if (Close>gadSuperTrend && Close<=gadSuperTrend) {

gadSuperTrend=dLowerLevel;

}

else if (Close=gadSuperTrend) {

gadSuperTrend=dUpperLevel;

}

else if (gadSuperTrend<dLowerLevel)

gadSuperTrend=dLowerLevel;

else if (gadSuperTrend>dUpperLevel)

gadSuperTrend=dUpperLevel;

else

gadSuperTrend=gadSuperTrend;

// Draw SuperTrend lines

gadUpBuf=EMPTY_VALUE;

gadDnBuf=EMPTY_VALUE;

if (Close>gadSuperTrend || (Close==gadSuperTrend && Close>gadSuperTrend))

gadUpBuf=gadSuperTrend;

else if (Close<gadSuperTrend || (Close==gadSuperTrend && Close<gadSuperTrend))

gadDnBuf=gadSuperTrend;

}

return(0);

}

//+------------------------------------------------------------------+

Désolé, mais je ne vois vraiment pas ce que vous essayez de faire (il semble que vous essayez de calculer la super tendance d'une sorte de spread mais je ne peux pas le dire à partir du code).

Pourquoi ne pas commencer par l'indicateur de super tendance lui-même (puisqu'il semble que vous essayez de le modifier) ?

 

Oui, c'est ce que j'essaie de faire :

1) créer un indicateur du spread entre 2 actifs

2) calculer le Supertrend sur le spread.

Je ne peux pas utiliser le Supertrend avec iCustom car il est chargé sur le graphique principal et non sur le spread créé par moi.

J'ai donc essayé de suivre cette méthode (implémenter tout le code du spread et du supertrend dans un seul indicateur).

 
k3rn3l:
Oui, c'est ce que j'essaie de faire :

1) créer un indicateur de l'écart entre 2 actifs

2) calculer le Supertrend sur le spread.

Je ne peux pas utiliser le Supertrend avec iCustom car il est chargé sur le graphique principal et non sur le spread créé par moi.

Donc, j'ai essayé de suivre cette voie (implémenter tout le code du spread et de la super tendance dans un indicateur).

k3rn3l

Vous ne pouvez pas faire cela (puisque la super tendance dépend de choses comme l'atr - vous auriez besoin de calculer l'atr de ce spread aussi et ce n'est pas possible). De plus, vous comparez le prix de clôture actuel avec la valeur du spread, ce qui n'est pas logique. C'est le résultat avec cet atr utilisé, mais comme je l'ai dit, il n'a pas de signification comme dans la super tendance originale, et vous ne pouvez pas comparer des valeurs d'une échelle de valeurs complètement différente (clôture par rapport au spread, par exemple).

Dossiers :
_test.gif  29 kb
_test.mq4  4 kb
Raison: