Общие вопросы по разработке > ЛЧИ 2018 - как лог сделок вынести на график?

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

Re: ЛЧИ 2018 - как лог сделок вынести на график?

Непрочитанное сообщение evge » 22 окт 2018, 15:32

Исправил небольшую ошибку в строке

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

(BarDate(0) > BarDate(1) && t > BarTime(1) && t < BarTime(0))


заменил на

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

(BarDate(1) == d && BarDate(0) > BarDate(1) && t > BarTime(1) && t > BarTime(0))


демонстрация ошибки на примере mifprofit
Nom = 1
User = 182704
Инструмент: OGKB

не выводилась сделка 19.10.2018 в 18:50.

В АД4 последний бар 18:39, следующий бар это 22.10.2018 в 10:00.
Указанное выше исправление выводит сделку на баре 18:39.

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

m4Dmitry
Сообщения: 72
Зарегистрирован: 21 май 2018, 22:04
Благодарил (а): 60 раз
Поблагодарили: 3 раза

Re: ЛЧИ 2019 - как лог сделок вынести на график?

Непрочитанное сообщение m4Dmitry » 23 сен 2019, 13:20

А ЛЧИ 2019 будет работать по этому коду? Или нужно адаптировать?

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

Re: ЛЧИ 2019 - как лог сделок вынести на график?

Непрочитанное сообщение evge » 23 сен 2019, 13:35

Если ничего не изменили в формате файлов, то будет. Если какие-то незначительные изменения, поправим :)
никогда такого не было и вот опять

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

Re: ЛЧИ 2019 - как лог сделок вынести на график?

Непрочитанное сообщение evge » 23 сен 2019, 13:55

ftp://ftp.moex.com/pub/info/stats_contest/2019/all/ - есть, поэтому:

Подредактировал скрипт php, можно будет передавать год, если не передан, то 2018 (чтобы работал прошлый год).
Изменил в связи с этим последний индикатор, где добавил параметр Year и внес изменения в код:

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

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

AddSeries("CountBuy", DrawAs.Custom, Color.Green, AxisType.ZeroBased, true, Axes.New);
AddSeries("CountSell", DrawAs.Custom, Color.Red, AxisType.ZeroBased, true, Axes.New);
AddSeries("Buy", DrawAs.Custom, Color.Green);   
AddSeries("Sell", DrawAs.Custom, Color.Red);   

//Номинация
//1   Лучший частный инвестор на фондовом рынке
//2   Лучший частный инвестор на срочном рынке
//3   Лучший частный инвестор на валютном рынке
AddParameter("Nom", 2);
//Уникальный идентификатор пользователя
//см. ссылку на странице статистики пользователя ?user=XXXXXX, где XXXXXX - уникальный идентификатор
AddParameter("User", 0);
//год проведения конкурса
AddParameter("Year", 2019);

AddGlobalVariable("C", Types.DoubleList); // кол-во
AddGlobalVariable("Price", Types.DoubleList); // цена
AddGlobalVariable("DT", Types.DoubleList); // дата и время
AddGlobalVariable("Type", Types.IntList); // тип

AddGlobalVariable("NeedRead", Types.Boolean, true); // необходимость чтения данных
}

function Evaluate()
{

// evge 05.10.2018 http://alfadirect4.ru
// evge 23.09.2019 добавлен новый параметр Year - год проведения конкурса ЛЧИ

// Считываем параметры сделок из файла File (1 раз) в списки DoubleList
// ФОРМАТ .csv файла: Дата время (ГГГГ-ММ-ДД HH:MM:SS.000);Тикер;Кол-во;Цена
if (C.Count == 0 && NeedRead && User != 0)
{
   // Генерируем csv
   // В alfadirect4.ru/investor/X_USER.csv из ftp://ftp.moex.com/pub/info/stats_contest/2018/all/X_USER.zip
   System.Net.WebClient wc = new System.Net.WebClient();
   wc.Encoding = System.Text.Encoding.UTF8;
   string result = wc.DownloadString("https://alfadirect4.ru/investor.php?user=" + Convert.ToString(User) + "&year=" + Convert.ToString(Year));
     
   // читаем
   System.Net.WebRequest req = System.Net.WebRequest.Create("https://alfadirect4.ru/investor/" + (Year != 2018 ? Convert.ToString(Year) + "/" : "") + Convert.ToString(Nom) + "_" + Convert.ToString(User) + ".csv");   
   System.Net.WebResponse resp = req.GetResponse();
   System.IO.Stream stream = resp.GetResponseStream();
   System.IO.StreamReader sr = new System.IO.StreamReader(stream);   
           
   var Ticker = I.VirtualSecurity.Split('=')[0];
   string S = "";
   
   while ((S = sr.ReadLine()) != null)
   {   
      string[] Data = S.Split(';');
      if (Ticker != Data[1].Trim()) continue;         
      if (Data.Count() >= 4)
      {         
         var count = double.Parse(Data[2]);
         C.Add(count);
         Price.Add(double.Parse(Data[3].Replace(".",",")));
         var D = DateTime.ParseExact(Data[0].Substring(0, 19), "yyyy-MM-dd HH:mm:ss", null);
         DT.Add(D.ToBinary());
         if (count < 0)
            Type.Add(-1);
         if (count > 0)
            Type.Add(1);
      }
   }
   
NeedRead = false;
} // C == 0

for (var x = 0; x < C.Count; x++)
{   
   long b = Convert.ToInt64(DT[x]);
   DateTime d = DateTime.FromBinary(b).Date;
   TimeSpan t =  DateTime.FromBinary(b).TimeOfDay;   
   if (BarDate(0) == d && BarDate(1) != d && BarTime(0) == AsTime(0,0,0) && BarTime(1) == AsTime(0,0,0))
   {
      if (Type[x] > 0) { Buy[0] = Price[x]; CountBuy[0] += C[x]; }
      if (Type[x] < 0) { Sell[0] = Price[x]; CountSell[0] += C[x]; }
   } else
   if (BarDate(0) == d && t == BarTime(0))
   {
      if (Type[x] > 0) { Buy[0] = Price[x]; CountBuy[0] += C[x]; }
      if (Type[x] < 0) { Sell[0] = Price[x]; CountSell[0] += C[x]; }
   } else
   if (
      (BarDate(0) == d && t > BarTime(1) && t < BarTime(0))
         ||
      (BarDate(1) == d && BarDate(0) > BarDate(1) && t > BarTime(1) && t > BarTime(0))
      )
   {
      if (Type[x] > 0) { Buy[1] = Price[x]; CountBuy[1] += C[x]; }
      if (Type[x] < 0) { Sell[1] = Price[x]; CountSell[1] += C[x]; }
   }
}

Buy.DrawArrowUp();
Sell.DrawArrowDown();
CountBuy.DrawHistogram();
CountSell.DrawHistogram();

}


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

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

Re: ЛЧИ 2019 - как лог сделок вынести на график?

Непрочитанное сообщение evge » 23 сен 2019, 14:25

внес коррективы выше и проверил, работает:

investor-2019-01.png
Trades: Nom = 2, User = 210866, Year = 2019
investor-2019-01.png (32.39 КБ) 34154 просмотра
никогда такого не было и вот опять

m4Dmitry
Сообщения: 72
Зарегистрирован: 21 май 2018, 22:04
Благодарил (а): 60 раз
Поблагодарили: 3 раза

Re: ЛЧИ 2019 - как лог сделок вынести на график?

Непрочитанное сообщение m4Dmitry » 23 сен 2019, 14:38

да, работает. Спасибо!

m4Dmitry
Сообщения: 72
Зарегистрирован: 21 май 2018, 22:04
Благодарил (а): 60 раз
Поблагодарили: 3 раза

Re: ЛЧИ 2019 - как лог сделок вынести на график?

Непрочитанное сообщение m4Dmitry » 12 янв 2020, 12:26

Хотел посмотреть графики для "валютного рынка", не работают...

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

Re: ЛЧИ 2019 - как лог сделок вынести на график?

Непрочитанное сообщение evge » 13 янв 2020, 14:32

По валюте тикер в csv не совпадает с АД4.

investor-usd-01.png
investor-usd-01.png (9.62 КБ) 32999 просмотров


Необходимо код индикатора доработать, чтобы разбирать эти тикеры.

Попозже займусь этим.

А так всё в этой строчке кода:

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

if (Ticker != Data[1].Trim()) continue;


здесь условие не отрабатывает

ещё нужно будет учесть рынок, сейчас он откидывается из проверки:

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

var Ticker = I.VirtualSecurity.Split('=')[0];


т.к. тикер может быть "USD = BP TOM", "USD = BP TOD", а сейчас это будет в обоих случаях USD.

Поправлю позже.
никогда такого не было и вот опять

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

Re: ЛЧИ 2019 - как лог сделок вынести на график?

Непрочитанное сообщение evge » 14 янв 2020, 06:30

Скрипт модифицировал, сделки по валюте теперь показывает.

Trades-BP-01.png
BP TOM
Trades-BP-01.png (29.91 КБ) 32938 просмотров

Trades-BP-TOD-01.png
BP TOD
Trades-BP-TOD-01.png (27.91 КБ) 32931 просмотр

Trades-FORTS-01.png
На всякий случай проверил работу с ФОРТС
Trades-FORTS-01.png (32.01 КБ) 32938 просмотров

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

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

AddSeries("CountBuy", DrawAs.Custom, Color.Green, AxisType.ZeroBased, true, Axes.New);
AddSeries("CountSell", DrawAs.Custom, Color.Red, AxisType.ZeroBased, true, Axes.New);
AddSeries("Buy", DrawAs.Custom, Color.Green);   
AddSeries("Sell", DrawAs.Custom, Color.Red);   

//Номинация
//1   Лучший частный инвестор на фондовом рынке
//2   Лучший частный инвестор на срочном рынке
//3   Лучший частный инвестор на валютном рынке
AddParameter("Nom", 2);
//Уникальный идентификатор пользователя
//см. ссылку на странице статистики пользователя ?user=XXXXXX, где XXXXXX - уникальный идентификатор
AddParameter("User", 0);
//год проведения конкурса
AddParameter("Year", 2019);

AddGlobalVariable("C", Types.DoubleList); // кол-во
AddGlobalVariable("Price", Types.DoubleList); // цена
AddGlobalVariable("DT", Types.DoubleList); // дата и время
AddGlobalVariable("Type", Types.IntList); // тип

AddGlobalVariable("NeedRead", Types.Boolean, true); // необходимость чтения данных
}

function Evaluate()
{

// evge 05.10.2018 http://alfadirect4.ru
// evge 23.09.2019 добавлен новый параметр Year - год проведения конкурса ЛЧИ
// evge 14.01.2020 добавлено отображение сделок на валютном рынке.

// Считываем параметры сделок из файла File (1 раз) в списки DoubleList
// ФОРМАТ .csv файла: Дата время (ГГГГ-ММ-ДД HH:MM:SS.000);Тикер;Кол-во;Цена
if (C.Count == 0 && NeedRead && User != 0)
{
   // Генерируем csv
   // В alfadirect4.ru/investor/X_USER.csv из ftp://ftp.moex.com/pub/info/stats_contest/2018/all/X_USER.zip
   System.Net.WebClient wc = new System.Net.WebClient();
   wc.Encoding = System.Text.Encoding.UTF8;
   string result = wc.DownloadString("https://alfadirect4.ru/investor.php?user=" + Convert.ToString(User) + "&year=" + Convert.ToString(Year));
     
   // читаем
   System.Net.WebRequest req = System.Net.WebRequest.Create("https://alfadirect4.ru/investor/" + (Year != 2018 ? Convert.ToString(Year) + "/" : "") + Convert.ToString(Nom) + "_" + Convert.ToString(User) + ".csv");   
   System.Net.WebResponse resp = req.GetResponse();
   System.IO.Stream stream = resp.GetResponseStream();
   System.IO.StreamReader sr = new System.IO.StreamReader(stream);   
           
   string[] VS = I.VirtualSecurity.Split('=');
   string Ticker = VS.Count() > 0 ? VS[0] : "";
   string Market = VS.Count() > 1 ? VS[1] : "";
   string mM = Market.Substring(Market.Length-3);
   string S = "";
   
   while ((S = sr.ReadLine()) != null)
   {   
      string[] Data = S.Split(';');
      string TickerData = Data[1].Trim();
      string dT = TickerData.Substring(0, 3);
      string dM = TickerData.Substring(TickerData.Length-3);
      if (Ticker == TickerData || (dT == Ticker && dM == mM ))
      if (Data.Count() >= 4)
      {         
         var count = double.Parse(Data[2]);
         C.Add(count);
         Price.Add(double.Parse(Data[3].Replace(".",",")));
         var D = DateTime.ParseExact(Data[0].Substring(0, 19), "yyyy-MM-dd HH:mm:ss", null);
         DT.Add(D.ToBinary());
         if (count < 0)
            Type.Add(-1);
         if (count > 0)
            Type.Add(1);
      }
   }
   
NeedRead = false;
} // C == 0

for (var x = 0; x < C.Count; x++)
{   
   long b = Convert.ToInt64(DT[x]);
   DateTime d = DateTime.FromBinary(b).Date;
   TimeSpan t =  DateTime.FromBinary(b).TimeOfDay;   
   if (BarDate(0) == d && BarDate(1) != d && BarTime(0) == AsTime(0,0,0) && BarTime(1) == AsTime(0,0,0))
   {
      if (Type[x] > 0) { Buy[0] = Price[x]; CountBuy[0] += C[x]; }
      if (Type[x] < 0) { Sell[0] = Price[x]; CountSell[0] += C[x]; }
   } else
   if (BarDate(0) == d && t == BarTime(0))
   {
      if (Type[x] > 0) { Buy[0] = Price[x]; CountBuy[0] += C[x]; }
      if (Type[x] < 0) { Sell[0] = Price[x]; CountSell[0] += C[x]; }
   } else
   if (
      (BarDate(0) == d && t > BarTime(1) && t < BarTime(0))
         ||
      (BarDate(1) == d && BarDate(0) > BarDate(1) && t > BarTime(1) && t > BarTime(0))
      )
   {
      if (Type[x] > 0) { Buy[1] = Price[x]; CountBuy[1] += C[x]; }
      if (Type[x] < 0) { Sell[1] = Price[x]; CountSell[1] += C[x]; }
   }
}

Buy.DrawArrowUp();
Sell.DrawArrowDown();
CountBuy.DrawHistogram();
CountSell.DrawHistogram();

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

m4Dmitry
Сообщения: 72
Зарегистрирован: 21 май 2018, 22:04
Благодарил (а): 60 раз
Поблагодарили: 3 раза

Re: ЛЧИ 2018 - как лог сделок вынести на график?

Непрочитанное сообщение m4Dmitry » 14 янв 2020, 08:22

Очень круто, спасибо!!!


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

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

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