Что нового

Пишу бота

modnik

Знающий
Сообщения
138
Репутация
13
Решил написать бота, чтобы облегчить себе жизнь в ивке. Просмотрел мануал, научился двигать мышку,и находить пиксели. Но всё равно есть кое какие явно несложные вопросы(которые можно было бы решить с помощь совета профи). Я так понял, что консультации на джабере и в аське уже закрылись, или нет? Если кто может помочь, напишите мне пожалуйста ваши координаты
 

Lexx98

Продвинутый
Сообщения
272
Репутация
73
Да на форуме и задай.
Конечно, ответа придётся ждать чуть дольше, но и время в джаббере разговаривать есть не всегда.
А в конференции просто редко кто появляется сейчас.
 
Автор
M

modnik

Знающий
Сообщения
138
Репутация
13
Хорошо, тогда попробую писать в этой теме.
Первый вопрос, как присвоить определённой кнопке паузу или закрытие бота?
Я уже столкнулся тем, что при тесте создаётся бесконечный цикл и прекратить его можно только перезагрузкой ;D
Посмотрел скрипты других людей и увидел, что они добовляют такие строки
Код:
HotKeySet("{PAUSE}", "TogglePause")
HotKeySet("{F9}", "Terminate")

Но у меня они не работают, в чём проблема?
 

Lexx98

Продвинутый
Сообщения
272
Репутация
73
Проблема в том, что у тебя не описаны функции, реагирующие на эти назначенные кнопки. Смотри модуль Options. Кстати строго рекомендую оттуда стянуть себе все описанные в том форуме модули (и вообще почитать всё что там касается евы), ибо часть из них не была перенесена на этот форум, в результате чего логика чуток потерялась.
TogglePause и Terminate - функции, которые ты сам должен написать, чтобы они работали.
На будущее - если что-то не работает, первым делом смотри справку автоита по неработающей функции. Кстати хелп на русском тоже где-то есть ссылка на закачку.
Конкретно вот код для функций (по идее ты его мог найти чуть ниже там же где нашёл назначение клавиш на функции)
Код:
Func TogglePause()
$Paused = NOT $Paused
While $Paused
sleep(100)
ToolTip('Script is "Paused"',0,0)
WEnd
ToolTip("")
EndFunc
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;;;;;;;;;;;;;;;;;;;;;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;;;;;;;;;;;;;;;;;;;;;
;; Terminate v0.1 Завершение работы бота. Функция отвечает за завершение работы бота.
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;;;;;;;;;;;;;;;;;;;;;
Func Terminate()
$sMSG = StringFormat("Cycle Time: %.02d minutes.", (TimerDiff($sBeginTime)/1000)/60 )
MsgBox(0, "Macro Statistics", $sMSG)
Exit 0
EndFunc ;==>Terminate
 
Автор
M

modnik

Знающий
Сообщения
138
Репутация
13
В хелп регулярно смотрю. Функции это я так понял отдельно написаные программы которые вставляются одной тсрочкой

Первый вопрос решён, большое спасибо! Потихоньку набираюсь опыта
 

Lexx98

Продвинутый
Сообщения
272
Репутация
73
Одной строчкой можно просто "присоединить" к скрипту другие участки кода, написанные в других файлах, удобно отдельные функции выносить в отдельные файлы, дабы не делать код основной программы слишком большим - неудобно будет искать нужную функцию чтобы внести изменения.
#include "file.au3"
 

killbond

Осваивающий
Сообщения
96
Репутация
32
Но у меня они не работают, в чём проблема?
Это станет ясно только после того, как вы выложите полный код, вот так они точно будут работать:
Код:
HotKeySet("{PAUSE}", "_TogglePause")
HotKeySet("{F9}", "_Terminate")

Global  $fTerminated = 0, $fPaused = 0, $iCounter = 0

While $fTerminated = 0
	if Not $fPaused Then
		; ... Some code ...
		ToolTip ($iCounter)
		$iCounter += 1
		; ... Some code ...
	EndIf
	Sleep (100)
WEnd
Exit

Func _Terminate ()
	 $fTerminated = NOT $fTerminated
 EndFunc
 
 Func _TogglePause()
	 $fPaused = NOT $fPaused
EndFunc

Сравнивайте, м.б. проблема в том, что что-то недописано?

Функции это я так понял отдельно написаные программы которые вставляются одной тсрочкой
Только правильнее подпрограммы (или функции), и не "вставляются" а вызываются. Если алгоритм требует повторения, при чем вызов алгоритма должен производится из разных частей кода, то рациональнее будет оформить алгоритм ввиде отдельных функций, что упростит чтение кода, и собственно уменьшит кол-во строк, а если таковых функций становится много и все они объединены общим типом операций и/или данными, над которыми они работают, то их выносят в отдельный *.au3 файл, называемый UDF (user defined function - функции определенные пользователем)
 
Автор
M

modnik

Знающий
Сообщения
138
Репутация
13
У меня бывает ещё такая проблема! Если запущена программа с названием EVE(другая программа, не игра например "EVE programm") то не активирутеся окно игры. Оно по всей видимости читает не полный титл окна атолько часть. МОжно это исправить?
 

killbond

Осваивающий
Сообщения
96
Репутация
32
В операциях с окнами в Windows фигурирует т.н. внутренний идентификатор окна или хендл (Handle) он уникален для каждого окна, имея хендл можно получить все остальные данные об окне (включая заголовок, класс и пр.) основная идея в том, что можно отсеить окно не только по заголовку, но и по классу, но в идеале же будет именно по хендлу, как это делается можно прочитать в справке по AutoIt:
AutoIt --> Применение AutoIt --> Заголовок и текст окна (дополнительные возможности)
AutoIt --> Using AutoIt --> Window Titles and Text (Advanced)
А также здесь
Код:
[PROPERTY1:Value1; PROPERTY2:Value2]
Вот некий шаблон, сначала прописывается 1-ое свой-во, затем через двоеточие его параметр, затем можно закрыть это квадратной скобкой, а можно продолжить после точки с запятой. Эти параметры окна можно определить с помощью AutoIt Window Info (Au3Info.exe) идущего в поставке с AutoIt.
Вот пример:
Код:
WinWaitActive("[CLASS:Notepad]", "")
 
Автор
M

modnik

Знающий
Сообщения
138
Репутация
13
Спасибо за оперативную помощь!
Следующий вопрос, я написал алгоритм, он работает. После выполнения алгоритма выполняется одно действие, а потом этот алгоритм нужно выполнить снова, я так понимаю можно просто копировать\вставить(так я временно сделал), а можно оформить в функцию, чтобы было удобнее. Я выделил алгоритм в Func...EndFunc и думал что потом нужно будет просто указать название, но почему алгоритм игнорируется даже в певрый раз
Код:
Func Market()
MouseClick("Left", 289, 139, 1, 10)
$a = 289
$b = 139
Sleep(2000)
do
	$b = $b + 18
	$c = MouseGetPos()
	if $b >= 707 then ExitLoop
	MouseClick("Left", 289, $b, 1, 10)
	Sleep(2000)
	$p = MouseGetPos()
Until $p[1] >= 707
EndFunc
 

edyapd

Осваивающий
Сообщения
380
Репутация
30
modnik сказал(а):
Я выделил алгоритм в Func...EndFunc и думал что потом нужно будет просто указать название, но почему алгоритм игнорируется даже в певрый раз
Код:
Func Market()
MouseClick("Left", 289, 139, 1, 10)
$a = 289
$b = 139
Sleep(2000)
do
	$b = $b + 18
	$c = MouseGetPos()
	if $b >= 707 then ExitLoop
	MouseClick("Left", 289, $b, 1, 10)
	Sleep(2000)
	$p = MouseGetPos()
Until $p[1] >= 707
EndFunc
Не понял где ты вызываешь функцию.
Да и в самой функции много лишнего. Я бы сделал так
Код:
Func Market()
$a = 289
$b = 139
do
    MouseClick("Left", $a, $b, 1, 10)
    $b = $b + 18
    Sleep(2000)
Until $b >= 707
EndFunc
 
Автор
M

modnik

Знающий
Сообщения
138
Репутация
13
Спасибо всем! Я дописал первого простого бота, теперь хочу написать второго, который сложнее и тут мне нужен квалифицированный совет.
Задача такая: У нас есть пять ордеров на рынке, нам нужно получить информацию об ордерах, сравнить цены с другими ценами и если наше предложение хуже то поменять цену на лучшую.
Весь алгоритм данной задачи вполне прост, но есть один сложный момент, который распишу ниже

Допустим мы сравнили цены, выбрали лучшую, теперь нужно её поставить в игре. Для этого из пяти ордеров нам нужен определённый. Эту проблему можно было бы решить с помощью ЕВЕапи, т.е упорядочить ордера по алфавиту и так ориентироваться в игре, т.е первый в списке значит первый по координатам в игре. Но вот незадача, зато время пока сравниваются цены, какой то ордер может пропасть и будет искажение, так как ЕВЕ АПИ можно обновлять только один раз в час. В этом и есть проблема

На у м приходят два решения(пока в теории, не знаю как на практике).

Первый это определить ордер попиксельно по цене. Вроде цифры можно определять по семи точкам(было прочитано в соседней теме) Возможно ли это? или это очень сложно?

Второе решение это использование имэджсёрча, если бы например можно было напринскринить ордера, потом нарезать полоски с ценами и присвоить им номера, а потом по этим полоскам с ценами искать. ЗДесь вопрос такой, вроде говорят что имэдж сёрч очень долгий? Возможно ли принскринить выделенную область?

Вот мои соображения если не сложно попробуйте указать направление
 

Lexx98

Продвинутый
Сообщения
272
Репутация
73
Ха... Ещё один...
Могу посоветовать почитать тему про торговлю в хабах, и в любом случае быть готовым к тому, что в открытом доступе тебе никто ничего секретного не расскажет. Тут лучше до всего доходить своей головой.
 
Автор
M

modnik

Знающий
Сообщения
138
Репутация
13
Я прочитал соседнюю тему, но с моим алгоритмом есть разница. Томми собирался конкретно считывать с экрана инфу. Очевидно, чтоэто сложно(если говорить о 100% результате). Мне же например нужно только найти нужную строчку, я даже придумал как это обойти но опять же там возникает вероятность что случиться искажение вероятность порядка 20-30%. Вот я и спрашиваю помощи конкретно по двум решением. пиксел сёрч и имедж сёрч
 

Lexx98

Продвинутый
Сообщения
272
Репутация
73
Ну вот чтобы найти нужную строчку нужно как минимум распознать где какой ордер высвечивается, на нём же и кликать надо для модификации...
То есть приходим именно к считыванию с экрана.
Вариант без считывания единственный - поудалять все ордера и выставить новые, но так даже если раз в час менять - разоришься на комиссионных брокерам.

С ImageSearch не работал, ибо не рекомендуют. А пиксели там искать не надо, их надо брать и смотреть, анализировать - никакого пиксель сёрча там нет и не нужно.
 
Автор
M

modnik

Знающий
Сообщения
138
Репутация
13
нашёл чисто формальное решение проблемы, Файнридер распознаёт всё 100% после некоторых усилий, единственно плохо,что здоровый он
 

McSkull

Знающий
Сообщения
66
Репутация
6
Вот поэтому я весело копаю...

Самый простой бот это МайнингБот по моему...
 

killbond

Осваивающий
Сообщения
96
Репутация
32
modnik сказал(а):
нашёл чисто формальное решение проблемы, Файнридер распознаёт всё 100% после некоторых усилий, единственно плохо,что здоровый он
А чем http://cap-cap.ru/ не подходит? Я из него все лишнее повырезал, свои шаблоны сделал, все это около 1.5 метра весит, но работает по такому же принципу...
 
Автор
M

modnik

Знающий
Сообщения
138
Репутация
13
О да, программа конечно жесть, попробую в ней разобраться? А качество распознования такое же как в файнридере?


Добавлено:
Сообщение автоматически объединено:

Скачал я эту прогу. Запустил экзешник он выдаёт "Rapidsharecom.jpg не найден", ну я не долго думая залил в папку файл(скрин из евы, который распознать надо) и переименовал его в "Rapidsharecom.jpg". Далее снова зпускаю экзешник, через некоторое время появляется белка и строка для ввода(чекер?) куда сохраняется распознаный текст? порылся на оф сайте, но так ничего и не нашёл
 

Tommy_DJ

Новичок
Сообщения
8
Репутация
0
Ну и чем тебе мой способ не понравился? Единственно что там нужно достаточно много просидеть с подгонками .. но в той же теме есть и относительно рабочее решение ...
И это, ты бы все же по каждой теме в нужном топике бы отписывался, неправильно это когда в одной теме обсуждается 100 различных ботов.
 
Верх