Jeżeli chcesz komentować kliknij na tytuł artykułu, wyświetli się tylko ten artykuł z możliwością komentowania.

piątek, 13 września 2024

TotoCAD powrót...

Witam

Po dłuższej przerwie postanowiłem wrócić do programu TOTOCAD który, to napisałem kiedyś dla potrzeb własnych.

Dobrych kilka lat temu u zakazanego obecnie bukmachera "UNIBET" czy "EKSPEKT" można było grać w totalizator sportowy na 8,10 lub 14 skreśleń o nagrodę sięgającą około 100 tysięcy Euro.

Ta gra u tych bukmacherów nazywała się "SuperToTo". Taką grę prowadził w zamierzchłych czasach również nasz "Totalizator Sportowy". Nie bez przyczyny w nazwie ma ten człon "Sportowy". Grę tę do dziś prowadzi Lotto Niemieckie.

Niestety u nas ktoś o tym zapomniał a grający się tego nie domagają. Zresztą lista pretensji do naszego Lotto nie kończy się tylko na tym. Nie byłbym sobą gdybym nie wyraził swojego zdania o naszym Lotto. Ta organizacja rządzona jest przez polityków czy przynoszone w teczkach zarządy i wiele ich decyzji jest sprzecznych ze zdrowym rozsądkiem czy fachowością. A niektóre wprost są wrogie w stosunku do grających. Zlikwidowano dla przykładu tanią grę Multi gdzie na zagranie kilkudziesięciu kuponów systemem stać było emerytów. Grać za złotówkę za zakład czy za 5zł to dla emeryta ogromna różnica. Obecnie z pomocą zapewne bardzo drogiego systemu CloudFlare "chroni" się ogólnodostępne dane z losowań. Tak jakby ktoś chciałby im ukraść losowania!!!. Konia z rzędem temu kto racjonalnie to wytłumaczy. W sieci prowadzą grę Keno i Szybkie600. Jak gracz ma szybko uzyskać kilkadziesiąt ostatnich wyników jak się mu blokuje dostęp do danych które powinny być powszechnie dostępne.

Ale wracając do ToTo to niestety politycy i bukmacherzy nie dogadali się i obecnie gra u zagranicznych bukmacherów jest w Polsce zakazana.

Ponieważ "żyłka" do gry nie wygasła to postanowiłem że sam zbuduję sobie możliwość ustawiania gier na kuponach tak jak mi pasuje i jak mi wygodnie czy używać takich meczy i spotkań na których się znam i które wydają się więc "łatwiejsze" do typowania.

Interfejs programu


Elementy główne:

Obraz 1: Interfejs programu.

  1. Panel tekstowy "Tickets..."

    gdzie zapisywane są przeważnie listy zakładów, systemów i tym podobne.

  2. Panel tekstowy "Results..."

    gdzie zapisywane są wyniki sprawdzenia, generacje, raporty i tym podobne.

  3. Menu głównego

    - steruje ono głównymi opcjami i poleceniami programu.

  4. Narzędzi bocznych

    - to zadokowane do bocznej krawędzi programu dodatkowe okna do sterowania programem.

  5. Pasków narzędziowych

    z poleceniami uzupełniającymi lub powielanymi z menu głównego.

  6. Paska informacyjnego stanu...

    - jest to dolny pasek programu do bieżącego informowania o wykonywanych opcjach i informacją o stanie programu.

  7. Główne pole edycji wyników, podświetlań...

    - to pole gdzie wpisane typy służą do sprawdzania zakładów, podświetlania trafień, wpisywania typów czy zadawania systemów.

Panele tekstowe to dwa dokowane edytory tekstowe. Tych edytorów można utworzyć dowolną ilość ale w danym momencie aktywne są tylko dwa zaznaczone w lewym czy prawym panelu zakładki edytorów "Tickets..."(1) i "Results..." (2).

Edytory (1), (2) mają możliwość podświetlania trafień w zakładach na podstawie typów umieszczonych w "głównym polu edycji" (7). Podświetlanie jest włączone a może być włączane i wyłączane z pomocą menu podręcznego.

Obraz 2: Menu podręczne edytorów.
Edytorów może być więcej, tworzone są dynamicznie jako następne edytory typu "Tickets" lub "Results". Tworzymy je wybierając z menu głównego "Pliki">"Utwórz dodatkowy edytor..."

Musimy opanować sztukę komunikacji z edytorami lewego i prawego panela. Sprawa jest prosta jeżeli będziemy pamiętać że aktywne są zawsze dwa edytory jeden z rodziny "Tickets...", i jeden z rodziny "Results...". Ale aktywny jest zawsze jeden ten zaznaczony którego zakładka "Tickets" czy "Results" jest podświetlona.

Wyjaśnię może, jeżeli chcemy zapisać plik obojętnie z którego edytora to najpierw podświetlamy jego zakładkę a następnie z menu Pliki wybieramy "Zapisz zakłady", Zapisz Plik, Skrypt, SQL i tym podobne. To samo dotyczy odczytu Plik będzie wczytany do tego edytora który będzie zaznaczony.

Przeważnie wyniki generacji, statystyk i zestawień wypisywana jest do edytora "Result..". Tak więc gdybyś chciał zachować każdy taki nowy wpis to musisz zapewnić więcej edytorów "Results" lub wyłączyć opcję nadpisywania wyników. Opcję tę znajdziesz w menu "Kombinacje" są to opcje "Wynik dodaj do Results", "Wynik wstaw do Results". Pierwszy dodaje linijki tekstu do tych istniejących a drugi usuwa zawartość poprzednią i wstawia nową treść.

W menu "Pliki" znajdziesz standardowe polecenia dotyczące edycji, otwierania i zapisywania plików, rejestr ostatnich plików. Nie wymagają one wyjaśnień ponieważ to nic nowego a opcje posiadają dymki z dość dokładnymi podpowiedziami.

Dokładniejszego wyjaśnienia wymagają dwie zasadnicze dla działania programu opcje menu "Pliki":

  • Otwórz Tabelę Kursów
  • Otwórz Bazę Danych Kuponów

Program posiada dwie główne tabele bazy danych. Jedna gromadzi Kursy a druga To "Baza kuponów" do gry które sami założymy czy to do gry realnej czy gry wirtualnej.

Obraz 3: Menu Pliki
Tabela "Kursy" budowana jest z danych dostarczanych przez bukmacherów czy serwisy zbierające dane od wielu bukmacherów, z wielu lig czy turniejów. Takim serwisem jest "betexplorer.com". Dane te obejmują nie tylko archiwalne dane z przed kilku lat nawet ale głównie bieżące i przyszłe zestawienia gier. Warto gromadzić te dane bo można z nich utworzyć właśnie dobre dane statystyczne do gier.

Proces tworzenia danych tabeli Kursy wydaje się dość skomplikowany ale za to uwalnia nas od żmudnego wpisywania danych. Proces polega na pobraniu skryptem JavaScript danych o kuponach i zaręczam że po kilku próbach wydaje się że, będzie to proste dla każdego.

Dla wygody zadokujemy wszystkie edytory i panele do jednego Tabsa. Tabsami nazywam układ dwóch głównych paneli lewego i prawego edytora.

Lewy Tabs zawiera Tabelę "Statystyka kuponów" o której powiem później i "Stronę Startową" a właściwie iest to moduł pełnej wewnętrznej przeglądarki "Edge". To dokowanie do jednego Tabsa można wykonać ręcznie przeciągając panele i opuszczając je właśnie do jednego Tabsa. Lub wybrać opcję "Narzędzia">"Zadokuj panele do jednego Tabsa".

Przeciągnij zakładkę "Strona Startowa" na pierwsze miejsce w szeregu "Tabulatorów". Z lewych narzędzi wybierz "Nawigator WWW". I kliknij na przykład pozycję . Pokaże nam się strona Polskiego sezonu 2024/2025 i pełen wybór lig w Polsce. Klikamy "Ekstraklasa".

Obraz 4: Strona betexplorer.com z danymi kursów spotkań.

No i proszę mimo że dziś czwarty wrzesień i mamy przerwę na reprezentację a są już kursy od 5 bukmacherów na mecze które będą rozegrane od 13-go do 16-go września.

Możesz mozolnie wprowadzać kolejne mecze korzystając z formularza wprowadzania kursów ale można to zautomatyzować.

Moduł "Edge" ma ciekawą opcję wstrzykiwania skryptu Javascript i pobrania jego wyniku jako pliku w formacie Json. To tajemnicze słowo skrót od słów JavaScript Object Notation a krócej to sposób na tekstowy zapis obiektów języka JavaScript

No więc wstrzykniemy taki skrypt. Z lewych narzędzi wybieramy Import-Export. W oknie "Select JavaScript for Browser" wybieramy "Ekstraklasa" a w oknie "select tournament" wybieramy "Footbol Ekstraklasa 24/25".

Teraz wciskamy przycisk "Execute Script" i w prawym panelu "Results" który wcześniej przenieśliśmy na prawo na swoje miejsce mamy wypisany gotowy do wprowadzenia do bazy danych zestaw poleceń języka SQL.

Zaznaczamy je wszystkie(zaznacz wszystko CTRL+A). I Wciskamy przycisk Execute SQL. I gotowe zestaw na przyszłą grę wprowadzony. Ale brakuje mi 7 kolejka Ekstraklasy więc w przeglądarce wybieram zakładkę "Results" i mamy 7 rund Ekstraklasy sezonu 24/25.

No więc wstrzykniemy inny skrypt. Z lewych narzędzi wybieramy Import-Export. W oknie "Select JavaScript for Browser" wybieramy "Ekstraklasa wyniki" a w oknie "select tournament" wybieramy "Footbol Ekstraklasa 24/25".

Teraz wciskamy przycisk "Execute Script" i w prawym panelu "Results" który wcześniej przenieśliśmy na prawo na swoje miejsce mamy wypisany gotowy do wprowadzenia do bazy danych zestaw poleceń języka SQL.

Zaznaczamy je wszystkie(zaznacz wszystko CTRL+A). I Wciskamy przycisk Execute SQL. I gotowe zestaw na przyszłą grę wprowadzony.

Zgromadzane kupony dają przejrzysty obraz statystyczny gier, średnich trafień, ilości błędów, szeregów błędów, procentów wygrywających a te z kolei dane to źródło informacji jak ustawić filtry i jak grać.

A więc stwórzmy kupon:

Z pomocą programu tworzę samodzielne kupony do gry na przykład na 8..10 spotkań ulubionej ligi czy wybranego sportu. Bukmacherzy w Polsce nie prowadzą gry takiej jak "Supertoto" ale za to można grać na zestawy i tworzyć własne kupony AKO. Taki kupon wygrywa tylko trafienia pełne a więc nawet jeden błąd powoduje że kupon jest przegrany.

Ale nie martwcie się zagramy na jeden lub swa błędy to zabezpieczymy trafienia mniejsze własnym sumptem i znacznie korzystniej finansowo. Właśnie o to chodziło mi przy konstrukcji programu. Łatwo, mało ryzykownie i tanio.

Tak że grać musimy z rozsądkiem w sposób przemyślany a warto zagrać wcześniej w sposób wirtualny sprawdzić swoje metody typowań.

Jak wiedzą dobrzy gracze dobry typer potrafi bezbłędnie wytypować ok pięćdziesiąt procent meczy na kuponie. To tak zwane "Pewniaki" czyli typy 1,X czy 2. Reszta to tak zwane. "Podpórki" czyli drugie co do przewidywania wyniki typującego a więc typy podparte drugim wynikiem (dwudrogowe) dla przykładu 1,X 1,2 czy X,2 oraz tak zwane "Fuksy" czyli wyniki najmniej przewidywalne wymagające trzeciego co do przewidywalności wyniku zawodów. Fuksy wymagają podparcia tym trzecim wynikiem a więc typem trzy drogowym 1,X i 2.

W programie te trzy stany typowania wyniku oznaczamy nie 1, X i 2 ale A, B i C. Gdzie A to pewniaki, B to "podpórki" a C to "fuksy". Przy czym kolejność typu A,B czy C musi być uporządkowana do wielkości kursów.

Dla przykładu dla meczu i kursów :

 teams...                        K1     KX     K2 
 ----------------------------   ----   ----   ----
 Motor Lublin - Gornik Zabrze   2.71   3.13   2.53
 
Pewniak  to 2
Podpórka to 1
Fuks     to X 

przy podstawianiu systemu będzie więc dla A,B,C to kolejno 2,1,X a nie 1,X,2

Za wygodę trzeba płacić bo wymaga gry systemem pełnym. Ilość wymaganych kuponów do zawarcia to iloczyn ilości wszystkich typów.

I tak typuję na przykład typy dwa spotkania trzy drogowo i pięć spotkań dwu drogowo (więc trzy do potęgi drugiej równa się 9 zakładów, razy dwa do potęgi czwartej to 16 zakładów to system pełny 9 razy 16 = 144 kuponów. Przy minimalnej 2 zł stawce to wydatek 288zł brutto.

W firmie "STS" zakład akumulacyjny AKO można zagrać dla bezpieczeństwa z błędem a nawet więcej niż jeden. Wygrane wówczas są zgodnie z rachunkiem prawdopodobieństwa (czytaj: bardzo obniżane). Ale my mamy na to sposób, systemy filtrów, zakładanie ilości błędów czy sterowanie generacji ze wzmocnieniem czy osłabienie na podstawie typów (kursów) ekspertów

No więc budujemy kupon dalej...

Otwieramy program. Wybieramy z menu "Pliki">"Baza danych kuponów". W pasku nawigacji (1) klikamy w przycisk [+](2) i wpisujemy lub wybieramy z kalendarza datę zamknięcia zawodów (3) i opis zdarzenia (4) zatwierdzamy przyciskiem nawigacji (5). Właśnie utworzyliśmy nowy kupon.

Obraz 5: Utworzony kupon
Można to zrobić ręcznie. W oknie obok mamy w przeglądarce otworzoną stronę naszego bukmachera. A w bazę kuponów (7) wpisujemy dostępne tam dane to znaczy zestaw par nr kolejny na kuponie oraz odpowiednie wielkości kursów. W rubryki wpisujemy wprost albo posługujemy się paskiem nawigacji (6) lub formularzem wprowadzania danych.

Dla wspomagania i obróbki danych kuponu możemy otworzyć "Formularz Wprowadzania Danych". Tam można przeliczyć przyciskiem "kursy>na procent" szans lub odwrotnie. Kursy bukmachera są podstawą gry więc nie polecam przeliczania procentów na kursy. Chyba że musimy i wiemy co robimy. Obawa polega na tym że algorytm przeliczenia kursów na procenty i odwrotnie różnie wygląda u różnych bukmacherów.

Tak utworzony kupon jest podstawą do dalszej obróbki systemów i typowań w programie "ToToCAD".

To tyle w pierwszym odcinku. Dziękuję i zapraszam do dyskusji na blogu. Wasze wskazówki są cenne bo program wciąż jest w fazie produkcyjnej. Zapraszam na dalsze odcinki, w których poznamy:

  • Systemy i Generatory
  • Zestawienia i Statystyki
  • Opcje i Filtry
  • Narzędzia
  • Przykład gry












czwartek, 30 maja 2024

Dlaczego nie działa skrypt "prognozer3.php" i wyświetla mi się tylko kod skryptu.


Sądziłem że uszkodzony jest kod skryptu. Najczęstszą przyczyną jest to że pierwsza linijka skryptu musi mieć znacznik : <?php
To co przed znacznikiem php wyświetla jako zwykły tekst a dopierp po znaczniku jako kod php i kod ten PHP wykonuje.
    Ale okazało się że wszystko działa prawidłowo a to jest skrypt interaktywny a wyswietlany kod to kod strony internetowej którą on generuje w języku HTML. 
    Aby go wyświetlić prawidłowo należy jak poniżej wybrać opcję [skrypty PHP]->[PHP Opcje] i [przez serwer HTML (interaktywnie)]. (interaktywnie) znaczy  że, będzie można nim sterować z przeglądarki.


Teraz otworzyć należy przeglądarkę i wpisać w nią adres sieci lokalnej lottocada : http://localhost:8086
Jeżeli nie zadziała bo nigdy nie ustawiana była domena to mozna wpisać lokalny adres IP : http://127.0.0.1:8086 . Oba wpisy są równoznaczne. Powinna się wyświetlić jak poniżej lista skryptów programu lottocad która znajduje się w podkatalogu "Script".


Teraz wystarczy kliknąć na skrypt "progozer3.php" i w przeglądarce internetowej zobaczysz formularz sterujący podobny do prognozera wbudowanego w program lottocad. Jak na rysunku 2 i 3 poniżej. 


Przypominam  że prognozer wbudowany uruchamia się w następujący sposób. Na wolnym polu obok menu głównego wciskamy prawy przycisk myszki i rozwinie się submenu ze spisem wszystkich narzędzi i pasków narzędziowych. Wystarczy wybrać np [Panel Prognoz] i one się włączą do używania.

 

 Powodzenia

Wojtek Jarzęcki

poniedziałek, 4 marca 2024

Pytanie: ...Nie mogę pobrać aktualizacji wyników losowań system Windows10

Klient zgłosił pytanie jak w tytule ze zrzutem ekranu:

Odp: Jeżeli komunikat "wyskoczył" od razu przy starcie programu to znaczy że program był źle zainstalowany. Natomiast gdy jednak instalacja jest OK a komunikat wyświetla się podczas aktualizacji wyników to najprawdopodobiej zainstalowanie nowej wersji zadziałało ale nie ma w katalogu LottoCad-a odpowiedniej biblioteki. Jeżeli "awaria" polegała na wyświetleniu komunikatu "Nie mozna załadować biblioteki dll" to zapewne w katalogu głównym jej nie ma. Mechanizm wczytywania bublioteki do aktualizacji wyników polega na tym ze program z bazy danych odczytuje jaka biblioteka aktualnie odpowiada za ściaganie wyników. W najnowaszej wersji jest to biblioteka (plik dll) o nazwie downsql.dll, która powinna znajdować się w katalogu głównym programu np C:\Program Files (x86)\Wojar Software\Lotto CAD 2.32lottocad.

Zależności przedstawia dobrze rysunek ( jeżeli wpis w bazie jest inny lub nie ma tej biblioteki w katalogu głównym, to nalezy go tam umiesćić. Bibliotekę można ściągnąć z downsql.zip. Po rozpakowaniu umieść go w katalogu głównym programu lottocad.)

Polecam pobranie pełnej instalacji z poprawkami. Poprawki dotyczyły głównie instalatora i deinstalatora. Poprawiony deinstalator podczas odinstalowania programu nie usuwał danych programu i starych baz danych. Poprawiony już to wykonuje. Dlatego koniecznie użyj deinstalacji dwukrotnie. Więc dobrze jest aby zrobić to dwukrotnie, raz zainstalować (wgrany będzie nowy uninstaler) , potem odinstalować programem uninstall.exe z katalogu głównego (uninstaler usunie wszystkie śmieci) i po usunięciu zainstalować program jeszcze raz już bez śmieci na czysto.

Uwaga : Nowy moduł pobierania wyników pobiera również wyniki Keno i Szybkie600. Z uwagi na wielkość baz losowań (losownia są przecież co 4 minuty). Dla pobrania zaległości wymagane jest kilkukrotne wywołanie opcji "Pobierz" w module pobierania wyników losowań. Moduł pobiera na raz maksymalnie 5000 wyników z każdej gry.

środa, 11 stycznia 2023

Sposób na utworzenie i aktualizację baz dla gier MULTI_14 i MULTI_22

 Łatwy sposób na tworzenie i aktualizację baz MULTI_14 i MULTI_22. 

 Otwórz "Managera gier". 

Zrób kopię plików bazy wszystkich lub tylko tych o nazwie MULTI_14 i MULTI_22 z katalogu

    C:\Users\Klient\AppData\Roaming\LottoCad232R

    lub w wesji spolszczonej bedzie to ściezka jak na zdjęciu. Gdzie Klient oznacza indywidualną

    nazwę Twojego udziału np "Wojtek", "Marek" poprostu TY.

    W podkatalogu zaznacz wpisy tabel o nazwach MULTI_14 i MULTI_22 (4 pliki) i przenieś ja na chwilę

    np na pulpit. Zabezpieczy Cię to jak coś zepsujesz. Zawsze możesz wrócić przenosząc je spowrotem.

    

Otwórz "Manager Gier", przejdź do zakładki SQL. Wklej w edytor ponizszy skrypt. Następnie wciśnij przycisk wykonaj. I już bazy zostaną rozdzielone na dwie bazy ze wzgledu na wpis o godzinie losowania.


/* początek skryptu, komentarze otoczone parą ukośnik, gwiazdka nie biorą udziału
   to tylko informacja co wykonuje linia polecenia */
EMPTY TABLE MULTI_14;
/* Czyści tabelę wyników gry MULTI_14 */

INSERT INTO MULTI_14 SELECT * FROM multi_multi WHERE (EXTRACT(HOUR FROM "Date")< 15);
/* zapytanie wybiera z bazy te losowania których czas
   losowania jest przed godziną 15:00:00 czyli losowania
   południowe */

EMPTY TABLE MULTI_22;
/* Czyści tabelę wyników gry MULTI_22 */

INSERT INTO MULTI_22 SELECT * FROM multi_multi WHERE (EXTRACT(HOUR FROM "Date")> 15);
/* zapytanie wybiera z bazy te losowania których czas
   losowania jest po godzinie 15:00:00 czyli losowania
   wieczorne */
/* koniec skryptu */

niedziela, 12 września 2021

Keno i Szybkie600, kłopoty

 Dostałem wiadomość że nie działa skrypt do sciągania wyników Szybki600 i Keno. Jak sie okazało skrypt działa. Przyczyną niepowodzenia mogą być zabezpieczenia w skrypcie wykonywanym w programie, usłudze : powershell.

Jak sprawdzić czy powershell ściąga wyniki. W paczce znajduje się wykonywalny skrypt powershell o nazwie dwn.ps1.

Jak go uruchomic aby sprawdzić czy ściągane są wyniki losowań.

Wybierz w eksploratorze katalog gdzie są skrypty dla nowych gier jak w poprzednim poście: LottoCad: Keno i Szybkie600 w LottoCAD-zie. Wybierz menu "Plik" a z niego uruchom powershell lub jezeli masz ustawione inaczej to polecenie otwierające konsolę "cmd".

Otworzy się okno "powershell" lub "cmd". Jeżeli będzie to okno "cmd" wpisz " "powershell dwn.ps1" natomiast gdy będzie to okno "powershell" wpisz polecenie jak na rysunku "./dwn.ps1"

Po wykonaniu skryptu w oknie powinny pojawić sie dane z usługi ściągania wyników ze strony "lotto.pl". Poniższe zrzuty ekranu wyjaśnią wiele.

Przypominam: okna powershell czy cmd powinny byc otworzone z pełna ścieżką jak na zrzutach.







poniedziałek, 30 sierpnia 2021

Keno i Szybkie600 w LottoCAD-zie

 Witam...

Wprowadziłem skrypty i można wprowadzić nowe dwie gry do LottoCADa:

  • Keno
  • Szybkie600
Spakowaną w formacie zip paczkę skryptów można pobrać z linku :


To gry losowane co 4 minuty i trzeba tu zmienić koncepcję gry. Analiza gry na bieżąco wydaje się niemożliwa, podczas sesji w ciągu 4 minut trzeba by było ściągnąć i zapisać wyniki, wykonać analizę czy predykcję, wygenerować zakłady no i je wysłać. Ściąganie wyników na bieżąco i "gra zaraz po grze" wydaje się więc niemożliwa ale można ściągnąć np zawsze ostatnie 500 wyników i analizować do gry na przyszłe kilka losowań niekoniecznie na następne. Czyli sesję zaczynamy od ściągnięcia 500 wyników czyli ok dwa dni losowań. 

W paczce znajdują się pliki :
  • download500_Keno.php  - ściąga wyniki dla gry Keno, maximum 500
  • download500_Szybkie600.php   - ściąga wyniki dla gry Szybkie600, maximum 500  
  • keno_config.ini - plik w formacie ini dane do założenia gry Keno
  • Szybkie600_config.ini - plik w formacie ini dane do założenia gry Szybkie600
  • Keno_create_new_game.php - skrypt tworzący zapytania tworzące gre Keno
  • Szybkie600_create_new_game.php  - skrypt tworzący zapytania tworzące gre S600

a w podkatalogu "szablony" pliki:
  • newgame_config.ini  - przykładowy plik konfiguracji do tworzenia przyszłych gier
  • newgame_to_sql.php - przykładowy skrypt do tworzenia przyszłych gier
Jak to zrobić najlepiej wyjaśni film.






 

wtorek, 3 listopada 2020

Prognozy przypomnienie i "paskuda" czyli prognozy nieco inaczej...

 Cykliczność występowania liczb w kolejnych losowaniach jest podstawą działania predykcji w module "Prognozy" programu "LottoCAD". Do obejrzenia na YouTube...

Prognozy cz.1 na YouTube


Prognozy cz.2 na YouTube


Prognozy cz.3 na YouTube



Ale w module "Prognozy" okresy cykli są o stałej szerokości a sposób wybierania polega na podziale częstosci w zadany stosunek procentowy liczb pobieranych z histogramów czestosci (czyli podział na liczby "zimne" - rzadziej wystepujace i liczby "gorące" czesciej wystepujace naprzemian w kolejnych okresach o stałej szerokości (ilości losowań).

Wyniki gry z zastosowaniem "prognoz" są zachęcajace i okresowo mozna liczyc na dobre prognozowane wyniki. Dlatego spróbowałem napisać skrypt który szuka podobnych zaleznosci ale nieco inaczej.
    // wirtualny układ matrycy parametrów (wiersze kolumny):
    // [4, 6 ,8]
    // [1, 1 ,1]
    // [0, 1 ,2]
    // Przykład parametrów w kodzie PHP odpowiada powyższej matrycy:
    $back_range = array(4,6,8); // przedziały wstecz (w trzech cyklach po 4,6,8 = 18 losowań)
	$back_level = array(1,1,1); // poziom trafień w histogramie z każdego przedziału
	$back_mode  = array(0,1,2); // kryteria -2:mniejszy, -1:mniejszy lub równy, 0:równy, 1:większy lub równy, 2:wiekszy
  • Okresy i zawartość okresów zadajemy parametrami. Zawartymi w tablicy prostokatnej (matrycy) np: jak powyżej
  • Parametry to matryca o ilosci wierszy = 3 elementy, natomiast kolumny to parametry dla poszczególnych okresów analizy
  • Kolejne okresy są badane a liczby spełniające kryteria są wybierane a ich wspólne elementy przechodzą selekcję (są wybierane jako prognoza, ponieważ spełniają kryteria)
  • Ponieważ cięzko jest z góry okreslić zestaw parametrów dlatego stworzyłem drugi skrypt "symulator" który losowo wybiera zestaw parametrów, szereguje je w tablicy wg skutecznosci trafień (ranking=0 jezeli żadna liczba nie trafiła lub ranking=1 /100%/ jeżeli wszystkie liczby trafiły w następnym losowaniu) od danego offsetu (przesuniecia od odtatniego losowania). Ostatnie losowanie ma offset= 0 /zero/.
Skrypty mozna pobrać z linku : Tu pobierzesz skrypty spakowane do archiwum zip Przykład jak skrypt wybiera liczby znajdziesz w komentarzu w skrypcie "paskuda-symulator" :

Skrypt paskuda

<php
error_reporting(5);
require_once("include/class_Utils.php");
/*

            Skrypt wybiera liczby które w zadanych przedziałach spełniają kryteria
            podane w ustawieniach zmiennych, dla offsetów większych niż jeden
            skrypt podaje trafienia wybranych liczb.
            Należy tak dobrać kryteria aby uzyskać najwięcej trafień.
            Ilść zakresów i kryterium jest dowolna ale ilść kryterium
            powinna być równa ilości zakresów. Należy o tym pamiętać ( float $arg );

Kryteria oznaczaj1 :

$back_range = array(4,6,8); // przedziały wstecz (pierwszy ostatnie losowanie)
$back_level = array(1,1,1); // poziom trafień w przedziałach
$back_mode  = array(0,1,2); // -2:mniejszy, -1:mniejszy lub równy, 0:równy, 1:większy lub równy, 2:wiekszy

wybierz liczby które w 4 ostatnich losowaniach trafione były dokładnie jeden raz
        a w następnych 6 losowaniach trafione były więcej niż 1 raz

*/

//-------------------------------------- ustawienie zmiennych---------------------------------------

$offsetstart=0;
$offsetstop=200;
//[ 14,  7,  ]
//[  1,  3,  ]
//[  1,  1,  ]
$back_range = array(14,7); // przedziały wstecz (pierwszy element od ostatniego losowania)
$back_level = array(1,3); // poziom trafień w przedziałach
$back_mode  = array(1,1); // liczba oznacza -2:mniejszy, -1:mniejszy lub równy, 0:równy, 1:większy lub równy, 2:wiekszy

// -------------------------------------------------------------------------------------------------

    $back_array=array($back_range,$back_level,$back_mode);
    $offset = 0; // ostatnie losowanie w bazie
    
    $cutting = $offsetstop+array_sum($back_range)+100;
    $drawtable= delphi_get_draw_arr();
    Utils::draw_to_set_array($drawtable);
    $drawtable = array_reverse($drawtable);
    $drawtable = array_splice($drawtable,0,$cutting);
    $out=array();    
         for ($offset=$offsetstart;$offset<=$offsetstop;$offset++) {   // dla każdego offsetu
        //echo "offset $offset\n";

            $rank=get_paskuda($drawtable,$offset,$back_array);            // wybiera paskudę

            if ($offset>0) {                                              // jeżeli offset>0 sprawdza trafienia tej paskudy
                $lastdraw=$offset-1;
                $xhit=array_intersect ( $rank,$drawtable[$lastdraw]);
                $countXHit = count($xhit);
                $rankcount = count($rank);
                //echo sprintf("cnt.rank : %3d, cnt.hit: %3d\n",$rankcount,$countXHit);
                if ($countXHit>0) {
                    $ranking = $countXHit/$rankcount;
                    $out[]=array("offset"=>$offset, "rank"=>$ranking,$back_array,"psk"=>$rank,"hit"=>$xhit);
                } else
                continue;
            }

        } // for   
        foreach ($out as $arr) {
            echo sprintf ("offset: %3d ranking: %1.2f\n%s%s",$arr['offset'],$arr['rank'],array2line("paskuda:",$arr['psk']),array2line("    hit:",$arr['hit']));
            echo params2matrix($arr[0]);
        }

//    for ($offset=$offsetstart;$offset<=$offsetstop;$offset++) {   // dla każdego offsetu
//        $rank=get_paskuda($drawtable,$offset,$back_array);            // wybiera paskudę
//        print array2line("paskuda : ",$rank);
//        if ($offset>0) {                                              // jeżeli offset>0 sprawdza trafienia tej paskudy
//            $lastdraw=$offset-1;
//            $xhit=array_intersect ( $rank,$drawtable[$lastdraw]);
//            echo array2line("trafila : ",$xhit); // wypisuje trafienia
//        }
//    print " ----------- offset $offset ------\n";
//    }


function array2line($title,$arr) {
$s="";
foreach($arr as $item)  $s.=sprintf("%2d ",$item);
$s=trim($s);
return sprintf("%s (%3d): %s\n",$title, count($arr),$s);
}

function params2matrix($arr) {
  $s="";
  foreach($arr as $line) {
     $s.="[ ";
     foreach($line as $par) {
           $s.=sprintf("%2d, ",$par);
     }
     $s.=" ]\n";
  }
return $s;
}

function get_paskuda($draw,$offset,$back_array) {       // procedura paskuda                                     // ostatnie losowanie danego offsetu
$zx=array();
$lastdraw=$offset;                                           // delkaracja tablicy zx
foreach($back_array[0] as $brkey=>$br) {                // dla kazdej tróki parametru $back_range
$blevel=$back_array[1][$brkey];
$bmode=$back_array[2][$brkey];


$x=array();
$z=array();                                              // tablice pomocnicze
// oblicza kolejne grupy wg kryterii
for ($i=0;$i<$br ;$i++) {                                // robi harmonogram liczb w zakresach z parametrami
    foreach($draw[$lastdraw] as $num)
        if (isset($z[$num]))
          $z[$num]++;
        else
          $z[$num]=1;
        $lastdraw++; // zwiększ licznik o jeden
   };


foreach($z as $nkey=>$num) {
       if ($bmode==-2) {
        //echo $num." < ".$blevel."\n";                             // dodaje liczby do tablicy $x jeżeli :
       if ($num<$blevel) $x[]=$nkey;                   // jeżeli mode==-2 (trafienia mniejsze niż $blevel)
        }
   elseif ($bmode==-1) {                               
        if ($num<=$blevel) $x[]=$nkey;                 // jak wyżej ale trafienia mniejsze
        }
   elseif ($bmode==0) {                                
        if ($num==$blevel) $x[]=$nkey;                 // jak wyżej ale trafienia równe
        }
   elseif ($bmode==1) {
        //echo $num." >= ".$blevel."\n";
        if ($num>=$blevel) $x[]=$nkey;                 // jak wyżej ale trafienia większe    
        }
   elseif ($bmode==2) {
        if ($num>$blevel) $x[]=$nkey;                  // jak wyżej ale trafienia większe lub równe
        };
   
}

$zx[$brkey]=$x;  // tablicę $x ładuje do odpowiedniej tablicy zakresu $zx
};

$out=$zx[0]; // bierze tablicę pierwszego zakresu 

foreach($zx as $key=>$arr)
     if ($key>0) $out=array_intersect ( $out, $arr); // i wybiera wspólne liczby z wszystkich zakresów
return $out; // zwraca te liczby jako paskudę.
}

Skrypt paskuda, symulator

<php
error_reporting(5);
require_once("include/class_Utils.php");
/*
Znaleziona paskuda z parametrami jak powyżej. Prognoza znalazła 
18 liczb z czego w następnym losowaniu zostało trafione 7 liczb
co stanowi skuteczność 18%. Po znalezieniu tych parametrów wpisujemy
je do skryptu paskuda i robimy analizę dla np 100 offsetów. Obserwując 
wyniki patrzymy na obliczona skuteczność (ranking) stwierdzany jak 
często uzyskujemy dobry wynik.
Parametry kolejnych okresów losowań są w kolumnach matrycy:

offset:  16 ranking: 0.39 paskuda: paskuda: ( 18): 43 34 42 22 46 32 18 58 53 75  4 13 11  9 16 63 35 40 hit: hit: (  7): 34 58 53 75 13 16 35
[ 14,  7,  ]
[  1,  3,  ]
[  1,  1,  ]

Jak to jest budowane? Skrypt pobiera pierwszą kolumnę (pack=0) i buduje 
w okresie back=14 losowań histogram częstości wystąpień liczb. Dla mode=1 i level=1 Wybiera
z histogramu częstości te liczby które wystąpiły w tych 14 losowaniach (back=14) 
wiecej lub równo (mode=1) jeden raz (level=1). Więc są to wszystkie liczby z tego zakresu.
W histogramie widać częstość a tablica jest posortowana wg częstości właśnie. Przykład:
liczba 65 w 14 losowaniach wystąpiła 7 razy, liczba 60 pieć razy a liczba 77 trzy razy. 
########################## back=14 level=1 mode=1
---  pack : 0 ---
--- histo : 7  6  6  6  6  6  6  6  6  6  5  5  5  5  5  5  5  5  5  5  5  5  4  4  4  4  4  4  4  4  4  4  4  4  4  4  4  3  3  3  3  3  3  3  3  3  3  3  3  3  3  3  3  3  3  3  3  3  2  2  2  2  2  2  2  2  2  2  2  2  2  2  2  1  1  1  1  1  1
--- liczby:65 45 16 35 30 70 11 20 27 79 60  2 17 56 41  6 42 40 69 51 49 78 75 73 55  5 12 24  1 26  7 64 37 38 39 48 80 33 72 77 21 57  9 15 25 50 61 47 10 14 29 53 59 58 13 44 68  8 31 52 32 28 46 18 62 19 74  4 54 23 36 76 71 34 43 63 66 22 67

To samo robi z paczką drugą (druga kolumna parametrów) back=7 level=3 mode=1 
Jak widać ma za zadanie z paczki następnych back=7 losowań, zrobic histogram
częstości i wybrać z niego liczby które wystąpiły (więcej lub równo (mode=1) 
3 krotnie (level=3)). Poniżej to liczby z linii (---output)

--- output :65 45 16 35 30 70 11 20 27 79 60  2 17 56 41  6 42 40 69 51 49 78 75 73 55  5 12 24  1 26  7 64 37 38 39 48 80 33 72 77 21 57  9 15 25 50 61 47 10 14 29 53 59 58 13 44 68  8 31 52 32 28 46 18 62 19 74  4 54 23 36 76 71 34 43 63 66 22 67
--- select :43 34 42 22 46 32 18 58 53 75  4 13 11  9 16 63 35 40
--- output :43 34 42 22 46 32 18 58 53 75  4 13 11  9 16 63 35 40

teraz paczkę z pierwszej kolumny (---output) porównuje z paczką z drugiej kolumny
(---output) robi logiczną operację I (AND) na zbiorach liczb i pobiera jako paskudę 
(---output) zestaw wspólny (liczb występujących w obu zbiorach)


Paczkę tę sprawdza z losowaniem następnym od losowania offset (następne losowanie)
  
*/

//-------------------------------------- ustawienie zmiennych---------------------------------------
    $offsetstart=0;                          // od offsetu zero ostatnie losowanie
    $offsetstop=20;                         // ilosc sprawdzanych offsetow
    $ranges["back_range"]= array(1,20);      // zakres paczek losowan (okresy)
    $ranges["back_level"]=array(0,10);       // ilosc trafien w zakresie od zero do 10
    $ranges["back_mode"]=array(-2,2);        // zakresy od -2 do 2 oznaczaja rodzaj porownania "<, <=, =, >=, >"
    $ranges["count"] = 2;                    // ilosc okresow glownych
    $iterations = 100;                      // ilosc losowan kombinacji parametr??//-------------------------------------------------------------------------------------------------------

    $cutting = ($offsetstop-$offsetstart)+($ranges["count"]*$ranges["back_range"][1])+100;
    $drawtable= delphi_get_draw_arr();
    Utils::draw_to_set_array($drawtable);
    $drawtable = array_reverse($drawtable);
    $drawtable = array_splice($drawtable,0,$cutting);


//    $back_range = array(4,6,8); // przedzia3y wstecz (pierwszy element od ostatniego losowania)
//    $back_level = array(1,1,1); // poziom trafien w przedzia3ach
//    $back_mode  = array(1,1,1); // liczba oznacza -2:mniejszy; -1:mniejszy lub rowny 0:równy 1:wiekszy lub równy 2:wiekszy



// Pętla główna    
// -------------------------------------------------------------------------------------------------

    $items=array();
    For ($i=$ranges["back_range"][0];$i<=$ranges["back_range"][1];$i++) {
        For ($j=$ranges["back_level"][0];$j<=$ranges["back_level"][1];$j++) {
            For ($k=$ranges["back_mode"][0];$k<=$ranges["back_mode"][1];$k++) {
                $items[]=array($i,$j,$k);
            }
        }
    }
    
    
    $cnt = count($items);
    
    $out=array();
    
    do {
    $back_range = array();
    $back_level = array();
    $back_mode  = array();
        for ($i=0;$i<$ranges["count"];$i++) { // dla każdej kolumny (okresu)
            $rnd = rand(0,$cnt);
            //echo "rand: $rnd, i: $i, cnt: $cnt\n";
            $back_range[] = $items[$rnd-1][0];
            $back_level[] = $items[$rnd-1][1];
            $back_mode[]  = $items[$rnd-1][2];
        }
  
    $back_array=array($back_range,$back_level,$back_mode);
    //echo params2line($back_array);
    $offset = 0; // ostatnie losowanie w bazie
     
        for ($offset=$offsetstart;$offset<=$offsetstop;$offset++) {   // dla każdego offsetu
        //echo "offset $offset\n";
            $rank=get_paskuda($drawtable,$offset,$back_array);            // wybiera paskudę

            if ($offset>0) {                                              // jeżeli offset>0 sprawdza trafienia tej paskudy
                $lastdraw=$offset-1;
                $xhit=array_intersect ( $rank,$drawtable[$lastdraw]);
                $countXHit = count($xhit);
                $rankcount = count($rank);
                //echo sprintf("cnt.rank : %3d, cnt.hit: %3d\n",$rankcount,$countXHit);
                if ($countXHit>0) {
                    $ranking = $countXHit/$rankcount;
                    $out[]=array("offset"=>$offset, "rank"=>$ranking,$back_array,"psk"=>$rank,"hit"=>$xhit);
                } else
                continue;
            }

        } // for
    $iterations--; 
    //echo "iteracja $iterations\n";
    } while ($iterations>0);

usort($out,"cmp");

foreach ($out as $arr) {
echo sprintf ("offset: %3d ranking: %1.2f %s %s\n",$arr['offset'],$arr['rank'],array2line("paskuda:",$arr['psk']),array2line("hit:",$arr['hit']));
echo params2matrix($arr[0]);
}
//echo "rank: {$out["ranking"]}";
//echo ", params:"


 
// Koniec programu zasadniczego    
// funkcje pomocnicze

function params2line($arr) {
  $s=sprintf("[%2d %2d %2d], [%2d %2d %2d], [%2d %2d %2d]\n",$arr[0][0],$arr[0][1],$arr[0][2],$arr[1][0],$arr[1][1],$arr[1][2],$arr[2][0],$arr[2][1],$arr[2][2]);
return $s;
}

function params2matrix($arr) {
  $s="";
  foreach($arr as $line) {
     $s.="[ ";
     foreach($line as $par) {
           $s.=sprintf("%2d, ",$par);
     }
     $s.=" ]\n";
  }
return $s;
}


function array2line($title,$arr) {
$s="";
foreach($arr as $item)  $s.=sprintf("%2d ",$item);
$s=trim($s);
return sprintf("%s (%3d): %s",$title, count($arr),$s);
}

function get_paskuda($draw,$offset,$back_array) {       // procedura paskuda                                     // ostatnie losowanie danego offsetu
$zx=array();
$lastdraw=$offset;                                           // delkaracja tablicy zx
foreach($back_array[0] as $brkey=>$br) {                // dla kazdej tróki parametru $back_range
$blevel=$back_array[1][$brkey];
$bmode=$back_array[2][$brkey];
//echo "########################## back=$br level=$blevel mode=$bmode\n";
$x=array();
$z=array();                                              // tablice pomocnicze
// oblicza kolejne grupy wg kryterii
for ($i=0;$i<$br ;$i++) {                                // robi harmonogram liczb w zakresach z parametrami
    foreach($draw[$lastdraw] as $num)   $z[$num]++;
    $lastdraw++; // zwiększ licznik o jeden
   };
    arsort($z);
    //echo "---  pack : $brkey ---\n";
    //echo "--- histo :",Utils::printTicket($z),"\n";
    //echo "--- liczby:",Utils::printTicket(array_keys($z)),"\n";
    
foreach($z as $nkey=>$num) {
       if ($bmode==-2) {                               // dodaje liczby do tablicy $x jeżeli :
       if ($num<$blevel) $x[]=$nkey;                   // jeżeli mode==-2 (trafienia mniejsze niż $blevel)
        }
   elseif ($bmode==-1) {                               
        if ($num<=$blevel) $x[]=$nkey;                 // jak wyżej ale trafienia mniejsze
        }
   elseif ($bmode==0) {                                
        if ($num==$blevel) $x[]=$nkey;                 // jak wyżej ale trafienia równe
        }
   elseif ($bmode==1) {                            
        if ($num>=$blevel) $x[]=$nkey;                 // jak wyżej ale trafienia większe    
        }
   elseif ($bmode==2) {
        if ($num>$blevel) $x[]=$nkey;                  // jak wyżej ale trafienia większe lub równe
        };
}

$zx[$brkey]=$x;  // tablicę $x ładuje do odpowiedniej tablicy zakresu $zx
};


$out=$zx[0]; // bierze tablicę pierwszego zakresu 

//echo "offset: $offset  -------------------\n";
//echo "lastdraw: $lastdraw  ---------------\n";
//echo params2matrix($back_array);
foreach($zx as $key=>$arr) { 
  //  echo "--- output :",Utils::printTicket($out),"\n"; 
    if ($key>0) $out=array_intersect ( $arr,$out); // i wybiera wspólne liczby z wszystkich zakresów
  //  echo "--- select :",Utils::printTicket($arr),"\n";
  //  echo "--- output :",Utils::printTicket($out),"\n";   
    }
return $out; // zwraca te liczby jako paskudę.
}


function cmp($a, $b)
{
    if ($a["rank"] == $b["rank"]) {
        return 0;
    }
    return ($a["rank"] < $b["rank"]) ? 1 : -1;
}