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...
Poi dichiarate un altro buffer (per esempio ExtMapBuffer2) e usate iCustom() per recuperare i valori del supertrend in quel nuovo buffer (qualcosa come questo :
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)?
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)
parametri predefiniti, 3.0 e 10
parametri predefiniti, 3.0 e 10
In questo caso basta sostituire la seguente linea :
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...
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);
}
//+------------------------------------------------------------------+
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);
}
//+------------------------------------------------------------------+
Grazie
#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)
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)