Индикатор который должен был получать сигнал с робота на отрисовку линии при формировании потерна.
Код: Выделить всё
function Initialize()
{
// Обязательные параметры:
IndicatorName = "Search_level_Robot"; // Задайте название индикатора и сохраните с данным именем
PriceStudy = true; // Рисовать в области цены (true – да, false – нет)
AddInput("Input", Inputs.Candle); // Input - входной ряд (Inputs.Price) или свечи (Inputs.Candle)
AddSeries("Last1", DrawAs.Line, Color.Red);// Задаем вид линии индикатора с именем ряда Last
AddLevel(0, Color.Red, LineStyles.Dot, 2, "Last");
//Данные получаемые с робота
AddParameter("GetPriceStep_ind", 0); // Минимальный шаг цены получаемый с робота (число знаков после запятой)
AddParameter("Period", 200); // Период построения уровней
AddParameter("Enable_Recalculation", 1); // Разрешение на обработку данных
AddParameter("max_stop", 20); // Период построения уровней (длинна истории)
AddParameter("gap", 4); // Период построения уровней (длинна истории)
//Данные передаваемые в робот
AddSeries("Direction"); // Направление открываемой позиции (0 - нет направления, 1- лонг, 2- шорт)
AddGlobalVariable("ListDouble", Types.DoubleList);
AddGlobalVariable("path", Types.String, @"c:\\dell\\Search_level_Robot.txt");
}
function Evaluate()
//Владимир
{
int Period_int = (int)Period;
double High=Input.High[2]; // Переменная хранения значения хая для сравнения
double Low=Input.Low[2]; // Переменная хранения значения хая для сравнения
double Hx=0;
double Lx=0;
Direction=0;
string Model="нет";
if ((MaxIndex - CurrentIndex) > Period_int) return;
if (CurrentIndex == MaxIndex)
{
//////// Описываем модель на покупку
//модель 1
double Low2=Input.Low[2]+gap;
if(Input.Low[0] ==Input.Low[2] && (Input.Low[0]<=Input.Low[1] && Low2>=Input.Low[1]))
{
for(var x=3; x<Period_int; x++ )
{
if ((Low==Input.High[x])||(Low==Input.Low[x]) )
{
Lx=Low;
if( Low>0)
{
Model="Лонг - 1";
Direction=1;
ListDouble.Add(Lx);
}
}
}
}
//модель 2
if(Input.Low[0] ==Input.Low[1] && Input.Low[0] ==Input.Low[2]
&& Input.Low[0] > Input.Low[3] && Input.Low[0] < Input.Close[3] && Input.Low[0] < Input.Open[3] )
{
for(var x=4; x<Period_int; x++ )
{
if ((Low==Input.High[x])||(Low==Input.Low[x]) )
{
Lx=Low;
if( Low>0)
{
Model="Лонг - 2 (простой ложный пробой)";
Direction=1;
ListDouble.Add(Lx);
}
}
}
}
//модель 3
if(Input.Low[0] ==Input.Low[1] && Input.Low[0] ==Input.Low[2]
&& Input.Low[0] > Input.Close[3] && Input.Low[0] < Input.Open[3] && Input.Low[0] < Input.Close[4])
{
for(var x=5; x<Period_int; x++ )
{
if ((Low==Input.High[x])||(Low==Input.Low[x]) )
{
Lx=Low;
if( Low>0)
{
Model="Лонг - 3 (сложный ложный пробой)";
Direction=1;
ListDouble.Add(Lx);
}
}
}
}
//////// Описываем модель на продажу
//модель 1
double High2=Input.High[2]-gap;
if(Input.High[0] ==Input.High[2] && (Input.High[0]>=Input.High[1] && High2<=Input.High[1]))
{
for(var x=3; x<Period_int; x++ )
{
if ((High==Input.High[x])||(Low==Input.Low[x]) )
{
Hx=High;
if( High>0)
{
Model="Шорт - 1";
Direction=2;
ListDouble.Add(Hx);
}
}
}
}
//модель 2
if(Input.High[0] ==Input.High[1] && Input.High[1] ==Input.High[2]
&& Input.High[0] < Input.High[3] && Input.High[0] > Input.Close[3] && Input.High[0] > Input.Open[3] )
{
for(var x=5; x<Period_int; x++ )
{
if ((High==Input.High[x])||(Low==Input.Low[x]) )
{
Hx=High;
if( High>0)
{
Model="Шорт - 2 (простой ложный пробой)";
Direction=2;
ListDouble.Add(Hx);
}
}
}
}
//модель 3
if(Input.High[0] ==Input.High[1] && Input.High[0] ==Input.High[2]
&& Input.High[0] > Input.Close[3] && Input.High[0] < Input.Open[3] && Input.High[0] < Input.Close[4])
{
for(var x=5; x<Period_int; x++ )
{
if ((High==Input.High[x])||(Low==Input.Low[x]) )
{
Hx=High;
if( High>0)
{
Model="Шорт - 3 (сложный ложный пробой)";
Direction=2;
ListDouble.Add(Hx);
}
}
}
}
//////////////////////////////////
using (System.IO.StreamWriter sw = System.IO.File.CreateText(path))
{
sw.WriteLine("Модель - " + Model);
sw.WriteLine("Направление - " + Convert.ToString(Direction ));
sw.WriteLine(string.Join("\r\n", ListDouble ));
sw.Close(); sw.Dispose();
}
if (Direction>0 && (Convert.ToBoolean(Enable_Recalculation)==true))
{ //Открываем позицию вконце формирования свечи с индексом[0] (за 30 секунд до закрытия свечи)
Levels[0].Level = ListDouble[0];
}
//else
//{Levels[0].Level=0;}
}//off if (CurrentIndex == MaxIndex)
}
Индиеатор формирует линиию с задержкой на одну свечу (тестовый)
Код: Выделить всё
function Initialize()
{
// Обязательные параметры:
IndicatorName = "Search_level"; // Задайте название индикатора и сохраните с данным именем
PriceStudy = true; // Рисовать в области цены (true – да, false – нет)
AddInput("Input", Inputs.Candle); // Input - входной ряд (Inputs.Price) или свечи (Inputs.Candle)
AddSeries("Last1", DrawAs.Line, Color.Red);// Задаем вид линии индикатора с именем ряда Last
AddLevel(0, Color.Red, LineStyles.Dot, 2, "Last");
/* AddLevel(1, Color.Red, LineStyles.Dot, 2, "Last");
AddLevel(2, Color.Red, LineStyles.Dot, 2, "Last");
AddLevel(3, Color.Red, LineStyles.Dot, 2, "Last");
AddLevel(4, Color.Red, LineStyles.Dot, 2, "Last");
AddLevel(5, Color.Red, LineStyles.Dot, 2, "Last");*/
AddSeries("Direction"); // Направление открываемой позиции (0 - нет направления, 1- лонг, 2- шорт)
// AddSeries("GetPriceStep_ind"); // Минимальный шаг цены получаемый с робота (число знаков после запятой)
AddParameter("GetPriceStep_ind", 2); // Минимальный шаг цены (число знаков после запятой)
AddParameter("Period", 200); // Период построения уровней
AddGlobalVariable("path", Types.String, @"c:\\dell\\Search_level.txt");
AddGlobalVariable("ListDouble", Types.DoubleList);
}
function Evaluate()
//Владимир
{
int Period_int = Period-0;
double max_stop=Math.Round((Input.High[0]*0.2/100),(GetPriceStep_ind+0));
double gap=Math.Round((max_stop*0.2),(GetPriceStep_ind+0));
double High=Input.High[3]; // Переменная хранения значения хая для сравнения
double Low=Input.Low[3]; // Переменная хранения значения хая для сравнения
double Hx=0;
double Lx=0;
Direction=0;
string Model="нет";
if ((MaxIndex - CurrentIndex) > Period_int) return;
if (CurrentIndex == MaxIndex)
{
//////// Описываем модель на покупку
//модель 1
double Low2=Input.Low[3]+gap;
if(Input.Low[1] ==Input.Low[3] && (Input.Low[1]<=Input.Low[2] && Low2>=Input.Low[2]))
{
for(var x=4; x<Period_int; x++ )
{
if ((Low==Input.High[x])||(Low==Input.Low[x]) )
{
Lx=Low;
if( Low>0)
{
Model="Лонг - 1";
Direction=1;
ListDouble.Add(Lx);
}
}
}
}
//модель 2
if(Input.Low[1] ==Input.Low[2] && Input.Low[1] ==Input.Low[3]
&& Input.Low[1] > Input.Low[4] && Input.Low[1] < Input.Close[4] && Input.Low[1] < Input.Open[4] )
{
for(var x=5; x<Period_int; x++ )
{
if ((Low==Input.High[x])||(Low==Input.Low[x]) )
{
Lx=Low;
if( Low>0)
{
Model="Лонг - 2 (простой ложный пробой)";
Direction=1;
ListDouble.Add(Lx);
}
}
}
}
//модель 3
if(Input.Low[1] ==Input.Low[2] && Input.Low[1] ==Input.Low[3]
&& Input.Low[1] > Input.Close[4] && Input.Low[1] < Input.Open[4] && Input.Low[1] < Input.Close[5])
{
for(var x=6; x<Period_int; x++ )
{
if ((Low==Input.High[x])||(Low==Input.Low[x]) )
{
Lx=Low;
if( Low>0)
{
Model="Лонг - 3 (сложный ложный пробой)";
Direction=1;
ListDouble.Add(Lx);
}
}
}
}
//////// Описываем модель на продажу
//модель 1
double High2=Input.High[3]-gap;
if(Input.High[1] ==Input.High[3] && (Input.High[1]>=Input.High[2] && High2<=Input.High[2]))
{
for(var x=4; x<Period_int; x++ )
{
if ((High==Input.High[x])||(Low==Input.Low[x]) )
{
Hx=High;
if( High>0)
{
Model="Шорт - 1";
Direction=2;
ListDouble.Add(Hx);
}
}
}
}
//модель 2
if(Input.High[1] ==Input.High[2] && Input.High[1] ==Input.High[3]
&& Input.High[1] < Input.High[4] && Input.High[1] > Input.Close[4] && Input.High[1] > Input.Open[4] )
{
for(var x=6; x<Period_int; x++ )
{
if ((High==Input.High[x])||(Low==Input.Low[x]) )
{
Hx=High;
if( High>0)
{
Model="Шорт - 2 (простой ложный пробой)";
Direction=2;
ListDouble.Add(Hx);
}
}
}
}
//модель 3
if(Input.High[1] ==Input.High[2] && Input.High[1] ==Input.High[3]
&& Input.High[1] > Input.Close[4] && Input.High[1] < Input.Open[4] && Input.High[1] < Input.Close[5])
{
for(var x=6; x<Period_int; x++ )
{
if ((High==Input.High[x])||(Low==Input.Low[x]) )
{
Hx=High;
if( High>0)
{
Model="Шорт - 3 (сложный ложный пробой)";
Direction=2;
ListDouble.Add(Hx);
}
}
}
}
//////////////////////////////////
using (System.IO.StreamWriter sw = System.IO.File.CreateText(path))
{
sw.WriteLine("Модель - " + Model);
sw.WriteLine("Направление - " + Convert.ToString(Direction ));
sw.WriteLine(string.Join("\r\n", ListDouble ));
sw.Close(); sw.Dispose();
}
if (Direction>0)
{
Levels[0].Level = ListDouble[0];
}
}//off if (CurrentIndex == MaxIndex)
}
Автоматизированная торгавля по данному индикатору оказалась невозможна по причине описанной выше