Общие вопросы по разработке > Можно ли научить робота считывать и рисовать уровни?

Общие вопросы по разработке в Альфа-Директ 4. Обсуждение разработки пользовательских индикаторов, стратегий.
ZiZ
Сообщения: 23
Зарегистрирован: 19 ноя 2019, 15:32
Благодарил (а): 2 раза
Поблагодарили: 1 раз

Можно ли научить робота считывать и рисовать уровни?

Непрочитанное сообщение ZiZ » 19 июн 2020, 16:17

Робот торгует, опираясь на один конкретный уровень. Для визуального удобства рисую его стандартными методами терминала Карандашик/Уровень, а в самом роботе задаю его значение через параметр P1.

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

Если такая возможность существует, помогите с кодом, пожалуйста.

Спасибо.

Владимир
Сообщения: 84
Зарегистрирован: 14 ноя 2016, 02:17
Благодарил (а): 3 раза
Поблагодарили: 2 раза

Re: Можно ли научить робота считывать и рисовать уровни?

Непрочитанное сообщение Владимир » 08 ноя 2020, 23:59

Добрый день! В терминале есть такая реализованная возможность как "Робот по линиям". где Вы задаёте (рисуете уровни), а потом можете задать условие на открытие позиции. Или описываете какой нибудь патерн в индикаторе и используете его в роботе. Можно описать сразу в роботе. Когда то пробовал описать патерны по А.Герчику. Ищем БПУ (бар образовавший уровень), потом БПУ1-3 (бар подтвердивший уровень), по ним строим уровень. Это только образец не паноцея, т.к это неполная часть условий по А.Герчику.

Код: Выделить всё

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)
   
}



Владимир
Сообщения: 84
Зарегистрирован: 14 ноя 2016, 02:17
Благодарил (а): 3 раза
Поблагодарили: 2 раза

Re: Можно ли научить робота считывать и рисовать уровни?

Непрочитанное сообщение Владимир » 09 ноя 2020, 10:21

пример.jpg


Вернуться в «Общие вопросы по разработке»

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и 6 гостей