
Пользовательские индикаторы > Очень нужен индикатор VWAP
-
- Сообщения: 72
- Зарегистрирован: 21 май 2018, 22:04
- Благодарил (а): 60 раз
- Поблагодарили: 3 раза
Re: Очень нужен индикатор VWAP
Поддерживаю коллегу, если можно прикрутить динамичное изменение точки 0, то это будет просто огонь 

-
- Сообщения: 535
- Зарегистрирован: 11 ноя 2018, 17:11
- Благодарил (а): 21 раз
- Поблагодарили: 92 раза
Re: Очень нужен индикатор VWAP
Вариант с ручным заданием точки начала.
Будет ли это работать? Неоднозначно. Если точка старта будет очень далеко в прошлом (~ нескольких тысяч баров; точное значение неизвестно, оно плавающее), то индикатор будет инициализировать себя уже после этой далекой точки, т.е. точка старта будет позже. В практическом плане это ограничение существенно на N-секундных таймфреймах (например, на секундах час - это уже 3600 баров, не забывайте).
Также следует учитывать, что до точки старта данных нет, поэтому в скриптах за нее залазить нельзя.
Изменять точку старта можно при счете индикатора из другого скрипта; значение точки старта д.б. строкой в формате даты времени, заданном в настройках Windows (обычно типа "10.12.2020 10:20:00"). Вызывается ли нормально из других скриптов с этим параметром-строкой, не проверял. Вроде препятствий к этому быть не должно, да кто ж знает.
Код: Выделить всё
function Initialize()
{
IndicatorName = "VWAP4";
PriceStudy = true;
AddInput("Input", Inputs.Candle);
AddParameter("Start", DateTime.Now.ToString());
AddSeries("VWAP4", DrawAs.Line, Color.Orange);
AddGlobalVariable("pq", Types.Double, 0.0);
AddGlobalVariable("q", Types.Double, 0.0);
}
function Evaluate()
{
string s=Start.stringValue;
DateTime start=Convert.ToDateTime(s);
// if(CurrentIndex==0)
// ShowMessage(String.Format("VWAP4 Start: {0}", start));
if(CurrentTime<start)
{
return;
// pq=0.0;
// q=0.0;
}
double p0=(Input.High[0]+Input.Low[0]+Input.Close[0])/3.0;
double q0=Input.Volume[0];
pq+=p0*q0;
q+=q0;
if(q!=0) VWAP4[0]=pq/q;
else VWAP4[0]=(CurrentIndex>0 ? VWAP4[-1] : 0.0);
}
Будет ли это работать? Неоднозначно. Если точка старта будет очень далеко в прошлом (~ нескольких тысяч баров; точное значение неизвестно, оно плавающее), то индикатор будет инициализировать себя уже после этой далекой точки, т.е. точка старта будет позже. В практическом плане это ограничение существенно на N-секундных таймфреймах (например, на секундах час - это уже 3600 баров, не забывайте).
Также следует учитывать, что до точки старта данных нет, поэтому в скриптах за нее залазить нельзя.
Изменять точку старта можно при счете индикатора из другого скрипта; значение точки старта д.б. строкой в формате даты времени, заданном в настройках Windows (обычно типа "10.12.2020 10:20:00"). Вызывается ли нормально из других скриптов с этим параметром-строкой, не проверял. Вроде препятствий к этому быть не должно, да кто ж знает.
Re: Очень нужен индикатор VWAP
а можно лт как-то сделать чтобы была возможность задавать произвольное количество отклонений, т.е. что бы это было не всегда 3 отклонения или 5, а в зависимости от того, сколько надо, ну и задать для каждого отклонения его значение?
-
- Сообщения: 535
- Зарегистрирован: 11 ноя 2018, 17:11
- Благодарил (а): 21 раз
- Поблагодарили: 92 раза
Re: Очень нужен индикатор VWAP
Универсальный вариант с бегущим окном (Period>0) или с накоплением от начала дня (Period<=0).
Код: Выделить всё
function Initialize()
{
IndicatorName = "VWAP3";
PriceStudy = true;
AddInput("Input", Inputs.Candle);
AddParameter("Period", 10, "Период");
AddSeries("VWAP3", DrawAs.Line, Color.Orange);
AddGlobalVariable("cv", Types.Double, 0.0);
AddGlobalVariable("v", Types.Double, 0.0);
}
function Evaluate()
{
int period=(int)Period;
if(period<=0 && BarDate()!=BarDate(1)) // period=0 - считать внутри дня
{
cv=0.0; v=0.0;
}
double p0=(Input.High[0]+Input.Low[0]+Input.Close[0])/3.0;
double q0=Input.Volume[0];
cv+=p0*q0;
v+=q0;
if(period<=0 || CurrentIndex<period)
{
if(v!=0) VWAP3[0]=cv/v; else
if(CurrentIndex>0) VWAP3[0]=VWAP3[-1];
else VWAP3[0]=0.0;
}
else
{
double p1=(Input.High[-period]+Input.Low[-period]+Input.Close[-period])/3.0;
double q1=Input.Volume[-period];
cv-=p1*q1;
v-=q1;
if(v!=0) VWAP3[0]=cv/v;
else VWAP3[0]=VWAP3[-1];
}
}
Вернуться в «Пользовательские индикаторы»
Кто сейчас на конференции
Сейчас этот форум просматривают: нет зарегистрированных пользователей и 3 гостя