Ajuda na codificação - página 176

 

parâmetros padrão, 3.0 e 10

 
k3rn3l:
parâmetros padrão, 3.0 e 10

Nesse caso, basta substituir a seguinte linha :

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

with this

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

Presumo que o nome do indicador seja "Supertrend".

 

Não quero substituir, quero integrar o código de supertrend neste indicador, e a supertrend integrada é calculada no indicador ExtMapBuffer1...

 
k3rn3l:
Não quero substituir, quero integrar o código de supertrend neste indicador, e a supertrend integrada é calculada no indicador ExtMapBuffer1...

k3rn3l

Receio não entender o que significa "integrar".

Você gostaria de explicar mais?

 

Refiro-me a algo como isto:

#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:
Quero dizer algo parecido com isto:

#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);

}

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

Então declare outro buffer (por exemplo, ExtMapBuffer2) e use iCustom() para recuperar os valores de super tendência para esse novo buffer (algo como isto :

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

 

Obrigado Agora, eu tenho isto... Você pode me ajudar a corrigir os erros?

#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:
Obrigado Agora, eu tenho isto... Você pode me ajudar a corrigir os erros?

#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);

}

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

Desculpe, mas eu realmente não consigo ver o que você está tentando fazer (parece que você está tentando calcular uma super tendência de algum tipo de spread, mas eu não consigo perceber pelo código)

Por que você não começa pelo próprio indicador de super tendência (já que parece que você está tentando mudá-lo)?

 

Sim, é o que eu tento fazer:

1) criar um indicador da dispersão entre 2 ativos

2) calcular a Supertrend no spread

Não posso usar o Supertrend com iCustom porque ele é carregado no gráfico principal e não no spread criado por mim.

Portanto, tentei seguir este caminho (implementar todo o código do spread e o supertrend em um único indicador).

 
k3rn3l:
Sim, é o que eu tento fazer:

1) criar um indicador da dispersão entre 2 ativos

2) calcular a Supertrend no spread

Não posso usar o Supertrend com iCustom porque ele é carregado no gráfico principal e não no spread criado por mim.

Então, eu tentei seguir este caminho (implementar todo o código do spread e a super tendência em um único indicador).

k3rn3l

Você não pode fazer isso (já que a super tendência depende de coisas como atr - você precisaria calcular o atr dessa propagação também e isso não é possível). Além disso, você está comparando o preço atual próximo com aquele valor de spread que não é lógico. Este é o resultado com aquele atr usado, mas como eu disse, ele não tem um significado como tem na super tendência original, e você não pode comparar valores de uma escala de valores completamente diferente (próximo em relação ao spread, por exemplo).

Arquivos anexados:
_test.gif  29 kb
_test.mq4  4 kb
Razão: