Перепрыгнеть в содержание


- - - - -

Помощь в написании кода на vb net по поиску на скачках



22 ответов в эту тему

#1 OFFLINE   vlad56

    Специалист


  • Участник II
  • ПипПипПип
  • 460 сообщения
27
  • МестоположениеДнепропетровск

Добавлено 10 February 2012 - 00:37

Хочу написать программу на vb net по поиску на скачках близких к горизонтальным графиков на фаворитов.А вот как это сделать? Имею очень смутные понятия. Кто нибудь может помочь хоть чем нибудь?

#2 Гость_oOo_*


  • Не Местный

Добавлено 10 February 2012 - 10:26

Тот что копировал Иерихон находится здесь там найдешь полную линию
forum.bdp.betfair.com/showthread.php?t=112

А все остальные вопросы по NET
forum.bdp.betfair.com/forumdisplay.php?f=4

Отредактировано oOo, 10 February 2012 - 10:27.


#3 OFFLINE   vlad56

    Специалист


  • Участник II
  • ПипПипПип
  • 460 сообщения
27
  • МестоположениеДнепропетровск

Добавлено 10 February 2012 - 12:01

СообщенияoOo, on 10 February 2012 - 10:26, сказал:

Тот что копировал Иерихон находится здесь там найдешь полную линию
forum.bdp.betfair.com/showthread.php?t=112

А все остальные вопросы по NET
forum.bdp.betfair.com/forumdisplay.php?f=4
Спасибо. Я это уже использовал для других целей. Но там мой вопрос не обсуждался.

#4 OFFLINE   vlad56

    Специалист


  • Участник II
  • ПипПипПип
  • 460 сообщения
27
  • МестоположениеДнепропетровск

Добавлено 10 February 2012 - 12:14

Я для себя немного план набросал. Получилось где то вот так.
Поиск линейного графика на рынках скачки Betfair.
  • Работа с Excel
  • На первой странице открываем рынок и заносим id рынка, id лошади ,коф и суммы сматченные на каждую лошадь.
  • По max сматченой сумме ищем лидера на этом рынке
  • Проверяем на второй странице есть ли такой лидер
  • Если есть то проверяем сматченую сумму
  • Если она не совпадает с новой суммой (т.е. была новая ставка) то добавляем коф новые и новую сумму сматченую
  • Если она совпадает с новой суммой то (т.е. новых ставок не было), тогда очищаем первую страницу и идем за следующим рынком.
  • Если такого лидера на второй странице нет тогда переносим лидера и его коф и сматченую сумму на новую строку с указанием id рынка, id лошади
  • В пределах указанного отклонения считаем сколько раз уже были эти значения и заносим их в ячейку по строке.
  • После прохода всех рынков скачек сортируем по убыванию вторую страницу по столбцу, где записано количество раз близких значений.
  • Получаем график по id рынка и id лошади.


#5 OFFLINE   vlad56

    Специалист


  • Участник II
  • ПипПипПип
  • 460 сообщения
27
  • МестоположениеДнепропетровск

Добавлено 10 February 2012 - 14:39

Для снижения обьема памяти потребляемого моим ботом я использую вот такой код:
Private Sub Form_Load(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Load
AddHandler Application.Idle, AddressOf FlushMemory
End Sub

Private Sub FlushMemory()
If System.Environment.OSVersion.Platform = PlatformID.Win32NT Then
SetProcessWorkingSetSize(System.Diagnostics.Process.GetCurrentProcess().Handle, -1, -1)
End If
End Sub

<DllImport("kernel32.dll")> _
Public Shared Function SetProcessWorkingSetSize(ByVal handle As IntPtr, ByVal minimumWorkingSetSize As Integer, ByVal maximumWorkingSetSize As Integer) As Boolean
End Function

При обьявлении Excel то же используется

Private Exl As Excel.Application

VS пишет ошибка

Application", импортированный из пространств имен или типов "Microsoft.Office.Interop.Excel, System.Windows.Forms", является неоднозначным.

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

Кто нибудь сможет помочь?

Отредактировано vlad56, 10 February 2012 - 14:40.


#6 Гость_buk_*


  • Не Местный

Добавлено 10 February 2012 - 16:44

Владос с пхп не пробовал подружиться? намного меньше гемороя в любом направлении

#7 OFFLINE   Jericho

    Иерихон


  • RSB
  • ПипПипПипПипПип
  • 2226 сообщения
859

Добавлено 10 February 2012 - 17:04

Сообщенияbuk, on 10 February 2012 - 16:44, сказал:

Хочу написать программу на vb net по поиску на скачках близких к горизонтальным графиков на фаворитов.А вот как это сделать? Имею очень смутные понятия. Кто нибудь может помочь хоть чем нибудь?

Всем привет!

Есть у меня такая функция в своем боте. В параметрах функции задается эталонный график(с которым сравнивать) и график для сравнения., а функция возвращает процент "схожести".Код функции скинуть не могу она уникальна, но подскажу алгоритм. Ничего сложного в нем нет.

Грузишь график (код в туториалах), тот который тебе нужен.(один или несколько) Берешь его за основу и сохраняешь изображение как эталон в папке с программой.

Далее функция, которая будет сравнивать:
  • Загружаешь эталон в битовый массив #1
  • График который нужно сравнить с биржи тоже загружаешь в битовый массив #2.
  • Далее пробегаешься двумя циклами по х и y картинки по пикселям и получаешь цвет пикселя. Если цвет красный - сохраняешь его координаты в темповом (временном)двухмерном массиве ...
  • Как циклы закончат работу у тебя будет массив с координатами точек графика. По ним ты можешь построить свой график идентичный биржи, сравнивать или даже транспонировать)..
  • Далее получаешь такой же массив для второго графика, который требуется сравнить.
  • Потом сравниваешь два массива одинаковой размерности и получаешь процент точности.
Мулька в том, что "прямой" или любой другой, какой тебе нужен график может быть как на одной "высоте" так и на другой из-за разности кэфов рынка... Т.е. Даже совсем одинаковые точки массивов могут находится в разных его границах.
На скрине два одинаковых графика, но один по кэфу 2,75 и выше, а второй по кэфу 2,25 и выше:
Прикрепленный файл  Безымянный.png   30.93K   1 Количество загрузок
Поэтому тебе нужно сравнивать только "более заполненную" область.


Метод не быстрый, но самый простой и для таких изображений как график подходит идеально. На современных компах обработка будет занимать доли секунды. Все графические редакторы, в которых можно обрабатывать фото фильтрами, работают по такому же принципу. Например, получают изображение в массив пикселей, затем делают сдвиг и получается эффект blur (размытие).
Сама задача очень интересная для программиста и решаема.

#8 OFFLINE   Jericho

    Иерихон


  • RSB
  • ПипПипПипПипПип
  • 2226 сообщения
859

Добавлено 10 February 2012 - 17:22

Сообщенияvlad56, on 10 February 2012 - 14:39, сказал:

Private Exl As Excel.Application  

Как исправить такую ошибку не нашел.
Кто нибудь сможет помочь?

Для начала сделай ссылку на объектную библиотеку Microsoft Office Excel = Microsoft Office Excel X.X Object Library. Если офис не установлен или нужна совместимость с ранними офисами - сделай ссылку на соответствующую библиотеку PIA

Далее, в форме или в модуле импортируй пространства имен:
Imports Microsoft.Office.Interop

Далее код для чтения и записи в ячейку:
Dim exl As New Excel.Application
Dim exlSheet As Excel.Worksheet

exl.Workbooks.Open(Application.StartupPath & "\Шаблон11001.xlt")
'exl.Workbooks.Add()
exl.Visible = true

exlSheet = exl.Workbooks(1).Worksheets(1) 'Переходим к первому листу
exlSheet.Range("F6").Value = "Записываем значение"

Dim str as String
str = exlSheet.Range("F6").Value 'Читаем значение

Зачем тебе excel? Храни все в памяти своей программы.

Здесь очень много примеров как по таблицам, так и по работе с изображениями
www.java2s.com/Tutorial/VB/CatalogVB.htm

#9 OFFLINE   vlad56

    Специалист


  • Участник II
  • ПипПипПип
  • 460 сообщения
27
  • МестоположениеДнепропетровск

Добавлено 10 February 2012 - 18:59

Спасибо за ссылку. Надо будет просмотреть.
А Excel для хранения значений Lay(0) и Back(0) для долгого процесса сравнения их с друг другом по величине и по времени.
Ну это все сырое и не отработанное. Мысли вслух.
А вот:

СообщенияJericho, on 10 February 2012 - 17:04, сказал:

  • Потом сравниваешь два массива одинаковой размерности и получаешь процент точности.
Вот где об этом почитать бы. Или исходник бы.Это наверное что то из учебного курса для программистов по теме массивы.
Еще раз спасибо.

А с Excel я уже сталкивался. Но только на VB 6.

Отредактировано vlad56, 10 February 2012 - 19:04.


#10 OFFLINE   Jericho

    Иерихон


  • RSB
  • ПипПипПипПипПип
  • 2226 сообщения
859

Добавлено 10 February 2012 - 19:16

Сообщенияvlad56, on 10 February 2012 - 18:59, сказал:

Вот где об этом почитать бы. Или исходник бы. Это наверное что то из учебного курса для программистов по теме массивы.

По массивам примеры - java2s.com/Code/VB/Data-Structure/CatalogData-Structure.htm
На русском - codenet.ru/progr/vbasic/Dot-Net/Arrays.php

Отредактировано Jericho, 10 February 2012 - 19:18.


#11 OFFLINE   vlad56

    Специалист


  • Участник II
  • ПипПипПип
  • 460 сообщения
27
  • МестоположениеДнепропетровск

Добавлено 13 February 2012 - 06:21

Сообщенияvlad56, on 10 February 2012 - 12:14, сказал:

Я для себя немного план набросал. Получилось где то вот так.
Поиск линейного графика на рынках скачки Betfair.
  • Работа с Excel
  • На первой странице открываем рынок и заносим id рынка, id лошади ,коф и суммы сматченные на каждую лошадь.
  • По max сматченой сумме ищем лидера на этом рынке
  • Проверяем на второй странице есть ли такой лидер
  • Если есть то проверяем сматченую сумму
  • Если она не совпадает с новой суммой (т.е. была новая ставка) то добавляем коф новые и новую сумму сматченую
  • Если она совпадает с новой суммой то (т.е. новых ставок не было), тогда очищаем первую страницу и идем за следующим рынком.
  • Если такого лидера на второй странице нет тогда переносим лидера и его коф и сматченую сумму на новую строку с указанием id рынка, id лошади
  • В пределах указанного отклонения считаем сколько раз уже были эти значения и заносим их в ячейку по строке.
  • После прохода всех рынков скачек сортируем по убыванию вторую страницу по столбцу, где записано количество раз близких значений.
  • Получаем график по id рынка и id лошади.
Дополнение. Мысли вслух.
Из математики. Линейная функция описывается формулой y = k*x + b;
Мы можем получать значения Lay(0) и Back(0).
Ттр.n =(Lay(0) +Back(0).)/2 это будет точка тренда, или же точка нашего графика.
(Ттр.n - Tтр.(n-1)) > 0 если больше 0 график подрос. Знак при коф k положителен.
(Ттр.n - Tтр.(n-1)) = 0 если равно 0 график горизонтальный. Знак при коф k положителен.
(Ттр.n - Tтр.(n-1)) < 0 если меньше 0 график пошел вниз. Знак при коф k отрицателен.
Ттр.n/Tтр.(n-1) это отношение показывает во сколько раз изменился график.
Теперь суммируем положительные и отрицательные значения (Ттр.n - Tтр.(n-1)) каждое в свой столбик. После, сравнивая по абсолютной величине, можно говорить график возрастающий, убывающий или топчется на месте.
Если складывать разы положительные, отрицательные и нулевые, то при значительном преобладании суммы нулевых разов, допустим при 90% и при равенстве сумм положительных и отрицательных значений, можно делать вывод что график ближе к горизонтальному. Что и требуется нам найти.
Теперь записать все это в виде программы, и программа по текущим коф найдет лошадь или же строчку с нужным нам графиком.
Жду критики и ваших предложений по улучшению алгоритма поиска нужного нам графика.

Отредактировано vlad56, 13 February 2012 - 06:22.


#12 OFFLINE   Jericho

    Иерихон


  • RSB
  • ПипПипПипПипПип
  • 2226 сообщения
859

Добавлено 13 February 2012 - 12:06

Мысли правильные. Так тебе нужен график текущих кэфов? Т.е. запустил бота - он "мониторит" рынок и по Lay(0) и Back(0) в режиме реального времени строит график? Или все-таки тебе нужно "определить" график до запуска бота(по картинке)?

#13 OFFLINE   vlad56

    Специалист


  • Участник II
  • ПипПипПип
  • 460 сообщения
27
  • МестоположениеДнепропетровск

Добавлено 13 February 2012 - 12:24

СообщенияJericho, on 13 February 2012 - 12:06, сказал:

Мысли правильные. Так тебе нужен график текущих кэфов? Т.е. запустил бота - он "мониторит" рынок и по Lay(0) и Back(0) в режиме реального времени строит график? Или все-таки тебе нужно "определить" график до запуска бота(по картинке)?

Для игры до In Play мне нужен текущий на настоящий момент график.

#14 OFFLINE   vlad56

    Специалист


  • Участник II
  • ПипПипПип
  • 460 сообщения
27
  • МестоположениеДнепропетровск

Добавлено 13 February 2012 - 13:55

Обьявил страницу как обьявляет Mumbles на форуме
Dim Sheet As Worksheet = e.UserState.Param

Class UserState
Property Param As Object
Sub New(ByVal Value As Object)
Param = Value
End Sub
End Class
Получаю ошибку
Не удалось привести тип объекта "System.Windows.Forms.TabPage" к типу "Microsoft.Office.Interop.Excel.Worksheet".
Кто поможет как избавится от ошибки?

#15 OFFLINE   Jericho

    Иерихон


  • RSB
  • ПипПипПипПипПип
  • 2226 сообщения
859

Добавлено 13 February 2012 - 18:37

Сообщенияvlad56, on 13 February 2012 - 13:55, сказал:

Обьявил страницу как обьявляет Mumbles на форуме
Dim Sheet As Worksheet = e.UserState.Param

Кто поможет как избавится от ошибки?

Ранее в 31 и 32 шагах автор использовал TabControl для отображения рынков... А в шаге 34 уже переделал под excel.

Dim Sheet As Worksheet - у тебя тип Microsoft.Office.Interop.Excel.Worksheet, а вот e.UserState.Param у тебя так и остался типа TabPage из TabControl. Соответственно приравнять два разных типа данных он и не может. Эта как в integer строку сувать...

Где-то ранее в коде ошибка... ищи место где определяется e.. должно быть что-то вроде ByVal e As BFUK.getMarketPricesCompressedCompletedEventArgs

#16 OFFLINE   vlad56

    Специалист


  • Участник II
  • ПипПипПип
  • 460 сообщения
27
  • МестоположениеДнепропетровск

Добавлено 14 February 2012 - 05:12

СообщенияJericho, on 13 February 2012 - 18:37, сказал:

Где-то ранее в коде ошибка... ищи место где определяется e.. должно быть что-то вроде ByVal e As BFUK.getMarketPricesCompressedCompletedEventArgs

Вот в имени процедуры Private Sub BetFairUK_getMarketPricesCompressedCompleted(ByVal sender As Object, ByVal e As BFUK.getMarketPricesCompressedCompletedEventArgs) Handles BetFairUK.getMarketPricesCompressedCompleted
идет определение е.
А где об этом е. да и про e.UserState.Param можно было бы прочитать?

#17 OFFLINE   vlad56

    Специалист


  • Участник II
  • ПипПипПип
  • 460 сообщения
27
  • МестоположениеДнепропетровск

Добавлено 14 February 2012 - 06:42

Нашел, благодаря твоей помощи, почему нет совместимости типов. В процедуре
Private Sub PriceTimer_Tick(ByVal sender As Object, ByVal e As System.EventArgs) Handles PriceTimer.Tick

Try
With Exl
If .ActiveSheet IsNot Nothing Then
Dim Req As New BFUK.GetMarketPricesCompressedReq
Req.header = oHeaderUK()
Req.marketId = .ActiveSheet.Range(rMarketId).Value 'The marketId on the current worksheet
BetFairUK.getMarketPricesCompressedAsync(Req, New UserState(.ActiveSheet)) 'Call the API to get prices
End If
End With
Catch
End Try

End Sub

это условие не пропускает дапьше If .ActiveSheet IsNot Nothing Then и нет передачи ActiveSheet в качестве параметра UserState.
BetFairUK.getMarketPricesCompressedAsync(Req, New UserState(.ActiveSheet)). Еще раз большое спасибо.
Но возникает следующий вопрос. Если Excel загружен, страничка загружена то почему тогда не True эта ActiveSheet IsNot Nothing? И как сделать ее true?

Отредактировано vlad56, 14 February 2012 - 06:51.


#18 OFFLINE   vlad56

    Специалист


  • Участник II
  • ПипПипПип
  • 460 сообщения
27
  • МестоположениеДнепропетровск

Добавлено 14 February 2012 - 07:54

Сообщенияvlad56, on 14 February 2012 - 06:42, сказал:

Но возникает следующий вопрос. Если Excel загружен, страничка загружена то почему тогда не True эта ActiveSheet IsNot Nothing? И как сделать ее true?
Решена и эта true.

#19 OFFLINE   vlad56

    Специалист


  • Участник II
  • ПипПипПип
  • 460 сообщения
27
  • МестоположениеДнепропетровск

Добавлено 14 February 2012 - 10:36

У меня код в основном модуле около 2,000 строк. Для быстрого перемещения по коду я сворачиваю процедуры. Но после перезагрузки опять приходится сворачивать процедуры. Никто не знает как это можно ускорить. Или же сохранять в памяти свернутые процедуры, чтобы после перезагрузки они так и оставались бы свернутыми.

#20 OFFLINE   Jericho

    Иерихон


  • RSB
  • ПипПипПипПипПип
  • 2226 сообщения
859

Добавлено 15 February 2012 - 16:54

Сообщенияvlad56, on 14 February 2012 - 10:36, сказал:

У меня код в основном модуле около 2,000 строк. Для быстрого перемещения по коду я сворачиваю процедуры. Но после перезагрузки опять приходится сворачивать процедуры. Никто не знает как это можно ускорить. Или же сохранять в памяти свернутые процедуры, чтобы после перезагрузки они так и оставались бы свернутыми.

Есть такая директива в студии как регион. Обозначается так:
#Region "произвольное название"
' здесь любой код
End Region

Можешь разделить свой код благодаря этим регионам как угодно... Регионы всегда будут свернуты при сохранении...

А еще с помощью контекстного меню в редакторе кода ты можешь как свернуть все процедуры разом, так и развернуть:
Прикрепленный файл  01.png   22.11K   6 Количество загрузок