Помощь в кодировании - страница 176

 

параметры по умолчанию, 3.0 и 10

 
k3rn3l:
параметры по умолчанию, 3.0 и 10

В этом случае просто замените следующую строку :

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

with this

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

Я предполагаю, что имя индикатора - "Supertrend".

 

Я не хочу заменять, я хочу интегрировать код супертренда в этот индикатор, а интегрированный супертренд рассчитывается на индикаторе ExtMapBuffer1...

 
k3rn3l:
Я не хочу заменять, я хочу интегрировать код супертренда в этот индикатор, а интегрированный супертренд рассчитывается на индикаторе ExtMapBuffer1...

k3rn3l

Боюсь, я не понимаю, что означает "интегрировать".

Не могли бы вы объяснить подробнее?

 

Я имею в виду что-то вроде этого:

#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:
Я имею в виду что-то вроде этого:

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

}

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

Затем объявите другой буфер (например, ExtMapBuffer2) и используйте iCustom() для получения значений супертренда в этот новый буфер (примерно так :

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

 

Спасибо Теперь у меня есть это. Можете ли вы помочь мне исправить ошибки?

#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:
Спасибо Теперь, у меня есть это... Можете ли вы помочь мне исправить ошибки?

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

}

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

Извините, но я действительно не понимаю, что вы пытаетесь сделать (кажется, что вы пытаетесь вычислить супертренд какого-то спреда, но я не могу понять из кода).

Почему бы вам не начать с самого индикатора супертренда (поскольку кажется, что вы пытаетесь его изменить)?

 

Да, это то, что я пытаюсь сделать:

1) создать индикатор спреда между двумя активами

2) рассчитать Супертренд на спреде.

Я не могу использовать Супертренд с iCustom, потому что он загружается на основной график, а не на созданный мной спред.

Поэтому я попытался пойти таким путем (реализовать весь код спреда и супертренда в одном индикаторе)

 
k3rn3l:
Да, это то, что я пытаюсь сделать:

1) создать индикатор спреда между двумя активами

2) рассчитать Супертренд на спреде.

Я не могу использовать Супертренд с iCustom, потому что он загружается на основной график, а не на созданный мной спред.

Итак, я попытался пойти по этому пути (реализовать весь код спреда и супертренда в одном индикаторе)

k3rn3l

Вы не можете этого сделать (так как супертренд зависит от таких вещей, как atr - вам нужно будет рассчитать atr этого спреда тоже, а это невозможно). Также вы сравниваете текущую цену закрытия со значением спреда, что не логично. Это результат с используемым atr, но, как я уже сказал, он не имеет того значения, которое он имел в оригинальном супертренде, и вы не можете сравнивать значения из совершенно другой шкалы значений (закрытие по сравнению со спредом, например).

Файлы:
_test.gif  29 kb
_test.mq4  4 kb