Общие вопросы по разработке > Отображение сделок на графике

Общие вопросы по разработке в Альфа-Директ 4. Обсуждение разработки пользовательских индикаторов, стратегий.
Владимир Валерьевич
Сообщения: 36
Зарегистрирован: 27 мар 2016, 22:16
Благодарил (а): 9 раз

Отображение сделок на графике

Непрочитанное сообщение Владимир Валерьевич » 23 ноя 2017, 21:50

Поскольку собственного умения в программировании нет, обращаюсь за помощью к способным.
АД на графике отображает только неурегулированные сделки, а хочется увидеть все, ну или хотябы несколько последних, в идеале на всех видимых барах.
Идея написать в виде индикатора отображение сделок.
сделки хранятся в файле тикер.txt (NVTK.txt) в таком виде: Кол-во цена дата направление:

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

100   13.02   06.10.2017 10:00   К
100   12.8   10.11.2017 11:24   К
100   13.185   13.11.2017 11:15   П
100   11.775   22.11.2017 10:04   К

в индикаторе считывается тикер, по нему определяется файл с данными.
по дате определяется бар,
цена есть,
по направлению определяется символ, например К-стрелочка вверх, П-вниз
Визуально будет выглядеть как-то так:
111.jpg
111.jpg (68.49 КБ) 7928 просмотров

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

Re: Отображение сделок на графике

Непрочитанное сообщение evge » 24 ноя 2017, 10:03

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

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

Re: Отображение сделок на графике

Непрочитанное сообщение evge » 24 ноя 2017, 10:08

В папке X:\Program Files (x86)\Alfa-Direct Pro\

создайте папку Trades

в данной папке создавайте файл ТИКЕР.txt, где ТИКЕР - тикер инструмента, как есть с учетом регистра.

формат каждой строки вида

200 225,1 21.11.2017 10:00:00 B

разделитель пробел

Значения:

1 - Количество (пока не используется)
2 - Цена (разделитель дробной части запятая!)
3 - Дата формата ДД.ММ.ГГГГ. Дополненные 0, т.е. 09.11.2017 - правильно, 9.11.2017 - неправильно
4 - Время формата ЧЧ.ММ.СС (часы:минуты:секунда) дополненные 0, т.е. 00:05:01 - правильно 0:5:1 - неправильно
5 - Тип сделки B - Buy (покупка), S - Sell (продажа)

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

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

AddSeries("Buy", DrawAs.Custom, Color.Green);   
AddSeries("Sell", DrawAs.Custom, Color.Red);   

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

function Evaluate()
{

// evge 24.11.2017 http://alfadirect4.ru

// Считываем данные из файла X:\Program Files (x86)\Alfa-Direct Pro\Trades\ТИКЕР ИНСТРУМЕНТА.txt
// формат строк которого "1000 225 23.11.2017 11:00:00 B", разделитель пробел, данные: кол-во, цена, дата, вермя, тип (B - покупка, S - продажа)
if (C.Count == 0)
{
   string Path = @"Trades\\";
   System.IO.DirectoryInfo dirInfo = new System.IO.DirectoryInfo(Path);
   if (!dirInfo.Exists) dirInfo.Create();
   
   var Ticker = I.VirtualSecurity.Split('=')[0];
   string FileName = Ticker + ".txt";
   
   var URL = Path + FileName;
   
   string S = "";
   if (System.IO.File.Exists(URL))
   {
   System.IO.StreamReader output = new System.IO.StreamReader(URL);
   while (!output.EndOfStream)
   {   
      S = output.ReadLine();
   
      string[] Data = S.Split(' ');
      
      if (Data.Count() >= 5)
      {
         C.Add(double.Parse(Data[0]));
         Price.Add(double.Parse(Data[1]));
         //Data[2] + " " + Data[3];
         var D = DateTime.ParseExact(Data[2] + " " + Data[3], "dd.MM.yyyy HH:mm:ss", null);
         DT.Add(D.ToBinary());
         if (Data[4] == "S")
            Type.Add(-1);
         if (Data[4] == "B")
            Type.Add(1);
      }
   }
   output.Close();
   }
} // 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];
      if (Type[x] < 0) Sell[0] = Price[x];
   }
   if (BarDate(0) == d && t == BarTime(0))
   {
      if (Type[x] > 0) Buy[0] = Price[x];
      if (Type[x] < 0) Sell[0] = Price[x];
   }
   if (BarDate(0) == d && t >= BarTime(1) && t < BarTime(0))
   {
      if (Type[x] > 0) Buy[1] = Price[x];
      if (Type[x] < 0) Sell[1] = Price[x];
   }
}

Buy.DrawArrowUp();
Sell.DrawArrowDown();

}


Скачать код индикатора

Trades.rar
(1.23 КБ) 342 скачивания
никогда такого не было и вот опять

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

Re: Отображение сделок на графике

Непрочитанное сообщение evge » 24 ноя 2017, 10:15

Возможно, отображение местами будет некорректно между таймфреймами например сделки дня на недельном графике и т.п., это уже дело техники, просто чуть доработать.

Сделал несколько проверок, которые отображают внутри дня корректно (надеюсь) и на дневном графике сделки внутри дня.
никогда такого не было и вот опять

Владимир Валерьевич
Сообщения: 36
Зарегистрирован: 27 мар 2016, 22:16
Благодарил (а): 9 раз

Re: Отображение сделок на графике

Непрочитанное сообщение Владимир Валерьевич » 27 ноя 2017, 13:32

Огромное спасибо!!!

Владимир Валерьевич
Сообщения: 36
Зарегистрирован: 27 мар 2016, 22:16
Благодарил (а): 9 раз

Re: Отображение сделок на графике

Непрочитанное сообщение Владимир Валерьевич » 27 ноя 2017, 15:29

Если, на одном баре было несколько одинаковых сделок, то отобразится только одна. Я так понимаю это правиться созданием еще одной серии, но для меня это не критично.
Поправил код под формат выгружаемый из EXCEL'я в txt.

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

string[] Data = S.Split('\t');
if (Data.Count() >= 4)
      {
         C.Add(double.Parse(Data[0]));
         Price.Add(double.Parse(Data[1].Replace(".", ","))); //разделитель разрядов .
         //Price.Add(Convert.ToDouble(Data[1]));   //разделитель разрядов ,

      if (Data[3] == "S")
            Type.Add(-1);
         if (Data[3] == "B")
            Type.Add(1);

         string[] bardt=Data[2].Split(' ');
         var D = DateTime.ParseExact(bardt[0] + " " + bardt[1], "dd.MM.yyyy HH:mm:ss", null);
         DT.Add(D.ToBinary());
      }


а вот латиницу для К/П победить не смог
Евгений, еще раз спасибо!!!!

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

Re: Отображение сделок на графике

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

Да, сделки внутри бара надо как то суммировать и выводить либо среднюю либо несколько серий заводить что бы отобразить их все по своим ценам. Есть у меня наборски, но так до ума и не довёл где я и кол-во по сделкам суммирую и вывожу их в отдельную область. Есть там ошибки в отображении на ТФ (например 12 часовой).

Подумаю может попозже что на ум придёт и по другому суммирую все сделки внутри 1 бара.

С кирилицей сразу не стал возится сознательно, кодировка файла может быть разная CP1251, UTF8.

Могу конечно попробовать.

Какая кодировка в вашем файле ?

А так в целом этот код индикатора был как пример того как прочитать данные из файла и вывести их на график, этот набросок конечно надо ещё до ума доводить :)
никогда такого не было и вот опять


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

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

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