Общие вопросы по разработке > Можете помочь ? прикрутить скользящую к этому индикатору (чтоб усреднял этот индикатор ).Спасибо

Общие вопросы по разработке в Альфа-Директ 4. Обсуждение разработки пользовательских индикаторов, стратегий.
naum
Сообщения: 22
Зарегистрирован: 17 мар 2016, 08:59

Можете помочь ? прикрутить скользящую к этому индикатору (чтоб усреднял этот индикатор ).Спасибо

Непрочитанное сообщение naum » 27 авг 2016, 12:28

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

function Initialize()
{


    IndicatorName = "A10";   

   PriceStudy = true;   

   AddInput("Input", Inputs.Candle);   

 AddSeries("A", DrawAs.Line, Color.Red);   
 //AddSeries("SM", DrawAs.Line, Color.Green);   
 //AddSeries("S", DrawAs.Line, Color.Gray);

 AddParameter("Period", 20);   

 AddVariable("Z", 0);   
}

function Evaluate()
{


if (BarTime() == AsTime(10, 00, 00))
A = Input.Open[0];

if (BarTime() == AsTime(11, 00, 00))
A = Input.Open[0];

if (BarTime() == AsTime(12, 00, 00))
A = Input.Open[0];

if (BarTime() == AsTime(13, 00, 00))
A = Input.Open[0];

if (BarTime() == AsTime(14, 05, 00))
A = Input.Open[0];

if (BarTime() == AsTime(15, 00, 00))
A = Input.Open[0];

if (BarTime() == AsTime(16, 00, 00))
A = Input.Open[0];

if (BarTime() == AsTime(17, 00, 00))
A = Input.Open[0];
   
if (BarTime() == AsTime(18, 00, 00))
A = Input.Open[0];

if (BarTime() == AsTime(19, 05, 00))
A = Input.Open[0];

if (BarTime() == AsTime(20, 00, 00))
A = Input.Open[0];

if (BarTime() == AsTime(21, 00, 00))
A = Input.Open[0];

if (BarTime() == AsTime(22, 00, 00))
A = Input.Open[0];

if (BarTime() == AsTime(23, 00, 00))
A = Input.Open[0];

if (BarTime() == AsTime(24, 00, 00))
A = Input.Open[0];


}

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

Re: Можете помочь ? прикрутить скользящую к этому индикатору (чтоб усреднял этот индикатор ).Спасибо

Непрочитанное сообщение evge » 27 авг 2016, 12:44

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

naum
Сообщения: 22
Зарегистрирован: 17 мар 2016, 08:59

Re: Можете помочь ? прикрутить скользящую к этому индикатору (чтоб усреднял этот индикатор ).Спасибо

Непрочитанное сообщение naum » 27 авг 2016, 13:20

Спасибо .Но я к этому бы мог другие индикаторы прикрутить в будущем .А в этом я не чего не пойму .

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

Re: Можете помочь ? прикрутить скользящую к этому индикатору (чтоб усреднял этот индикатор ).Спасибо

Непрочитанное сообщение evge » 27 авг 2016, 15:46

Хорошо. Добавленный мною код выделил в //+evge //-evge

так же в добавление параметра "Period" добавлен третий параметр для подчитки истории

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

function Initialize()
{
IndicatorName = "A10MA";   
PriceStudy = true;   
AddInput("Input", Inputs.Candle);   

 AddSeries("A", DrawAs.Line, Color.Red);   
 //AddSeries("SM", DrawAs.Line, Color.Green);   
 //AddSeries("S", DrawAs.Line, Color.Gray);

 AddParameter("Period", 20, 30);   
 AddVariable("Z", 0); 

//+evge
AddSeries("B", DrawAs.Line, Color.Blue);
AddGlobalVariable("s", Types.DoubleList);
AddGlobalVariable("count", Types.Int, 0);
//-evge
 
}

function Evaluate()
{


if (BarTime() == AsTime(10, 00, 00))
A = Input.Open[0];

if (BarTime() == AsTime(11, 00, 00))
A = Input.Open[0];

if (BarTime() == AsTime(12, 00, 00))
A = Input.Open[0];

if (BarTime() == AsTime(13, 00, 00))
A = Input.Open[0];

if (BarTime() == AsTime(14, 05, 00))
A = Input.Open[0];

if (BarTime() == AsTime(15, 00, 00))
A = Input.Open[0];

if (BarTime() == AsTime(16, 00, 00))
A = Input.Open[0];

if (BarTime() == AsTime(17, 00, 00))
A = Input.Open[0];
   
if (BarTime() == AsTime(18, 00, 00))
A = Input.Open[0];

if (BarTime() == AsTime(19, 05, 00))
A = Input.Open[0];

if (BarTime() == AsTime(20, 00, 00))
A = Input.Open[0];

if (BarTime() == AsTime(21, 00, 00))
A = Input.Open[0];

if (BarTime() == AsTime(22, 00, 00))
A = Input.Open[0];

if (BarTime() == AsTime(23, 00, 00))
A = Input.Open[0];

if (BarTime() == AsTime(24, 00, 00))
A = Input.Open[0];

//+evge
if (A != 0)
{
s.Add(A);
count++;
if ( count > Period )
s.RemoveAt(0);
B = s.Average(x => x);
}
//-evge

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

naum
Сообщения: 22
Зарегистрирован: 17 мар 2016, 08:59

Re: Можете помочь ? прикрутить скользящую к этому индикатору (чтоб усреднял этот индикатор ).Спасибо

Непрочитанное сообщение naum » 27 авг 2016, 15:54

спасибо .а как добавить можно другой индикатор на пример WMA ?если не затруднит можете показать ?

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

Re: Можете помочь ? прикрутить скользящую к этому индикатору (чтоб усреднял этот индикатор ).Спасибо

Непрочитанное сообщение evge » 27 авг 2016, 16:57

Вообще проблемы не будет если Вы сделаете в третьем индикаторе вызов индикатора от индикатора.

например так:

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

var PeriodWMA = 20;
var Ser = MY.A10(Input, 10);
A = WMA(Ser, PeriodWMA);


на выходе имеем ряд A значение, которого можно выводить в вашем третьем индикаторе вызывающем индикатор от индикатора.

есть только условие!
A10 - должен выводить только 1 ряд.
Для индикаторов с множественными рядами на выходе, как помню (или может уже есть, но я не в курсе), нет возможности пока выводить их ряды на вход другого индикатора в коде.

Почитайте инструкцию с сайта АД "Скрипты индикаторов и стратегий" там многие вопросы озвучены, в том числе и вызов индикатора от индикатора.
никогда такого не было и вот опять

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

Re: Можете помочь ? прикрутить скользящую к этому индикатору (чтоб усреднял этот индикатор ).Спасибо

Непрочитанное сообщение evge » 27 авг 2016, 17:06

Ваш код в индикаторе А10 можно упростить намного, если бы конечно не 14:05 и 19:05, если так задумано конечно то не подойдёт.

Вот замена всех условий которые Вы описали выше на одно условие в индикаторе

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

if (BarTime().Hours != BarTime(1).Hours)
A = Input.Open[0];


Тут проверяется текущий бар и предыдущий, если их "час" не совпадает значит это первый бар следующего часа!
и мы просто его выводим в серию A индикатора.

Этот код отработает даже если будут паузы торгов, в отличие от вашего кода, т.к. он не отработает если будут задержки какие-то например на 10 минут остановка торгов перед началом сессии и другие возможные паузы на первой минуте часов.

в итоге Ваш индикатор упростится до:

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

function Initialize()
{
IndicatorName = "A10MA";   
PriceStudy = true;   
AddInput("Input", Inputs.Candle);   
AddSeries("A", DrawAs.Line, Color.Red);   
AddParameter("Period", 20, 30);   

AddSeries("B", DrawAs.Line, Color.Blue);
AddGlobalVariable("s", Types.DoubleList);
AddGlobalVariable("count", Types.Int, 0);
}

function Evaluate()
{

if (BarTime().Hours != BarTime(1).Hours)
A = Input.Open[0];

if (A != 0)
{
s.Add(A);
count++;
if ( count > Period )
s.RemoveAt(0);
B = s.Average(x => x);
}

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

naum
Сообщения: 22
Зарегистрирован: 17 мар 2016, 08:59

Re: Можете помочь ? прикрутить скользящую к этому индикатору (чтоб усреднял этот индикатор ).Спасибо

Непрочитанное сообщение naum » 27 авг 2016, 17:34

Можно вас попросить написать такой же SMAhour только WMA .

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

Re: Можете помочь ? прикрутить скользящую к этому индикатору (чтоб усреднял этот индикатор ).Спасибо

Непрочитанное сообщение evge » 27 авг 2016, 19:52

naum писал(а):Можно вас попросить написать такой же SMAhour только WMA .


Ниже код, в котором я заменил Ваши условия по каждому часу на одно условие для всех часов

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

if (BarTime().Hours != BarTime(1).Hours) A = Input.Open[0];


если Вам требуется ваш код, эту строку удалите и замените своими прежними условиями по каждому часу

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

function Initialize()
{
IndicatorName = "A10WMA";   
PriceStudy = true;   
AddInput("Input", Inputs.Candle);   
AddSeries("A", DrawAs.Line, Color.Red);   

AddParameter("Period", 20, 30);   

AddSeries("B", DrawAs.Line, Color.Green);
AddGlobalVariable("s", Types.DoubleList);
AddGlobalVariable("count", Types.Int, 0);
}

function Evaluate()
{

if (BarTime().Hours != BarTime(1).Hours) A = Input.Open[0];

if (A != 0)
{
s.Add(A);
count++;
if ( count > Period )
{
   s.RemoveAt(0);
   var cWMA = 0.0;
   var cZn = 0.0;
   for (var i = 0; i < Period; i++ )
   {     
      cWMA = cWMA + s[Period - i - 1] * (Period - i);
      cZn = cZn + (i + 1);
   }
   B = cWMA / cZn;
}
else
B = A;   

} //A != 0

}


A10WMA-02.png
Пример работы MA и WMA
A10WMA-02.png (42.8 КБ) 21198 просмотров


A10WMA-01.png
Пример работы MA и WMA
A10WMA-01.png (37.58 КБ) 21200 просмотров
никогда такого не было и вот опять



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

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

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