1 как задать толщину и тип линии?
2 как нарисовать восходящий тренд зеленым, нисходящий красным (используя массив) ?
3 как можно нарисовать луч и можно ли получать числовые значения этого луча на нулевой свече?
Эта попытка написать индикатор "Волны Вульфа" описание его полно в интернете если кому интересно.
Код: Выделить всё
function Initialize()
{
// Область определения параметров индикатора
// Обязательные параметры:
IndicatorName = "WolfeWave"; // Задайте название индикатора и сохраните с данным именем
PriceStudy = true; // Рисовать в области цены (true – да, false – нет)
AddInput("Input", Inputs.Candle); // Input - входной ряд (Inputs.Price) или свечи (Inputs.Candle)
AddSeries("LineHigh", DrawAs.Line, Color.Green); // Задаем вид линии индикатора с именем LineHigh
AddSeries("LineLow", DrawAs.Line, Color.Red); // Задаем вид линии индикатора с именем LineLow
AddSeries("MarkerUp", DrawAs.Custom, Color.Red); // Метим экстремум
AddSeries("MarkerLow", DrawAs.Custom, Color.Yellow); // Метим экстремум
// Дополнительные параметры:
AddParameter("ExsN1", 80, 1);
AddParameter("Scan", 163, 1); // сканируемый период
//AddParameter("имя переменной", период, множитель), требующий размер истории 163 баров ( т.е. 163*1)
AddGlobalVariable("Kbuy", Types.Double, 0.0); //выводим значение предпологаемой переменной цены покупки
//AddGlobalVariable("ExstremaNumber", Types.Int, 80); // Задаем число экстремумов
AddGlobalVariable("NaprHelp", Types.Int,1); // Задаем число экстремумов
AddGlobalVariable("XHighN", Types.Int); //переменная хранения номера свечи хая для сравнения
AddGlobalVariable("XLowN", Types.Int); //переменная хранения номера свечи лоу для сравнения
//AddGlobalVariable("ExstremaNumber", Types.Int);
}
function Evaluate()
{ var ExstremaNumber=ExsN1/1;
double [] Buf_High = new double[ExstremaNumber]; // Объявление массивов цен (под буферы индикатора)
double [] Buf_Low = new double[ExstremaNumber]; // Объявление массивов цен (под буферы индикатора)
int [] Buf_time_High = new int[ExstremaNumber]; // Объявление массивов время цены (под буферы индикатора)
int [] Buf_time_Low = new int[ExstremaNumber]; // Объявление массивов время цены (под буферы индикатора)
if ((MaxIndex - CurrentIndex) > Scan) return;
{
if (CurrentIndex == MaxIndex)
{
var Napr=0; //направление движения цены 0- нет; 1-лонг; 2-шорт;
// var NaprHelp=1; //изменение направления ;
var IzNapr=0; //изменение направления 0- нет; 1-лонг; 2-шорт;
var HighX= Input.High[Scan]; //переменная хранения значения хая для сравнения
var LowX=Input.Low[Scan]; //переменная хранения значения лоу для сравнения
var High = Input.High[Scan]; //переменная сравнения хая
var Low = Input.Low[Scan]; //переменная сравнения лоу
XHighN=Scan-1; XLowN=Scan-1;
for (var x= Scan-1; x>0; x--)
{
/////при нормальных свечах
if (Input.Open[x]<Input.Close[x]) //проверяем закрытие свечи лонг шорт
{//лонг
if (High<Input.Close[x])
{ // считаем, что произошло обновление High. Поэтому переписываея значения хая и лоу
Napr=1; //лонг
High=Input.High[x];
Low=Input.Low[x];
HighX=High; //сохраняем значение хая в памяти
XHighN=x; //сохраняем значение в памяти
}
}
else
{//шорт
if (Low>Input.Close[x])
{ // считаем, что произошло обновление low. Поэтому переписываея значения хая и лоу
Napr=2; //шорт
High=Input.High[x];
Low=Input.Low[x];
LowX=Low; //сохраняем значение лоу в памяти
XLowN=x; //сохраняем значение в памяти
}
}
/////при формировании свечей с гепами
if (Input.Open[x]>Input.Close[x]) //проверяем закрытие свечи лонг шорт
{//лонг
if (High<Input.Open[x])
{ // считаем, что произошло обновление High. Поэтому переписываея значения хая и лоу
Napr=1; //лонг
High=Input.High[x];
Low=Input.Low[x];
HighX=High; //сохраняем значение хая в памяти
XHighN=x; //сохраняем значение в памяти
}
}
else
{//шорт
if (Low>Input.Open[x])
{ // считаем, что произошло обновление low. Поэтому переписываея значения хая и лоу
Napr=2; //шорт
High=Input.High[x];
Low=Input.Low[x];
LowX=Low; //сохраняем значение лоу в памяти
XLowN=x; //сохраняем значение в памяти
}
}
//заполняем буфер хаёв
if (Napr==NaprHelp && Napr==2) //смена направления с лонга в шорт
{
for (var ch=ExstremaNumber-1; ch>0; ch--) //ExstremaNumber-1
{
Buf_High[ch]=Buf_High[ch-1];
Buf_time_High[ch]=Buf_time_High[ch-1];
}
Buf_High[0]=HighX;
Buf_time_High[0]=XHighN;
NaprHelp=1;
}
//заполняем буфер лоёв
if (Napr==NaprHelp && Napr==1) //смена направления с шорта в лонг
{
for (var Lo=ExstremaNumber-1; Lo>0; Lo--) //ExstremaNumber-1
{
Buf_Low[Lo]=Buf_Low[Lo-1];
Buf_time_Low[Lo]=Buf_time_Low[Lo-1];
}
Buf_Low[0]=LowX;
Buf_time_Low[0]=XLowN;
NaprHelp=2;
}
/////////////////////////////////////
} //закрытие цикла for
///пробуем строить график
for(var i=0; i<ExstremaNumber-1; i++)
{
if (MarkerLow[Buf_time_Low[i]]>0 || Buf_Low[i]>0)// нулевые данные игнорируем для построения
MarkerLow[Buf_time_Low[i]]=Buf_Low[i]; //данные для построения меток хаёв
if (MarkerUp[Buf_time_High[i]]>0 || Buf_High[i]>0) // нулевые данные игнорируем для построения
MarkerUp[Buf_time_High[i]]=Buf_High[i]; //данные для построения меток лоёв
if ((MarkerLow[Buf_time_Low[i]]>0 || Buf_Low[i]>0) && (MarkerUp[Buf_time_High[i]]>0 || Buf_High[i]>0))
{
LineHigh[Buf_time_Low[i]]=Buf_Low[i];
LineHigh[Buf_time_High[i]]=Buf_High[i];
}
}//построение графика закончено
}
}
MarkerUp.DrawArrowDown();
MarkerLow.DrawArrowUp();
LineHigh.DrawLine();
LineLow.DrawLine();
}