Общие вопросы по разработке > Как суммировать показания за день?

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

Re: Как суммировать показания за день?

Непрочитанное сообщение evge » 20 окт 2017, 14:40

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

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

AddGlobalVariable("LX", Types.Int, 0);
AddGlobalVariable("HX", Types.Int, 0);

замените на

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

AddGlobalVariable("LX", Types.Long, 0);
AddGlobalVariable("HX", Types.Long, 0);
никогда такого не было и вот опять

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

Re: Как суммировать показания за день?

Непрочитанное сообщение Den » 20 окт 2017, 14:49

Параметр P там вообще можно убрать, я его просто забыл удалить он не нужен

да так все скомпилировалось.

Но он S показывает = 0
Вложения
25.png
25.png (6.63 КБ) 20146 просмотров
Последний раз редактировалось Den 20 окт 2017, 14:52, всего редактировалось 1 раз.

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

Re: Как суммировать показания за день?

Непрочитанное сообщение evge » 20 окт 2017, 14:51

ну значит не так он работает, как работал ваш код?
не смотрели значит, когда написали

Den писал(а):Проверил
Да, ваш упрощенный код идентичен моему сельскому "мегакоду"
никогда такого не было и вот опять

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

Re: Как суммировать показания за день?

Непрочитанное сообщение evge » 20 окт 2017, 14:53

объясните тогда как вы смотрели, если ваш индикатор 1, код которого вы дали, имеет параметр на вход!!!

его надо передавать, вызывая 1 из индикатора A-DOWN_VIII,

НО вы дали код где параметра нет. И вызов идёт другого индикатора под именем "индикатор".

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

var lastLVal = MY.индикатор(Input).GetLastValues ("L", 1)[0];
var lastHVal = MY.индикатор(Input).GetLastValues ("H", 1)[0];


т.е. индикатор (кстати имя другое не "1") вызывается с передачей только ряда Input и всё, параметра через запятую не передано никакого!

где параметр?

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

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

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

Re: Как суммировать показания за день?

Непрочитанное сообщение Den » 20 окт 2017, 14:54

нет, я проверил ваш упрощенный работает точно так же как мой длинный

щас еще раз проверю

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

Re: Как суммировать показания за день?

Непрочитанное сообщение evge » 20 окт 2017, 14:55

Den писал(а):нет, я проверил ваш упрощенный работает точно так же как мой длинный


ок, тогда дайте код "индикатора", где нет параметра :)

ранее вы дали код другого индикатора под именем "1", в который надо передавать параметр.
никогда такого не было и вот опять

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

Re: Как суммировать показания за день?

Непрочитанное сообщение Den » 20 окт 2017, 15:12

индикатор

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

function Initialize()
{
IndicatorName = "Summa";
AddInput("Input1", Inputs.Candle);      
PriceStudy = true;   
AddSeries("H", DrawAs.Custom, Color.Coral);   
AddSeries("L", DrawAs.Custom, Color.LightGreen);   

AddGlobalVariable("CountUp", Types.Int, 0);
AddGlobalVariable("CountDn", Types.Int, 0);

AddGlobalVariable("HH", Types.Double, 0.0);
AddGlobalVariable("LL", Types.Double, 100000000.0);

}

function Evaluate() {

if (CurrentIndex > 2)
{

if ( Input1.Close[0] < Input1.Close[1] && Input1.Close[1] >= Input1.Close[2] )
{
     if ( Input1.Close[1] > HH )
     {
          CountUp++;
          HH = Input1.Close[1];

          if ( CountUp >= 1 )
          {   
               H[-1] = HH;
               CountDn = 0;
               LL = 1000000000.0;
           }
     }
           
}     

if ( Input1.Close[0] > Input1.Close[1] && Input1.Close[1] <= Input1.Close[2] )
{
     if ( Input1.Close[1] < LL )
     {
          CountDn++;
          LL = Input1.Close[1];

          if ( CountDn >= 1 )
          {   
               L[-1] = LL;
               CountUp = 0;
               HH = 0.0;
          }
      }

       
}     

               H.DrawArrowDown(Color.HotPink, LineStyles.Solid, 4, Color.HotPink, 10);
               L.DrawArrowUp(Color.Cyan, LineStyles.Solid, 4, Color.Cyan, 10);





}
}





сумма

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

function Initialize()
{
IndicatorName = "A-DOWN_XV";
AddInput("Input", Inputs.Candle);
AddShadowSeries("D", DrawAs.Custom, Color.Lime);
AddShadowSeries("U", DrawAs.Custom, Color.Violet);
AddShadowSeries("S", DrawAs.Custom, Color.Red);

AddGlobalVariable("Sum", Types.Double, 0);
AddGlobalVariable("LX", Types.Long, 0);
AddGlobalVariable("HX", Types.Long, 0);
PriceStudy = true;
AddParameter("P", 2, 1);
}

function Evaluate()
{

if (BarDate(0) != BarDate(1)) Sum = 0;

var lastLVal = MY.Summa(Input).GetLastValues ("L", 1)[0];
var lastHVal = MY.Summa(Input).GetLastValues ("H", 1)[0];

if ( lastHVal.X > lastLVal.X )
D = lastHVal.Y - lastLVal.Y;
else
U = lastHVal.Y - lastLVal.Y;

if (HX != lastHVal.X || LX != lastLVal.X)
{
   HX = lastHVal.X;
   LX = lastLVal.X;
   Sum += lastHVal.Y - lastLVal.Y;
}

S = Sum;

D.DrawHistogram(Input.Open, Color.Blue, Line.Solid, 1, Color.Blue, 3);
U.DrawHistogram(Input.Open, Color.Blue, Line.Solid, 1, Color.Blue, 3);
S.DrawHistogram();

}




его подсчёт
Вложения
25.png
25.png (8.49 КБ) 20125 просмотров

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

Re: Как суммировать показания за день?

Непрочитанное сообщение evge » 20 окт 2017, 16:13

вообщем нельзя использовать метод GetLastValues, т.к. некорректно работает в АД4.

Он возвращает последние значения не от текущей точки расчета, а вообще последние значения за всю историю. Поэтому в любой точке истории он перерисовывает индикатор текущими значениями.

Данный метод логически должен бы возвращать не все последние значения (даже будущего, как сейчас), а только начиная от текущей точки расчета и назад в историю.

Вообщем это проблемный метод, использовать его не советую :)

Поэтому такое странное поведение получаем в индикаторе.

Вот код работающий. Можно сделать лучше было, но не было у меня времени. Чуть-чуть можно будет потом улучшить, перенеся в глоб. переменные Lx, Hx, Ly, Hy и поиск их сделать по другому в процессе обхода, а не поиск в истории. Будет и быстрее даже. Хотя и так нормально.

но пока так, вот примеры работы:

down-01.png
down-01.png (35.83 КБ) 20112 просмотров

down-02.png
down-02.png (37.62 КБ) 20106 просмотров


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

function Initialize()
{
IndicatorName = "A-DOWN_VIII";
AddInput("Input", Inputs.Candle);
AddSeries("D", DrawAs.Custom, Color.Green);
AddSeries("U", DrawAs.Custom, Color.Red);
AddShadowSeries("S", DrawAs.Custom, Color.Blue);

AddGlobalVariable("Sum", Types.Double, 0);
AddGlobalVariable("LX", Types.Long, 0);
AddGlobalVariable("HX", Types.Long, 0);

PriceStudy = false;
AddParameter("P", 2000, 1);
}

function Evaluate()
{

if (BarDate(0) != BarDate(1)) Sum = 0;

var I = MY.индикатор(Input);
var Lx = 0;
var Hx = 0;
var Ly = 0.0;
var Hy = 0.0;

for (var x = 0; x < 999; x++)
{
   if (I["L"][x] > 0) { Lx = x; Ly = I["L"][x]; }
   if (I["H"][x] > 0) { Hx = x; Hy = I["H"][x]; }
   if (Lx != 0 && Hx != 0) break;
}

if (Lx == 0 && Hx == 0 ) return;

if ( Lx > Hx )
   D[1] = Hy - Ly;
else
   U[1] = Hy - Ly;

if (HX != Hx || LX != Lx)
{
   HX = Hx;
   LX = Lx;
   Sum += Hy - Ly;
}

S[0] = Sum;

D.DrawHistogram(Color.Red, Line.Solid, 1, Color.Red, 50);
U.DrawHistogram(Color.Green, Line.Solid, 1, Color.Green, 50);
S.DrawHistogram();

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

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

Re: Как суммировать показания за день?

Непрочитанное сообщение evge » 20 окт 2017, 16:27

Ещё "ошибка" всплыла с отображением серий в АД4, но это уже к индикатору не относится.

Если первой создать серию обычную (не Shadow), то отображаться и все последующие будут как обычные серии, например в отдельном окне, даже если заданы как Shadow.

Если же первой будет создана серия Shadow, тогда и все остальные будут в области цены как Shadow.

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

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

Re: Как суммировать показания за день?

Непрочитанное сообщение Den » 20 окт 2017, 16:50

я поставил Shadow

Блин, жестокий индикатор, у меня АД увеличил память в два раза с 600МБ до 1.2ГБ :)

Он показывает теперь одну сумму, но опять - же сумма выходит больше, чем на самом деле.

На Н1 явно не 680 пунктов сегодня на сишке.

В любом случае, Евгений большое спасибо за вашу помощь !

так все-таки как ему задать условие, при котором если число баров после сигнала > 1 , то Break до следующего сигнала? Как это можно прописать кодом?
Последний раз редактировалось Den 20 окт 2017, 16:59, всего редактировалось 2 раза.


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

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

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