Версия для печати темы

Нажмите сюда для просмотра этой темы в обычном формате

UoKit.com Форумы _ UO Pilot _ UOpilot и ставки в онлайн браузере

Автор: Levo223 24.10.2017, 10:33

Заинтересовался темой автоматизации процесса торгов в онлайн платформах брокеров БО и форекс, знаю что пишут приводы и плагины специально для браузера. Но если брать UOpilot то каким способом можно будет реализовать автоматическое повышение ставок при проигрыше? При выигрышной ставке вылазиет желтенькое окошечко, при проигрышной серенькое.
Получается что
вот массив отвечающий за поиск цвета

set $a 0
while $a < 1
set $a findcolor (154, 80 318, 260 1 1 2366701 %arr 2) // ждёт какого-то цвета
end_while
и определяет точку

Но вопрос такой - серых точек в платформе много, как определить цвет именно области 2х2 см а не точки?

Далее если он серый то в определенном окне прописывается сумма, которая увеличена на коэффициент "N" от предыдущей каждый раз, когда появляется это серое окно. И сбрасываться к стартовой, когда появляется желтое!

Как будет в целом выглядеть данный скрипт?

Для примера:
Допустим в окне с координатами Х, У вылазит белое окошечко, и скрипт должен автоматически перейти в окошечко с координатами Q, W и задать там число 1*2,5 т.е. "2,5", Далее если появилось вновь белое окошечко то 2,5*2.5 т.е. "6,25". Но тут вылазит желтенькое окошечко, и нам необходимо вернуться к = "1". И так по кругу, как это сделать?

Автор: cirus 24.10.2017, 12:03

Цитата
серых точек в платформе много, как определить цвет именно области 2х2 см а не точки?

Искать как картинку с помощью http://uopilot.tati.pro/index.php?title=Findimage
Цитата
задать там число 1*2,5 т.е. "2,5", Далее если появилось вновь белое окошечко то 2,5*2.5 т.е. "6,25". Но тут вылазит желтенькое окошечко, и нам необходимо вернуться к = "1".

Начнём с того что пилот работает только с целыми числами, для не целых нужно использовать https://forum.uokit.com/index.php?showtopic=29139.
Код
set #summa 1
while 1 = 1
    // какие-то действия, если надо
    set #a findcolor()   // ищем появилось ли нужное окно, вписать нужные параметры
    if #a > 0            // если окно нашлось
        set #summa #summa * 2   // увеличиваем сумму на 2
    else                        // иначе, т. е. окно не нашлось
        set #summa 1            // сумма = 1
    end_if
    wait 1
     // какие-то действия, если надо
end_while

Или же писать скрипт на языке lua, работает пока только в бета версии пилота. Из плюсов: без проблем работает с не целыми числами, из минусов: нет полноценной справки, ещё не все функции работают.

Автор: Levo223 24.10.2017, 13:40

Цитата(cirus @ 24.10.2017, 12:03) *

Искать как картинку с помощью http://uopilot.tati.pro/index.php?title=Findimage

Начнём с того что пилот работает только с целыми числами, для не целых нужно использовать https://forum.uokit.com/index.php?showtopic=29139.
Код
set #summa 1
while 1 = 1
    // какие-то действия, если надо
    set #a findcolor()   // ищем появилось ли нужное окно, вписать нужные параметры
    if #a > 0            // если окно нашлось
        set #summa #summa * 2   // увеличиваем сумму на 2
    else                        // иначе, т. е. окно не нашлось
        set #summa 1            // сумма = 1
    end_if
    wait 1
     // какие-то действия, если надо
end_while

Или же писать скрипт на языке lua, работает пока только в бета версии пилота. Из плюсов: без проблем работает с не целыми числами, из минусов: нет полноценной справки, ещё не все функции работают.


Ну ладно это ерунда, можно и с целыми, я условно обозначил как дробные для точности. Главное чтобы прописывал коэффициент и возвращал значения.
Так а как прописывать то будет я не совсем понял?

Автор: cirus 24.10.2017, 13:58

Цитата
Так а как прописывать то будет я не совсем понял?

код
Код
set #summa 1
while 1 = 1
    // какие-то действия, если надо
    set #a findcolor()   // ищем появилось ли нужное окно, вписать нужные параметры
    if #a > 0            // если окно нашлось
        set #summa #summa * 2   // увеличиваем сумму на 2
    else                        // иначе, т. е. окно не нашлось
        set #summa 1            // сумма = 1
    end_if
    wait 1
     // какие-то действия, если надо

    kleft 100 200   // клик в строку куда прописывать значение, указать нужные координаты
    wait 500
    send #summa     // напечатать сумму
    // тут что делать дальше
end_while



Автор: Levo223 24.10.2017, 14:06

Цитата(cirus @ 24.10.2017, 13:58) *

код
Код
set #summa 1
while 1 = 1
    // какие-то действия, если надо
    set #a findcolor()   // ищем появилось ли нужное окно, вписать нужные параметры
    if #a > 0            // если окно нашлось
        set #summa #summa * 2   // увеличиваем сумму на 2
    else                        // иначе, т. е. окно не нашлось
        set #summa 1            // сумма = 1
    end_if
    wait 1
     // какие-то действия, если надо

    kleft 100 200   // клик в строку куда прописывать значение, указать нужные координаты
    wait 500
    send #summa     // напечатать сумму
    // тут что делать дальше
end_while


Ок. Спасибо

Так а как без указания коэффициента в скрипте т.е. заранее подготовленные числа, допустим было 1000 а надо прописать 2345, затем вместо 2345 прописать 5678 и т.д. как можно?


По какой-то причине клик происходит не в точку координат а со смещением.

Автор: cirus 24.10.2017, 15:18

Цитата
По какой-то причине клик происходит не в точку координат а со смещением.

Привязка Ctrl + A к нужному окну не сделана.
Цитата
Так а как без указания коэффициента в скрипте т.е. заранее подготовленные числа, допустим было 1000 а надо прописать 2345, затем вместо 2345 прописать 5678 и т.д. как можно?

Пример:
Код
init_arr %num 2345 5678 10000 15999     // массив с числами
while 1 = 1
    set #count #count + 1     // переменная-счётчик
    if #count > size(%num)   // если переменная-счётчик больше, чем размер массива num
        end_script                  // остановить скрипт
    end_if
        set #summa %num [#count]   // присваиваиваем переменной значние из массива
        log #count   #summa
end_while

Автор: Levo223 24.10.2017, 16:01

Цитата(cirus @ 24.10.2017, 15:18) *

Привязка Ctrl + A к нужному окну не сделана.

Пример:
Код
init_arr %num 2345 5678 10000 15999     // массив с числами
while 1 = 1
    set #count #count + 1     // переменная-счётчик
    if #count > size(%num)   // если переменная-счётчик больше, чем размер массива num
        end_script                  // остановить скрипт
    end_if
        set #summa %num [#count]   // присваиваиваем переменной значние из массива
        log #count   #summa
end_while


Ой да ты настоящий гений, у меня получилось что надо backspace несколько раз тыкать.
Вот прописал я findcolor но по всей видимости смещение и в определении цвета присутствует. Какие параметры тут за что отвечают? %arr 2 - это что такое?

У меня получилась наполовину рабочая... но вот такая вот хрень

Код

set #100
while 1 = 1 // это что означает?
    // какие-то действия, если надо
    set #2  findcolor(73, 74, 78, 260 1 1 #131416 %arr 2(что такое %arr 2 вот это я не понял, и куда его сувать?)   // ищем появилось ли нужное окно, вписать нужные параметры
    if #2 > 0            // если окно нашлось, ну допустим 2 пикселя, вроде у меня такого цвета там больше нет
    kleft 1256 205   // клик в строку куда прописывать значение
    wait 3000
     send backspace // нажать баксп 5 раз
     send backspace
     send backspace
     send backspace
     send backspace
     send #200    // напечатать сумму
    Double_left 1256 150 // двойной клик в сторону
    else                        // иначе, т. е. окно не нашлось
        set #100           // сумма = 100 /тут надо написать ничего не делаем, если оно не нашлось
    end_if
    wait 3000
   трёмся *опой об диван) // какие-то действия, если надо

    
end_while
end_script


insert и delete как-нибудь можно тут использовать параметры?

Автор: Levo223 24.10.2017, 18:17

Вобщем не работает

Код

set #блаблабла
while 1 = 1
    // какие-то действия, если надо
    set #2 findcolor(111, 397 350, 567 1 1 5130825)   // ищем появилось ли нужное окно, вписать нужные параметры
    if #2 > 0            // если окно нашлось
    kleft 1256 205   // клик в строку куда прописывать значение, указать нужные координаты
    wait 3000
     send backspace // нажать баксп 5 раз
     send backspace
     send backspace
     send backspace
     send backspace
     send #200    // напечатать сумму
    Double_left 1256 150 // тут что делать дальше, двойной клик в сторону
    else                        // иначе, т. е. окно не нашлось
        set #100           // сумма = 100 тут надо написать ничего не делаем, если оно не нашлось...
    end_if
    wait 1000
     // какие-то действия, если надо
    end_while
end_script

Что бы я не делал, какие координаты не задавал, он не ищет данный цвет и не нажимает кнопки.

Автор: cirus 25.10.2017, 2:49

Цитата
(что такое %arr 2 вот это я не понял, и куда его сувать?)

Неплохо бы для начала прочитать описание команды. Посмотреть синтаксис и примеры.
http://uopilot.tati.pro/index.php?title=Findcolor
Кратце, %arr - это массив, в который будут записаны результаты поиска.
Цитата
он не ищет данный цвет и не нажимает кнопки.

Из-за того что в findcolor указаны не все параметры, в данном случае отсутствует массив, команда возвращает ошибку, соответственно всё что дальше выполниться не может.
Цитата
set #2

Лучше имя переменной начинать с буквы, несмотря на то что пилот и так жрёт.
Как это обычно бывает, не находит, не кликает, не работает и т. д. Не надо писать весь скрипт сразу, для начала проверяем находит ли цвет:
Код
// не забываем сделать привязку Ctrl + A
set #a findcolor(111, 397 350, 567 1 1 5130825 %arr)   // ищем
log #a    // результат поиска, количество найденных пикселей
if #a > 0
    log Цвет найден
else
    log Цвет не найден
end_if
end_script

Если поиск цвета работает дописываем следующие действия.
Цитата
send #200 // напечатать сумму

Код
    // Если хотите напечатать 200, то:
send 200
    // Если содержимое переменной, то:
set #summa 500
send #summa    // напечатает 500

Автор: Levo223 25.10.2017, 4:33

Цитата(cirus @ 25.10.2017, 2:49) *

Лучше имя переменной начинать с буквы, несмотря на то что пилот и так жрёт.

Код
// не забываем сделать привязку Ctrl + A
set #a findcolor(111, 397 350, 567 1 1 5130825 %arr)   // ищем
log #a    // результат поиска, количество найденных пикселей
if #a > 0
    log Цвет найден
else
    log Цвет не найден
end_if
end_script

[/code]

Так теперь он пишет и ищет.
Как теперь связать вот это:
Код
init_arr %num 2345 5678 10000 15999     // массив с числами
while 1 = 1
    set #count #count + 1     // переменная-счётчик
    if #count > size(%num)   // если переменная-счётчик больше, чем размер массива num
        end_script                  // остановить скрипт
    end_if
        set #summa %num [#count]   // присваиваиваем переменной значние из массива
        log #count   #summa
end_while


и вот это
Код
set #summa 100
while 1 = 1
//привязк Ctrl + A
set #a findcolor(111, 397 350, 567 1 1 5130825 %arr)   // ищем
if #a > 0
kleft 1256 126   // клик в строку куда прописывать значение, указать нужные координаты
    wait 1000
     send backspace // нажать баксп 5 раз
     send backspace
     send backspace
     send backspace
     send backspace
     send 200  // напечатать сумму
    Double_left 1247 68 // тут что делать дальше, двойной клик в сторону
else
end_if
end_while
end_script

И еще, как программно задать повторение нажатия клавиши несколько раз, у меня несколько раз писать приходится как backspace//

т.е. мне нужна какая-то переменная, которая позволяет прыгнуть в другой скрипт и выполнить его там. Т.е. если окно серенькое
идёт вот эта часть
set #count #count + 1 // переменная-счётчик
if #count > size(%num) // если переменная-счётчик больше, чем размер массива num
end_script // остановить скрипт
end_if
set #summa %num [#count] // присваиваиваем переменной значние из массива
log #count #summa

если желтенькое
то
kleft 1256 126 // клик в строку куда прописывать значение, указать нужные координаты
wait 1000
send backspace // нажать 5 раз
send backspace
send backspace
send backspace
send backspace
send 100 // напечатать сумму


Также нужна однократность действия, т.е. когда я пишу
Код
kleft 1256 126   // клик в строку куда прописывать значение, указать нужные координаты
    wait 1000
     send backspace // нажать баксп 5 раз
     send backspace
     send backspace
     send backspace
     send backspace
     send 200  // напечатать сумму

он успевает сделать это 2 раза, stop_script не помогает, увеличить время ожидания чтоли


В целом должно получиться что-то вроде

Код

set #summa 100
init_arr %num 2345 5678 10000 15999     // массив с числами, куда его именно поставить?
while 1 = 1
//привязк Ctrl + A
set #a findcolor(111, 397 350, 567 1 1 5130825 %arr)   // ищем  серый 5130825
if #a > 0
  
    kleft 1256 126   // клик в строку куда прописывать значение, указать нужные координаты
    wait 1000
     send backspace // нажать баксп 5 раз
     send backspace
     send backspace
     send backspace
     send backspace
set #count #count + 1     // переменная-счётчик
    if #count > size(%num)   // если переменная-счётчик больше, чем размер массива num
        end_script                  // остановить скрипт
    end_if // эта часть я так понимаю должна быть за поиском цвета
        set #summa %num [#count]   // присваиваиваем переменной значние из массива
        Double_left 1247 68 // тут что делать дальше, двойной клик в сторону
        log #count   #summa
                                      // Выдаёт ошибку с числами из массива.
        wait 4000

else // если не находит серый
end_if
// и начинает поиск жёлтого
set #a findcolor(111, 397 350, 567 1 1 4709887 %arr) // желтый 4709887
if #a > 0 // находит желтый
kleft 1256 126   // клик в строку куда прописывать значение, указать нужные координаты
    wait 1000
     send backspace // нажать баксп 5 раз
     send backspace
     send backspace
     send backspace
     send backspace
     send 100  // напечатать сумму
    Double_left 1247 68 // тут что делать дальше, двойной клик в сторону
    wait 4000
    end_if // не находит жёлтый - возвращается к началу скрипта
end_while
end_script



Автор: cirus 25.10.2017, 11:30

Цитата
Для примера:
Допустим в окне с координатами Х, У вылазит белое окошечко

Окно само появляется или какие-то действия нужны для этого?
То белое окно, то серое, это одно и тоже или нет?
Нормально напишите все действия по порядку.
Цитата
как программно задать повторение нажатия клавиши несколько раз, у меня несколько раз писать приходится как backspace

Код
for #i 1 5             // цикл
    send {Backspace}   // нажать Backspace 5 раз
    wait 100           // ждать 100 мсек
end_for
end_script



Автор: Levo223 25.10.2017, 11:40

Цитата(cirus @ 25.10.2017, 11:30) *

Окно само появляется или какие-то действия нужны для этого?
То белое окно, то серое, это одно и тоже или нет?
Нормально напишите все действия по порядку.


Беленькое - это серенькое, я так выразился.
Само оно появляется, при условии что кто-то там заключил сделку. Есть некоторые сложности, например возврат затраченной ставки обозначается желтым окном также как и выигрышная, поэтому в последующем планируется каким-то образом дифференцировать этот возврат от выигрыша. Возможно по findimage или сумме. Что касается самой сделки, Ну это другая часть скрипта, которая по всей видимости будет находится в другом пилоте, я так думаю разделить. Идеально связать работу программы и сигналы из появляющегося окошка MT с индикаторами, но этот раздел мне еще нужно изучить.

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

Автор: cirus 25.10.2017, 12:06

как-то так
Код
set #summa 100     // начальная ставка
init_arr %num 2345 5678 10000 15999
set #count 0

while 1 = 1
    set #grey 0
    set #yellow 0
    while #grey = 0 and #yellow = 0   // ждём пока не появится серое или жёлтое окно
        set #grey findcolor(111, 397 350, 567 1 1 5130825 %arr)
        set #yellow findcolor(111, 397 350, 567 1 1 4709887 %arr)
        wait 100
    end_while

    if  #grey > 0    // если найдено серое окно
        kleft 1256 126   // клик в строку куда прописывать значение, указать нужные координаты
        wait 1000
        for #i 1 5       // нажимаем Backspace 5 раз
            send {Backspace}
            wait 100
        end_for
        set #count #count + 1     // переменная-счётчик
        if  #count > size(%num)   // если переменная-счётчик больше, чем размер массива num
            end_script            // остановить скрипт, тут что делать если достигнута максимальная ставка
            // сейчас остановка скрипта, чтобы не было ошибки при выходе за пределы массива
        end_if

        set #summa %num [#count]   // присваиваиваем переменной значение из массива
        log Текущая ставка #summa
        send #summa  // напечать сумму

        Double_left 1247 68 // двойной клик в сторону
        log #count   #summa
        wait 4000
    else   // иначе, т. е. найдено жёлтое окно
        kleft 1256 126   // клик в строку куда прописывать значение, указать нужные координаты
        wait 1000
        for #i 1 5       // нажимаем Backspace 5 раз
            send {Backspace}
            wait 100
        end_for
        set #summa 100
        set #count 0 // сбрасываем счётчик на 0, т. е. ставки начнутся заново
        send #summa  // напечатать сумму
    end_if
end_while

Автор: Levo223 25.10.2017, 12:22

хз

Цитата(cirus @ 25.10.2017, 12:06) *

Код
set #summa 100     // начальная ставка
init_arr %num 2345 5678 10000 15999
set #count 0

while 1 = 1
    set #grey 0
    set #yellow 0
    while #grey = 0 and #yellow = 0   // ждём пока не появится серое или жёлтое окно
        set #grey findcolor(111, 397 350, 567 1 1 5130825 %arr)
        set #yellow findcolor(111, 397 350, 567 1 1 4709887 %arr)
        wait 100
    end_while

    if  #grey > 0    // если найдено серое окно
        kleft 1256 126   // клик в строку куда прописывать значение, указать нужные координаты
        wait 1000
        for #i 1 5       // нажимаем Backspace 5 раз
            send {Backspace}
            wait 100
        end_for
        set #count #count + 1     // переменная-счётчик
        if  #count > size(%num)   // если переменная-счётчик больше, чем размер массива num
            end_script            // остановить скрипт, тут что делать если достигнута максимальная ставка
            // сейчас остановка скрипта, чтобы не было ошибки при выходе за пределы массива
        end_if

        set #summa %num [#count]   // присваиваиваем переменной значение из массива
        log Текущая ставка #summa
        send #summa  // напечать сумму

        Double_left 1247 68 // двойной клик в сторону
        log #count   #summa
        wait 4000
    else   // иначе, т. е. найдено жёлтое окно
        kleft 1256 126   // клик в строку куда прописывать значение, указать нужные координаты
        wait 1000
        for #i 1 5       // нажимаем Backspace 5 раз
            send {Backspace}
            wait 100
        end_for
        set #summa 100
                Double_left 1247 68
        set #count 0 // сбрасываем счётчик на 0, т. е. ставки начнутся заново
        send #summa  // напечатать сумму
    end_if
end_while




Да, проблемка, оно при желтом окне не возвращается к начальной ставке, а пишет 0, но должно возвращаться к начальной ставке. Даблклик в сторону для закрытия окна подправил, после нахождения желтого окна. Но не могу понять где изменить 0 на 100, чтобы возврат к старту был... Т.е. переменную ноль нужно обозначить как 100!

А как очистить Log? Она когда какой-то максимальной ставки достигает почему-то не хочет дальше писать?

И почему-то когда 0 - пишется 2 раза

Автор: cirus 25.10.2017, 12:40

Цитата
Double_left 1247 68

После кликов надо добавлять wait, для закрытия окна требуется время. Т. е. окно ещё не закрылось, а send уже начал печатать символы, в итоге от 100, остаётся 0 или 00.

Автор: Levo223 25.10.2017, 12:42

Цитата(cirus @ 25.10.2017, 12:40) *

После кликов надо добавлять wait, для закрытия окна требуется время. Т. е. окно ещё не закрылось, а send уже начал печатать символы, в итоге от 100, остаётся 0 или 00.


" end_script // остановить скрипт, тут что делать если достигнута максимальная ставка"

Если достигнута максимальная ставка - должна возвращаться к старту.

Так с 0 разобрались) ставит 100

Автор: Levo223 25.10.2017, 13:09

Эксперимента ради было бы неплохо после каждого нахождения окна и установлении ставки нажимать рандомно горячие клавиши Q или R
как вы мне посоветовали в данном скрипте
init_arr %a U T // список клавиш
set #rand random(size(%a)) + 1 // случайное число от 1 до количество_символов_в_массиве
send %a [#rand]
end_script

Автор: cirus 25.10.2017, 13:27

Цитата
Если достигнута максимальная ставка - должна возвращаться к старту.

Тогда вместо end_script ставьте break, по сути скрипт начнётся сначала.
Цитата
было бы неплохо после каждого нахождения окна и установлении ставки нажимать рандомно горячие клавиши Q или R

Так в чём сложность? Список клавиш в начало скрипта, остальное в ту часть кода, где нужно нажать клавишу.

Автор: Levo223 25.10.2017, 13:59

Цитата(cirus @ 25.10.2017, 13:27) *

Тогда вместо end_script ставьте break, по сути скрипт начнётся сначала.

Так в чём сложность? Список клавиш в начало скрипта, остальное в ту часть кода, где нужно нажать клавишу.

Окей, щас пробну.

Автор: Levo223 25.10.2017, 15:03

Цитата(cirus @ 25.10.2017, 13:27) *

Тогда вместо end_script ставьте break, по сути скрипт начнётся сначала.

Так в чём сложность? Список клавиш в начало скрипта, остальное в ту часть кода, где нужно нажать клавишу.


Отправил картинку в приват, чтобы было понятнее, но во избежании фикса её лучше не выкладывать
Вот собственно вопрос:
Как прописать копирование в заданных координатах?
И будет ли пилот сравнивать дробные числа с . по середине? Каким образом в нередактируемых данных скопировать и сравнить?

Автор: cirus 25.10.2017, 15:26

Цитата
Как прописать копирование в заданных координатах?

Выделяем число двойным кликом и нажимаем Ctrl + C, либо тоже самое мышкой.
Код
// копируем число в буфер, написать нужные действия
get clipboard $a    // получили число в переменную
// копируем второе число в буфер, написать нужные действия
get clipboard $b    // получили число в переменную
// дальше их сравниваем

Цитата
И будет ли пилот сравнивать дробные числа с . по середине? Каким образом это лучше сделать?

Обязательно сравнивать дробную часть? Если нет, можно её отбросить:
Код
// пример
set $a 100.5
set $b 101.67
set $a string_replace ($a "." ",")   // заменяем точку на запятую, иначе не будет работать trunc
set $b string_replace ($b "." ",")

log trunc($a)   trunc($b)
if  trunc($a) < trunc($b)  // теперь можно сравнить, если $a меньше $b
    // какие-то действия
end_if
end_script

Если надо сравнивать и дробную часть, то придётся дописывать.

Автор: Levo223 25.10.2017, 15:46

Цитата(cirus @ 25.10.2017, 15:26) *

Выделяем число двойным кликом и нажимаем Ctrl + C, либо тоже самое мышкой.
Код
// копируем число в буфер, написать нужные действия
get clipboard $a    // получили число в переменную
// копируем второе число в буфер, написать нужные действия
get clipboard $b    // получили число в переменную
// дальше их сравниваем


Обязательно сравнивать дробную часть? Если нет, можно её отбросить:
Код
// пример
set $a 100.5
set $b 101.67
set $a string_replace ($a "." ",")   // заменяем точку на запятую, иначе не будет работать trunc
set $b string_replace ($b "." ",")

log trunc($a)   trunc($b)
if  trunc($a) < trunc($b)  // теперь можно сравнить, если $a меньше $b
    // какие-то действия
end
end_script

Если надо сравнивать и дробную часть, то придётся дописывать.


Дробная часть не влияет, но как сравнивать если, к примеру, будет 3х значное число? Заранее прописывать длину
Она не копирует те цифры, нужно провести левой кнопкой мыши нажатой по горизонтали чтобы выделить N знаков от точки X Y, до точки X2 Y, а затем уже нажать ПКМ или скопировать Ctrl+c, но если я проведу и зацеплю точку в двухзначном, в 3х значном это будет еще один символ до точки

Автор: Levo223 25.10.2017, 16:06

Цитата(cirus @ 25.10.2017, 15:26) *


Код
// пример
set $a 100.
set $b 101.


Тут число само пропишется, или надо его для каждой ставки отдельно указывать?

получилось вот таким образом

Код
left_down 424, 384 abs 
Move 548, 384 abs
left_up
    ctrl+c // копируем число в буфер
get clipboard $a    // получили число в переменную
    left_down 621, 384 abs
Move 713, 384 abs
left_up
    Ctrl+c // копируем второе число в буфер
get clipboard $b    // получили число в переменную
// дальше их сравниваем    СРАВНИВАЕМ ВСЁ ЧТО ДО ТОЧКИ. КАК ЭТО СДЕЛАТЬ?
set $a 100. //Откуда эти числа берутся?
set $b 101.
set $a string_replace ($a "." ",")   // заменяем точку на запятую, иначе не будет работать trunc Допустим можно вобще после точки не сравнивать, тогда что-то нужно убрать?
set $b string_replace ($b "." ",")

log trunc($a)   trunc($b)
if  trunc($a) < trunc($b)  // теперь можно сравнить, если $a меньше $b
kleft 37, 190 abs // закрыть архив
Breack  // какие-то действия  продолжить скрипт с начала  полагаю, НО КАКОЙ ИЗ НИХ НАЧНЁТСЯ С НАЧАЛА? просто продолжить выполнение скрипта тогда Breack не писать?
end
end_script

продолжить выполнение скрипта

после if trunc($a) < trunc($b) //
разве не надо end_if ставить?

что-то не так...
Код
20:41:12 15 (autosaved_15.txt, 2): left_up - (2): Ошибка! Проверьте правильность скрипта! EConvertError '' is not a valid integer value
left_up
20:41:44 15 (autosaved_15.txt, 3): ctrl+c - Неопознанная команда: ctrl+c
20:52:19 16 (autosaved_16.txt, 0): drag - (0): Ошибка! Проверьте правильность скрипта! EConvertError 'abs' is not a valid integer value
drag 424 384 abs 548 384 abs
20:53:01 16 (autosaved_16.txt, 0): drag - (0): Ошибка! Проверьте правильность скрипта! EConvertError 'abs' is not a valid integer value
drag 426, 385 abs 532, 384 abs


Sendex ^c не работает

Код

set $a 424 292 539 292   //координаты заданы строковой переменной
drag $a  // так наполовину работает
Right 539 292  // нажимается ПКМ открывается окно
wait 1000
set clickoffsetx 5       // смещение для координаты X
set clickoffsety 5       // смещение для координаты Y
left 539 292           // клик в координаты 539 292 и ничего не происходит. Вместо копирования становится активной панель задач
End_script


Как сместить то после Right курсор вправо вниз чтобы нажать скопировать? Там другое окно поидее

Автор: cirus 26.10.2017, 2:24

Что мешает посмотреть описание команд, синтаксис и примеры?
http://uopilot.tati.pro/index.php?title=Список_функций
Выделить слово можно двойным кликом, Sendex ^c работает только для активного окна, т. е. рабочее окно должно быть на переднем плане.

Цитата
Breack
left_up

Break.
При отпускании кнопки мыши нужно указывать координаты.
код
Код
// Сделать привязку Ctrl + A
showwindow windowhandle MINIMIZE  // свернуть пилот
wait 500
double_left 100 200    // двойной клик по числу, указать координаты
wait 200
sendex ^c                // нажать Ctrl + C
get clipboard $a       // получить в переменную содержимое буфера
wait 100
double_left 200 20     // двойной клик по второму числу, указать координаты
wait 200
sendex ^c
get clipboard $b
log $a   $b
set $a string_replace ($a "." ",")   // заменяем точку на запятую, иначе не будет работать trunc
set $b string_replace ($b "." ",")
log $a   $b
if trunc($a) < trunc($b)   // сравниваем
    // действия
end_if
end_script

Автор: Levo223 26.10.2017, 7:09

Цитата(cirus @ 26.10.2017, 2:24) *


showwindow windowhandle MINIMIZE // свернуть пилот


Так, теперь копирует но я не до конца понял, откуда берутся вот эти вот а и б

двойной клик тоже выделяет

set $a
set $b
Я должен задавать их или что? Каждый раз по новой писать? или это автоматическое значение каждый раз для выделенного/скопированного?

Left_up не нужен, работает

Код
set $a 424 292 539 292  
drag $a
wait 300

Или эта переменная в дальнейшем в коде помешает?
Если есть в drag $a и есть в
set $a string_replace ($a "." ",")
set $b string_replace ($b "." ",")

Они потом столкнутся лбами? Да или что?

/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////

Ну вот я сделал его
Код

double_left 440, 388 abs
wait 300
showwindow windowhandle MINIMIZE  // свернуть пилот
wait 1000
Sendex ^c
get clipboard $a    // получили число в переменную
double_left 633, 383 abs
wait 1000
Sendex ^c
get clipboard $b    // получили число в переменную
// дальше их сравниваем    СРАВНИВАЕМ ВСЁ ЧТО ДО ТОЧКИ? КАК ЭТО СДЕЛАТЬ?
set $a
set $b
set $a string_replace ($a "." ",")   // заменяем точку на запятую, иначе не будет работать trunc
set $b string_replace ($b "." ",")

log trunc($a)   trunc($b)
if  trunc($a) < trunc($b)  // теперь можно сравнить, если $a меньше $b
kleft 37, 190 abs // закрыть архив
// какие-то действия  продолжить скрипт с начала  полагаю, НО КАКОЙ ИЗ НИХ НАЧНЁТСЯ С НАЧАЛА? Просто продолжить выполнение скрипта.
end_if
end_script

только получилось что не тыкает по kleft 37, 190 abs по итогу сравнения
т.е. или не работает сравнение или я что-то не так написал

вот это выдаёт
13:21:07 2 (autosaved_19.txt, 16): -1 -1
13:24:53 2 (autosaved_19.txt, 16): -1 -1

Надо целое число сравнить, а не то что после точки. После точки пошло оно на..р



Помимо этого следующий вопрос:
Как пилот ловит окна в фоновом режиме, где-то сзади стоящие неактивные, по ID или чему-там еще. И считывает текст который там написан. А потом закрывает это окно?

Автор: cirus 26.10.2017, 11:15

Цитата
set $a
set $b

Толку не будет от того что вы дописываете то, чего нет ни в одном примере. Где вы это взяли? Убрать.
Значения этих переменных обновляются при копировании из буфера.
Цитата
set $a 424 292 539 292
drag $a
wait 300
Или эта меременная в дальнейшем в коде помешает?

Разные имена используйте.

Автор: Levo223 26.10.2017, 13:48

Цитата(cirus @ 26.10.2017, 11:15) *

Толку не будет от того что вы дописываете то, чего нет ни в одном примере. Где вы это взяли? Убрать.


Мне здесь подумалось, нет ли в пилоте например функции которая позволила бы переходить к строке с №, для облегчением всех этих прыжков от одного массива к другому?
Например у меня при сравнении чисел ставится необходимость вернуться к строке скрипта в котором были прописаны действия при нахождении "серого" окна, как это можно сделать? Более интуитивно бы понятно было
Я что-то читал про массивы и циклы, но не пойму зачем такая сложность когда можно указать просто номер строки...

Вот этот весь массив у меня, как на него сослаться, чтобы повторить действия при сером окне - включая счётчик переменных?
Код

if  #grey > 0    // если найдено серое окно
    kleft 1256 126   // клик в строку куда прописывать значение, указать нужные координаты
        wait 500
        send backspace // нажать баксп 5 раз
     send backspace
     send backspace
     send backspace
     send backspace
     wait 10
        set #count #count + 1     // переменная-счётчик
        if  #count > size(%num)   // если переменная-счётчик больше, чем размер массива num
            break            // break - сначала, end_script остановить скрипт, тут что делать если достигнута максимальная ставка
            // сейчас остановка скрипта, чтобы не было ошибки при выходе за пределы массива
        end_if
        set #summa %num [#count]   // присваиваиваем переменной значение из массива
        log Текущая ставка #summa
        send #summa  // напечать сумму
        Double_left 1247 68 // двойной клик в сторону
        wait random(2500) +3000
        log #count   #summa

Автор: Cockney 26.10.2017, 13:55

Цитата
Мне здесь подумалось, нет ли в пилоте например функции которая позволила бы переходить к строке с №


Цитата
Более интуитивно бы понятно было



Сколько же людей так ошибались и сходили с ума в последствии, когда им показывали верное решение....

Автор: Levo223 26.10.2017, 14:34

Беда
Прописываю Еще одно if

Код
if trunc($a) < trunc($b)   // сравниваем    2    ВЫИГРЫШ
Kleft 37 188 abs
wait 100
kleft 1256 126   // клик в строку куда прописывать значение, указать нужные координаты
        wait 500
        send backspace // нажать баксп 5 раз
     send backspace
     send backspace
     send backspace
     send backspace
     wait 10
        set #summa 100
        set #count 100 // сбрасываем счётчик на 0, т. е. ставки начнутся заново
        send #summa  // напечатать сумму
        Double_left 1247 68
        wait random(2500) +3000  // действия
        end_if


для сравнения ситуации равенства или меньше
и ничего не происходит. Выполняется только первый Trunc. Или я запутался в закрытии End_if, сколько их вообще в одном скрипте возможно? Или лучше как-то в одном прописать > < = ?

или для каждого trunc нужно копировать в своём массиве If... ?

Автор: cirus 26.10.2017, 15:42

Цитата
Вот этот весь массив у меня

Это не массив, а часть кода.
Цитата
и ничего не происходит.

Значит условие не является истиной.
Выводите в лог значения переменных, тогда будет понятнее почему не выполняется условие.
Код
log $a   $b
log trunc($a)   trunc($b)
if trunc($a) < trunc($b)
     // нужные действия
end_if

Цитата
Или я запутался в закрытии End_if, сколько их вообще в одном скрипте возможно?

Количество end_if равно количеству if. В одном скрипте условий может быть хоть сколько.
Цитата
нет ли в пилоте например функции которая позволила бы переходить к строке с №

Допустим была бы, дописали 1 строчку в начало скрипта, весь скрипт сместился и уже перейдёт не туда куда надо. Пока такой переход один ещё можно проследить логику скрипта, когда таких переходов будет больше, уже не понять что и в каком порядке работает.


Автор: Levo223 26.10.2017, 20:13

Цитата(cirus @ 26.10.2017, 15:42) *

Это не массив, а часть кода.
Код
log $a   $b
log trunc($a)   trunc($b)
if trunc($a) < trunc($b)
     // нужные действия
end_if


Как мне написать последовательную проверку
if trunc($a) < trunc($b)
действия set #summa 100
set #count 100 // сбрасываем счётчик на 0, т. е. ставки начнутся заново

if trunc($a) = trunc($b)
return к повтору последних действий перед началом сравнений

if trunc($a) > trunc($b)
возврат к "серому окну"

Одна из них проводится, на этом скрипт заканчивается и больше не идёт! Застопоривается на end_script ,хотя раньше через него проходило
В логах ничего нету
Код
23:59:05 21 (Сравнение.txt, 92): -1   -1
23:59:05 21 (Сравнение.txt, 114):  
23:59:05 21 (Сравнение.txt, 115): -1   -1


Автор: cirus 27.10.2017, 2:17

Во-первых, где код.
Во-вторых, переменные $a и $b содержат -1, а должны содержать скопированное число. Смысл дальше писать код, если предыдущая часть нормально не выполняется? Ищите почему не было копирования из буфера.
Скрипт можно писать отдельными частями, написали часть, проверили что она корректно работает, добавили в основной скрипт.

Автор: Levo223 27.10.2017, 5:33

Цитата(cirus @ 27.10.2017, 2:17) *

Во-первых, где код.
Во-вторых, переменные $a и $b содержат -1, а должны содержать скопированное число.

Откуда я знаю почему оно не копирует. Вы же мне дали такой код -

Код

set #summa 100     // начальная ставка
init_arr %num 250 625 1526 3815 9700 24414 62500
set #count 0

while 1 = 1
    set #grey 0
    set #yellow 0
    while #grey = 0 and #yellow = 0   // ждём пока не появится серое или жёлтое окно
        set #grey findcolor(111, 397 350, 567 1 1 5130825 %arr)
        set #yellow findcolor(111, 397 350, 567 1 1 4709887 %arr)
        wait 100
    end_while

    if  #grey > 0    // если найдено серое окно
        kleft 1256 126   // клик в строку куда прописывать значение
        wait 500
        send backspace // нажать баксп 5 раз
     send backspace
     send backspace
     send backspace
     send backspace
     wait 10
        set #count #count + 1     // переменная-счётчик
        if  #count > size(%num)   // если переменная-счётчик больше, чем размер массива num
            break            // break - сначала, end_script остановить скрипт, тут что делать если достигнута максимальная

ставка
            // сейчас остановка скрипта, чтобы не было ошибки при выходе за пределы массива
        end_if
        set #summa %num [#count]   // присваиваиваем переменной значение из массива
        log Текущая ставка #summa
        send #summa  // напечать сумму
        Double_left 1247 68 // двойной клик в сторону
        wait random(2500) +3000
        send R
        log #count   #summa
        wait 200
    else   // иначе, т. е. найдено жёлтое окно
Kleft 37 188 abs
wait 500
kleft 261 178 abs
wait 500
double_left 440, 388 abs
wait 300
showwindow windowhandle MINIMIZE  // свернули пилот
wait 1000
Sendex ^c
get clipboard $a    // получили число а в переменную
double_left 633, 383 abs
wait 1000
Sendex ^c
get clipboard $b    // получили число  в переменную, Число не получается, хотя при ручной вставке обнаруживается что оно скопировано в буфер
// дальше их сравниваем    СРАВНИВАЕМ ВСЁ ЧТО ДО ТОЧКИ
set $a
set $b
set $a string_replace ($a "." ",")   // заменяем точку на запятую, иначе не будет работать trunc
set $b string_replace ($b "." ",")
log $a  $b
log trunc($a)   trunc($b)
if trunc($a) > trunc($b)   // сравниваем   1           ПРОИГРЫШ
wait 100
Kleft 35 101
wait 100
kleft 1256 126   // клик в строку куда прописывать значение, указать нужные координаты
        wait 500
        send backspace // нажать баксп 5 раз
     send backspace
     send backspace
     send backspace
     send backspace
     wait 10
        set #count #count + 1     // переменная-счётчик
        if  #count > size(%num)   // если переменная-счётчик больше, чем размер массива num
            break            // break - сначала, end_script остановить скрипт, тут что делать если достигнута максимальная

  // действия
set #summa %num [#count]   // присваиваиваем переменной значение из массива
        log Текущая ставка #summa
        send #summa  // напечать сумму
        Double_left 1247 68 // двойной клик в сторону
        wait random(2500) +3000
        send R
        log #count   #summa
        wait 200

end_if
end_if
set $a
set $b
set $a string_replace ($a "." ",")   // заменяем точку на запятую
set $b string_replace ($b "." ",")
log $a  $b
log trunc($a)   trunc($b)
if trunc($a) < trunc($b)   // сравниваем    2    ВЫИГРЫШ
Kleft 35 101
wait 100
kleft 1256 126   // клик в строку куда прописывать значение, указать нужные координаты
        wait 500
        send backspace // нажать баксп 5 раз
     send backspace
     send backspace
     send backspace
     send backspace
     wait 10
        set #summa 100
        set #count 100 // сбрасываем счётчик на 0, т. е. ставки начнутся заново
        send #summa  // напечатать сумму
        Double_left 1247 68
        wait random(2500) +3000  // действия
        end_if
set $a
set $b
set $a string_replace ($a "." ",")   // заменяем точку на запятую
set $b string_replace ($b "." ",")
log $a  $b
log trunc($a)   trunc($b)
if trunc($a) = trunc($b)   // сравниваем    3   РАВЕНСТВО
     Kleft 35 101
     wait 100
     Send Q // какое-то действие
    wait 100
    end_if
end_script
       end_if
end_while

Автор: cirus 27.10.2017, 10:22

Цитата
set $a
set $b
Толку не будет от того что вы дописываете то, чего нет ни в одном примере. Где вы это взяли? Убрать.

Для кого я это пишу? Что не понятного в слове убрать?
Цитата
Откуда я знаю почему оно не копирует. Вы же мне дали такой код -

Я пишу пример как можно что-то сделать, как его применять, где использовать и дорабатывать ваше дело.
Цитата
на этом скрипт заканчивается и больше не идёт! Застопоривается на end_script

end_script - конец скрипта. По сути остановить скрипт. Удивительно почему дальше скрипт не работает?

Автор: Levo223 28.10.2017, 14:05

Цитата(cirus @ 27.10.2017, 10:22) *

Для кого я это пишу? Что не понятного в слове убрать?

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

end_script - конец скрипта. По сути остановить скрипт. Удивительно почему дальше скрипт не работает?


Да спасибо, теперь вроде бы всё

Еще как можно прописать команду которая бы возвращала после всех манипуляций активное окно перед тем как было активировано данное окно. Если они не свёрнуты но перекрыты?

Автор: cirus 28.10.2017, 19:35

Цитата
команду которая бы возвращала после всех манипуляций активное окно перед тем как было активировано данное окно.

http://uopilot.tati.pro/index.php?title=Showwindow

Автор: Levo223 29.10.2017, 14:14

Цитата(cirus @ 28.10.2017, 19:35) *

http://uopilot.tati.pro/index.php?title=Showwindow


Как вернуться к началу If?
Если этих If много, а мне нужен именно один из них?
Т.е. что отличает команду End_if с продолжением выполнения цикла ниже, от команды возврата к началу этого If пока что-то не выполнено?

Автор: cirus 29.10.2017, 15:52

Использовать while вместо if.

Код
if условие  
    // выполнится однократно, если условие является истиной
end_if

Код
while условие
    // будет выполняться пока условие является истиной
end_while

Например:
Код
log clear
set #a 3
if #a < 7   // если переменная #a меньше 7
    log #a  // вывести в лог
end_if
log
while #a < 7  // пока переменная #a меньше 7
    log #a    // вывести в лог
    set #a #a + 1   // увеличиваем переменную #a на 1
end_while
end_script



Автор: Levo223 29.10.2017, 21:22

Так у меня затруднение какое-то получилось.
мне нужно выйти за пределы цикла и написать возврат к нему ниже. Не буду же я копировать одно и тоже по 100 раз. Вот почему и говорю что возврат к строке или переменной с Уникальным номером было бы естественным выходом из порочных дъявольских кругов цикличности. Тот кто изобрёл программирование был... мазохист.

wile 1=1 (#A)
бла бла
if = 1
Тут надо писать end_if ? Или как мне вывести за пределы этого цикла условие если if не равно 1
end_while (то есть начать цикл заново)
else (это же относится к началу if, будет ли оно в таком случае работать)-- в противном случае

те же действия что в общем цикле
но по ходу их выполнения может возникнуть необходимость несколько раз вернуться к циклу #А

Графически объясню что я хочу потому что на словах не очень
https://ibb.co/m11hmR

Вот во вторых квадратиках у меня может содержаться то, что уже сделано в первых, и как мне сослаться на решение в первых чтобы не писать его по 100 раз в тех что будут после него?

В природе всё гораздо проще - решает сила а не переменные)

Автор: cirus 29.10.2017, 21:59

Цитата
цикл if

if это не цикл, а проверка условия на истина/ложь.
Цитата
мне нужно выйти за пределы цикла и написать возврат к нему ниже.

Код
while 1 = 1
    gosub metka      // перейти к метке (имя может быть любое)
end_while
end_script

:metka
    // тут могут быть любые проверки/действия или другой цикл
    if  1 = 1
        // бла бла
    else
        // бла бла
    end_if
return        // возвращаемся к месту перенаправления, т. е. обратно в цикл

Автор: Levo223 30.10.2017, 1:48

Цитата(cirus @ 29.10.2017, 21:59) *

Код
while 1 = 1
    gosub metka    
return        // возвращаемся к месту перенаправления, т. е. обратно в цикл


А если по этой метке пройдется цикл из другого скрипта - он не перенаправится?

Вот такая проблема.
Есть цикл
while 1=1
в нем еще 1 цикл
while 2=2
а в нём проверка условия
если то
в противном случае
Но противный случай выходит за пределы цикла
И что делать?

т.е. тут
if > 0
нужен повтор цикла
а если if <0
то нужно что бы этот цикл прервался и скрипт пошел дальше?

while 1=1
while 2=2
if #f > 0 // если найдено f
return
else
gosub :metka (а если gosub этот заденет прохождение другого скрипта то сюда вернётся?) или как застраховаться чтобы его другие циклы не брали в учёт?
Или что делать?
end_while
end_while

Автор: cirus 30.10.2017, 11:04

Код
while 1 = 1    // (цикл 1)
    while 2 = 2   // (цикл 2)
        if var > 0   // если переменная var больше 0 переход к метке
            gosub metka  // переход в подпрограмму
            // после возвращения из подпрограммы оба цикла продолжат работу
        else
            break    // если var меньше или равно 0, выйти из цикла 2
                     // если надо выйти и из цикла 1, то break 2 (где 2 - это уровень вложенности циклов)
        end_if
    end_while
end_while

Цитата
gosub :metka

Код
gosub metka   // без двоеточия

Автор: Levo223 30.10.2017, 11:19

Цитата(cirus @ 30.10.2017, 11:04) *

[code]while 1 = 1 // (цикл 1)
while 2 = 2 // (цикл 2)
if var > 0 // если переменная var больше 0 переход к метке


Ах да забыл спросить, проигрывание звуков возможно со ссылкой на файл? Это что должно быть открытие какой-то сторонней программой? Или взятие в хендл допустим такого-то окна плеера и нажатие опять же по координатам его кнопки запуска проигрывания файла, или как-то проще можно сделать?

Автор: cirus 30.10.2017, 11:22

Цитата
проигрывание звуков возможно со ссылкой на файл?

http://uopilot.tati.pro/index.php?title=Alarm

Автор: Levo223 30.10.2017, 13:15

Цитата(cirus @ 30.10.2017, 11:22) *

http://uopilot.tati.pro/index.php?title=Alarm

О круто)

Как точно прописать хендл окна которое нужно сделать активным, в скобках или без скобок? Вот у меня есть Program Meneger
Его то есть писать showwindow windowhandle Program manager SHOW че то оно не показывает?

Автор: cirus 30.10.2017, 13:39

Не надоело ещё придумывать свой синтаксис для команд? smile.gif
http://uopilot.tati.pro/index.php?title=Showwindow

Код
set #handle findwindow ("Яндекс.Браузер")  // найти окно яндекса
showwindow #handle  // показать окно
end_script

Код
set #handle findwindow ("Яндекс.Браузер")   // найти окно яндекса
set workwindow #handle   //сделать его рабочим окном
showwindow  // показать рабочее окно
end_script

Цитата
windowhandle

Это переменная, хранящая хендл окна пилота.

Автор: Levo223 30.10.2017, 13:53

Цитата(cirus @ 30.10.2017, 13:39) *

Не надоело ещё придумывать свой синтаксис для команд? smile.gif
http://uopilot.tati.pro/index.php?title=Showwindow
Код
set #handle findwindow ("Яндекс.Браузер")  // найти окно яндекса
showwindow #handle  // показать окно
end_script

Код
set #handle findwindow ("Яндекс.Браузер")   // найти окно яндекса
set workwindow #handle   //сделать его рабочим окном
showwindow  // показать рабочее окно
end_script


Это переменная, хранящая хендл окна пилота.


Такая проблема. Я указываю окно. Но когда оно показывается там сбиваются все координаты. Потому что в привязке оно называется по другому. А то название я не могу полностью прочитать оно не показывается. Есть какая-то зависимость между абсолютными и относительными которые показываются при привязке пилота Ctrl+A?

И можно ли как-то по № показывать окна а не по названию?

Автор: cirus 30.10.2017, 14:54

http://uopilot.tati.pro/index.php?title=Поиск_пути_к_дочернему_окну
Координаты сбиваются потому что через Ctrl + A привязываетесь к дочернему окну, а findwindow находит родительское. Надо найти путь от родительского к дочернему и дочернее делать рабочим.

Автор: Levo223 30.10.2017, 15:12

Цитата(cirus @ 30.10.2017, 14:54) *

http://uopilot.tati.pro/index.php?title=Поиск_пути_к_дочернему_окну
Координаты сбиваются потому что через Ctrl + A привязываетесь к дочернему окну, а findwindow находит родительское. Надо найти путь от родительского к дочернему и дочернее делать рабочим.

Не пойму, вот есть скрипт

Код

set #ownerHandle findwindow (Небеса: уникальная игра! - Игра – Yandex)
set #tmp getwindow (#ownerHandle child)
set #childHandle getwindow (#tmp )
set workwindow #childHandle


Выдаёт ошибку!

Куда здесь вписать № дочернего, и куда родительского?

если родительское 1312146
а дочернее 1967758
???

И его получается один раз поставить в начале скрипта, и больше никуда не вписывать? Писать только родительское?

Автор: cirus 30.10.2017, 15:19

Цитата
Не пойму, вот есть скрипт

Это не скрипт, а результат работы скрипта. Скрипт находится ниже. Читайте до конца страницу.
Про номера забудьте вообще, они не нужны, т. к. меняются при перезапуске приложения.

Автор: Levo223 30.10.2017, 19:41

Есть еще один вопрос. Как заставить рандомно нажимающуюся клавишу нажиматься еще раз точно также как первый рандом? Т.е. как-то через лог вывести сравнение?
Т.е. допустим есть

Код
repeat 2
init_arr %a А В   // клавиши
set #rand random(size(%a)) + 1    // случайное число от 1 до количество_символов_в_массиве
send %a [#rand]
log A, B .... //как прописать в логе чтобы оттуда взяло нажатую клавишу и повторило её нажатие еще X раз? Может ниже? На чем именно определяется рандом? Важно чтобы было без задержки.
Нужно чтобы если нажалось A, то она же нажалась 2 раза, если B то 2 раза.
End_Repeat



Т.е. я бы допустим хотел удвоить рандом и утроить, но он каждый раз разный!

Автор: cirus 31.10.2017, 1:59

Цитата
Как заставить рандомно нажимающуюся клавишу нажиматься еще раз

Код
init_arr %a А В   // клавиши
set #rand random(size(%a)) + 1    // случайное число от 1 до количество_символов_в_массиве
send %a [#rand]  // нажать клавишу
send %a [#rand]  // нажать ещё раз

Автор: Levo223 31.10.2017, 8:05

Цитата(cirus @ 31.10.2017, 1:59) *

Код
init_arr %a А В   // клавиши
set #rand random(size(%a)) + 1    // случайное число от 1 до количество_символов_в_массиве
send %a [#rand]  // нажать клавишу
send %a [#rand]  // нажать ещё раз


так нажимается рандомно, если первая А может нажаться В

Вот что я хочу

К примеру рандомно выбирается одно из чисел

Код

if %a [#rand] = 1
send А
else // т.е. если оно равно 2
send В
end_if


Как это будет выглядеть?

Автор: cirus 31.10.2017, 11:31

Цитата
если первая А может нажаться В

Не может.
Код
log clear
init_arr %a А В   // клавиши
set #rand random(size(%a)) + 1    // случайное число от 1 до количество_символов_в_массиве
log %a [#rand]  // клавиша
log %a [#rand]  // та же самая клавиша
end_script

В логе будет либо две A, либо две B.

Автор: Levo223 31.10.2017, 14:41

Цитата(cirus @ 31.10.2017, 11:31) *

Не может.
Код
log clear
init_arr %a А В   // клавиши
set #rand random(size(%a)) + 1    // случайное число от 1 до количество_символов_в_массиве
log %a [#rand]  // клавиша
log %a [#rand]  // та же самая клавиша
end_script

В логе будет либо две A, либо две B.

понял

Автор: Levo223 31.10.2017, 19:20

Цитата(cirus @ 31.10.2017, 11:31) *



Еще по какой-то причине происходит стопор
вот в этой части скрипта

Код

kleft 194 249
    wait 200
    kleft 1256 126   // клик в строку куда прописывать значение, указать нужные координаты
    wait 100
     send backspace // нажать баксп 5 раз
     send backspace
     send backspace
     send backspace
     send backspace
     wait 100
        set #count #count + 1     // переменная-счётчик
        if  #count > size(%num)   // если переменная-счётчик больше, чем размер массива num
        break// break - сначала, end_script остановить скрипт, тут что делать если достигнута максимальная
       // сейчас остановка скрипта, чтобы не было ошибки при выходе за пределы массива
        end_if

он как будто на 2 круга проходит
толи из-а break, толи счётчик долго думает что скрипт успевает пойти на второй круг, хотя максимальная ставка не достигнута...

А также мне данный счётчик необходимо переделать под количество нажатий а не под увеличение размера ставки.
Т.е. допустим у нас будет

Код

set #summa 1     // начальное число
init_arr %num 2 4 8 16
set #count 0
(где num это количество нажатий на кнопку, из тех рандомов что обсуждалось выше)
Как это всё не запутать?

if A>0
set #count #count + 1     // переменная-счётчик
        if  #count > size(%num)   // если переменная-счётчик больше, чем размер массива num
        break//тут что делать если достигнут мах нажатий
       // сейчас остановка скрипта, чтобы не было ошибки...
        end_if

        set #summa %num [#count]   // присваиваиваем переменной значение из массива
        log Текущее количество нажатий #summa
        send #summa  // напечать ...


Как это лучше оформить, с учётом того что обсуждалось выше?
Т.е. рандомное нажатие 1, затем 2, затем 3 ит.д.

Автор: cirus 1.11.2017, 3:39

Цитата
он как будто на 2 круга проходит
толи из-а break, толи счётчик долго думает что скрипт успевает пойти на второй круг

Как написали скрипт, так и работает. Выводите в лог действия и переменные, тогда можно будет отследить в каком месте что-то идёт не так. Т. е. допишите в нужным местах что-нибудь вроде:
Код
log #count 
log Делаем ставку
log Выход из цикла

Цитата
Т.е. рандомное нажатие 1, затем 2, затем 3 ит.д.

Так что ли?
Код
init_arr %num 2 4 8 16   // количество нажатий
set #count 0
init_arr %a А В   // клавиши

log clear
log mode compact
log open 0 0 200 600
while #count < size(%num)
    set #count #count + 1
    set #rand random(size(%a)) + 1
    for #i 1 %num [#count]
        log        %a [#rand]  // клавиша, вместо log нужен будет send
    end_for
    log
end_while
end_script

Автор: Levo223 1.11.2017, 16:00

Цитата(cirus @ 1.11.2017, 3:39) *

Так что ли?
Код
init_arr %num 2 4 8 16   // количество нажатий
set #count 0
init_arr %a А В   // клавиши

log clear
log mode compact
log open 0 0 200 600
while #count < size(%num)
    set #count #count + 1
    set #rand random(size(%a)) + 1
    for #i 1 %num [#count]
        log        %a [#rand]  // клавиша, вместо log нужен будет send
    end_for
    log
end_while
end_script



Да, что.то вроде того. Как будет команда на то чтобы окно лога не вылазило сразу после первой записи а сворачивалось и там оставалось?

Автор: Levo223 1.11.2017, 17:56

--

Автор: cirus 2.11.2017, 2:01

Цитата
Как будет команда на то чтобы окно лога не вылазило сразу после первой записи а сворачивалось и там оставалось?

Код
log open 0 0 500 300  // открыть лог в координатах 0 0, размером 500 300
showwindow loghandle minimize   // свернуть окно лога
end_script

Автор: Levo223 2.11.2017, 10:53

[quote name='cirus' date='2.11.2017, 2:01' post='421377']
У меня что-то случилось с пилотом, такое ощущение что действия из других скриптов вмешиваются в работу текущего скрипта, т.е. делают то что не написано? Он своей жизнью зажил?

Или я нажал что-то не то?


Можно ли убрать из сравнения первые 4 строки, если они уже фигурируют в данном скрипте но над If который выше этого? Будет ли работать. Числа в переменную уже же получены? Или не будет работать?

Код

set $a string_replace ($a "." ",")   // заменяем точку на запятую, иначе не будет работать
set $b string_replace ($b "." ",")
log $a  $b
log trunc($a)   trunc($b)

if trunc($a) < trunc($b)  
IIII
end_if


Т.е. Можно ли написать вот так

Код

set $a string_replace ($a "." ",")   // заменяем точку на запятую, иначе не будет работать
set $b string_replace ($b "." ",")
log $a  $b
log trunc($a)   trunc($b)

if trunc($a) < trunc($b)    
IIII
end_if

if trunc($a) > trunc($b)    
IIe
end_if

if trunc($a) = trunc($b)    
IIUU
end_if

???




Автор: cirus 3.11.2017, 2:22

Цитата
Т.е. Можно ли написать вот так

Можно и даже нужно.

Автор: Levo223 3.11.2017, 7:12

Еще одна проблема, сейчас в циклах If стоит какой-то беспорядок
перескакивает с одного на другой, хотя я вроде ничего не менял

Есть

Код

while 1=1
while Grey/Yelow
1111
end_while

if #grey > 0
  12345
else //////////////////////////////// что тут не так?

if trunc($a) < trunc($b)    
IIII
end_if

тут перескакивает на следующий if

if trunc($a) > trunc($b)    
IIe
end_if

тут перескакивает на следующий if

if trunc($a) = trunc($b)    
IIUU
end_if
end_if
end_while

КАк сделать так чтобы после else скрипт возвращался к while Grey/Yelow, а не продолжал сравнение

А также после каждого сравнения > < = возвращался в начало цикла а не продолжал сравнивать?

Автор: cirus 3.11.2017, 13:15

код
Код
while 1=1
    while Grey/Yelow
        1111
    end_while

    if  #grey > 0
        12345
    else
        if  trunc($a) < trunc($b)      // если $a < $b
            IIII
        else                           // иначе
            if  trunc($a) > trunc($b)  // если $a > $b
                IIe
            else                       // иначе $a = $b
                IIUU
            end_if
        end_if
    end_if
end_while

Автор: Levo223 3.11.2017, 18:11

Цитата(cirus @ 3.11.2017, 13:15) *

код
Код
while 1=1
    while Grey/Yelow
        1111
    end_while

    if  #grey > 0
        12345
    else
        if  trunc($a) < trunc($b)      // если $a < $b
            IIII
        else                           // иначе
            if  trunc($a) > trunc($b)  // если $a > $b
                IIe
            else                       // иначе $a = $b
                IIUU
            end_if
        end_if
    end_if
end_while



Я не знаю что происходит. Раньше работало без этого. а теперь всё сбилось!


Могут ли одновременно 2 скрипат работать? Я не пойму у меня всё правильно написано, какая-то дичь происходит? Вроде в другом скрипте тоже привязка к этому окну стоит? Работает только активный скрипт или все которые привязаны? И как отвязать остальные?

Автор: cirus 4.11.2017, 0:10

Цитата
Могут ли одновременно 2 скрипат работать?

Могут. Скрипты работают независимо друг от друга. Но, надо учитывать что в системе только 1 курсор, 1 буфер. Например, не надо из нескольких скриптов пытаться перемещать курсор.
Кстати, если скрипты работают в одном и том же окне, то в 99% случаев достаточно одного скрипта. Там где появляются 2 скрипта, к бабке не ходи будет и 5, и 10 скриптов. И все для одного окна.
Цитата
у меня всё правильно написано

Меня терзают смутные сомнения...
Выкладывайте код и опишите что работает нет так.

Автор: Levo223 4.11.2017, 0:34

Цитата(cirus @ 4.11.2017, 0:10) *

Могут. Скрипты работают независимо друг от друга. Но, надо учитывать что в системе только 1 курсор, 1 буфер. Например, не надо из нескольких скриптов пытаться перемещать курсор.
Кстати, если скрипты работают в одном и том же окне, то в 99% случаев достаточно одного скрипта. Там где появляются 2 скрипта, к бабке не ходи будет и 5, и 10 скриптов. И все для одного окна.

Нет я просто к тому что из одного окна пилота несколько скриптов..? В нескольких окнах то я запускал. Просто для поиска.

Автор: cirus 4.11.2017, 1:01

Цитата
Нет я просто к тому что из одного окна пилота несколько скриптов..?

Хоть 99 пилотов запустите, хоть 99 вкладок, разницы не будет.

Автор: Levo223 8.11.2017, 0:43

Цитата(cirus @ 4.11.2017, 1:01) *

Хоть 99 пилотов запустите, хоть 99 вкладок, разницы не будет.


У меня почему-то работает схема

if главное

else

if
End_if

If
End_if

If
End_if
End_if

скрипт проверяет последовательно каждое из условий и записывает в лог,
и никаких else между ними не требуется, чем это плохо? else наоборот всё сбивает

Но существует задержка между 1 и второй ставкой, я так и не пойму где запинка. Счётчик как будто чем-то подавился, очень долго думает. потом 2 раза тыкает в ввод, как будто по второму кругу пошёл но всё равно ставит. Следующие ставит быстро. возможно причина в Break посредине цикла, но я не знаю что еще поставить.

set #count #count + 1 // переменная-счётчик
if #count > size(%num) // если переменная-счётчик больше, чем размер массива num
break // break - сначала, end_script остановить скрипт, тут что делать если достигнута макс ставка
// сейчас остановка скрипта, чтобы не было ошибки при выходе за пределы массива
end_if
set #summa %num [#count] // присваиваиваем переменной значение из массива
log Текущая ставка #summa

Автор: cirus 8.11.2017, 2:03

Скрипт --> форматировать.
Расставятся отступы и будет понятнее что к чему.

Код
if  главное   // условие1
    // условие1 является истиной, выполняется эта часть, всё что от else до end_if (окончание условия1) пропускается
else
    // условие ложь, выполняется всё что идёт до end_if (окончание условия1)
    if       // условие2
    End_if   // окончание условия2

    If       // условие3
    End_if   // окончание условия3

    If       // условие4
    End_if   // окончание условия4
End_if     // окончание условия1

Автор: Levo223 9.11.2017, 0:02

Цитата(cirus @ 8.11.2017, 2:03) *

// условие ложь, выполняется всё что идёт до end_if (окончание условия1)
if // условие2
End_if // окончание условия2

If // условие3
End_if // окончание условия3

If // условие4
End_if // окончание условия4
End_if // окончание условия1[/code]

Расставилось

Почему-то не получается найти цвет в перекрытом окне устанавливаю хендл рабочего и задаю его в скобках

set workwindow 66210
while 1 = 1 // начало цикла
set #grey 0
while #grey = 0 // ждём пока не появится серое
set #grey findcolor(78, 35 99, 43 1 1 4737096 %arr workwindow) // ЦИКЛ ОЖИДАНИЯ
wait 100
end_while
Aero включен, что еще нужно
но почему-то не ищет, в инструкции сказано что по относительным координатам, толи его рабочим не хочет признавать толи хз, других окон нет

В окне поиска F показывает черный квадрат, окно монолитное...

Автор: cirus 9.11.2017, 2:06

Цитата
В окне поиска F показывает черный квадрат

Привязка не к тому окну. Обычно нужен хендл родительского окна. Если браузер, то Ctrl + A на рамке или заголовке.
Код
set #grey findcolor(0 0 1920 1080 1 1 4737096 %arr workwindow)  // для теста координаты указываем больше
hint #grey
end_script





Автор: Levo223 9.11.2017, 11:08

Цитата(cirus @ 9.11.2017, 2:06) *

Привязка не к тому окну. Обычно нужен хендл родительского окна. Если браузер, то Ctrl + A на рамке или заголовке.
Код
set #grey findcolor(0 0 1920 1080 1 1 4737096 %arr workwindow)  // для теста координаты указываем больше
hint #grey
end_script



Вобщем в логе пишет вот так, я её сделал

15:01:47 21 (Модиф 21.txt, 32): что за хрень 1501 1501 + 1
15:01:47 21 (Модиф 21.txt, 34): наступил break

Код

if  #count > size(%num)   // если переменная-счётчик больше, чем размер массива num
            log наступил break
            break // break - сначала,

данная часть скрипта пропускает выполнение в себя даже если не максимальная ставка? как быть?


[quote name='Levo223' post='421509' date='9.11.2017, 11:08']
Вобщем в логе пишет вот так, я её сделал

15:01:47 21 (Модиф 21.txt, 32): что за хрень 1501 1501 + 1
15:01:47 21 (Модиф 21.txt, 34): наступил break

Код

if  #count > size(%num)   // если переменная-счётчик больше, чем размер массива num
            log наступил break
            break // break - сначала,

данная часть скрипта пропускает выполнение в себя даже если не максимальная ставка? как быть?


Автор: cirus 9.11.2017, 11:59

Цитата
данная часть скрипта пропускает выполнение

Выводите значения в лог и смотрите является ли условие истиной.
Код
log #count > size(%num)
if  #count > size(%num)

Автор: Levo223 9.11.2017, 14:18

Цитата(cirus @ 9.11.2017, 11:59) *

Выводите значения в лог и смотрите является ли условие истиной.
Код
log #count > size(%num)
if  #count > size(%num)



Является но сравнивает с порядковым номером а не со значением ставки!
Код

18:11:47 21 (Модиф 21.txt, 32): 1501 > 4

Автор: cirus 9.11.2017, 14:47

Что написано, то и сравнивается.

Автор: Levo223 9.11.2017, 14:58

Цитата(cirus @ 9.11.2017, 14:47) *

Что написано, то и сравнивается.


А как написать чтобы сранивало со значением а не с порядковым его номером?

Автор: cirus 9.11.2017, 15:13

Цитата
А как написать чтобы сранивало со значением а не с порядковым его номером?

Код
set %arr [1] 12
set %arr [2] 6
set %arr [3] 123
set %arr [4] 77

set #count 3
log %arr [#count]    // вывести в лог значение 3 элемента массива
end_script

Автор: Levo223 9.11.2017, 17:03

Цитата(cirus @ 9.11.2017, 15:13) *

Код
set %arr [1] 12
set %arr [2] 6
set %arr [3] 123
set %arr [4] 77

set #count 3
log %arr [#count]    // вывести в лог значение 3 элемента массива
end_script



что обозначают числа 12. 6. 123. 77 ?

А не проще?

Обозначить макс ставку какой-нибудь допустим Х
set #x 100 // макс ставка
if #count >= #x ???

--------------------------

Я не пойму вот этого момента
Код

set #count #count + 1     // переменная-счётчик
            if  #count > size(%num)   // если переменная-счётчик больше, чем размер массива num
                log достигнута максимальная ставка // end_script остановить скрипт, тут что делать если достигнута максимальная
                // сейчас остановка скрипта, чтобы не было ошибки при выходе за пределы массива
            end_if
            set #summa %num [#count]   // присваиваиваем переменной значение из массива
            log Текущая ставка #summa
            send #summa  // напечать сумму

В каком месте здесь остановка скрипта?

Проверку на макс ставку нужно проводить не во время её постановки, а во время прихода окон.
Т.е. в начале цикла определения окна.
Но если я поставлю в каждой проверке такой цикл

Код
if  #grey > 0    // если найдено серое окно
if  #count = #x
            end_script
если поставлю else
то куда девать             end_if ?

if #yellow >0
if  #count = #x
            end_script
снова куда девать?
else
и
end_if

Если поставлю в конец? Они не запутаются?

Вобщем нужно условие которое нужно поставить в начало каждого нахождения окна
Код

if  #grey > 0    // если найдено серое окно         || (1) if ||
             if  #count = #x // где х это максимальная
            end_script
        else
        continue
        end_if[
                       wait 300
            kleft 1256 126 .........

Чтобы продолжало выполнение при ложности условия, и останавливало при истинности

Автор: cirus 10.11.2017, 2:18

Цитата
что обозначают числа 12. 6. 123. 77 ?

Ничего. Это лишь пример обращения к элементу массива.
Цитата
В каком месте здесь остановка скрипта?

Ни в каком. Строка end_script закомментирована.
Цитата
Проверку на макс ставку нужно проводить не во время её постановки, а во время прихода окон.

Зачем тогда вообще ждать окна? Ставка максимальная значит остановка скрипта. Т. е. проверять можно до поиска окон.
Цитата
if #grey > 0 // если найдено серое окно
if #count = #x
end_script
если поставлю else
то куда девать end_if ?

Разберитесь с if, пока не поймёте скрипт никогда не напишете. Обратите внимание как стоят end_if в примере 2 и 3.
Примеры
Код
// Пример 1
log clear
if  1 = 1
    log +++   // показать в логе если условие истина
end_if
end_script

Код
// Пример 2, проверены будут оба условия
log clear
if  1 = 1
    log +++   // показать в логе если условие истина
end_if
if  2 = 2
    log !!!   // показать в логе если условие истина
end_if
end_script

Код
// Пример 3, проверено будет первое условие, второе только если первое истина
// если первое ложь, то второе не будет проверено
log clear
if  1 = 1
    log +++   // показать в логе если условие истина
    if  2 = 2
        log !!!   // показать в логе если условие истина
    end_if
end_if
end_script

Код
// Пример 4
log clear
if  1 = 1
    log +++   // показать в логе если условие истина
else
    log !!!   // если истина ложь
end_if
end_script

Код
// Пример 5, проверено будет первое условие, второе только если первое ложь
log clear
if  1 = 1
    log +++   // показать в логе если условие истина
else
    if  2 = 2
        log !!!   // показать в логе если условие истина
    end_if
end_if
end_script

Автор: Levo223 10.11.2017, 13:19

Цитата(cirus @ 10.11.2017, 2:18) *

Зачем тогда вообще ждать окна? Ставка максимальная значит остановка скрипта. Т. е. проверять можно до поиска окон.

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

Цитата(cirus @ 10.11.2017, 2:18) *

Разберитесь с if, пока не поймёте скрипт никогда не напишете. Обратите внимание как стоят end_if в примере 2 и 3.
Примеры
Код
// Пример 1
log clear
if  1 = 1
    log +++   // показать в логе если условие истина
end_if
end_script

Код
// Пример 2, проверены будут оба условия
log clear
if  1 = 1
    log +++   // показать в логе если условие истина
end_if
if  2 = 2
    log !!!   // показать в логе если условие истина
end_if
end_script

Код
// Пример 3, проверено будет первое условие, второе только если первое истина
// если первое ложь, то второе не будет проверено
log clear
if  1 = 1
    log +++   // показать в логе если условие истина
    if  2 = 2
        log !!!   // показать в логе если условие истина
    end_if
end_if
end_script

Код
// Пример 4
log clear
if  1 = 1
    log +++   // показать в логе если условие истина
else
    log !!!   // если истина ложь
end_if
end_script

Код
// Пример 5, проверено будет первое условие, второе только если первое ложь
log clear
if  1 = 1
    log +++   // показать в логе если условие истина
else
    if  2 = 2
        log !!!   // показать в логе если условие истина
    end_if
end_if
end_script


Я понял, но почему оно у меня пропускает действия в скрипте даже если условие не истино?

Автор: cirus 10.11.2017, 13:42

Цитата
но почему оно у меня пропускает действия в скрипте даже если условие не истино?

Значит что-то неправильно написано.

Автор: Levo223 11.11.2017, 14:57

Цитата(cirus @ 10.11.2017, 13:42) *

Значит что-то неправильно написано.


Ну вот не пойму что не правильного в
Код
if  #count = #x
        log #count = #x
            end_script
        else
        log #count не равен #x
            continue
        end_if

однако она не переходит дальше
команда continue не срабатывает и она пишет в лог
18:53:39 21 (Модиф 21.txt, 28): 1500 не равен 8600
18:53:41 21 (Модиф 21.txt, 28): 1500 не равен 8600
18:53:43 21 (Модиф 21.txt, 28): 1500 не равен 8600
3 раза

Почему 3 раза? И почему не срабатывает? Цикл возвращается назад к поиску окон
Есть какая-то другая команда которая позволяет опустится за данный цикл и продолжить его если условие не истинно? /Break также не подходит

почему у меня теперь когда я закоментировал строку с проверкой на макс ставку
Код

set #count #count + 1     // переменная-счётчик
       // if  #count > size(%num)   // если переменная-счётчик больше, чем размер массива num
          //  break            // break - сначала, end_script остановить скрипт, тут что делать если достигнута максимальная ставка
            // сейчас остановка скрипта, чтобы не было ошибки при выходе за пределы массива
        //end_if
        set #summa %num [#count]   // присваиваиваем переменной значение из массива
        log Текущая ставка #summa
        send #summa  // напечать сумму

печатается 0 вместо следующей суммы?

Автор: cirus 11.11.2017, 19:49

continue относится к циклу for, но не while.

Цитата
#count не равен #x
1500 не равен 8600
set #summa %num [#count] // если #count = 1500, то вы обращаетесь к 1500 элементу массива

В массиве 1500 элементов? Сомневаюсь. Странно что вообще не выбило ошибку.
Цитата
Есть какая-то другая команда которая позволяет опустится за данный цикл и продолжить его если условие не истинно? /Break также не подходит

В кусках кода, который вы выкладываете, циклов нет вообще.
Нет кода, нет нормального описания что должно быть. Тут же не форум гадалок.


Автор: Levo223 13.11.2017, 1:18

Цитата(cirus @ 11.11.2017, 19:49) *

В кусках кода, который вы выкладываете, циклов нет вообще.


Впринципе пока не критично. Всёравно при макс ставке скрипт в ней намертво виснет) Так что ничего страшного не произойдет)

Теперь передо мной стоит другая задача - как найти при открытом браузере с привязанным к нему пилотом другое окно, взять из него данные и выполнить обратно действия в браузере на основании взятых оттуда данных?
Браузер имеет родительское и дочернее, и окно алерта также имеет родительское и дочернее? Что тут нужно будет делать? Перепривязку? Для поиска слова в дочернем окне алерта. Или же слово найти можно будет в родительском? Там оно есть но не редактируемо, только кликабельно, но не хотелось бы делать его активным для кликов, а сделать это фоном. Какая нужно будет команда (Getwindow/Findwindow) чтобы скрипт не запутался в ходе их смены? И нужна ли будет вобще смена? Вобщем нужно скопировать текст/найти слово в перекрытом окне не делая его активным.

Это древо окна алерта
https://imgbb.com/
Скрипт должен:
1) Находиться в ожидании появления (Alert)(1)
2) Копировать верхнюю строку (2) или найти в ней Demand/ Supply(опционно)
3) Закрыть окно/или Нажать ОК кнопку(3) ну или тыкать на крестик. Пробовал Sendex @{f4} закрывается только пилот)
4) Исходя из найденой переменной Demand/Supply выполнять какие-то действия в браузере
само окно

https://imgbb.com/


Скрипт.. Ну что-то подобное

Код

while 1=1
    set #window Alert = 0
    while 2=2
       findwindow (Alert)
       end_while
      if Alert > 0
      log Alert найден
      //Ищем дочернее окно
     // set #ownerHandle findwindow (Алерт)
//set #tmp getwindow (#ownerHandle child) --
//set #tmp getwindow (#tmp next)
//set #tmp getwindow (#tmp next)
//set #childHandle getwindow (#tmp next)
//set workwindow #childHandle     //сделать рабочим окном
    // надо ли тут привязку делать?
// как скопировать строку AUDUSD M15 Demand Zone Entered at 0.76581? Или можно как-то найти это слово без копирования?
//Далее когда мы его находим, нужно получить что-то вроде
Sendex ^c
get clipboard $var
find word Demand
close "Alert"

//Пошли действия в браузере
if $var > 0
log Demand найден
send F // действия в браузере
else
log Demand не найден
send G // Действия в браузере
End_if
End_while
Вроде бы всё


Как это сделать?

Автор: cirus 13.11.2017, 2:22

Для начала проверить находится ли изображение в перекрытом окне. Кнопка F в окне пилота, там должно отображаться окно программы Алерт во время работы findimage. Вырезаете нужный текст и ищете.

Код
set #handle findwindow("Алерт")  // ищем окно  Алерт"
while #handle = 0    // пока не найдено
    set #handle findwindow("Алерт")  // ищем окно  Алерт"
    wait 100
end_while
set #a findimage(0 0 500 500 (C:\Demand.bmp) %arr #handle)   // искать картинку в окне Алерт
log #a
end_script

Цитата
Пробовал Sendex @{f4} закрывается только пилот

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

Автор: Levo223 13.11.2017, 15:24

Цитата(cirus @ 13.11.2017, 2:22) *

Для начала проверить находится ли изображение в перекрытом окне. Кнопка F в окне пилота, там должно отображаться окно программы Алерт во время работы findimage. Вырезаете нужный текст и ищете.
Код
set #handle findwindow("Алерт")  // ищем окно  Алерт"
while #handle = 0    // пока не найдено
    set #handle findwindow("Алерт")  // ищем окно  Алерт"
    wait 100
end_while
set #a findimage(0 0 500 500 (C:\Demand.bmp) %arr #handle)   // искать картинку в окне Алерт
log #a
end_script


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


Ладно, закрывает. Если найдется способ закрыть его без вывода на передний план это лучше

Автор: cirus 13.11.2017, 15:33

Цитата
Как теперь закрыть его?

Код
terminate Алерт   // закрыть все окна с именем Алерт
end_script

Автор: Levo223 13.11.2017, 15:43

Цитата(cirus @ 13.11.2017, 15:33) *

Код
terminate Алерт   // закрыть все окна с именем Алерт
end_script


МММ Mass Armageddon)))

Вобще-то по этой команде целиком закрывает и терминал, а это делать не надо...

Автор: Levo223 13.11.2017, 16:57

Цитата(cirus @ 13.11.2017, 15:33) *

Код
terminate Алерт   // закрыть все окна с именем Алерт
end_script



что-то не пойму
Вот есть скрипт


set #ownerHandle findwindow (Google Chrome)
set #tmp getwindow (#ownerHandle child)
set #childHandle getwindow (#tmp )
set workwindow #childHandle

end_if
end_while
if #handle > 0
set #a findimage(0 0 500 500 (C:\Supply.bmp) %arr #handle) // искать картинку Supply в окне Алерт
set #b findimage(0 0 500 500 (C:\Demand.bmp) %arr #handle) // искать картинку Demond в окне Алерт
if #a > 0
https://imgbb.com/
end_if
else
return
end_if


Всё разобрался)

Автор: Levo223 15.11.2017, 13:33

Цитата(cirus @ 13.11.2017, 15:33) *

[code]terminate Алерт



Теперь есть другая проблема:

Каким образом сделать счетчик с таймером? Чтобы у меня сканировалось событие, включался таймер и счетчик. А по истечении времени сбрасывался счетчик и таймер.

Т.е. пример.
У меня есть алерт, пилот сканирует его(найдя картинку присваевает ей переменную, количество которой затем будет сбрасываться) Т.е. нашел он первый раз, записывает в память и ждет. Если по истечении 3х минут(в определенном промеж времени) данная картинка появляется снова - идут какие-то действия, если не появляется - счетчик этой картинки сбрасывается. И он снова ищет как первый раз, для того чтобы подождать 3 мин, по по истечении которых ему дается временной промежуток секунд 15. Тут еще проблема в том что он должен искать и другие картинки, и сравнивать их, чтобы он не завис на ожидании одной, а продолжал бегать но таймер со счетчиком бы работал?

Автор: cirus 16.11.2017, 2:15

Что-то вроде этого.

код
Код
set #count 0    // флаг что картинка не найдена

while 1 = 1
    // какие-то действия

    gosub find_image   // подпрограмма поиска

    // какие-то действия
end_while

// подпрограмму можно в конец скрипта
:find_image
    if  #count = 0     // если картинка не найдена
        set #a findimage(...)  // ищем картинку
        if  #a > 0        // если найдена
            set #count 1  // флаг что картинка найдена
            set #time timer + 180000  // записываем в переменную текущее время + 3 минуты (60000 = 1мин)
            wait 3000  // ждать 3 секунды, указать нужное время
        end_if
    else  // иначе, т. е. картинка найдена, count = 1
        if  #time > timer   // если не прошло 3 минуты с момента нахождения картинки
            set #a findimage(...)  // ищем картинку
            if  #a > 0        // если найдена
                // тут что делать когда картинка найдена
            end_if
        else    // иначе, т. е. вышло время (3 минуты)
            set #count 0   // ставим флаг что картинка не найдена
            // все действия начнутся с начала
        end_if
    end_if
    // возвращаеися в тело скрипта
return

Автор: Levo223 16.11.2017, 17:56

Цитата(cirus @ 16.11.2017, 2:15) *

Что-то вроде этого.
код
Код
set #count 0    // флаг что картинка не найдена

while 1 = 1
    // какие-то действия

    gosub find_image   // подпрограмма поиска

    // какие-то действия
end_while

// подпрограмму можно в конец скрипта
:find_image
    if  #count = 0     // если картинка не найдена
        set #a findimage(...)  // ищем картинку
        if  #a > 0        // если найдена
            set #count 1  // флаг что картинка найдена
            set #time timer + 180000  // записываем в переменную текущее время + 3 минуты (60000 = 1мин)
            wait 3000  // ждать 3 секунды, указать нужное время
        end_if
    else  // иначе, т. е. картинка найдена, count = 1
        if  #time > timer   // если не прошло 3 минуты с момента нахождения картинки
            set #a findimage(...)  // ищем картинку
            if  #a > 0        // если найдена
                // тут что делать когда картинка найдена
            end_if
        else    // иначе, т. е. вышло время (3 минуты)
            set #count 0   // ставим флаг что картинка не найдена
            // все действия начнутся с начала
        end_if
    end_if
    // возвращаеися в тело скрипта
return



Может мне нужно было точнее выражаться, мне нужно искать подтверждение сигналу за N времени.
Т.е. у нас появился Петя с ножом, и продавщица про себя решила: если #Петя будет еще тут тереться с ножом возле магазина через 3 минуты когда она вернется из подсобки - то она вызывает полицию. Но если он будет тереться с деньгами! - то это совсем другой расклад и цикл начинается заново... Если его не будет когда она вернется из подсобки и покрутит головой в течении 15 сек - отбой тревоги.

Дано
Есть #Петя
Есть #Вася
У #Пети может быть #нож
А могут быть #деньги
У #Васи тоже может быть #нож
но могут быть и #деньги

Приходит #петя
продавщица смотрит
#нож или #деньги
если #нож - уходит в подсобку на 3 мин
возвращается- 15 секунд ищет #петю с #ножом
если дожидается #петю с #ножом
-вызывает полицию

если #петя с #деньгами это совсем другие действия и новый цикл
уходит в подсобку на 3 минуты за товаром
возвращается если #петя еще с #деньгами
продает ему

в это же время может прийти вася
и его тоже надо проверить на деньги или нож
и тоже запустить свой таймер
Ну вобщем я понял что для каждой переменной и подпеременной нужен свой таймер

Только непонятно зачем
Код

else  // иначе, т. е. картинка найдена, count = 1
        if  #time > timer   // если не прошло 3 минуты с момента нахождения картинки
            set #a findimage(...)  // ищем картинку
            if  #a > 0        // если найдена
                // тут что делать когда картинка найдена
            end_if

если время еще не вышло?

Т.е. у нас что будет:
s
Код

set #петя с #ножом
set #петя с #деньгами
set #вася с #ножом
set #вася с #деньги
if  #петя с ножом
    gosub петя с ножом
else
    if  vasa s nojom
        gosub vasla s nojom  // Или же можно прямо здесь каким-то образом написать вот этот блок с таймером???
    else
        if  peja s dengi
            gosub petja s dengi
        else
            if  vasja s dengi
                gosub vasja s dengi
            end_if
        end_if
    end_if
end_if

:Петя с ножом
    if  #count = 0     // если картинка не найдена
        set #a findimage(Петя с ножом)  // ищем картинку
        if  #a > 0        // если найдена
            set #count 1  // флаг что картинка найдена
            set #time timer + 180000  // записываем в переменную текущее время + 3 минуты (60000 = 1мин)
            wait 3000  // ждать 3 секунды, указать нужное время
        end_if
    else  // иначе, т. е. картинка найдена, count = 1
        if  #time > timer   // если не прошло 3 минуты с момента нахождения картинки
            set #a findimage(Петя с ножом)  // ищем картинку
            if  #a > 0        // если найдена
                // тут что делать когда картинка найдена
            end_if
        else    // иначе, т. е. вышло время (3 минуты)
            set #count 0   // ставим флаг что картинка не найдена
            // все действия начнутся с начала
        end_if
    end_if
    // возвращаемся в тело скрипта
return

:vasa s nojom
    if  #count = 0     // если картинка не найдена
        set #a findimage(vasa s nojom)  // ищем картинку
        if  #a > 0        // если найдена
            set #count 1  // флаг что картинка найдена
            set #time timer + 180000  // записываем в переменную текущее время + 3 минуты (60000 = 1мин)
            wait 3000  // ждать 3 секунды, указать нужное время
        end_if
    else  // иначе, т. е. картинка найдена, count = 1
        if  #time > timer   // если не прошло 3 минуты с момента нахождения картинки
            set #a findimage(vasa s nojom)  // ищем картинку
            if  #a > 0        // если найдена
                // тут что делать когда картинка найдена
            end_if
        else    // иначе, т. е. вышло время (3 минуты)
            set #count 0   // ставим флаг что картинка не найдена
            // все действия начнутся с начала
        end_if
    end_if
    // возвращаемся в тело скрипта
return

: peja s dengi
    if  #count = 0     // если картинка не найдена
        set #a findimage( peja s dengi)  // ищем картинку
        if  #a > 0        // если найдена
            set #count 1  // флаг что картинка найдена
            set #time timer + 180000  // записываем в переменную текущее время + 3 минуты (60000 = 1мин)
            wait 3000  // ждать 3 секунды, указать нужное время
        end_if
    else  // иначе, т. е. картинка найдена, count = 1
        if  #time > timer   // если не прошло 3 минуты с момента нахождения картинки
            set #a findimage( peja s dengi)  // ищем картинку
            if  #a > 0        // если найдена
                // тут что делать когда картинка найдена
            end_if
        else    // иначе, т. е. вышло время (3 минуты)
            set #count 0   // ставим флаг что картинка не найдена
            // все действия начнутся с начала
        end_if
    end_if
    // возвращаемся в тело скрипта
return

: vasja s dengi
    if  #count = 0     // если картинка не найдена
        set #a findimage(vasja s dengi)  // ищем картинку
        if  #a > 0        // если найдена
            set #count 1  // флаг что картинка найдена
            set #time timer + 180000  // записываем в переменную текущее время + 3 минуты (60000 = 1мин)
            wait 3000  // ждать 3 секунды, указать нужное время
        end_if
    else  // иначе, т. е. картинка найдена, count = 1
        if  #time > timer   // если не прошло 3 минуты с момента нахождения картинки
            set #a findimage(vasja s dengi)  // ищем картинку
            if  #a > 0        // если найдена
                // тут что делать когда картинка найдена
            end_if
        else    // иначе, т. е. вышло время (3 минуты)
            set #count 0   // ставим флаг что картинка не найдена
            // все действия начнутся с начала
        end_if
    end_if
    // возвращаемся в тело скрипта
return
???


Че-то мне кажется одно с другим будет путаться. Или я так всё сложно придумал. Вот щас сижу и не могу увязать - зачем мне в 2 цикла писать одно и то же действие по идентификации картинки?

т.е. у меня
Код
if  #петя с ножом
    gosub петя с ножом
else


а почему тогда я прям тут не могу написать
Код
 
set #time timer + 180000  // записываем в переменную текущее время + 3 минуты (60000 = 1мин)
            wait 3000  // ждать 3 секунды, указать нужное время

???


---------
и у меня дальше if #count = 0 // если картинка не найдена
не уходит просто возвращается в начало

нужно так - первый раз нашел картинку - включился таймер - включился счетчик. Он тикает
все разы которые он находит такую же картинку пока таймер не истёк идет команда закрытия алерта
Alert close
как только таймер истёк
Идет временное окно присвоения той же картинке повышенного приоритета важности с последующим выполнением по ней каких-то действий

Нужен какой-то такой вид счетчика
Set #count =0 (Картинка %arr, N time)
-----------

чет я даже в логе не могу желаемый результат получить
нужно что-то такое
if #time > timer
log найдена картинка в первый раз
else
log картинка найдена 2 раз
end_if

Автор: Levo223 16.11.2017, 19:38

Вот сейчас такая проблема.
пишу из маленького уголка своего монитора - не занятого пилотом.
Потому что он при проверке форматирования завис(окно стало серым) и где то выдал окно
которое указало там на какую-то ошибку
но не в диспетчере
ни где-то еще это окно не показывает, только писщит что оно есть
и перейти я к нему не могу(ни сдвинуть не свернуть окно) потому что в настройках пилота указано поверх всех окон
написал большой код
и если я просто закрою его в процессах он весь потеряется
Что делать? И как в последующем выводить это окно
"всплывающее табло пилота"(не лог)
на первый план ли вообще идентифицировать?

--------------------------------------

P.S| В этот раз спасся утилитой TurboTop позволяющей лишать топа и выводить окна на передний план
Но в дальнейшем с этим маленьким оконцем нужно что-то делать
https://imgbb.com/

Автор: cirus 17.11.2017, 2:38

Цитата
написал большой код
и если я просто закрою его в процессах он весь потеряется

Скрипты сохраняются в папке Scripts, autosaved_номер_вкладки, также в папке Scripts\Backup сохраняются скрипты. В настройках пилота должны стоять соответствующие галки.
Цитата
Но в дальнейшем с этим маленьким оконцем нужно что-то делать

Ищите лишний end.
Цитата
нужно так - первый раз нашел картинку - включился таймер - включился счетчик. Он тикает
все разы которые он находит такую же картинку

код
Код
set #time1 0     // таймер 1
set #count1 0   // счётчик 1

while 1 = 1

    set #a findimage(299, 395 394, 488 (C:\Users\abc\Desktop\1.bmp) %arr)
    if  #a > 0               // если нашли картинку
        if  #count1 = 0      // если счётчик 0
            set #count1 1        // счётчик равен 1
            set #time1 timer + 180000 // установили таймер
        else
            hint #a #count1
            if  #time1 > timer         // если не вышло время
                set #count1 #count1 + 1   // увеличиваем счётчик
                log #count1
                wait 100
            end_if
        end_if
    end_if

end_while



Автор: Levo223 17.11.2017, 4:20

Цитата(cirus @ 17.11.2017, 2:38) *

Скрипты сохраняются в папке Scripts, autosaved_номер_вкладки, также в папке Scripts\Backup сохраняются скрипты. В настройках пилота должны стоять соответствующие галки.


Нет, они то сохраняются, но с какой периодичностью. И если я просто вырублю в процессах пилот, думаю, он не успеет сохраниться.

Цитата(cirus @ 17.11.2017, 2:38) *

Ищите лишний end.


End я нашел. это не проблема. Проблема в том что при выдвинутом на передний план пилоте его вплывающие окна такой привилегией не обладают(кроме лога), о чем также нет и пункта в настройках.

Цитата(cirus @ 17.11.2017, 2:38) *

нужно так - первый раз нашел картинку - включился таймер - включился счетчик. Он тикает(ТУТ НУЖНО ПОСТАВИТЬ ЗАПЯТУЮ!!!)))
все разы которые он находит такую же картинку...

соотвтественно всё что написано дальше не так))

б

Код

set #time1 0     // таймер 1
set #count1 0   // счётчик 1

while 1 = 1

    set #a findimage(299, 395 394, 488 (C:\Users\abc\Desktop\1.bmp) %arr)
    if  #a > 0               // если нашли картинку
        if  #count1 = 0      // если счётчик 0
            set #count1 1        // счётчик равен 1
            set #time1 timer + 180000 // установили таймер
        else
            hint #a #count1 // тут я понимаю надо написать hint - Вторичное нахождение?
            if  #time1 > timer         // если не вышло время
                set #count1 #count1 + 1   // увеличиваем счётчик
                log #count1
                wait 100
            end_if
        end_if
    end_if

end_while

Можно разжевать? Какой параметр будет отвечать за первичное нахождение, а какой за вторичное?
Можно ли переименовать #count в например #счетчиквася и он будет продолжать считать?

Мне как очень привычному к вещественному порядку вещей непонятно на каком именно временном промежутке производится запись в первичное нахождение и вторичное? Вот я понимаю буфер обмена, какой-то файл где храниться информация до её обнуления. Но здесь где место где находятся переменные, ну ладно можно вывести logом посмотреть что там есть. Вот тут вроде бы 2 строчки а у меня идёт несостыковка. Почему count 1 при = 0 у нас считается истиной, а %arr - нигде не встречается кроме как в скобке, - у меня голова лопнет от такого вида синтаксиса.

-----------------------------------------------------------

план Б для особо клинического случая

Ладно. Сделаем проще. От начала поиска картинки.
Пускай пилот просто замрёт и ждёт пока пройдёт N минут после прихода сигнала, потом выйдя из анабиоза
прочекает еще раз наличие такой же картинки
в цикле:
допустим
Код

while time 15s
//так написать чтобы он гонял 15 секунд этот цикл?
findimage (картинка)
if картинка  найдена
goto на подпрограмму выполнения действий
end_if
если не найдена, он по истечении этих 15 с идет дальше
end_while


С таймерами пока чет не получается, либо я тупой либо лыжи не едут. Не пойму как он работает, где у него конец и где начало, в коде написано а в голове не укладывается откуда он начинается и где принимается во внимание.



Еще раз.
Ну тут просто у меня начались мозговые судороги

Код

Есть 2 картинки - Левая и правая.
set #L findimage (0 0 500 500 C;/L.Bmp #Alert)
set #R findimage (0 0 500 500 C;/R.Bmp #Alert)
if #L > 0
--Записываем L как мего L т.е. ML
наверно будет так - set L=#ML
это надо будет сделать пока не найдена 3-я картинка L
и где-то тут включаем таймер
set #time1 timer + 180000 // Можно объяснить тупому Барану где именно ведется отсчёт этого эфемерного таймера???? Я не могу визуально не наблюдая его понять когда он есть, а когда его нет.
Ждём
В это время приходит картинка R(но мы её ##ёбываем, потому что сидим здесь и ждём когда же у нас закончится таймер, или не сидим?) Где мы находимся?
Ок. Закончился таймер.
Пошел вторичный цикл поиска картинки L
я так думаю будет сделано.
while time 15s
set #L findimage (0 0 500 500 C;/L.Bmp #Alert) -- А как присвоить ей тут суперстатус #ML? чтобы она покруче была\ во избежании спутывания пилотом с другой картинкой L???
???
if #L > 0
goto Расправа с левой картинкой
else
log Картинка не найдена // только наверно лог будет забит этой строкой, потому что будет гонять её без перерыва на обед, пока не закончится???
end_if
end_while
else // т.е. не найдена L а найдена R - В ПЕРВЫЙ РАЗ!!!!
if R > 0  (Не говоря уже о том что мы @@ёбываем картинку R если она приходит во время ожидания вторичного появления картинки L, но это ладно, это проблема вторична)
log R найдена 1 раз
где-то тут таймер
Ну тут я понял что что-то не то делаю, но увы не пойму что...
goto Расправа с R картинкой


:Расправа с левой картинкой
и тут то уж я с ней расправлюсь!!!

:Расправа с R
Тут я со всеми расправляюсь и выхожу победителем!



Автор: cirus 17.11.2017, 11:54

Цитата
Нет, они то сохраняются, но с какой периодичностью.

При каждом запуске скрипта. Откройте папку бекап и найдёте все ваши скрипты, когда-либо запускаемые.
Цитата
соотвтественно всё что написано дальше не так))

Всё так, счётчик можно переименовать. Добавить закрытие аларм тоже не проблема.
Цитата
Можно разжевать? Какой параметр будет отвечать за первичное нахождение, а какой за вторичное?

Изначально счётчик равен 0, поэтому выполняется if #count1 = 0 устанавливаем счётчик в 1 или больше, т. е. не 0. Теперь будет выполняться else.
Код
log clear
log mode compact
set #count1 0   // счётчик, обозначает найдена картинка первый раз или нет

while 1 = 1
    if  #count1 = 0
        log #count1, картинка найдена первый раз
        log Счётчик равен 0, выполняется эта часть блока
        log ++++++
        set #count1 1   // счётчик равен 1, теперь эта часть блока не будет выполняться
    else
        log #count1, картинка найдена НЕ первый раз
        log Счётчик не равен 0, выполняется эта часть блока
        log !!!!!!!!!!!!!!
    end_if
    log
    wait 2000
end_while

Цитата
Почему count 1 при = 0 у нас считается истиной

Потому что #count1 это имя переменной. Напишите #счетчиквася если так понятнее.
Цитата
а %arr - нигде не встречается

В массив записываются координаты найденного изображения. Они нигде не используются, поэтому и нет в коде.
Цитата
С таймерами пока чет не получается

Код
// пример
log clear
log mode compact
set #time 0

while 1 = 1
    hint (20 clRed 500 500 -1 -1 (#time  timer))   // выводим переменную #time и timer
    if #time < timer
       log ++++++         // каждые 2 секунды будет сообщение в логе
       set #time timer + 2000   // увеличиваем таймер на 2 секунды
    end_if
end_while

Автор: Levo223 17.11.2017, 12:33

Цитата(cirus @ 17.11.2017, 11:54) *


Код
// пример
log clear
log mode compact
set #time 0

while 1 = 1
    hint (20 clRed 500 500 -1 -1 (#time  timer))   // выводим переменную #time и timer
    if #time < timer
       log ++++++         // каждые 2 секунды будет сообщение в логе
       set #time timer + 2000   // увеличиваем таймер на 2 секунды
    end_if
end_while


О слава те господи, увидел таймер!
Так а какой же из этих названий опять же можно переименовать? (напр: #Времяожиданияваси #Времяожиданияпети?)

Автор: cirus 17.11.2017, 12:47

Цитата
Так а какой же из этих названий опять же можно переименовать?

Всё что начинается с #, $, % можно переименовывать.

Автор: Levo223 17.11.2017, 14:14

Цитата(cirus @ 17.11.2017, 12:47) *

Всё что начинается с #, $, % можно переименовывать.

Можно как-то увеличить длительность hint? Или больше 5 с никак? P.S; понял что можно его просто почаще навтыкать и он не исчезнет
Нужно как-то поддерживать статус ожидания чтобы можно было ориентироваться есть ли текущая операция ожидания, или все сигналы ожидаются впервые...

..........
Почему у меня при выводе hint отображается что таймер не истекает а наоборот увеличивается?

Эмм, начал с 10.000
пару кругов и
https://imgbb.com/

Автор: cirus 17.11.2017, 14:44

Только вызывать хинт в нужных местах скрипта.

Цитата
Почему у меня при выводе hint отображается что таймер не истекает а наоборот увеличивается?

Ну так
Код
set #time timer + 10000  // это увеличение переменной #time

Дописывайте что делать если таймер вышел.
Код
log clear
log mode compact
set #time timer + 3000
while 1 = 1
   if #time > timer
       hint (20, clBlue 500 500 -1 -1 (Ждём 3 секунды))
   else
       hint (20, clRed 500 500 -1 -1 (3 секунды прошло))
       // какие-то действия если прошло 3 секунды
       log         АААА
       wait 300
   end_if
   log Какие-то действия
   wait 300
end_while
end_script


Автор: Levo223 17.11.2017, 15:09

Цитата(cirus @ 17.11.2017, 14:44) *

Ну так
Код
set #time timer + 10000  // это увеличение переменной #time




А как сбросить его тогда?

Автор: cirus 17.11.2017, 15:15

Цитата
А как сбросить его тогда?

http://uopilot.tati.pro/index.php?title=Timer
Код
set timer   // обнулить таймер
set #time 0  // переменная равна 0


Автор: Levo223 17.11.2017, 15:16

Цитата(cirus @ 17.11.2017, 15:15) *

http://uopilot.tati.pro/index.php?title=Timer
Код
set timer   // обнулить таймер
set #time 0  // переменная равна 0

.
Так это я прочитал, это я просто затупил!

Автор: Levo223 17.11.2017, 18:55

Не пропускает имя счетчика.
Не пойму почему
---------------
Скрипт просто прыгает несколько раз по этим строкам и уходит на другую метку.
UCM1S Identified
23:09:56 51 ( 40): execution UCM1S
23:09:56 51 (41): 0
23:09:57 51 (40): execution UCM1S
23:09:57 51 (41): 0
23:09:58 51 ( 89): execution UCM1B

Хотя на нее ничего не указывает...

Код


set #CUCM1S 0
set #CUCM1B 0

if  #UCM1S > 0
        log  -- UCM1S -- Identified
        gosub UCM1S
    else
        if  #UCM1B > 0
            log -- UCM1B -- Identified
            gosub UCM1B
        end_if
:UCM1S  // выполнение переходит сюда
(40)    log execution UCM1S
(41)    log #CUCM1S
(42)    if  #CUCM1S = 0     // если картинка не найдена
И всё а дальше не идёт?

.
.
.
.
.
.
(88):UCM1B  // выполнение переходит сюда, если найдена картинка
(89)    log execution UCM1B  //сразу прыгает сюда?
(90)    if  #CUCM1B = 0     // если картинка найдена
          set #UCM1B findimage

Автор: cirus 18.11.2017, 2:08

Не надо располагать подпрограммы в самом скрипте. В конец вынесите.
Посмотрите примеры: http://uopilot.tati.pro/index.php?title=Gosub

Автор: Levo223 18.11.2017, 6:18

Цитата(cirus @ 18.11.2017, 2:08) *

Не надо располагать подпрограммы в самом скрипте. В конец вынесите.
Посмотрите примеры: http://uopilot.tati.pro/index.php?title=Gosub

Так они и так в самом конце, и ниже их ничего нету, что там ставить между ними и основным скриптом?

Визуально кажется всё так просто
но в коде я это не могу выразить
https://ibb.co/dk40v6

Как увязать что на протяжении всего времени "таймера" (Timer1)
#Вася1 = 1
а timer2 #Петя1 = 1
А как-только таймер 1 заканчивается, карета в тыкву и #Вася = 0?
А #петя1 при timer2

Автор: Levo222 18.11.2017, 19:19

erfsdfsdf
Залогинился со старого компа.
Странно старое имя не подходит

Автор: cirus 18.11.2017, 19:33

Цитата
Залогинился со старого компа.
Странно старое имя не подходит

Значит не тот пароль.
Цитата
Как увязать что на протяжении всего времени "таймера" (Timer1)
#Вася1 = 1
а timer2 #Петя1 = 1
А как-только таймер 1 заканчивается, карета в тыкву и #Вася = 0?
А #петя1 при timer2

Код
// пример
set #time1 timer + 3000     // 3 секунды для васи
set #vasya 1

set #time2 timer + 5000    // 5 секунд для пети
set #petya 1

set %n [1] "\n"  // перенос строки для hint
while 1 = 1
    hint (20, clBlue 500 500 -1 -1 (#time1  timer  Вася = #vasya%n [1]#time2  timer  Петя = #petya))
    if  #time1 < timer     // если вышло время для васи
        set #vasya 0    // присваиваем 0
    end_if

    if  #time2 < timer     // если вышло время для пети
        set #petya 0    // присваиваем 0
    end_if
    wait 100
end_while

Автор: Levo222 18.11.2017, 21:21

Как сделать в теле скрипта поиск и замену символов наподобие блокнота/ворда?

Автор: cirus 18.11.2017, 21:34

Цитата
Как сделать в теле скрипта поиск и замену символов наподобие блокнота/ворда?

Имеется ввиду в самом скрипте, к примеру, переименовать переменные? Тогда вставить скрипт в notepad/word и заменить что требуется.
Или есть какой-то файл/строка и в них надо что-то заменить?

Автор: Levo222 18.11.2017, 21:50

Цитата(cirus @ 19.11.2017, 1:34) *

Имеется ввиду в самом скрипте, к примеру, переименовать переменные? Тогда вставить скрипт в notepad/word и заменить что требуется.
Или есть какой-то файл/строка и в них надо что-то заменить?

Нет вобще слово заменить, там очень много частовстречающихся которые надо менять. Ну вобщем через блокнот

Автор: Levo222 18.11.2017, 22:12

Не могу понять, голимый клиент мёртв:
https://imgbb.com/
Ни перепривязку не могу сделать ни поиск дочернего окна, вобще никакие действия не делает...
Тут Хр на старом компе, какие могут быть проблемы после перехода?

Автор: cirus 18.11.2017, 22:25

Может окно не найдено. На какой строке ошибка?

Автор: Levo222 18.11.2017, 22:42

Цитата(cirus @ 19.11.2017, 2:25) *

Может окно не найдено. На какой строке ошибка?

ну да, что-то с окном
(Поиск пути к дочернему окну.txt, 0): set - Клиент мертв...
(Поиск пути к дочернему окну.txt, 0): set - Не могу найти рабочее окно
///////////////
так вроде сделало, очень очень в дальний угол пришлось тыкать, по внешней вкладке пилот никак не хочет идентифицировать родительское
.........

Так теперь финдimage не работает. У меня же XP аеронет
пошел пилить софт!

Что-то Aeroтемы не очень помогают с перекрытыми окнами. Может есть какой-то другой софт?

Автор: Levo222 18.11.2017, 23:47

[quote name='Levo222' post='422150' date='19.11.2017, 2:42']
ну да, что-то с окном
Так всё вроде быработает

Автор: cirus 19.11.2017, 0:08

Код
set #handle findwindow("Алерт")  // ищем окно  Алерт"
log #handle
end_script

Что в логе?
Цитата
Что-то Aeroтемы не очень помогают с перекрытыми окнами. Может есть какой-то другой софт?

Win7 smile.gif

Автор: Levo222 19.11.2017, 0:14

Цитата(cirus @ 19.11.2017, 4:08) *

Код
set #handle findwindow("Алерт")  // ищем окно  Алерт"
log #handle
end_script

Что в логе?


"1115408"

Автор: cirus 19.11.2017, 0:38

А пишите что окно не находит. Это хендл окна. Если не находит, то было бы 0.

Автор: Levo222 19.11.2017, 0:40

Цитата(cirus @ 19.11.2017, 4:38) *

А пишите что окно не находит. Это хендл окна. Если не находит, то было бы 0.


Да нет, тут что-то не так. Я его закрываю. Но он всеравно его выводит в лог

но уже под другим Хэндлом!

Так ладно это сам терминал глючит, с ними надо разбираться

Автор: cirus 19.11.2017, 0:50

Цитата
но уже под другим Хэндлом!

Он всегда разный. После каждого перезапуска окна.

Автор: Levo222 19.11.2017, 1:09

Цитата(cirus @ 19.11.2017, 4:50) *

Он всегда разный. После каждого перезапуска окна.


Подж почему он у мня отображается когда я его закрыл? И прога поиска окон InqSoft которая его тоже отображает. Хотя его нет? И при переходе к окну он его не показываеГде он может храниться и как его выпилить?

Цитата(Levo222 @ 19.11.2017, 5:00) *

Подж почему он у мня отображается когда я его закрыл? И прога поиска окон InqSoft которая его тоже отображает. Хотя его нет? И при переходе к окну он его не показываеГде он может храниться и как его выпилить?


Ну что-то я подозреваю это особенность работы терминала в выходные...

Автор: Levo222 19.11.2017, 1:30

Нужно состряпать скрипт до понедельника. И обкатывать его уже на рабочем терминале

Вот еще раз скажите мне.
Я должен все "set"ы = 0 кроме счетчиков
В начало скрипта запихать, и больше с ними не морочиться? Или есть особенность куда его можно засовывать только в частное исполнение? Ну в if там и прочее... понятно что таймер и прочее будут конкретно стоять

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

Из того что я в схемах напридумывал -
Именно вот этот #count 0 куда лучше засунуть, чтобы он не путался под ногами и к месту всё обнулял? потому что их будет много. так нужно сразу определить в каком месте будет происходить "обнуление"?
Исходя из того, что есть блок поиска, определения и выполнения.

У меня есть определенные аббревиатуры: по каталогу их удобнее всего будет присваивать блоку поиска убрав букву С(count), а по определению в строку исполнения исходя из категории буквы S или B они же соответствуют заданному изображению
set #СUCM1B
set #СUCM1S
set #CNUM1S
и так далее.
т.е. это #Вася1
#Вася2
#Петя1
#Петя2
ну и т.д.

Автор: cirus 19.11.2017, 2:09

Лучше объявить переменные вначале. Потом меняйте значения как надо.

Автор: Levo222 19.11.2017, 2:12

Цитата(cirus @ 19.11.2017, 6:09) *

Лучше объявить переменные вначале. Потом меняйте значения как надо.

Т.е. я делаю в самое начало
код
Код
set #СUCM1B 0
set #СUCM1S 0
set #CNUM1B 0
set #CNUM1S 0 ?



проехали....


Так как будет выглядеть Цикл поиска картинки идущий 15 секунд?
Или можно как-то по-другому идентифицировать #count 1 по истечению таймера. вобщем-то было бы лучше если бы выполнение скрипта на ней не затормаживалось но я вообще не знаю как это сделать. Пока мы будем ждать эти 15 секунд подтверждения сигнала может столько других прийти)

А понял, надо еще 1 таймер встроить. Но так мы все таймеры у картинок позабираем, придётся пока для 2х писать
Нужен
Т.е. цикл проверки таймера на 3 минуты. А после таймер проверки самого себя пока идёт определенный цикл он его возвращает на круг

Автор: Levo222 19.11.2017, 2:28

Fixd-d--xd

Автор: cirus 19.11.2017, 3:07

Цитата
#СUCM1B

Ничего что у вас буквы C написаны на русском?
Код
set $str СUCM1B
log Код первого символа в строке  ord(СUCM1B)
log А должно быть ord(CUCM1B)
end_script

Автор: Levo222 19.11.2017, 3:09

Цитата(cirus @ 19.11.2017, 7:07) *

Ничего что у вас буквы C написаны на русском?
Код
set $str СUCM1B
log Код первого символа в строке  ord(СUCM1B)
log А должно быть ord(CUCM1B)
end_script


Да я понял уже это, голову чуть себе не разбил, можно уже не заострять тут

Автор: cirus 19.11.2017, 3:30

Цитата
Так как будет выглядеть Цикл поиска картинки идущий 15 секунд?

код
Код
log clear
log mode compact
set #time1 timer + 15000     // 15 секунд

while 1 = 1
    log Какие-то действия
    wait 200

    hint (20 clBlue 500 500 -1 -1 (#time1  timer))
    if #time1 > timer    // если не вышло время
        set #image findimage (...)   // ищем картинку
        if #image > 0
            log Тут что делать если картинка найдена
        end_if
    else      // если время вышло
        log             Время вышло
    end_if

    log Ещё какие-то действия
    wait 200
end_while

Автор: Levo222 20.11.2017, 2:42

Так проблема с алертом всё еще актуальна. Он не закрывается а становится невидимым. Возможно будет работать поиск среди окон только видимого уровня. Как будет выглядеть команда на поиск окон среди видимых?


Автор: cirus 20.11.2017, 3:16

https://forum.uokit.com/index.php?showtopic=28991
С помощью плагина находим все окна 'Алерт' и проверяем видимость. find и visible.
Плагин распаковать в папку Plugins, которая рядом с пилотом должна быть создана.

Автор: Levo222 20.11.2017, 3:27

Так, как теперь задать условие видимости в поиске?


Т.е. если я задаю

6
Код

set #Visible WindowStatus.visible (132584)
set #Alert findwindow("Алерт")
while #Alert = 0    // пока не найдено
if #Visible = 1
    :Findalert
    set #Alert findwindow("Алерт")
    wait random(150) + 0
if  #Alert > 0
        log Сигнал получен
        goto findimag
    else
        goto Findalert
    end_if
    else
    return
end_while


Хрень какаято получилась)

Пока таким способом решил, но это костыли)
ъ

Код

//__________________________________//
//  --- Блок поиска Alerta ---
//__________________________________//
set #Alert findwindow("Алерт")
if #Alert > 0
log Алерт присутствует
end_if
while #Alert = 0 // пока не найдено
    :Findalert
    set #Alert findwindow("Алерт")
    wait random(150) + 0
    if  #Alert > 0
        goto Findvisible
    else
        goto Findalert
    end_if
end_while

//________________________________________//
//   ---Блок видимости Алерта ---
//________________________________________//
set #Visible WindowStatus.visible (329202)
if #Visible = 0
log Алерт невидим
log Ведется поиск
end_if

while #Visible = 0 // пока не найдено
    :Findvisible
    set #Visible WindowStatus.visible (329202)
    wait random(150) + 0
    if  #Visible = 1
        log Сигнал получен
        goto findimag
    else
        goto Findalert
    end_if
end_while



Нужно как-то находить и привязывать хэндл алерта автоматически при запуске скрипта. Наподобие привязки окон дочернего к рабочему. А то каждый раз его искать не ок

Автор: cirus 20.11.2017, 12:00

Цитата
set #Visible WindowStatus.visible (329202)

Писать хендл нет смысла, он изменится после перезапуска программы.
Код
set #Alert findwindow("Алерт")
set #a WindowStatus.visible (#Alert)
if #a = 0
    log Невидимо
else
   if #a = 1
       log Видимо
   else
       log Хендл не существует
   end_if
end_if
end_script

Если окон Алерт несколько, то надо перебирать все, для поиска видимого.

Автор: Levo222 20.11.2017, 20:23

Еще по таймерам не понял - их ограниченное количество чтоли?

Т.е. если я больше 5-ти захочу запустить они не сработают?

Там в справке перечислено всего 5? это пример или ограничение?

и может ли на одну картинку одновременно быть установлено несколько переменных?
т.е. у меня есть картинка "1"
переменные #a
#b
#c

Если установить

Код
 
set #a findimage (1)
if  sdsfsd
else
    12312
end_if
set #b findimage (1)
if  sdsfsd
else
    12312
end_if
set #c findimage (1)
if  sdsfsd
else
    12312
end_if

но в разных блоках
что произойдет?

Также findimage путает картинки с текстом. Какова его точность? И как можно её увеличить? Уменьшением или увеличением разрешения? Увеличением картинки и пр.?

Автор: cirus 21.11.2017, 2:16

Цитата
Еще по таймерам не понял - их ограниченное количество чтоли?

Всего 5. На самом деле достаточно одного, если его правильно использовать.
пример
Код
set #time1 timer + 1000
set #time2 timer + 3000
set #time3 timer + 10000

log clear
log mode compact
while 1 = 1
    if  #time1 < timer
        log 111             // выводить в лог сообщение раз в секунду
        set #time1 timer + 1000
    end_if

    if  #time2 < timer
        log   222           // выводить в лог сообщение раз в 3 секунды
        set #time2 timer + 3000
    end_if

    if  #time3 < timer
        log      333        // выводить в лог сообщение раз в 10 секунду
        set #time3 timer + 10000
    end_if
    wait 100
end_while
end_script

Цитата
и может ли на одну картинку одновременно быть установлено несколько переменных?
что произойдет?

В переменные #a #b и #c запишется результат поиска.
Цитата
Также findimage путает картинки с текстом. Какова его точность? И как можно её увеличить?

Код
set #b FindImage (0  0 1920 1080 (d:\myImages\wolf.bmp) %arr 2 80 20 5)

2 - тип поиска,
80 - точность поиска в %
20 - количество объектов для поиска
5 - погрешность в цвете в %

Автор: Levo222 21.11.2017, 10:45

Цитата(cirus @ 21.11.2017, 6:16) *

Всего 5. На самом деле достаточно одного, если его правильно использовать.
пример
Код
set #time1 #time1 timer + 1000
set #time2 #time2 timer + 3000
set #time3 #time3 timer + 10000

log clear
log mode compact
while 1 = 1
    if  #time1 < timer
        log 111             // выводить в лог сообщение раз в секунду
        set #time1 timer + 1000
    end_if

    if  #time2 < timer
        log   222           // выводить в лог сообщение раз в 3 секунды
        set #time2 timer + 3000
    end_if

    if  #time3 < timer
        log      333        // выводить в лог сообщение раз в 10 секунду
        set #time3 timer + 10000
    end_if
    wait 100
end_while
end_script


В переменные #a #b и #c запишется результат поиска.

Код
set #b FindImage (0  0 1920 1080 (d:\myImages\wolf.bmp) %arr 2 80 20 5)

2 - тип поиска,
80 - точность поиска в %
20 - количество объектов для поиска
5 - погрешность в цвете в %


Круто)

Автор: Levo222 21.11.2017, 14:27

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

Автор: cirus 21.11.2017, 15:29

http://uopilot.tati.pro/index.php?title=Showwindow
http://uopilot.tati.pro/index.php?title=SendMessage

Автор: Levo222 21.11.2017, 18:13

[quote name='cirus' date='21.11.2017, 6:16' post='422255']
Всего 5. На самом деле достаточно одного, если его правильно использовать.

пример
Код
set #time1 #time1 timer + 1000
set #time2 #time2 timer + 3000
set #time3 #time3 timer + 10000

log clear
log mode compact
while 1 = 1
    if  #time1 < timer
        log 111             // выводить в лог сообщение раз в секунду
        set #time1 timer + 1000
    end_if

    

На самом деле не совсем про двойное присвоение понял? Оно умножается чтоли?

2 переменных к одному таймеру? Но если их 6? При условии что у них одинаковое время
Как увязать между ними таймеры
У меня подтверждение ожидается 3 минуты с момента первого сигнала. Если в течении их не приходит #Миша еще раз с красной лентой... то мы его забываем.

Автор: cirus 22.11.2017, 2:07

Цитата
На самом деле не совсем про двойное присвоение понял? Оно умножается чтоли?

Исправил, там косяк был.
Цитата
2 переменных к одному таймеру? Но если их 6?

Будет 6 переменных.

Автор: Levo222 22.11.2017, 19:20

Цитата(cirus @ 22.11.2017, 6:07) *


Не совсем въехал как в этом примере мне тыкнуть в картинку?

Код


set $path "C:"
set %cash[1] картинка
// будем искать картинку из файла C:\Program Files\UOPilot\images\картинка.bmp
set #a findimage (#startX #startY #endX #endY ($path%cash[1].bmp) %crds 2)
if #a > 0
  log Изображение найдено в координатах X= %crds[1 1] Y= %crds[1 2]. //Кликнем на нём...
  left %crds[1 1] %crds[1 2] // кликнули
else
  log Изображение не найдено
end_if

при том что у меня картинка C:\UCP.bmp
зачем присваивать $path
и что такое %crds?
какое значение имеет [1] цифрка в скобках?

Автор: Cockney 22.11.2017, 21:08

http://uopilot.tati.pro/index.php?title=%D0%92%D0%B2%D0%B5%D0%B4%D0%B5%D0%BD%D0%B8%D0%B5_%D0%B2_%D0%BF%D0%B8%D0%BB%D0%BE%D1%82%D0%BD%D1%8B%D0%B9_%D1%81%D0%BA%D1%80%D0%B8%D0%BF%D1%82%D0%B8%D0%BD%D0%B3
http://uopilot.tati.pro/index.php?title=Findimage

И только потом что-то заставлять искать или работать.

Автор: cirus 23.11.2017, 2:00

Код
set #a findimage (0 0 1920 1080 (C:\UCP.bmp) %crds)
hint #a   // результат поиска
if #a > 0
     move %crds [1 1]  %crds [1 2]   // если найдена навести курсор
end_if
end_script

Русская версия Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)