Вы упускаете торговые возможности:
- Бесплатные приложения для трейдинга
- 8 000+ сигналов для копирования
- Экономические новости для анализа финансовых рынков
Регистрация
Вход
Вы принимаете политику сайта и условия использования
Если у вас нет учетной записи, зарегистрируйтесь
параметры по умолчанию, 3.0 и 10
параметры по умолчанию, 3.0 и 10
В этом случае просто замените следующую строку :
with this
[PHP]ExtMapBuffer1 = iCustom(Symbol2,0,"Supertrend",3,10,0,iShift2);Я предполагаю, что имя индикатора - "Supertrend".
Я не хочу заменять, я хочу интегрировать код супертренда в этот индикатор, а интегрированный супертренд рассчитывается на индикаторе ExtMapBuffer1...
Я не хочу заменять, я хочу интегрировать код супертренда в этот индикатор, а интегрированный супертренд рассчитывается на индикаторе 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);
}
//+------------------------------------------------------------------+
Я имею в виду что-то вроде этого:
#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);
}
//+------------------------------------------------------------------+
Спасибо Теперь, у меня есть это... Можете ли вы помочь мне исправить ошибки?
#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, потому что он загружается на основной график, а не на созданный мной спред.
Поэтому я попытался пойти таким путем (реализовать весь код спреда и супертренда в одном индикаторе)
Да, это то, что я пытаюсь сделать:
1) создать индикатор спреда между двумя активами
2) рассчитать Супертренд на спреде.
Я не могу использовать Супертренд с iCustom, потому что он загружается на основной график, а не на созданный мной спред.
Итак, я попытался пойти по этому пути (реализовать весь код спреда и супертренда в одном индикаторе)k3rn3l
Вы не можете этого сделать (так как супертренд зависит от таких вещей, как atr - вам нужно будет рассчитать atr этого спреда тоже, а это невозможно). Также вы сравниваете текущую цену закрытия со значением спреда, что не логично. Это результат с используемым atr, но, как я уже сказал, он не имеет того значения, которое он имел в оригинальном супертренде, и вы не можете сравнивать значения из совершенно другой шкалы значений (закрытие по сравнению со спредом, например).