Aiuto per la codifica - pagina 176

 

parametri predefiniti, 3.0 e 10

 
k3rn3l:
parametri predefiniti, 3.0 e 10

In questo caso basta sostituire la seguente linea :

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

with this

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

Presumo che il nome dell'indicatore sia "Supertrend"

 

Non voglio sostituire, voglio integrare il codice supertrend in questo indicatore, e il supertrend integrato è calcolato sull'indicatore ExtMapBuffer1...

 
k3rn3l:
Non voglio sostituire, voglio integrare il codice supertrend in questo indicatore, e il supertrend integrato è calcolato sull'indicatore ExtMapBuffer1...

k3rn3l

Temo di non capire cosa significa "integrare".

Vorresti spiegarmi meglio?

 

Intendo qualcosa del genere:

#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:
Intendo qualcosa come questo:

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

}

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

Poi dichiarate un altro buffer (per esempio ExtMapBuffer2) e usate iCustom() per recuperare i valori del supertrend in quel nuovo buffer (qualcosa come questo :

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

 

Grazie Ora, ho questo... Potete aiutarmi a correggere gli errori?

#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:
Grazie Ora, ho questo... Potete aiutarmi a correggere gli errori?

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

}

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

Scusa, ma non riesco proprio a capire cosa stai cercando di fare (sembra che tu stia cercando di calcolare il super trend di un qualche tipo di spread ma non riesco a capirlo dal codice)

Perché non parti dall'indicatore super trend stesso (visto che sembra che tu stia cercando di cambiarlo)?

 

Sì, è quello che cerco di fare:

1) creare un indicatore dello spread tra 2 asset

2) calcolare il Supertrend sullo spread

Non posso utilizzare il Supertrend con iCustom perché viene caricato sul grafico principale e non sullo spread creato da me.

Allora, ho provato a seguire questa strada (implementare tutto il codice dello spread e del supertrend in un indicatore)

 
k3rn3l:
Sì, è quello che cerco di fare:

1) creare un indicatore dello spread tra 2 asset

2) calcolare il Supertrend sullo spread

Non posso usare il Supertrend con iCustom perché viene caricato sul grafico principale e non sullo spread creato da me.

Allora, ho provato a seguire questa strada (implementare tutto il codice dello spread e del supertrend in un solo indicatore)

k3rn3l

Non puoi farlo (poiché il supertrend dipende da cose come l'atr - dovresti calcolare anche l'atr di quello spread e questo non è possibile). Inoltre stai confrontando l'attuale prezzo di chiusura con quel valore di spread che non è logico. Questo è il risultato con quell'atr usato, ma come ho detto, non ha un significato come nel super trend originale, e non puoi confrontare valori da una scala di valori completamente diversa (vicino rispetto allo spread, per esempio)

File:
_test.gif  29 kb
_test.mq4  4 kb
Motivazione: