Расстояние от стрелки до цены

 

У меня в индикаторе стрелка прописывается с помощью такой строчки:

SetIndexStyle(0, DRAW_ARROW, ArrowSize, 0);

Что необходимо дописать в код индикатора, чтобы эта стрелка рисовалась с заданным отступом от цены на графике?

Или такую регулировку можно делать только для объектов (OBJ) ?

 
Igogo:

У меня в индикаторе стрелка прописывается с помощью такой строчки:

SetIndexStyle(0, DRAW_ARROW, ArrowSize, 0);

Что необходимо дописать в код индикатора, чтобы эта стрелка рисовалась с заданным отступом от цены на графике?

Или такую регулировку можно делать только для объектов (OBJ) ?


К значению соответствующего индикаторного буфера прибавьте нужное смещение.
 
Igogo:

У меня в индикаторе стрелка прописывается с помощью такой строчки:

SetIndexStyle(0, DRAW_ARROW, ArrowSize, 0);

Что необходимо дописать в код индикатора, чтобы эта стрелка рисовалась с заданным отступом от цены на графике?

Или такую регулировку можно делать только для объектов (OBJ) ?


К значению буфера, соответствующего данной стрелке, надо добавить или отнять нужное количество пипсов, высота расположения стрелки изменится.
 
evillive:

К значению буфера, соответствующего данной стрелке, надо добавить или отнять нужное количество пипсов, высота расположения стрелки изменится.


А можно на примере это показать? Что куда конкретно надо написать? (Ибо я забыл написать, что в MQL4, увы, не силен)
 
val1[shift]=Low[shift]-Point*15; //стрелка будет ниже минимума цены на 15 пунктов  
val2[shift]=High[shift]+Point*15; //стрелка будет выше максимума цены на 15 пунктов (вернее не сама стрелка, а её точка привязки) 
 

То есть если ТУПО я после строчки:

SetIndexStyle(0, DRAW_ARROW, ArrowSize, 0);

вставлю:

val1[shift]=Low[shift]-NormalizeDouble(Point*15,Digits);

То все будет, как надо, или надо еще что-то будет дописывать?

(прошу понять меня правильно -я нуб в программировании)

 
Нет не там а в месте где значение буферу просваивается, после расчётов. Там и надо добавить это самое смещение.
 

Прошу прощения за тупость, еще раз повторюсь - я нуб в программировании...

ГДЕ находится это место, где "значение буферу просваивается" ?

Напишите пожалуйста - в каком КОНКРЕТНО месте и ЧТО надо написать, чтобы все заработало ?

 
код свой опубликуйте, я же не знаю, где там у вас расчёты проводятся.
 

Код вот такой:

#property indicator_chart_window
#property indicator_buffers 7
#property indicator_color1 DeepSkyBlue
#property indicator_color2 Red
#property indicator_color3 Green
#property indicator_color4 Red
#property indicator_color5 DeepSkyBlue
#property indicator_color6 Red
#property indicator_color7 Maroon

extern int SignalPeriod = 6;
extern int ArrowPeriod = 2;
extern int bars = 1000;
extern int SL_pips = 100;
extern bool AlertON = false;
bool Email = false;
extern int ArrowSize = 4;

extern int drawDots = 2; 
extern int drawZZ = 0;

int gi_84 = 1;

double BlueDots[];
double RedDots[];
double ArrUp[];
double ArrDn[];
double ZZlo[];
double ZZhi[];
double ZZ[];

bool gi_136 = FALSE;
bool gi_140 = FALSE;
datetime g_time_144;

void displayAlert(string as_0, double ad_8, double ad_16, double ad_24) {
string ls_32;
string ls_40;
string ls_48;
string ls_56;
string ls_64;
if (Time[0] != g_time_144) {
g_time_144 = Time[0];
if (ad_24 != 0.0) ls_48 = " at price " + DoubleToStr(ad_24, 4);
else ls_48 = "";
if (ad_8 != 0.0) ls_40 = ", TakeProfit on " + DoubleToStr(ad_8, 4);
else ls_40 = "";
if (ad_16 != 0.0) ls_32 = ", StopLoss on " + DoubleToStr(ad_16, 4);
else ls_32 = "";
Alert("BUYSELL MAGIC " + as_0 + ls_48 + ls_40 + ls_32 + " ", Symbol(), ", ", Period(), " minute chart");
ls_56 = "BUYSELL MAGIC - " + as_0 + ls_48;
ls_64 = "BUYSELL MAGIC " + as_0 + ls_48 + ls_40 + ls_32 + " " + Symbol() + ", " + Period() + " minute chart";
if (Email) SendMail(ls_56, ls_64);
}
}

int init() {
SetIndexBuffer(0, BlueDots);
SetIndexBuffer(1, RedDots);
SetIndexBuffer(2, ArrUp);
SetIndexBuffer(3, ArrDn);
SetIndexBuffer(4, ZZlo);
SetIndexBuffer(5, ZZhi);
SetIndexBuffer(6, ZZ);

SetIndexStyle(0, DRAW_ARROW, ArrowSize, 0);
SetIndexStyle(1, DRAW_ARROW, ArrowSize, 0);
SetIndexStyle(2, DRAW_ARROW, STYLE_SOLID, 0);
SetIndexStyle(3, DRAW_ARROW, STYLE_SOLID, 0);

int dr = 0;
if(dr == 1)
{ 
SetIndexStyle(4, DRAW_ZIGZAG, STYLE_DASH, 1);
SetIndexStyle(5, DRAW_ZIGZAG, STYLE_DASH, 1);
}
else
{ 
SetIndexStyle(4, DRAW_NONE);
SetIndexStyle(5, DRAW_NONE);
}

SetIndexStyle(6, DRAW_NONE);




SetIndexArrow(0, 159); // Жирная точка
SetIndexArrow(1, 159); // Жирная точка

SetIndexArrow(2, 233);
SetIndexArrow(3, 234);

IndicatorDigits(MarketInfo(Symbol(), MODE_DIGITS));
string ls_0 = "BUYSELL MAGIC(" + AlertON + "," + ArrowPeriod + ")";
IndicatorShortName(ls_0);
SetIndexLabel(0, "UpTrend Stop");
SetIndexLabel(1, "DownTrend Stop");
SetIndexLabel(2, "UpTrend Signal");
SetIndexLabel(3, "DownTrend Signal");
SetIndexLabel(4, "UpTrend Line");
SetIndexLabel(5, "DownTrend Line");
SetIndexDrawBegin(0, SignalPeriod);
SetIndexDrawBegin(1, SignalPeriod);
SetIndexDrawBegin(2, SignalPeriod);
SetIndexDrawBegin(3, SignalPeriod);
SetIndexDrawBegin(4, SignalPeriod);
SetIndexDrawBegin(5, SignalPeriod);
return (0);
}

int start() 
{
int crossBB;
double BBupper[25000];
double BBlower[25000];
double upLine[25000];
double dnLine[25000];
double ld_28;
double l_close_36;

double lastLo, lastHi;
int lastLoNum, lastHiNum;

for (int i = bars; i > 0; i--) 
{
BlueDots[i] = 0;
RedDots[i] = 0;
ArrUp[i] = 0;
ArrDn[i] = 0;
ZZlo[i] = EMPTY_VALUE;
ZZhi[i] = EMPTY_VALUE;
}
for (i = bars - SignalPeriod - 1; i > 0; i--) 
{
BBupper[i] = iBands(NULL, 0, SignalPeriod, ArrowPeriod, 0, PRICE_CLOSE, MODE_UPPER, i);
BBlower[i] = iBands(NULL, 0, SignalPeriod, ArrowPeriod, 0, PRICE_CLOSE, MODE_LOWER, i);

if (Close[i] > BBupper[i + 1]) crossBB = 1;
if (Close[i] < BBlower[i + 1]) crossBB = -1;

if (crossBB > 0 && BBlower[i] < BBlower[i + 1]) BBlower[i] = BBlower[i + 1];
if (crossBB < 0 && BBupper[i] > BBupper[i + 1]) BBupper[i] = BBupper[i + 1];

upLine[i] = BBupper[i] + (gi_84 - 1) / 2.0 * (BBupper[i] - BBlower[i]);
dnLine[i] = BBlower[i] - (gi_84 - 1) / 2.0 * (BBupper[i] - BBlower[i]);

if (crossBB > 0 && dnLine[i] < dnLine[i + 1]) dnLine[i] = dnLine[i + 1];
if (crossBB < 0 && upLine[i] > upLine[i + 1]) upLine[i] = upLine[i + 1];

if (crossBB > 0) 
{
if(High[i] >= lastHi)
{
lastHi = High[i];
lastHiNum = i;
}
if (drawDots > 0 && BlueDots[i + 1] == -1.0) // Close пересекла верх линию BB
{
lastHi = High[i];
lastHiNum = i;
ZZ[lastLoNum] = lastLo;

ArrUp[i] = dnLine[i];
BlueDots[i] = dnLine[i];
if (drawZZ > 0) 
ZZlo[i] = dnLine[i];

if (AlertON == TRUE && i == 1 && !gi_136) 
{
// это ьолько для алерта. ld_28 в отображении индюка не участвует
ld_28 = Low[1];
if (Low[2] < ld_28) ld_28 = Low[2];
if (Low[3] < ld_28) ld_28 = Low[3];
if (Low[4] < ld_28) ld_28 = Low[4];
ld_28 -= SL_pips * Point;
l_close_36 = Close[1];
displayAlert("Buy signal", 0, ld_28, l_close_36);

gi_136 = TRUE;
gi_140 = FALSE;
}
} 
else 
{
BlueDots[i] = dnLine[i];
if (drawZZ > 0) 
ZZlo[i] = dnLine[i];
ArrUp[i] = -1;
}
if (drawDots == 2) 
BlueDots[i] = 0;

ArrDn[i] = -1;
RedDots[i] = -1.0;
ZZhi[i] = EMPTY_VALUE;
}

if (crossBB < 0) 
{
if(Low[i] <= lastLo)
{
lastLo = Low[i];
lastLoNum = i;
}

if (drawDots > 0 && RedDots[i + 1] == -1.0) 
{
lastLo = Low[i];
lastLoNum = i;

ZZ[lastHiNum] = lastHi;

ArrDn[i] = upLine[i];
RedDots[i] = upLine[i];
if (drawZZ > 0) 
ZZhi[i] = upLine[i];
if (AlertON == TRUE && i == 1 && !gi_140) 
{
ld_28 = High[1];
if (High[2] > ld_28) ld_28 = High[2];
if (High[3] > ld_28) ld_28 = High[3];
if (High[4] > ld_28) ld_28 = High[4];
ld_28 += SL_pips * Point;
l_close_36 = Close[1];
displayAlert("Sell signal", 0, ld_28, l_close_36);
gi_140 = TRUE;
gi_136 = FALSE;
}
} 
else 
{
RedDots[i] = upLine[i];
if (drawZZ > 0) 
ZZhi[i] = upLine[i];
ArrDn[i] = -1;
}
if (drawDots == 2) RedDots[i] = 0;

ArrUp[i] = -1;
BlueDots[i] = -1.0;
ZZlo[i] = EMPTY_VALUE;
}
}
return (0);
}
 
Igogo:

Код вот такой:



На базе ломанного индикатора делаете свой?
Причина обращения: