Общие вопросы по разработке > Учусь писать индикатор. JapanCandles Patterns

Общие вопросы по разработке в Альфа-Директ 4. Обсуждение разработки пользовательских индикаторов, стратегий.
Balalayka
Сообщения: 38
Зарегистрирован: 21 сен 2018, 10:57
Благодарил (а): 2 раза
Поблагодарили: 3 раза

Учусь писать индикатор. JapanCandles Patterns

Непрочитанное сообщение Balalayka » 31 окт 2018, 11:11

Добрый день!
В рамках изучения и практики кодирования алгоритмов решил попробывать написать индикатор.
Поискал на форуме и не нашел ничего о Японских свечных моделях. Поскольку такой индикатор на мой взгляд полезен, а логика его не слишком сложна, то выбор пал на него.
Изучая документацию по АД начал писать код, и почти сразу же столкнулся с проблемами :)
Проблема №1.

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

function Initialize()
{
 IndicatorName = "JapanCandles";                     
 AddInput("Input", Inputs.Candle);     
 AddSeries("Hammer", DrawAs.Custom, Color.Green, true, Axes.Parent);
 AddSeries("Hanged", DrawAs.Custom, Color.Black, true, Axes.Parent);   //произв.метод рисования, ряд отображается в области входного ряда
 PriceStudy = true;
 ///                            
 ///AddParameter("", , 0);          
 ///AddGlobalVariable("", Types.Double, 0.0);
}

function Evaluate()
{
  var O = Input.Open[0];
  var C = Input.Close[0];
  var H = Input.High[0];
  var L = Input.Low[0];
 
  if ((C>O) && (O-L)>(C-O)*2)   
  {
    Hammer.DrawCircle();
  }
if ((O>C) && (O-L)>(C-O)*2)   
  {
    Hanged.DrawCircle();
  }

}


Код компилируется, но не отрисовывает фигуры на графике.

P.S. По мере написания буду выкладывать возникающие вопросы (думаю они будут довольно типичны для новичков и поэтому полезны для фиксирования на форуме).
Просьба участникам форума не проходить мимо. По итогам (если удасться дописать самому) выложу полный код на форум
Спасибо!

Аватара пользователя
evge
Администратор
Сообщения: 1807
Зарегистрирован: 04 фев 2016, 09:46
Откуда: Млечный путь, планета Земля
Благодарил (а): 83 раза
Поблагодарили: 361 раз
Контактная информация:

Re: Учусь писать индикатор. JapanCandles Patterns

Непрочитанное сообщение evge » 31 окт 2018, 12:48

задайте сериям Hammer, Hanged значения перед отрисовкой.
никогда такого не было и вот опять

Balalayka
Сообщения: 38
Зарегистрирован: 21 сен 2018, 10:57
Благодарил (а): 2 раза
Поблагодарили: 3 раза

Re: Учусь писать индикатор. JapanCandles Patterns

Непрочитанное сообщение Balalayka » 01 ноя 2018, 07:11

evge писал(а):задайте сериям Hammer, Hanged значения перед отрисовкой.


Евгений спасибо за подсказку!
Чуть доработал вычисления, конечно, не идеал, но есть от чего отталкиваться. После этого попробую добавить другие паттерны

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

function Initialize()
{
 IndicatorName = "JapanCandles";                     
 AddInput("Input", Inputs.Candle);     
 AddSeries("Hammer", DrawAs.Custom, Color.Green, true, Axes.Parent);
 AddSeries("Hanged", DrawAs.Custom, Color.Black, true, Axes.Parent);   //произв.метод рисования, ряд отображается в области входного ряда
 PriceStudy = true;
 AddParameter("pips", 2, 0);
 ///                            
 ///AddParameter("", , 0);          
 ///AddGlobalVariable("", Types.Double, 0.0);
}

function Evaluate()
{
  var O = Input.Open[0];
  var C = Input.Close[0];
  var H = Input.High[0];
  var L = Input.Low[0];

  Hammer=Input.Low-pips;
  Hanged=Input.High+pips;

  if ( (C>O) && (O-L)>(C-O)*2.1 && ((C==H) || (H-C) < (C-O)) )     
  {
    Hammer.DrawCircle();
  }
  if ((C<O) && (C-L)>(O-C)*2.1 && ((O==H) || (H-O) < (O-C))  )   
  {
    Hanged.DrawCircle();
  }

}


Вложения
Скриншот 2018-11-01 10.42.59.png

Аватара пользователя
evge
Администратор
Сообщения: 1807
Зарегистрирован: 04 фев 2016, 09:46
Откуда: Млечный путь, планета Земля
Благодарил (а): 83 раза
Поблагодарили: 361 раз
Контактная информация:

Re: Учусь писать индикатор. JapanCandles Patterns

Непрочитанное сообщение evge » 01 ноя 2018, 07:44

pips правильнее так:

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

Hammer = Input.Low - GetPriceStep() * pips;
Hanged = Input.High + GetPriceStep() * pips;
никогда такого не было и вот опять

nikkrav
Сообщения: 40
Зарегистрирован: 19 май 2016, 15:20
Благодарил (а): 66 раз

Re: Учусь писать индикатор. JapanCandles Patterns

Непрочитанное сообщение nikkrav » 01 ноя 2018, 21:28

Здравствуйте. Осмелюсь предложить другой вариант.
https://ru.tradingview.com/chart/AUDJPY ... That-Work/
кажется так симпатичнее.
У Евгения где то был индикатор с раскрашенными свечками.
У самого была такая мысль сделать, но увы...

Аватара пользователя
evge
Администратор
Сообщения: 1807
Зарегистрирован: 04 фев 2016, 09:46
Откуда: Млечный путь, планета Земля
Благодарил (а): 83 раза
Поблагодарили: 361 раз
Контактная информация:

Re: Учусь писать индикатор. JapanCandles Patterns

Непрочитанное сообщение evge » 01 ноя 2018, 21:37

Как пример рисования свечек кодом

EvgeBars

RangeChart
никогда такого не было и вот опять

Balalayka
Сообщения: 38
Зарегистрирован: 21 сен 2018, 10:57
Благодарил (а): 2 раза
Поблагодарили: 3 раза

Re: Учусь писать индикатор. JapanCandles Patterns

Непрочитанное сообщение Balalayka » 06 ноя 2018, 11:10

Вариант со свечным паттерном "Поглощение"

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

function Initialize()
{
 IndicatorName = "JapanCandles";                     
 AddInput("Input", Inputs.Candle);     
 AddSeries("Hammer", DrawAs.Custom, Color.Green, true, Axes.Parent);
 AddSeries("Hanged", DrawAs.Custom, Color.Black, true, Axes.Parent);   //произв.метод рисования, ряд отображается в области входного ряда
 PriceStudy = true;
 AddParameter("pips", 2, 0);
 AddSeries("BullEngulfing", DrawAs.Custom, Color.Green, true, Axes.Parent);
 AddSeries("BearEngulfing", DrawAs.Custom, Color.Black, true, Axes.Parent);
 ///AddParameter("PriceStep", 0);
 ///                            
 ///AddParameter("", , 0);          
 ///AddGlobalVariable("GetPriceStep", Types.Double, 0.0);
}

function Evaluate()
{
  var O = Input.Open[0];
  var C = Input.Close[0];
  var H = Input.High[0];
  var L = Input.Low[0];
 
 
  Hammer = Input.Low - pips;
  Hanged = Input.High + pips;
 
  if ( (C>O) && (O-L)>(C-O)*2.1 && ((C==H) || (H-C) < (C-O)) )     
  {
    Hammer.DrawCircle();
  }
  if ((C<O) && (C-L)>(O-C)*2.1 && ((O==H) || (H-O) < (O-C))  )   
  {
    Hanged.DrawCircle();
  }

  BullEngulfing=Input.Low-pips;
  BearEngulfing=Input.High+pips;

  if (Input.Close[1] < Input.Open[1]) // определение типа свечи
  if ( (C > O) && (C > Input.Open[1]) && (O < Input.Close[1]) )
  if ( ((Input.Open[1] - Input.Close[1])*3) > (Input.High[1] - Input.Low[1]) )
  {
    BullEngulfing.DrawArrowUp();
  }
 
  if (Input.Close[1] > Input.Open[1])
  if ( (C < O) && (O > Input.Close[1]) && (C < Input.Open[1]) )
  if ( ((Input.Close[1] - Input.Open[1])*3) > (Input.High[1] - Input.Low[1]) ) 
  {
    BearEngulfing.DrawArrowDown();
  }
}


Вложения
Скриншот 2018-11-06 14.43.58.png
Последний раз редактировалось Balalayka 06 ноя 2018, 11:12, всего редактировалось 1 раз.

Balalayka
Сообщения: 38
Зарегистрирован: 21 сен 2018, 10:57
Благодарил (а): 2 раза
Поблагодарили: 3 раза

Re: Учусь писать индикатор. JapanCandles Patterns

Непрочитанное сообщение Balalayka » 06 ноя 2018, 11:12

evge писал(а):pips правильнее так:

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

Hammer = Input.Low - GetPriceStep() * pips;
Hanged = Input.High + GetPriceStep() * pips;


Евгений у меня к сожалению не получилось вашу поправку внести
GetPriceStep() выдавало отсутвие в контексте, пытался по разному поправить, но не вышло :oops:

Аватара пользователя
evge
Администратор
Сообщения: 1807
Зарегистрирован: 04 фев 2016, 09:46
Откуда: Млечный путь, планета Земля
Благодарил (а): 83 раза
Поблагодарили: 361 раз
Контактная информация:

Re: Учусь писать индикатор. JapanCandles Patterns

Непрочитанное сообщение evge » 06 ноя 2018, 17:26

Да, это возможно. В индикаторы могли просто не добавить. В стратегиях работает.
никогда такого не было и вот опять

Balalayka
Сообщения: 38
Зарегистрирован: 21 сен 2018, 10:57
Благодарил (а): 2 раза
Поблагодарили: 3 раза

Re: Учусь писать индикатор. JapanCandles Patterns

Непрочитанное сообщение Balalayka » 09 ноя 2018, 06:42

Обновлен код
Добавлены паттерны: Завеса темных облаков, просвет в облаках, утренняя и вечерняя звезды в нескольких вариациях, а также определение свечей дожи на графике.

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

function Initialize()
{
 IndicatorName = "JapanCandles";                     
 AddInput("Input", Inputs.Candle);     
 AddSeries("Hammer", DrawAs.Custom, Color.Green, true, Axes.Parent);
 AddSeries("Hanged", DrawAs.Custom, Color.Black, true, Axes.Parent);   //произв.метод рисования, ряд отображается в области входного ряда
 PriceStudy = true;
 AddParameter("pips", 1, 0);
 AddParameter("pips1", 3, 0);
 AddSeries("BullEngulfing", DrawAs.Custom, Color.Green, true, Axes.Parent);
 AddSeries("BearEngulfing", DrawAs.Custom, Color.Black, true, Axes.Parent);
 AddSeries("DarkCloud", DrawAs.Custom, Color.Red, true, Axes.Parent);
 AddSeries("BrightCloud", DrawAs.Custom, Color.Blue, true, Axes.Parent);
 AddSeries("MorningStar", DrawAs.Custom, Color.LimeGreen, true, Axes.Parent);
 AddSeries("EveningStar", DrawAs.Custom, Color.Purple, true, Axes.Parent);
 AddSeries("Doji", DrawAs.Custom, Color.Yellow, true, Axes.Parent);
 AddGlobalVariable("MSbullMiddle", Types.Int, 0);
 AddGlobalVariable("MSbearMiddle", Types.Int, 0);
 AddGlobalVariable("ESbullMiddle", Types.Int, 0);
 AddGlobalVariable("ESbearMiddle", Types.Int, 0);
 AddGlobalVariable("ESAllBear", Types.Int, 0);
 ///AddParameter("PriceStep", 0);
 ///                            
 ///AddParameter("", , 0);          
 ///AddGlobalVariable("GetPriceStep", Types.Double, 0.0);
}

function Evaluate()
{
  var O = Input.Open[0];
  var C = Input.Close[0];
  var H = Input.High[0];
  var L = Input.Low[0];
  MSbullMiddle = 0;
  MSbearMiddle = 0;
  ESbullMiddle = 0;
  ESbearMiddle = 0;
  ESAllBear = 0;
 
  Hammer = Input.Low - pips;
  Hanged = Input.High + pips;
 
  if ( (C>O) && (O-L)>(C-O)*2.1 && ((C==H) || (H-C) < (C-O)) )     
  {
    Hammer.DrawCircle();
  }
  if ((C<O) && (C-L)>(O-C)*2.1 && ((O==H) || (H-O) < (O-C))  )   
  {
    Hanged.DrawCircle();
  }

  BullEngulfing=Input.Low-pips;     // Поглощение
  BearEngulfing=Input.High+pips;

  if (Input.Close[1] < Input.Open[1]) // определение типа свечи
  if ( (C > O) && (C > Input.Open[1]) && (O < Input.Close[1]) )
  if ( ((Input.Open[1] - Input.Close[1])*5.0) > (Input.High[1] - Input.Low[1]) )
  {
    BullEngulfing.DrawArrowUp();
  }
 
  if ( (Input.Close[1] > Input.Open[1]) && (C < O) )
  if ( (O > Input.Close[1]) && (C < Input.Open[1]) )
  if ( ((Input.Close[1] - Input.Open[1])*5.0) > (Input.High[1] - Input.Low[1]) ) 
  {
    BearEngulfing.DrawArrowDown();
  }
 
  DarkCloud=Input.High+pips1;            //Завеса из облаков
  BrightCloud=Input.Low-pips1;

  if ((Input.Close[1] > Input.Open[1]) && (C < O) )  //определение типа свечей
  if ( (O>Input.Close[1]) && (C<Input.Close[1]) && (C>Input.Open[1]) )
  if ((Input.Close[1] - C) > ((Input.Close[1] - Input.Open[1])*0.45))

  {
    DarkCloud.DrawSquare();
  }

  if ((Input.Close[1] < Input.Open[1]) && (C > O))  //определение типа свечей
  if ((O<Input.Close[1]) && (C<Input.Open[1]) && (C>Input.Close[1]))   
  if ((C - Input.Close[1]) > ((Input.Open[1] - Input.Close[1])*0.51))

  {
    BrightCloud.DrawSquare ();
  }
 
  MorningStar=Input.Low-pips1;     
  EveningStar=Input.High+pips1;

  // Morning Star (две разновидности)
  // BullMiddle
  if (Input.Close[2]<Input.Open[2] )                       //1 свеча bear                                                                 
  if ((Input.Close[1]>Input.Open[1]) )                     //2 свеча bull                                                     
  if ((Input.Close[1]-Input.Open[1])<(Input.Open[2]-Input.Close[2]) &&     (Input.Close[1]-Input.Open[1])<(C-O))                      //  и 2 свеча <1и3ей свечей
  if (C>O)                                                 // 3 свеча bull                                                                                             

  {
    MSbullMiddle=1;
  }

  if (MSbullMiddle == 1)
  if ((Input.Close[1] < ((Input.Open[2] + Input.Close[2])/2)) && (Input.Close[1] < ((O+C)/2)))

  {
   MorningStar.DrawArrowUp();
  }
 
  // BearMiddle
  if (Input.Close[2]<Input.Open[2] )                       //1 свеча bear                                                                 
  if ((Input.Close[1]<Input.Open[1]) )                      //2 свеча bear                                                     
  if ((Input.Close[1]-Input.Open[1])<(Input.Open[2]-Input.Close[2]) &&     (Input.Close[1]-Input.Open[1])<(C-O))                      //  и 2 свеча <1и3ей свечей
  if (C>O)                                                 // 3 свеча bull   
 
  {
    MSbearMiddle=1;
  }

  if (MSbearMiddle == 1)
  if ((Input.Open[1] < ((Input.Open[2] + Input.Close[2])/2)) && (Input.Open[1] < ((O+C)/2)))
  {
   MorningStar.DrawArrowUp();
  }


//Evening Star (две разновидности)
  // BullMiddle
 
  if (Input.Close[2]>Input.Open[2] )                            //1 свеча bull
  if ((Input.Close[1]>Input.Open[1]) )                         //2 свеча bull                                   
  if ((Input.Close[1]-Input.Open[1])<(Input.Close[2]-Input.Open[2]) && (Input.Close[1]-Input.Open[1])<(O-C))                                        //  и 2 свеча < 1ой и 3ей свечей
  if (C<O)                                                    // 3 свеча bear                                                   

  {
    ESbullMiddle=1;
  }

  if (ESbullMiddle == 1)
  if ((Input.Open[1] > ((Input.Open[2] + Input.Close[2])/2)) && (Input.Open[1] > ((C+O)/2)))
  if (Input.Volume[0] >= Input.Volume[2])
 
  {
   EveningStar.DrawArrowDown();
  }
 
  //BearMiddle
  if (Input.Close[2]>Input.Open[2] )                            //1 свеча bull
  if ((Input.Close[1]<Input.Open[1]) )                         //2 свеча bear                                   
  if ((Input.Open[1]-Input.Close[1])<(Input.Close[2]-Input.Open[2]) && (Input.Open[1]-Input.Close[1])<(O-C))                                        //  и 2 свеча <1ой и 3ей свечей
  if (C<O)                                                   // 3 свеча bear                                                   

  {
    ESbearMiddle=1;
  }

 if (ESbearMiddle == 1)
 if ((Input.Close[1] > ((Input.Open[2] + Input.Close[2])/2)) && (Input.Close[1] > ((C+O)/2)))
 if (Input.Volume[0] >= Input.Volume[2])
  {
   EveningStar.DrawArrowDown();
  }

//AllBear
  if (Input.Close[2]<Input.Open[2] )                            //1 свеча bear
  if ((Input.Close[1]<Input.Open[1]) )                         //2 свеча bear                                   
  if ((Input.Open[1]-Input.Close[1])<(Input.Open[2]-Input.Close[2]) && (Input.Open[1]-Input.Close[1])<(O-C))                                        //  и 2 свеча <1ой и 3ей свечей
  if (C<O)                                                    // 3 свеча bear
 
  {
    ESAllBear=1;
  }
 if (ESAllBear == 1)
 if ((Input.Close[1] > ((Input.Close[2] + Input.Open[2])/2)) && (Input.Close[1] > ((C+O)/2)))
 if (Input.Volume[0] >= Input.Volume[2])
  {
   EveningStar.DrawArrowDown();
  }

   // Doji Detection определение дожи на графике
   
   Doji = Input.High[0] + pips;
   
   double Percent = Input.Open*0.0007;
   
   if ( (C>O) && ( C < (O + Percent )) )
   {
   Doji.DrawCircle();
   }
   
   if ( (C<O) && ( C > (O - Percent) ) ) 
   {
   Doji.DrawCircle();
   }

     
   }


Вложения
1.png
1.png (26.82 КБ) 22446 просмотров


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

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

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