Общие вопросы по разработке > Совсем уж простенькое - КАК МЕНЯТЬ ЦВЕТ SMA ?

Общие вопросы по разработке в Альфа-Директ 4. Обсуждение разработки пользовательских индикаторов, стратегий.
Аватара пользователя
Den
Сообщения: 352
Зарегистрирован: 09 фев 2016, 15:52
Благодарил (а): 14 раз
Поблагодарили: 4 раза

Совсем уж простенькое - КАК МЕНЯТЬ ЦВЕТ SMA ?

Непрочитанное сообщение Den » 10 июл 2017, 20:24

Добрый день ,

как менять цвет SMA под(над) сигналом пользовательского индикатора?

На скрине SMA желтая.
Вложения
34.png

Kurono
Сообщения: 14
Зарегистрирован: 08 июл 2017, 20:37
Поблагодарили: 5 раз

Re: Совсем уж простенькое - КАК МЕНЯТЬ ЦВЕТ SMA ?

Непрочитанное сообщение Kurono » 12 июл 2017, 16:17

Есть индикатор "Дельта", там если он больше 0 зеленый, ниже красный.
Простой пример, но он на гистограмме:

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

  if (Delta > 0 )
     Delta.DrawHistogram(Color.Green, Color.Green, 100);
  else
     Delta.DrawHistogram(Color.Red, Color.Red, 100);
}


А вот "Супертренд", с зеленой и красной линией на графике:

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

AddSeries("U", DrawAs.Custom, Color.Green);
AddSeries("D", DrawAs.Custom, Color.Red);

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

if (C[0] >= 0)
{
ST = I.Low[0] - A[0] * K; if (CurrentIndex > MPer) ST[0] = Math.Max(ST[0], ST[1]);
U[1] = ST[1]; U[0] = ST[0]; U.DrawLine();
}
else
{
ST = I.High[0] + A[0] * K; if (CurrentIndex > MPer) ST[0] = Math.Min(ST[0], ST[1]);
D[1] = ST[1]; D[0] = ST[0]; D.DrawLine();
}


Осталось понять при каком условии SMA должен менять цвет.

Аватара пользователя
Den
Сообщения: 352
Зарегистрирован: 09 фев 2016, 15:52
Благодарил (а): 14 раз
Поблагодарили: 4 раза

Re: Совсем уж простенькое - КАК МЕНЯТЬ ЦВЕТ SMA ?

Непрочитанное сообщение Den » 13 июл 2017, 10:45

Вопрос был не про какие-то другие индикаторы с новыми условиями, а про пользовательский тот, что на скрине и не про линию пользовательского индикатора, а про линию SMA .
Над стрелкой вверх она одного цвета.
Под стрелкой вниз она другого цвета.

Аватара пользователя
Den
Сообщения: 352
Зарегистрирован: 09 фев 2016, 15:52
Благодарил (а): 14 раз
Поблагодарили: 4 раза

Re: Совсем уж простенькое - КАК МЕНЯТЬ ЦВЕТ SMA ?

Непрочитанное сообщение Den » 13 июл 2017, 13:54

а где остальная часть SMA?

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

function Initialize()
{
  IndicatorName = "SMA_III";
  PriceStudy = true ;
  AddInput("Input", Inputs.Price);         
  AddParameter("Period", 1);                   
  AddGlobalVariable("D", Types.Double, 0.0);         
  AddSeries("S", DrawAs.Custom, Color.Yellow);   
}

function Evaluate()
{
  if ( CurrentIndex < Period )
  {
     D = D + Input[0];     
     S = D / (CurrentIndex + 1);     
  }
  else
  {
     D = D + Input[0] - Input[(int)(-Period)] ;     
     S = D / Period;   
  }
  if ( S[0] >= MY.индикатор.GetValue("L", 1))

       S.DrawLine(Color.Green, Line.DashSmall, 3);

  if ( S[0] <= MY.индикатор.GetValue("H", 1))

       S.DrawLine(Color.Red, Line.DashSmall, 3);

}





line.png
line.png (8.2 КБ) 22904 просмотра

Kurono
Сообщения: 14
Зарегистрирован: 08 июл 2017, 20:37
Поблагодарили: 5 раз

Re: Совсем уж простенькое - КАК МЕНЯТЬ ЦВЕТ SMA ?

Непрочитанное сообщение Kurono » 15 июл 2017, 00:42

Если я правильно прочитал индикатор (он не сработал), то у него есть 3 варианта:
вар1) S[0] выше нижней границы 1 бар назад, вариант 2 не применим;
вар2) S[0] ниже нижней границы 1 бар назад, вариант 1 не применим;
вар3) S[0] между данными границами, однозначного результата нет;
или, возможно, имеется 4 вар. когда наоборот оба условия не выполняются.

Предлагаю переписать скрипт так, чтобы были заданы все возможные варианты SMA и их цвета, как в данном примере:

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

  if ( S[0] > L[0] )
          {
          if ( S[0] < Input.Close[0] )
          {S.DrawLine(Color.Green, Line.DashSmall, 2);}
          else {S.DrawLine(Color.Yellow, Line.DashSmall, 1);}
          }
  else {
          if ( S[0] > Input.Close[0] )
          {S.DrawLine(Color.Red, Line.DashSmall, 2);}
          else  {S.DrawLine(Color.Yellow, Line.DashSmall, 1);}
       }

Аватара пользователя
Den
Сообщения: 352
Зарегистрирован: 09 фев 2016, 15:52
Благодарил (а): 14 раз
Поблагодарили: 4 раза

Re: Совсем уж простенькое - КАК МЕНЯТЬ ЦВЕТ SMA ?

Непрочитанное сообщение Den » 17 июл 2017, 10:57

тут дело вот в чем:
Индикатор рисует только одну точку после экстремума, так как индикаторы
MY.индикатор.GetValue("L", 1))
MY.индикатор.GetValue("H", 1))
имеют значения только в точках максимума и минимума (следующая точка GetValue("H", 1)) ,
а в остальных никакого значения не имеют , следовательно и рисовать не будет.
То есть НЕЛЬЗЯ, якобы (так мне ответил суппорт).

Но заставить его менять цвет SMA (именно SMA, это принципиально) после сигнала индикатора можно.
Вот пример ( красная линия -это SMA поменявшая цвет после сигнала вниз).
Тут весь график становится цвета последнего сигнала для пущей наглядности (так как предыдущие участки пройдены - уже не важно какого они цвета, зато так - нагляднее).
Вложения
h3 sma.png
Последний раз редактировалось Den 17 июл 2017, 11:14, всего редактировалось 1 раз.

Аватара пользователя
Den
Сообщения: 352
Зарегистрирован: 09 фев 2016, 15:52
Благодарил (а): 14 раз
Поблагодарили: 4 раза

Re: Совсем уж простенькое - КАК МЕНЯТЬ ЦВЕТ SMA ?

Непрочитанное сообщение Den » 17 июл 2017, 11:03

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

  if ( S[0] > L[0] )
          {
          if ( S[0] < Input.Close[0] )
          {S.DrawLine(Color.Green, Line.DashSmall, 2);}
          else {S.DrawLine(Color.Yellow, Line.DashSmall, 1);}
          }
  else {
          if ( S[0] > Input.Close[0] )
          {S.DrawLine(Color.Red, Line.DashSmall, 2);}
          else  {S.DrawLine(Color.Yellow, Line.DashSmall, 1);}
       }


Input.Close[0] тут ни причем, так как индикатор не совпадает с ним в каждой точке Input.Close[0]

Kurono
Сообщения: 14
Зарегистрирован: 08 июл 2017, 20:37
Поблагодарили: 5 раз

Re: Совсем уж простенькое - КАК МЕНЯТЬ ЦВЕТ SMA ?

Непрочитанное сообщение Kurono » 18 июл 2017, 13:59

Input.Close[0] был для примера,

ЕСЛИ сигнал1-цвет1 else (если сигнал 2-цвет2, else цвет3)

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

  if ( S[0] >= MY.индикатор.GetValue("L", 1))
          S.DrawLine(Color.Green, Line.DashSmall, 3);
  else {
          if ( S[0] <= MY.индикатор.GetValue("H", 1))
          {S.DrawLine(Color.Red, Line.DashSmall, 3);}
          else  {S.DrawLine(Color.Yellow, Line.DashSmall, 1);}
       }

линия будет менять цвет только в 2х и более барах отличающихся сигналом, при единичном баре с сигналом на линии появится точка

Аватара пользователя
Den
Сообщения: 352
Зарегистрирован: 09 фев 2016, 15:52
Благодарил (а): 14 раз
Поблагодарили: 4 раза

Re: Совсем уж простенькое - КАК МЕНЯТЬ ЦВЕТ SMA ?

Непрочитанное сообщение Den » 19 июл 2017, 11:22

1.Линия будет менять цвет ТОЛЬКО НА БАРЕ, ГДЕ ПОЯВИЛСЯ СИГНАЛ ИНДИКАТОРА - выше приведен ответ Еремина, почему нельзя менять цвет SMA между сигналами отстоящими друг от друга более, чем на 1 бар.

2.Приведен скрин, где цвет SMA всё же меняется в соответствии с сигналом индикатора (значит всё-таки можно)

Kurono
Сообщения: 14
Зарегистрирован: 08 июл 2017, 20:37
Поблагодарили: 5 раз

Re: Совсем уж простенькое - КАК МЕНЯТЬ ЦВЕТ SMA ?

Непрочитанное сообщение Kurono » 19 июл 2017, 20:48

Предлагаю ввести вспом. переменную которая будет изменять постоянное значение в зависимости от сигналов и изменять SMA

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

AddGlobalVariable("P", Types.Double, 0.0);       

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

  if ( S[0] >= MY.индикатор.GetValue("L", 1))
       P = 1;
  if ( S[0] <= MY.индикатор.GetValue("H", 1))
       P = -1;
  if ( P == 1)
          S.DrawLine(Color.Green, Line.DashSmall, 3);
  else {
          if (P == -1)
          {S.DrawLine(Color.Red, Line.DashSmall, 3);}
          else  {S.DrawLine(Color.Yellow, Line.DashSmall, 1);}
       }
       }


В моем скрипте все получилось даже когда двойные условия (S[0] > L[0] S[0] < Input.Close[0] или S[0] < L[0] S[0] > Input.Close[0]) фактически не выполняются (раньше там был желтый цвет)

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

function Initialize()
{
  IndicatorName = "SMASignaL2";
  PriceStudy = true;
  AddInput("Input", Inputs.Candle);         
  AddParameter("PeriodS", 50);
  AddParameter("PeriodL", 200);                       
  AddSeries("S", DrawAs.Custom, Color.Yellow);
  AddSeries("L", DrawAs.Line, Color.Gray);   
AddGlobalVariable("P", Types.Double, 0.0);         
}
function Evaluate()
{
// AlfaDirect. 2017. Kurono
if ( CurrentIndex < PeriodS)  {S = Input[0]; }
else {var Inp = LIB.MID(Input);
S = SMA(Inp, PeriodS)[0]; }
if ( CurrentIndex < PeriodL)  {L = Input[0]; }
else {var Inp = LIB.MID(Input);
L = SMA(Inp, PeriodL)[0]; }
  if ( S[0] > L[0] )
          {
          if ( S[0] < Input.Close[0] )
          {P = 1;}
          }
  if ( S[0] < L[0] )
          {
          if ( S[0] > Input.Close[0] )
          {P = -1;}
          }
  if ( P == 1)
          S.DrawLine(Color.Green, Line.DashSmall, 2);
  else {
          if ( P == -1)
          {S.DrawLine(Color.Red, Line.DashSmall, 2);}
          else  {S.DrawLine(Color.Yellow, Line.DashSmall, 1);}
       }
}


Желтый линия SMA идет только до первого сигнала


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

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

Сейчас этот форум просматривают: Google [Bot] и 18 гостей