კლასიფიკაციისა და პროგნოზირების მეთოდები. დამხმარე ვექტორული მანქანა. "უახლოესი მეზობლის" მეთოდი. ბაიესის კლასიფიკაცია. გულუბრყვილო ბეიზის კლასიფიკატორი სიგნალებისთვის ინდიკატორების ნაკრებიდან. სტატისტიკა, რომლის შესახებაც

19.02.2024

ყველაზე გავრცელებული აპლიკაცია გულუბრყვილო ბეისი- დოკუმენტების კლასიფიკაცია. ეს ელფოსტა სპამია თუ მისასალმებელი სიახლე? ეს Twitter პოსტი კეთილსაიმედოა თუ გაბრაზებული? უნდა გადაეცეს თუ არა ეს გადაღებული მობილური ტელეფონის ზარი ფედერალურ აგენტებს შემდგომი გამოძიებისთვის? თქვენ აწვდით სასწავლო ალგორითმს „ტრენინგ მონაცემებს“, როგორიცაა კლასიფიცირებული სამაგალითო დოკუმენტები, რომელსაც შეუძლია ახალი დოკუმენტების „კატეგორიზაცია“ იმავე კატეგორიებად არსებული ცოდნის გამოყენებით.

დოკუმენტების კლასიფიკაციის ყველაზე გავრცელებული მიდგომა არის მოდელის გამოყენება სიტყვების ნაკრებიშერწყმულია გულუბრყვილო Bayes კლასიფიკატორთან. მოდელი სიტყვების ნაკრებიდოკუმენტს აღიქვამს, როგორც სიტყვების ნარევს. "ჯონიმ შეჭამა ყველი" მისთვის იგივეა, რაც "ჯონიმ შეჭამა ყველი" - ორივე შედგება ერთი და იგივე სიტყვებისგან: ("ჯონი", "ჭამა", "ყველი").

ჩამოტვირთეთ შენიშვნა ფორმატში ან ფორმატში, მაგალითები ფორმატში

მოკლე შესავალი ალბათობის თეორიაში.გამოთქმა p() გამოიყენება ალბათობის აღსანიშნავად. მაგალითად, p(A) = 0 , 2 ნიშნავს, რომ მოვლენა A მოხდება 20%-ის ალბათობით. გამონათქვამები, როგორიცაა p(A|B) გამოიყენება პირობითი ალბათობების აღსანიშნავად. მაგალითად, p(A|B) = 0.3 ნიშნავს, რომ A მოვლენის ალბათობა, იმის გათვალისწინებით, რომ B მოვლენა ხდება, არის 30%. ერთობლივი ალბათობა p(A, B) გამოიყენება A და B მოვლენების ერთდროულად განხორციელების ალბათობის აღსანიშნავად. თუ მოვლენები A და B დამოუკიდებელია, მაშინ p(A, B) = p(A) * p(B). თუ მოვლენები A და B არის დამოკიდებული, მაშინ p(A, B) = p(A) * p(B|A).

მაგალითად, ჩვენ ვსწავლობთ ტვიტებს ელ.ფოსტის გაგზავნის სერვისის შესახებ - Mandrill.com. საკვანძო სიტყვით ძიებისას - მანდრილი– გარდა სასარგებლო ბმულებისა, ასევე ჩნდება არარელევანტური ბმულები. ჩვენი ამოცანაა გავფილტროთ შესაბამისი ტვიტები. ვთქვათ, ჩვენ ადრე დავაგროვეთ მონაცემთა ბაზა 300 ტვიტისგან: 150 Mandrill.com აპლიკაციის შესახებ და 150 სხვების შესახებ.

ჩვენ თითოეულ ტვიტს ვყოფთ ცალკეულ სიტყვებად (ე.წ. ნიშნები - ნიშანი). ჩვენ გვაინტერესებს ორი ალბათობა:

p (აპლიკაცია | სიტყვა1, სიტყვა2...)
p (სხვა | სიტყვა1, სიტყვა2, ...)

ეს არის ალბათობა, რომ ტვიტი ეხებოდეს ან აპლიკაციას ან სხვა რამეს, იმის გათვალისწინებით, რომ ჩვენ აღმოვაჩენთ სიტყვებს: "word1", "word2" და ა.შ.

(1) p (აპლიკაცია | სიტყვა1, სიტყვა2, ...) > p (სხვა | სიტყვა1, სიტყვა2, ...)

მაშინ ეს ტვიტი ეხება Mandrill.com-ს. მაგრამ როგორ გამოვთვალოთ ეს ალბათობები? პირველი ნაბიჯი არის ბეიზის თეორემის გამოყენება, რომელიც საშუალებას აძლევს განაცხადის პირობითი ალბათობის გადაწერას შემდეგნაირად:

Მსგავსი

(2) და (3) ჩანაცვლება (1)-ში და ორივე მხარის გამრავლება p (სიტყვა1, სიტყვა2, ...), ვიღებთ პირობას (1) სახით:

(4) p(adj.) * p(word1,word2,...|adj.) > p(სხვა) * p(word1,word2,...|სხვა)

ანალიზისთვის გამოყენებული a posteriori მაქსიმალური წესი (MAR) საშუალებას იძლევა, პირველ რიგში, ყურადღება არ მიაქციოთ p (app.) და p (სხვა) მნიშვნელობებში განსხვავებას და მეორეც, განიხილოს სიტყვების ალბათობა, რომელიც გამოჩნდება. ტვიტი იყოს დამოუკიდებელი (თუმცა ეს ასე არ არის!) და შეცვალეთ:

р(სიტყვა1, სიტყვა2,…| აპი.) –> р(სიტყვა1| აპ.) * р(სიტყვა2| აპ.) * …
p(word1,word2,...|სხვა) –>

საბოლოო ფორმით, ჩვენ შევადარებთ ორ რაოდენობას:

(5) p(word1| app.) * p(word2| app.) * … > p(word1|სხვა) * p(word2|სხვა) * …

დამოუკიდებლობის დაშვება საშუალებას გვაძლევს გავყოთ ცნობილი კლასის მოცემული სიტყვების სიმრავლის ერთობლივი პირობითი ალბათობა ამ კლასში თითოეული სიტყვის პოვნის ალბათობებად. სიტყვების დამოუკიდებლად განხილვით, ჩვენ ვნერგავთ უამრავ შეცდომას MAP ალგორითმში, მაგრამ საბოლოოდ ისინი არ იმოქმედებენ სწორ არჩევანზე აპლიკაციასთან დაკავშირებულ კომპლექტსა და სხვა ტვიტებს შორის.

ორი პრობლემა რჩება გადასაჭრელი: რა ვუყოთ იშვიათ სიტყვებს და როგორ დავამარცხოთ გაუჩინარებული მცირე მნიშვნელობები, რომლებიც ჩნდება დიდი რაოდენობის ალბათობების ნულთან ახლოს გამრავლებისას? ჩვეულებისამებრ, თითოეულ მნიშვნელობას (თუნდაც ნულს) ერთის დამატება. ამას ეწოდება დამატებითი გლუვი და ხშირად გამოიყენება მანამდე უცნობი სიტყვების შესატანად სიტყვების ჩანთაში. და გამრავლების ნაცვლად გამოიყენება ლოგარითმების დამატება. მაგალითად, თქვენ გაქვთ პროდუქტი: 0.2 * 0.8. აიღეთ მისი ლოგარითმი: ln(0.2 * 0.8) = ln(0.2) + ln(0.8).

ასე რომ, ყველა ახსნა მოცემულია და შეგიძლიათ გადახვიდეთ Excel-ზე. სამაგალითო წიგნის პირველი ორი გვერდი შეიცავს 150 ტვიტს, რომლებიც დაკავშირებულია Mandrill.com აპთან (სურათი 1) და სხვა თემებთან. თანმიმდევრულად, ტვიტების თავდაპირველ ტექსტში ყველა ასო იცვლება პატარა ასოებით, შემდეგ კი პუნქტუაციის ნიშნები ინტერვალით. მაგალითად, ფორმულა უჯრედში E2 =SUBSTITUTE(D2;"?";" ") - ცვლის ყველა კითხვის ნიშანს ტექსტში, რომელიც შეიცავს D2 უჯრედში.

ბრინჯი. 1. აპლიკაციის შესახებ ტვიტების მონაცემთა ბაზაში არასაჭირო სიმბოლოების ამოღება (სურათის გასადიდებლად დააწკაპუნეთ მასზე მარჯვენა ღილაკით და აირჩიეთ გახსენით სურათი ახალ ჩანართში)

ახლა ჩვენ უნდა დავთვალოთ რამდენჯერ არის გამოყენებული თითოეული სიტყვა მოცემული კატეგორიის პოსტებში. ამისათვის თქვენ უნდა შეაგროვოთ ყველა სიტყვა თითოეული მონაცემთა ბაზის ტვიტებიდან ერთ სვეტში. თუ ვივარაუდებთ, რომ თითოეული ტვიტი შეიცავს არაუმეტეს 30 სიტყვას და აპირებთ თითოეულ ჟეტონს მივანიჭოთ საკუთარი ხაზი, დაგჭირდებათ 150 * 30 = 4500 სტრიქონი. შექმენით ახალი ფურცელი, დაასახელეთ ჟეტონები_ადჯ.დაასახელეთ უჯრედი A1 ტვიტები. დააკოპირეთ H2:H151 მნიშვნელობები ფურცლიდან ბუფერში განაცხადი.აირჩიეთ ფურცელზე ჟეტონები_ადჯ.ფართობი A2:A4501 და დააწკაპუნეთ ჩასმა –> სპეციალური ჩანართი –> ღირებულებები(ნახ. 2). დააწკაპუნეთ OK. გაითვალისწინეთ, რომ მას შემდეგ, რაც თქვენ ჩასვით 150 ტვიტი 4500 მწკრივში, Excel იმეორებს ყველაფერს თქვენთვის. ეს ნიშნავს, რომ თუ ხაზს გაუსვამთ პირველ სიტყვას პირველი ტვიტიდან მე-2 სტრიქონზე, იგივე ტვიტი განმეორდება მეორე სიტყვის ხაზგასასმელად 152 სტრიქონზე, მესამე 302 ხაზზე და ა.შ.

შეისწავლეთ ფურცლის B:D სვეტების ფორმულები ჟეტონები_ადჯ.ტვიტიდან ტოკენების თანმიმდევრული ამოღების მექანიკის გასაგებად (სურათი 3). შექმენით ფურცელი იმავე გზით ჟეტონები_სხვატვიტების მონაცემთა ბაზისთვის, რომელიც არ არის დაკავშირებული Mandrill.com აპლიკაციასთან.

ბრინჯი. 3. ფურცლის ფრაგმენტი Tokens_adj.,რომელიც იღებს ტოკენებს Mandrill.com აპთან დაკავშირებულ ტვიტების მონაცემთა ბაზიდან

ახლა ფურცლის საფუძველზე ჟეტონები_ადჯ.თქვენ უნდა შექმნათ კრებსითი ცხრილი, რომელიც ითვლის თითოეული ტოკენის შემთხვევების რაოდენობას. კრებსითი ცხრილის ფილტრის გამოყენებით, გამორიცხეთ 4 სიმბოლომდე სიგრძის სიტყვები და ასევე დაამატეთ სვეტები ნიშნის გაჩენის სიხშირის ლოგარითმის გამოსათვლელად (ნახ. 4). გაიმეორეთ ოპერაცია ფურცლისთვის ჟეტონები_სხვა

ახლა, როდესაც კლასიფიკატორის მოდელი "გაწვრთნილი", დროა მისი გამოყენება. ფურცელზე ტესტიგამოქვეყნებულია 20 ტვიტი, რომლებიც გასაიდუმლოებულია. ისინი ასევე დამუშავებულია (როგორც ნახ. 1). მოათავსეთ მომზადებული ტვიტები ფურცელზე კლასიფიკაცია. მონიშნეთ D2:D21 და აირჩიეთ DATA –> სვეტის ტექსტი. ფანჯარაში, რომელიც გამოჩნდება, აირჩიეთ გამყოფებითდა დააჭირეთ Უფრო. მეორე ეტაპზე აირჩიეთ tab და space სიმბოლოები გამყოფებად და დაითვალეთ თანმიმდევრული გამსაზღვრები ერთად(ნახ. 5). დააყენეთ ხაზის დელიმიტერი (არა). დააწკაპუნეთ Უფრო. ბოლო საფეხურზე სვეტის მონაცემთა ფორმატიდაინსტალირება გენერალი. დააწკაპუნეთ მზადაა.

პროცედურა გაფანტავს ტვიტებს მთელი ფურცლის სვეტებზე AI-ის სვეტამდე (ნახ. 6).

ახლა, VLOOKUP ფუნქციის გამოყენებით, ჩვენ გამოვიყვანთ მონაცემებს ტესტის ნიშნების ალბათობის ლოგარითმებზე, რომლებიც წარმოიქმნება მონაცემთა ორ ნაკრებში (აპლიკაცია / სხვა). შევადაროთ რაოდენობები და გამოვიტანოთ დასკვნა, ეკუთვნის თუ არა ტესტები ამა თუ იმ კლასს (სურ. 7). ტვიტები, რომელთა ლოგარითმის სხვაობა 1-ზე ნაკლებია, მონიშნულია ფერით. ფორმულების შესახებ მეტი დეტალები შეგიძლიათ იხილოთ ფურცელზე კლასიფიკაცია.

Სულ ეს არის. მოდელი აგებულია, ვარაუდები კეთდება.

დაწერილია ჯონ ფორმანის წიგნის მიხედვით. – M.: Alpina Publisher, 2016. – გვ. 101–128

ამ ნაწილში ჩვენ არ ვისაუბრებთ სარეკომენდაციო სისტემებზე, როგორც ასეთზე. ამის ნაცვლად, ჩვენ კონკრეტულად გავამახვილებთ ყურადღებას მანქანათმცოდნეობის მთავარ ინსტრუმენტზე - ბეიზის თეორემაზე - და გადავხედავთ მისი გამოყენების ერთ მარტივ მაგალითს - გულუბრყვილო ბაიეს კლასიფიკატორს. უარი პასუხისმგებლობაზე: ნაკლებად სავარაუდოა, რომ მკითხველს, რომელიც ამ საკითხს იცნობს, რაიმე ახალს ვუთხრა აქ; ჩვენ ძირითადად ვისაუბრებთ მანქანათმცოდნეობის ძირითად ფილოსოფიაზე.


ბეიზის თეორემა ან ახსოვს ან შეიძლება ტრივიალურად გამოიტანოს ყველას, ვინც გავლილი აქვს ალბათობის თეორიის ყველაზე ძირითადი კურსიც კი. გახსოვდეთ, რა არის მოვლენის პირობითი ალბათობა xმოვლენას ექვემდებარება ? ზუსტად განსაზღვრებით: , სად არის ერთობლივი ალბათობა xდა , ა გვ(x) და გვ() - თითოეული მოვლენის ალბათობა ცალ-ცალკე. ეს ნიშნავს, რომ ერთობლივი ალბათობა შეიძლება გამოიხატოს ორი გზით:
.

აბა, აქ არის ბეიზის თეორემა:

თქვენ ალბათ ფიქრობთ, რომ მე დამცინი - როგორ შეიძლება პირობითი ალბათობის განმარტების ტრივიალურად ტავტოლოგიური გადაწერა იყოს რაიმეს მთავარი ინსტრუმენტი, განსაკუთრებით ისეთი დიდი და არატრივიალური მეცნიერების, როგორიცაა მანქანათმცოდნეობა? თუმცა, დავიწყოთ გაგება; პირველ რიგში, მოდით გადავიწეროთ ბეიზის თეორემა სხვადასხვა ნოტაციით (დიახ, დიახ, მე ვაგრძელებ დაცინვას):

ახლა მოდით ეს დავუკავშიროთ მანქანური სწავლების ტიპურ პრობლემას. აქ D არის მონაცემები, რაც ჩვენ ვიცით, და θ არის მოდელის პარამეტრები, რომლის მომზადებაც გვინდა. მაგალითად, SVD მოდელში მონაცემები არის რეიტინგები, რომლებიც მომხმარებლებმა მისცეს პროდუქტებს, ხოლო მოდელის პარამეტრები არის ის ფაქტორები, რომლებსაც ჩვენ ვამზადებთ მომხმარებლებისა და პროდუქტებისთვის.

თითოეულ ალბათობას ასევე აქვს თავისი მნიშვნელობა. - ეს არის ის, რისი პოვნაც გვინდა, მოდელის პარამეტრების ალბათობის განაწილება შემდეგროგორ გავითვალისწინეთ მონაცემები; მას ჰქვია უკანა ალბათობა(უკანა ალბათობა). ეს ალბათობა, როგორც წესი, პირდაპირ ვერ მოიძებნება და სწორედ აქ არის საჭირო ბეიზის თეორემა. - ეს არის ე.წ სანდოობა(ალბათობა), ფიქსირებული მოდელის პარამეტრების მოცემული მონაცემების ალბათობა; როგორც წესი, ამის პოვნა ადვილია; სინამდვილეში, მოდელის დიზაინი ჩვეულებრივ შედგება ალბათობის ფუნქციის მითითებით. A - წინასწარი ალბათობა(წინასწარი ალბათობა), ეს არის ჩვენი ინტუიციის მათემატიკური ფორმალიზაცია საგნის შესახებ, რაც ვიცოდით ადრე, ყოველგვარ ექსპერიმენტამდეც კი.

ეს, ალბათ, დრო და ადგილი არ არის ამის ჩასატარებლად, მაგრამ მეუფე თომას ბეისის დამსახურება იყო, რა თქმა უნდა, არა პირობითი ალბათობის განმარტების ორ სტრიქონში გადაწერა (მაშინ ასეთი განმარტებები არ არსებობდა), არამედ ზუსტად დასახვა. წინ და განავითარეთ ასეთი შეხედულება ალბათობის კონცეფციის შესახებ. დღეს, „ბაიესის მიდგომა“ გულისხმობს ალბათობების განხილვას „დარწმუნების ხარისხის“ პოზიციიდან და არა ფრიკენტისტური (სიტყვიდან სიხშირე, არა freak!) „წარმატებული ექსპერიმენტების პროპორცია, რადგან ექსპერიმენტების საერთო რაოდენობა მიდრეკილია უსასრულობისკენ. .” კერძოდ, ეს საშუალებას გვაძლევს ვისაუბროთ ერთჯერადი მოვლენების ალბათობაზე - ბოლოს და ბოლოს, ფაქტობრივად, არ არსებობს „უსასრულობისკენ მიდრეკილი ექსპერიმენტების რაოდენობა“ ისეთი მოვლენებისთვის, როგორიცაა „რუსეთი გახდება მსოფლიო ჩემპიონი ფეხბურთში 2018 წელს“ ან , უფრო ახლოს ჩვენს თემასთან, "მოგეწონებათ ფილმი" ტრაქტორის მძღოლები""; ეს უფრო დინოზავრს ჰგავს: ან მოგწონს, ან არა. მათემატიკა, რა თქმა უნდა, ყველგან ერთნაირია; კოლმოგოროვის ალბათობის აქსიომებს არ აინტერესებთ რას ფიქრობენ ხალხი მათზე.

იმის გასამყარებლად, რაც გაშუქდა, აქ არის მარტივი მაგალითი. განვიხილოთ ტექსტის კატეგორიზაციის ამოცანა: მაგალითად, დავუშვათ, რომ ვცდილობთ ახალი ამბების ნაკადის დახარისხებას თემის მიხედვით არსებული მონაცემთა ბაზის საფუძველზე თემებით: სპორტი, ეკონომიკა, კულტურა... ჩვენ გამოვიყენებთ ე.წ. bag-of-. სიტყვების მოდელი: წარმოადგენს დოკუმენტს, როგორც მასში შემავალი სიტყვების (მრავალ) ნაკრები. შედეგად, თითოეული ტესტის შემთხვევა x იღებს მნიშვნელობებს V კატეგორიების სიმრავლიდან და აღწერილია ატრიბუტებით. ჩვენ უნდა ვიპოვოთ ამ ატრიბუტის ყველაზე სავარაუდო მნიშვნელობა, ე.ი.

ბეიზის თეორემის მიხედვით,

მისი შეფასება მარტივია: ჩვენ უბრალოდ შევაფასებთ მისი გაჩენის სიხშირეს. მაგრამ შეუძლებელი იქნება განსხვავებულის შეფასება - ძალიან ბევრი მათგანია - ეს არის ზუსტად იგივე სიტყვების ალბათობა შეტყობინებებში სხვადასხვა თემებზე. ცხადია, ასეთი სტატისტიკა არსად არის.

ამის გასარკვევად, გულუბრყვილო ბეიზის კლასიფიკატორი (ზოგჯერ იდიოტის ბეისსაც კი უწოდებენ) იღებს ატრიბუტების პირობით დამოუკიდებლობას ობიექტური ფუნქციის მნიშვნელობის გათვალისწინებით:

ახლა ბევრად უფრო ადვილია ცალკეულის მომზადება: საკმარისია გამოვთვალოთ კატეგორიებში სიტყვების გაჩენის სტატისტიკა (არის კიდევ ერთი დეტალი, რომელიც მივყავართ გულუბრყვილო ბეისის ორ განსხვავებულ ვერსიამდე, მაგრამ ახლა დეტალებს არ შევეხებით).

გაითვალისწინეთ, რომ Naive Bayes კლასიფიკატორი საკმაოდ ძლიერ ვარაუდს აკეთებს: ტექსტის კლასიფიკაციაში, ჩვენ ვვარაუდობთ, რომ ტექსტში ერთი და იგივე თემის შესახებ განსხვავებული სიტყვები ერთმანეთისგან დამოუკიდებლად ჩნდება. ეს, რა თქმა უნდა, სრული სისულელეა - მაგრამ, მიუხედავად ამისა, შედეგები საკმაოდ ღირსეულია. სინამდვილეში, Naive Bayes კლასიფიკატორი ბევრად უკეთესია, ვიდრე ჩანს. მისი ალბათობის შეფასებები ოპტიმალურია, რა თქმა უნდა, მხოლოდ ნამდვილი დამოუკიდებლობის შემთხვევაში; მაგრამ თავად კლასიფიკატორი ოპტიმალურია პრობლემების უფრო ფართო კლასში და აი რატომ. უპირველეს ყოვლისა, ატრიბუტები, რა თქმა უნდა, დამოკიდებულნი არიან, მაგრამ მათი დამოკიდებულება ერთნაირია სხვადასხვა კლასებისთვის და "ურთიერთად გაუქმებულია" ალბათობების შეფასებისას. სიტყვებს შორის გრამატიკული და სემანტიკური დამოკიდებულებები ერთნაირია როგორც ფეხბურთის შესახებ, ასევე ბაიესის სწავლების ტექსტში. მეორეც, ალბათობების შესაფასებლად, გულუბრყვილო ბეიზი ძალიან ცუდია, მაგრამ როგორც კლასიფიკატორი ბევრად უკეთესია (ჩვეულებრივ, თუნდაც რეალურად და , გულუბრყვილო ბეისი გამოიმუშავებს და, მაგრამ კლასიფიკაცია უფრო ხშირად სწორი იქნება).

შემდეგ სერიაში, ჩვენ გავართულებთ ამ მაგალითს და განვიხილავთ LDA მოდელს, რომელსაც შეუძლია თემების იდენტიფიცირება დოკუმენტების კორპუსში, ყოველგვარი ეტიკეტირებული დოკუმენტების ნაკრების გარეშე, რათა ერთი დოკუმენტი შეიცავდეს რამდენიმე თემას და ასევე გამოიყენოს იგი რეკომენდაციის პრობლემაზე. .

მოგვწონს თუ არა, სტატისტიკა მნიშვნელოვან როლს თამაშობს ვაჭრობაში. რიცხვებით სავსე ფუნდამენტური სიახლეებიდან სავაჭრო ანგარიშებამდე ან ტესტირების ანგარიშებამდე, სტატისტიკური მაჩვენებლებისაგან თავის დაღწევა არ არის. ამავდროულად, თეზისი სტატისტიკის გამოყენებადობის შესახებ სავაჭრო გადაწყვეტილებების მიღებისას რჩება ერთ-ერთ ყველაზე საკამათო თემად. არის თუ არა ბაზარი შემთხვევითი, არის თუ არა ციტატები სტაციონარული, არის თუ არა სავარაუდო მიდგომა მათი ანალიზისთვის? ამაზე უსასრულოდ შეიძლება კამათი. ინტერნეტში და თუნდაც ვებსაიტზე, ადვილია იპოვოთ მასალები და დისკუსიები სხვადასხვა თვალსაზრისით, მკაცრი სამეცნიერო გამოთვლებით და შთამბეჭდავი გრაფიკებით. თუმცა, ტრეიდერებს, როგორც წესი, აინტერესებთ გამოყენებული ასპექტი - როგორ მუშაობს ეს ყველაფერი პრაქტიკაში, სავაჭრო ტერმინალში. ეს სტატია არის მცდელობა წარმოაჩინოს პრაგმატული მიდგომა სავარაუდო სავაჭრო გადაწყვეტილების მოდელის გამოყენებით ტექნიკური ინდიკატორების ნაკრების გამოყენებით. მინიმალური თეორია, მაქსიმალური პრაქტიკა.

იდეა მდგომარეობს იმაში, რომ შევაფასოთ სხვადასხვა ინდიკატორის პოტენციალი ალბათობის თეორიის პერსპექტივიდან და შევამოწმოთ ინდიკატორთა კომიტეტის უნარი გაზარდოს სავაჭრო სისტემის მოგების პროცენტი.

ამას დასჭირდება თვითნებური ინდიკატორების სიგნალების დამუშავების ჩარჩოს შექმნა და მასზე დაფუძნებული მარტივი ექსპერტი ტესტირებისთვის.

სამუშაო ინდიკატორებად იგეგმება სტანდარტული ინდიკატორების გამოყენება, მაგრამ ჩარჩო საშუალებას მოგცემთ დამოუკიდებლად დააკავშიროთ და გააანალიზოთ სხვა, მორგებული ინდიკატორები.

მაგრამ სანამ დავიწყებთ ალგორითმების შემუშავებას და დანერგვას, ჯერ კიდევ უნდა ჩავუღრმავდეთ თეორიას.

პირობითი ალბათობის მოდელის შესავალი

სტატიის სათაურში ნახსენებია Naive Bayes კლასიფიკატორი. იგი ეფუძნება ბაიესის ცნობილ ფორმულას, რომელიც აქ მოკლედ იქნება განხილული და ეწოდება "გულუბრყვილო" ფორმულით აღწერილი შემთხვევითი ცვლადების დამოუკიდებლობის აუცილებელი დაშვების გამო. ინდიკატორების დამოუკიდებლობაზე მოგვიანებით ვისაუბრებთ, მაგრამ ახლა მოდით ვისაუბროთ თავად ფორმულაზე.

სადაც H არის გარკვეული ჰიპოთეზა სისტემის შიდა მდგომარეობის შესახებ (ჩვენს შემთხვევაში, ეს არის ჰიპოთეზა ბაზრისა და სავაჭრო სისტემის მდგომარეობის შესახებ), E არის დაკვირვებული მოვლენა (ჩვენს შემთხვევაში, ეს არის ინდიკატორის სიგნალები), როგორც ასევე მათი აღწერის ალბათობები:

  • P(H) არის H მდგომარეობის აპრიორი ალბათობა, რომელიც ცნობილია დაკვირვებების ისტორიიდან;
  • P(E) - E მოვლენის მთლიანი ალბათობა ყველა არსებული ჰიპოთეზის გათვალისწინებით, რომელთაგან ჩვეულებრივ რამდენიმეა (აქ უნდა აღინიშნოს, რომ ჰიპოთეზები უნდა იყოს არათანმიმდევრული, ე.ი. სისტემის მხოლოდ ერთი მდგომარეობაა ყოველ მომენტში. მაგრამ მათთვის, ვისაც სურს ჩაღრმავდეს თეორიაში, ლინკები);
  • P(E|H) - E მოვლენის დადგომის ალბათობა, თუ ჰიპოთეზა (მდგომარეობა) H არის ჭეშმარიტი;
  • P(H|E) - ჰიპოთეზის (მდგომარეობის) უკანა ალბათობა E მოვლენაზე დაკვირვებისას.

თუ მაგალითს ავიღებთ უმარტივეს სავაჭრო სისტემას, საბაზრო მდგომარეობები, როგორიცაა აღმავალი მოძრაობა (ყიდვა), ქვევით მოძრაობა (გაყიდვა) და გვერდითი რყევები (მოლოდინი) ჩვეულებრივ განიხილება ჰიპოთეზად H. ინდიკატორის სიგნალები გამოიყენება როგორც მოვლენები E, რომლებიც აღწერს ბაზრის სავარაუდო მდგომარეობას.

კონკრეტული ინდიკატორის სიგნალებისთვის ადვილია გამოთვალოთ ალბათობა (1) ფორმულის მარჯვენა მხრიდან არსებულ ისტორიაზე და შემდეგ გაარკვიოთ ბაზრის ყველაზე სავარაუდო მდგომარეობა P(H|E).

თუმცა, გაანგარიშებისთვის საჭიროა უფრო მკაფიოდ განისაზღვროს ჰიპოთეზები და სტატისტიკის შეგროვების მეთოდოლოგია, რომლის საფუძველზეც მიიღება ალბათობა.

უპირველეს ყოვლისა, დავუშვათ, რომ ვაჭრობა ხორციელდება ზოლებით (არა ტკიპებით). ვაჭრობის ეფექტურობა შეიძლება შეფასდეს მოგების სიდიდის, მოგების ფაქტორის ან სხვა მახასიათებლების მიხედვით, მაგრამ პრეზენტაციის სიმარტივისთვის, ჩვენ ავიღებთ ბაზარზე მომგებიანი და წაგებული შესვლების რაოდენობას. ეს პირდაპირ დააკავშირებს სისტემის შეფასებას წარმატებული ვაჭრობის (დახარჯული სიგნალების) ალბათობასთან.

ჩვენ ასევე შემოვიფარგლებით სავაჭრო სისტემით მოგების მიღებისა და სტოპ ზარალის დონის გარეშე, სტოპ ზარალის მხარდაჭერისა და ლოტის შეცვლის გარეშე. ყველა ეს პარამეტრი შეიძლება შევიდეს მოდელში, მაგრამ მნიშვნელოვნად გაართულებს ალბათობის გამოთვლებს მათი მრავალვარიანტულ განაწილებად გადაქცევით. სავაჭრო სისტემის ერთადერთი პარამეტრი იქნება ბარებში პოზიციის დაკავების ხანგრძლივობა. სხვა სიტყვებით რომ ვთქვათ, ინდიკატორების გამოყენებით შერჩეული მიმართულებით ბაზარზე შესვლის შემდეგ, გასვლა ხდება ავტომატურად წინასწარ განსაზღვრული დროის შემდეგ. ეს მიდგომა კარგია, რადგან აქცენტს აკეთებს ციტატის ზრდის ან დაცემის შესახებ ჰიპოთეზის სისწორეზე ან სიცრუეზე. ამრიგად, ჩვენ შევამოწმებთ ჰიპოთეზას მისი სუფთა სახით, მაშველების და ჩალის გარეშე.

გამარტივებების თემის დასასრულებლად, ჩვენ კიდევ ორ კარდინალურ სვლას გავაკეთებთ.

ზემოთ ითქვა, რომ "ყიდვა", "გაყიდვა" და "ლოდინი" ჩვეულებრივ მიიღება როგორც სავაჭრო ჰიპოთეზა. „მოლოდინის“ გაუქმებით, ჩვენ შესამჩნევად შევამცირებთ გამოთვლებს ზოგადობის დაკარგვის გარეშე. შეიძლება ჩანდეს, რომ ასეთი გამარტივებები უარყოფითად იმოქმედებს მიღებული შედეგის გამოყენებადობაზე და გარკვეულწილად ეს მართალია. თუმცა, თუ ყურადღებას მიაქცევთ, თუ რამდენი მასალა დარჩა წასაკითხად თუნდაც ასეთი გამარტივებით, ალბათ დამეთანხმებით, რომ კარგი იქნებოდა ჯერ მხოლოდ სამუშაო მოდელის მიღება და დეტალების დამატება მოგვიანებით, თანდათანობით. მათ, ვისაც სურს შექმნას უფრო რთული მოდელები, რომლებიც ითვალისწინებს ალბათობის სიმკვრივეს, შეუძლიათ იპოვონ შესაბამისი ნამუშევრები ინტერნეტში, მათ შორის ინგლისურ ენაზე, მაგალითად, Reasoning Methods for Merging Financial Technical Indicators, რომელიც აღწერს გადაწყვეტილების მიღების ჰიბრიდულ ალბათურ სისტემას.

დაბოლოს, მეორე და ბოლო კარდინალური ნაბიჯი არის "ყიდვა" და "გაყიდვის" სტატუსების გაერთიანება ერთში, მაგრამ უნივერსალური მნიშვნელობით - "შესვლა ბაზარზე". ჩვეულებრივ, ჩვენ ვიყენებთ მრავალმიმართულების ინდიკატორის სიგნალებს სიმეტრიულად, ანალოგიურად, ანუ, მაგალითად, ინდიკატორის მიხედვით გადაჭარბებული შეძენა ხდება გაყიდვის სიგნალი, ხოლო გადაჭარბებული გაყიდვა - ყიდვის სიგნალი.

სხვა სიტყვებით რომ ვთქვათ, ჰიპოთეზა H ახლა ჟღერს ბაზარზე წარმატებულ შესვლას ორიდან რომელიმე მიმართულებით (ყიდვა ან გაყიდვა).

ამ პირობებში, ალბათობების გამოთვლა (1) ფორმულის მარჯვენა მხრიდან შეიძლება შესრულდეს ციტატების შერჩეულ ისტორიაზე შემდეგნაირად.

რადგან ნებისმიერ ბარზე არის ბაზარზე წარმატებით შესვლის შესაძლებლობა - ერთ-ერთი მიმართულება იქნება მომგებიანი (აქ უგულებელყოფთ გავრცელებას, რადგან სამუშაო დროის ჩარჩო იქნება D1, რომელიც უფრო დეტალურად განიხილება ქვემოთ).

P(E) = ზოლების რაოდენობა ინდიკატორის სიგნალებით / ზოლების საერთო რაოდენობა

P(E|H) = ზოლების რაოდენობა ინდიკატორის სიგნალებით, რომლებიც დაემთხვა მომგებიანი სავაჭრო მიმართულებას / ზოლების საერთო რაოდენობა

გამარტივების შემდეგ, ჩვენ ვიღებთ ფორმულას, რომ გამოვთვალოთ ისტორიის ალბათობა, რომ არჩეული ინდიკატორის სიგნალი მიუთითებს წარმატებული ტრანზაქციის გახსნის პირობებზე:

(2)

სადაც Nok არის სწორი სიგნალების რაოდენობა, Ntotal არის სიგნალების საერთო რაოდენობა.

ცოტა მოგვიანებით ჩვენ განვახორციელებთ ჩარჩოს, რომელიც საშუალებას მოგვცემს გამოვთვალოთ ეს ალბათობა ნებისმიერი ინდიკატორისთვის. როგორც დავინახავთ, ეს ალბათობა, როგორც წესი, 0.5-ს უახლოვდება და გარკვეული გამოკვლევა უნდა ჩატარდეს იმისათვის, რომ იპოვოთ პირობები, სადაც ის მუდმივად აღემატება 0.5-ს. თუმცა, დიდი მაჩვენებლის მქონე ინდიკატორები იშვიათია. სტანდარტული ინდიკატორებისთვის, რომლებსაც ჯერ შევისწავლით, ეს ალბათობა მერყეობს 0,51-0,55-მდე. ნათელია, რომ ასეთი ღირებულებები ძალიან მცირეა და უფრო სავარაუდოა, რომ საშუალებას მოგცემთ „დარჩეთ საკუთარ თავთან“, ვიდრე სტაბილურად გაზარდოთ თქვენი ანაბარი.

ამ პრობლემის გადასაჭრელად საჭიროა არა ერთი ინდიკატორის გამოყენება, არამედ რამდენიმე. ეს გამოსავალი თავისთავად ახალი არ არის; მას ტრეიდერების უმეტესობა იყენებს. მაგრამ ალბათობის თეორია შესაძლებელს გახდის ინდიკატორების ეფექტურობის რაოდენობრივი ანალიზის ჩატარებას სხვადასხვა კომბინაციებში და შეაფასოს პოტენციური ეფექტი.

ფორმულა (1) სამი ინდიკატორის შემთხვევაში (A, B, C) ასე გამოიყურება:

(3)

ჩვენ უნდა მივიყვანოთ ის ალგორითმული გამოთვლებისთვის ხელსაყრელ ფორმაში. საბედნიეროდ, ბაიესის თეორია გამოიყენება მრავალ ინდუსტრიაში და, შესაბამისად, არსებობს მზა რეცეპტი ჩვენი შემთხვევისთვის.

კერძოდ, არსებობს ისეთი მიმართულება, როგორიცაა ბაიესის სპამის ფილტრაცია. ჩვენ არ უნდა გავიგოთ ეს საფუძვლიანად. მნიშვნელოვანია მხოლოდ ფუნდამენტური ცნებები. დოკუმენტი (მაგალითად, ელ.წერილი) მოინიშნება როგორც სპამი, თუ შეიცავს გარკვეულ დამახასიათებელ სიტყვებს. სიტყვების ზოგადი გავრცელება ენაში და მათი პოვნის ალბათობა სპამში ცნობილია, ისევე როგორც ვიცით ინდიკატორის სიგნალების ზოგადი ალბათობა და მათი „ნიშანზე დარტყმის“ პროცენტი. სხვა სიტყვებით რომ ვთქვათ, საკმარისია "სპამის" ჰიპოთეზა ჩავანაცვლოთ "წარმატებული ტრანზაქციის" და "სიტყვის" მოვლენის "ინდიკატორის სიგნალით", რათა სპამის დამუშავების თეორია მთლიანად მოერგოს ჩვენს ალბათური ვაჭრობის თეორიას.

შემდეგ ფორმულა (3) შეიძლება გაფართოვდეს ცალკეული ინდიკატორების ალბათობით შემდეგნაირად (გამოთვლებისთვის იხილეთ ზემოთ ბმული):

P(H|A), P(H|B), P(H|C) გამოთვლები ხორციელდება ფორმულის მიხედვით (2) თითოეული ინდიკატორისთვის ცალკე.

რა თქმა უნდა, საჭიროების შემთხვევაში, ფორმულა (4) ადვილად შეიძლება გაფართოვდეს ინდიკატორების ნებისმიერ რაოდენობაზე. უხეშად რომ გავიგოთ, თუ როგორ მოქმედებს ინდიკატორების რაოდენობა სწორი სავაჭრო გადაწყვეტილების ალბათობაზე, დავუშვათ, რომ ყველა ინდიკატორს აქვს თანაბარი ალბათობის მნიშვნელობა:

შემდეგ ფორმულა (4) მიიღებს ფორმას:

(5)

სადაც N არის ინდიკატორების რაოდენობა.

ამ ფუნქციის გრაფიკი N-ის სხვადასხვა მნიშვნელობებისთვის ნაჩვენებია სურათზე 1.


ბრინჯი. 1 ერთობლივი ალბათობის ტიპი შემთხვევითი ცვლადების სხვადასხვა რაოდენობით

ასე რომ, p = 0.51-ით ვიღებთ P(3) = 0.53, რაც არ არის განსაკუთრებით შთამბეჭდავი, მაგრამ p = 0.55 - P(3) = 0.65 და ეს უკვე შესამჩნევი გაუმჯობესებაა.

ინდიკატორების დამოუკიდებლობა

ზემოთ განხილული ფორმულები ეფუძნება გაანალიზებული შემთხვევითი პროცესების დამოუკიდებლობის ვარაუდს, რომლებიც ჩვენს შემთხვევაში ინდიკატორული სიგნალებია. მაგრამ დაკმაყოფილებულია თუ არა ეს პირობა?

აშკარაა, რომ ზოგიერთ ინდიკატორს, მათ შორის ბევრს სტანდარტული სიიდან, ბევრი საერთო აქვს. როგორც ვიზუალური ილუსტრაცია, სურათი 2 გვიჩვენებს ჩაშენებულ ინდიკატორებს.

ბრინჯი. 2 მსგავსი სტანდარტული ინდიკატორების ჯგუფები

ადვილი შესამჩნევია, რომ სტოქასტური და WPR ინდიკატორები ერთი და იმავე პერიოდისთვის, ბოლო ფანჯარაში ერთმანეთზე გადაფარებული, რეალურად იმეორებენ ერთმანეთს. ეს გასაკვირი არ არის, რადგან მათი ფორმულები არითმეტიკურად ეკვივალენტურია.

MACD და გასაოცარი ოსცილატორის ინდიკატორები, რომლებიც ნაჩვენებია სკრინშოტზე ზემოთ, იდენტურია, მორგებული მოძრავი საშუალოების ტიპზე. გარდა ამისა, რადგან ორივე აგებულია მოძრავ საშუალოზე (MA), მათ არ შეიძლება ეწოდოს დამოუკიდებლად MA-ები.

RSI, RVI, CCI ასევე მაღალი კორელაციაა. უნდა აღინიშნოს, რომ თითქმის ყველა სტანდარტული ოსცილატორი მსგავსია, კორელაციის კოეფიციენტები ახლოს იქნება 1-თან.

ასევე შესამჩნევია გადახურვა არასტაბილურობის მაჩვენებლებს შორის, განსაკუთრებით ATR და StdDev.

მნიშვნელოვანია ამ ყველაფრის გათვალისწინება სავაჭრო სისტემისთვის ინდიკატორების ნაკრების შექმნისას, რადგან დამოკიდებული ინდიკატორების კომიტეტის რეალური ეფექტი პრაქტიკაში გაცილებით დაბალი იქნება, ვიდრე მოსალოდნელი თეორიული.

სხვათა შორის, მსგავსი სიტუაცია ჩნდება ნერვული ქსელების ვარჯიშის დროს. მათი დახმარებით, ტრეიდერები ხშირად ცდილობენ დაამუშავონ მონაცემები მრავალი ნებაყოფლობით არჩეული ინდიკატორიდან. ამასთან, ქსელების შეყვანაზე დამოკიდებული ვექტორების მიწოდება მნიშვნელოვნად ამცირებს ტრენინგის ეფექტურობას, რადგან ქსელის გამოთვლითი ძალა იკარგება. გაანალიზებული მონაცემების მოცულობა შეიძლება დიდი ჩანდეს, მაგრამ მასში შემავალი ინფორმაცია დუბლირებული და უაზროა.

ამ პრობლემისადმი მკაცრი მიდგომა მოითხოვს ინდიკატორებს შორის კორელაციის გამოთვლას და უმცირესი წყვილური მნიშვნელობებით ნაკრებების შედგენას. ეს არის ცალკე დიდი კვლევის სფერო. მსურველებს შეუძლიათ ამ თემაზე სტატიების მოძიება ინტერნეტში. აქ ჩვენ ვიხელმძღვანელებთ ზოგადი მოსაზრებებით ზემოთ ჩამოთვლილ დაკვირვებებზე დაყრდნობით. მაგალითად, ერთ-ერთი ნაკრები შეიძლება ასე გამოიყურებოდეს: Stochastic, ATR, AC (აჩქარება/შენელება) ან WPR, Bollinger Bands, Momentum.

აქვე უნდა განვმარტოთ, რომ აჩქარება/შენელება (AC) მაჩვენებელი არსებითად არის ოსცილატორის წარმოებული. რატომ არის ის შესაფერისი ჯგუფში ჩართვისთვის?

წარმოვიდგინოთ ციტატების სერია (ან მათგან მიღებული ოსცილატორი) გამარტივებული სახით, როგორც პერიოდული რყევები, მაგალითად, კოსინუსი ან სინუსი. შეგახსენებთ, რომ ამ ფუნქციების წარმოებულები ტოლია, შესაბამისად:

(6)

ამ ფუნქციებსა და მათ წარმოებულებს შორის კორელაცია ნულის ტოლია.

ამიტომ, ინდიკატორის პირველი წარმოებულის გამოყენება ზოგადად კარგი კანდიდატია დამატებითი დამოუკიდებელი ინდიკატორის სახით განხილვისთვის.

მეორე წარმოებული არის საეჭვო კანდიდატი ასეთ რხევად პროცესებში, რადგან მაღალია ორიგინალური სიგნალის ასლის მიღების შანსი.

ინდიკატორების დამოუკიდებლობის შესახებ საუბრის დასასრულს, აზრი აქვს ვისაუბროთ კითხვაზე, შეიძლება თუ არა დამოუკიდებლად ჩაითვალოს სხვადასხვა პერიოდით გამოთვლილი ინდიკატორის ასლები.

შეიძლება ვივარაუდოთ, რომ პასუხი დამოკიდებულია პერიოდების თანაფარდობაზე. მცირე განსხვავება აშკარად ინარჩუნებს ინდიკატორების დამოკიდებულებას და, შესაბამისად, საჭიროა შესამჩნევი განსხვავება. ეს ნაწილობრივ შეესაბამება კლასიკურ მეთოდებს, როგორიცაა Elder-ის სამი ეკრანის მეთოდი, სადაც დროის ჩარჩოები, რომლებიც, როგორც წესი, განსხვავდება, როგორც წესი, მინიმუმ 5-ჯერ, ექვივალენტურია სხვადასხვა დროის პერიოდის ინდიკატორების ანალიზის.

აღსანიშნავია, რომ განსახილველ სისტემაში დამოუკიდებელი რაოდენობები რეალურად არ უნდა იყოს ინდიკატორების ჩვენებები, არამედ მათ მიერ წარმოქმნილი სავაჭრო სიგნალები. ამასთან, იგივე ტიპის ინდიკატორების უმეტესობისთვის, მაგალითად, ოსცილატორებისთვის, სავაჭრო სიგნალების წარმოქმნის პრინციპები მსგავსია და, შესაბამისად, დროის სერიების ძლიერი ან სუსტი დამოკიდებულება უდრის სიგნალების ძლიერ ან სუსტ დამოკიდებულებას.

დიზაინი

ასე რომ, ჩვენ გავიგეთ თეორია და მზად ვართ გავუმკლავდეთ კითხვას, თუ რა და როგორ უნდა კოდირება.

ჩვენ შევაგროვებთ ინდიკატორის სავაჭრო სიგნალების სტატისტიკას სპეციალურ ექსპერტში. იმისათვის, რომ ექსპერტმა შეძლოს ვაჭრობა თვითნებური ინდიკატორების წაკითხვის საფუძველზე, საჭირო იქნება ჩარჩოს შემუშავება (ფაქტობრივად, mqh სათაურის ფაილი), რომელიც მიიღებს გამოყენებული ინდიკატორების აღწერას და სიგნალების გენერირებას. მათზე შეყვანის პარამეტრების მეშვეობით. მაგალითად, ჩვენ უნდა შევძლოთ პარამეტრებში სხვადასხვა პერიოდის ორი მოძრავი საშუალოს დაყენება და ყიდვისა და გაყიდვის სიგნალების გენერირება, როდესაც სწრაფი MA კვეთს ნელს ზევით და ქვემოთ, შესაბამისად.

ექსპერტ მრჩეველს ექნება მკაფიო კონტროლი ბარების გახსნაზე და ივაჭრებს მხოლოდ გახსნის ფასებში. ეს არ არის ნამდვილი ექსპერტი, არამედ ინსტრუმენტი ალბათობის გამოსათვლელად და ჰიპოთეზების შესამოწმებლად. ჩვენთვის მნიშვნელოვანია, რომ გადამოწმება სწრაფად მოხდეს, რადგან ინდიკატორების ნაკრების ვარიანტების შეუზღუდავი რაოდენობაა.

D1 გამოყენებული იქნება როგორც ნაგულისხმევი სამუშაო დრო. რა თქმა უნდა, არავინ აკრძალავს შემდგომ ანალიზს სხვა ვადებში, მაგრამ D1 ყველაზე ნაკლებად მგრძნობიარეა შემთხვევითი ხმაურის მიმართ და რამდენიმე წლის განმავლობაში არსებული შაბლონების ანალიზი ყველაზე სრულად აკმაყოფილებს ალბათური მიდგომის სპეციფიკას. გარდა ამისა, D1-ზე ვაჭრობის სტრატეგიებისთვის, სპრედი, როგორც წესი, შეიძლება უგულებელვყოთ, რაც ანეიტრალებს ჩვენს უარს „ლოდინის“ სისტემის შუალედური მდგომარეობის მხარდაჭერაზე. შიდადღიური ვაჭრობისთვის, რა თქმა უნდა, ასეთი ვარაუდის გაკეთება არ შეიძლებოდა და საჭირო იქნებოდა ჰიპოთეზების უფრო დიდი რაოდენობის ალბათობის გამოთვლა.

როგორც უკვე აღვნიშნეთ, ექსპერტი გახსნის პოზიციებს ინდიკატორის სიგნალებზე დაყრდნობით და დახურავს მათ წინასწარ განსაზღვრული პერიოდის შემდეგ. ამისათვის ჩვენ შემოგთავაზებთ შესაბამის შეყვანის პარამეტრს. მისი ნაგულისხმევი მნიშვნელობა იქნება 5 დღე. ეს არის დამახასიათებელი პერიოდი D1 დროის ჩარჩოსთვის და გამოიყენება ბევრ სავაჭრო კვლევით ნაშრომში, სადაც ასევე გამოიყენება D1.

EA და Framework იქნება კროს-პლატფორმული, ანუ ისინი შედგენილი და შესრულდება როგორც MetaTrader 4-ში, ასევე MetaTrader 5-ში. ეს ფუნქცია უზრუნველყოფილი იქნება არსებული, საჯაროდ ხელმისაწვდომი სათაურის wrapper ფაილებით, რომლებიც საშუალებას იძლევა გამოიყენონ MetaTrader 4 MQL. API სინტაქსი MetaTrader გარემოში 5, და გარდა ამისა, ზოგიერთ შემთხვევაში გამოვიყენებთ პირობით კომპილაციას: კოდის კონკრეტული ნაწილები შეიფუთება წინაპროცესორულ დირექტივებში #ifdef __MQL4__ და #ifdef __MQL5__.

დანერგვა MQL-ში

ინდიკატორების ჩარჩო

ჩვენ დავიწყებთ ინდიკატორის სიგნალების დამუშავების ჩარჩოს მიმოხილვას იმის განხილვით, თუ რა ტიპის ინდიკატორები დაგვჭირდება. ყველაზე აშკარა ჩამონათვალი მოიცავს ყველა ჩაშენებულ ინდიკატორს, ასევე პერსონალურ ინდიკატორებს iCustom. ჩამოთვლა საჭირო იქნება ინდიკატორების შესარჩევად ჩარჩოს შეყვანის პარამეტრების გამოყენებით.

enum IndicatorType ( iCustom, iAC, iAD, tADX_period_price, tAlligator_jawP_jawS_teethP_teethS_lipsP_lipsS_method_price, iAO, iATR_period, tBands_period_priod_deviation_wer,iodpriods ce , iBWMFI , iCCI_period_price, iDeMarker_period, tEnvelopes_period_method_shift_price_deviation, iForce_period_method_price, dFractals, dGator_jawP_jawS_teethP_teeth_price_lips, f. iMoment um_period_price, iMFI_period, iMA_period_shift_method_price, dMACD_fast_slow_signal_price, iOBV_price, iOsMA_fast_slow_signal_price, iRSI_period_price, dRVI_period, iSAR_step_maximum, iStdDev_period_shift_method_price, dStochastic_K_D_slowing_method_price, iWPR_period);

თითოეული ჩაშენებული ინდიკატორის სახელი შეიცავს სუფიქსს, რომელიც შეიცავს ინფორმაციას თავად ინდიკატორის პარამეტრების შესახებ. ელემენტის პირველი სიმბოლო მიუთითებს ხელმისაწვდომი ბუფერების რაოდენობაზე, მაგალითად, i - ერთი ბუფერი, d - ორი, t - სამი. ეს ყველაფერი მხოლოდ რჩევებია მომხმარებლისთვის. თუ ის მიუთითებს პარამეტრების არასწორ რაოდენობას ან არარსებული ბუფერის ინდექსს, ფრეიმვორი აჩვენებს შეცდომას ჟურნალში.

რა თქმა უნდა, შეყვანის პარამეტრებში თქვენ უნდა მიუთითოთ თითოეული ინდიკატორისთვის არა მხოლოდ მისი ტიპი, არამედ ფაქტობრივი პარამეტრები სტრიქონის სახით, ბუფერის ნომერი და ზოლის რაოდენობა, საიდანაც წაიკითხება მონაცემები.

ინდიკატორის ჩვენებიდან გამომდინარე, აუცილებელია სიგნალების გენერირება. პრინციპში, შეიძლება ბევრი განსხვავებული იყოს, მაგრამ ჩვენ გავაერთიანებთ მთავარ ვარიანტებს სხვა ჩამონათვალში.

enum SignalCondition (Disabled, NotEmptyIndicatorX, SignOfValueIndicatorX, IndicatorXcrossesIndicatorY, IndicatorXcrossesLevelX, IndicatorXrelatesToIndicatorY, IndicatorXrelatesToLevelX);

ამრიგად, სიგნალები შეიძლება შეიქმნას:

  • თუ ინდიკატორის მნიშვნელობა არ არის ცარიელი;
  • ინდიკატორის მნიშვნელობას აქვს საჭირო ნიშანი (დადებითი ან უარყოფითი);
  • ინდიკატორი სხვა ინდიკატორს კვეთს და აქვე უნდა აღინიშნოს, რომ სიგნალის აღწერისას უნდა მივცეთ 2 ინდიკატორის დაზუსტების შესაძლებლობა;
  • ინდიკატორი კვეთს გარკვეულ დონეს და აქ ირკვევა, რომ უნდა იყოს ველი დონის შესვლისთვის;
  • ინდიკატორი განლაგებულია საჭიროებისამებრ სხვა ინდიკატორთან შედარებით (მაგალითად, ზემოთ ან ქვემოთ);
  • ინდიკატორი განლაგებულია საჭირო წესით მითითებულ დონესთან შედარებით;

პირველი ელემენტი - გამორთული - საშუალებას გაძლევთ გამორთოთ სიგნალის წარმოქმნის ნებისმიერი მდგომარეობა. ჩვენ შემოგთავაზებთ შეყვანის პარამეტრების რამდენიმე იდენტურ ჯგუფს სიგნალების აღსაწერად და თითოეული სიგნალი გამორთული იქნება ნაგულისხმევად.

წინა ჩამონათვალში არსებული ნივთების სახელებიდან შეიძლება ვივარაუდოთ, რომ საჭიროა როგორმე დააყენოთ მნიშვნელობების საჭირო ნიშანი და ხაზების პოზიცია ერთმანეთთან შედარებით. ამ მიზნით დავამატოთ კიდევ ერთი ჩამოთვლა.

enum UpZeroDown (EqualOrNone, UpSideOrAboveOrPositve, DownSideOrBelowOrNegative, NotEqual);

EqualOrNone გაძლევთ საშუალებას შეამოწმოთ:

  • ცარიელი მნიშვნელობა SignOfValueIndicatorX-თან ერთად
  • დონის თანასწორობა IndicatorXrelatesToLevelX-თან ერთად

UpSideOrAboveOrPositve გაძლევთ საშუალებას შეამოწმოთ:

  • ქვემოდან ზევით გადაკვეთა IndicatorXcrossesIndicatorY-ის გამოყენებით
  • დადებითი მნიშვნელობა SignOfValueIndicatorX-ის გამოყენებით
  • დონის გადაკვეთა ქვემოდან ზემოდან IndicatorXcrossesLevelX-ის გამოყენებით
  • ინდიკატორის მნიშვნელობების ზრდა თანმიმდევრულ ზოლებზე IndicatorXrelatesToIndicatorY-ის გამოყენებით, თუ X და Y იგივე მაჩვენებელია
  • X და Y-ზე მოთავსება IndicatorXrelatesToIndicatorY-ის გამოყენებით, თუ X და Y სხვადასხვა ინდიკატორია
  • ინდიკატორის დონის ზემოთ პოზიციონირება IndicatorXrelatesToLevelX-ის გამოყენებით

DownSideOrBelowOrNegative გაძლევთ საშუალებას შეამოწმოთ:

  • ზემოდან ქვევით გადაკვეთა IndicatorXcrossesIndicatorY-ის გამოყენებით
  • უარყოფით მნიშვნელობამდე SignOfValueIndicatorX-ის გამოყენებით
  • დონის გადაკვეთა ზემოდან ქვემოდან IndicatorXcrossesLevelX-ის გამოყენებით
  • ინდიკატორის მნიშვნელობების ჩაშვება თანმიმდევრულ ზოლებზე IndicatorXrelatesToIndicatorY-ის გამოყენებით, თუ X და Y იგივე მაჩვენებელია
  • X-ის Y ქვეშ მოთავსება IndicatorXrelatesToIndicatorY-ის გამოყენებით, თუ X და Y სხვადასხვა ინდიკატორია
  • ინდიკატორის პოზიციონირება დონის ქვემოთ IndicatorXrelatesToLevelX-ის გამოყენებით

NotEqual საშუალებას გაძლევთ შეამოწმოთ:

  • უტოლობა დონემდე (მნიშვნელობა) IndicatorXrelatesToLevelX-ის გამოყენებით

როდესაც სიგნალი გააქტიურებულია, საჭიროა მისი დამუშავება. ამისათვის ჩვენ განვსაზღვრავთ სპეციალურ აღრიცხვას.

enum SignalType ( Alert , ყიდვა, გაყიდვა, CloseBuy, CloseSell, CloseAll, BuyAndCloseSell, SellAndCloseBuy, ModifyStopLoss, ModifyTakeProfit, ProceedToNextCondition);

სიგნალების დამუშავების ძირითადი მოქმედებები ნაჩვენებია აქ: შეტყობინების ჩვენება, ყიდვა, გაყიდვა, ყველა ღია შეკვეთის დახურვა (ყიდვა, გაყიდვა, ან ორივე), გაყიდვიდან ყიდვაზე გადაბრუნება, ყიდვიდან გაყიდვაზე გადაბრუნება, გაჩერების ზარალის შეცვლა ან დონის აღება - მოგება, ასევე გადასვლა შემდეგი მდგომარეობის (სიგნალის) შემოწმებაზე. ბოლო წერტილი საშუალებას გაძლევთ შექმნათ სიგნალის შემოწმება ჯაჭვში (მაგალითად, შეამოწმეთ, გადაკვეთა თუ არა მთავარმა ბუფერმა სიგნალის ხაზი და თუ ასეა, შემდეგ შეამოწმეთ, მოხდა ეს გარკვეულ დონეზე ზემოთ თუ ქვემოთ).

თქვენ შეიძლება შეამჩნიოთ, რომ მოქმედებების სიაში არ არის მომლოდინე შეკვეთების პარამეტრი. ეს დარჩა ამ სამუშაოს ფარგლებს გარეთ. მსურველებს შეუძლიათ გააფართოვონ ჩარჩო.

ყველა ამ ჩამოთვლის გათვალისწინებით, შესაძლებელია აღწეროთ ატრიბუტების რამდენიმე ჯგუფი, რომელთა დახმარებით დგინდება ოპერატიული ინდიკატორები. ერთი ჯგუფი ასე გამოიყურება:

შეყვანის IndicatorType Indicator1Selector = iCustom; // · სელექტორის შეყვანის სტრიქონი Indicator1Name = "" ; // · სახელის შეყვანის სტრიქონი Parameter1List = "" /*1.0,მნიშვნელობა:t,მნიშვნელობა:t*/ ; // · პარამეტრების შეყვანის string Indicator1Buffer = "" ; // · ბუფერული შეყვანა int Indicator1Bar = 1; // · ბარი

Indicator1Name პარამეტრი განკუთვნილია მორგებული ინდიკატორის სახელის დასაზუსტებლად, როდესაც iCustom დაყენებულია Indicator1Selector-ში.

Parameter1List პარამეტრი საშუალებას გაძლევთ მიუთითოთ ინდიკატორის პარამეტრები სტრიქონის სახით, გამოყოფილი მძიმეებით. თითოეული შეყვანის პარამეტრის ტიპი ამოიცნობს ავტომატურად, მაგალითად, 11.0 - ორმაგი, 11 - int, 2015.01.01 20:00 - თარიღი/დრო, true/false - bool, "ტექსტი" - სტრიქონი. ზოგიერთი პარამეტრი - მაგალითად, საშუალო მოძრავი ტიპები ან ფასის ტიპები - შეიძლება მითითებული იყოს არა როგორც რიცხვი, არამედ როგორც სტრიქონი ბრჭყალების გარეშე (sma, ema, smma, lwma, დახურვა, ღია, მაღალი, დაბალი, მედიანა, ტიპიური, შეწონილი, დაბალი მაღალი, ახლოს).

Indicator1Buffer - ბუფერის ნომერი ან სახელი ბრჭყალების გარეშე. მხარდაჭერილი ბუფერული სახელებია მთავარი, სიგნალი, ზედა, ქვედა, ყბა, კბილები, ტუჩები, ტენკანი, კიჯუნ, სენკოუA, სენკოუB, ჩიკო, +di, -di.

Indicator1Bar - ზოლის ნომერი, ნაგულისხმევი არის 1.

ინდიკატორების დადგენის შემდეგ, მათზე დაყრდნობით შეიძლება წარმოიქმნას სიგნალები, ე.ი. მოვლენების გამომწვევი პირობები. თითოეული სიგნალი მითითებულია შეყვანის პარამეტრების ჯგუფით.

შეყვანის სტრიქონი __SIGNAL_A = "" ; შეყვანის SignalCondition ConditionA = გამორთულია; // · პირობა შეყვანის სტრიქონი IndicatorA1 = "" ; // · ინდიკატორი X სიგნალისთვის Aშეყვანის სტრიქონი IndicatorA2 = "" ; // · ინდიკატორი Y სიგნალისთვის Aშეყვანის ორმაგი LevelA1 = 0; // · დონე X სიგნალისთვის A შეყვანის ორმაგი LevelA2 = 0; // · დონე Y სიგნალისთვის A შეყვანისთვის UpZeroDown მიმართულებაA = EqualOrNone; // · მიმართულება ან ნიშანი A შეყვანის SignalType ExecutionA = Alert; // მოქმედება ა

თითოეული სიგნალისთვის შეგიძლიათ მიუთითოთ იდენტიფიკატორი __SIGNAL_ პარამეტრში.

Condition-ის გამოყენებით ირჩევთ სიგნალის შემოწმების პირობას. შემდეგი, დაყენებულია ერთი ან ორი ინდიკატორი და ერთი ან ორი დონის მნიშვნელობა (მეორე დონე დაცულია მომავლისთვის და არ იქნება გამოყენებული ამ ექსპერიმენტში). ინდიკატორის პარამეტრებში ინდიკატორები არის ან ინდიკატორის ნომერი შესაბამისი ატრიბუტის ჯგუფიდან, ან ინდიკატორის პროტოტიპი ფორმით:

ინდიკატორიName@buffer(param1,param2,...)

ჩაწერის ეს ფორმა საშუალებას გაძლევთ სწრაფად განსაზღვროთ გამოყენებული ინდიკატორი მისი დეტალური აღწერის გარეშე ატრიბუტების ჯგუფის გამოყენებით. Მაგალითად,

iMA@0 (1,0, sma, მაღალი)

იძლევა მაღალი ფასის მნიშვნელობებს და მომუშავე ექსპერტის თითოეულ მიმდინარე ზოლზე აღებულია ზოლი ნომერი 1 (ბოლოს დასრულებული, რომლის მაღალი ფასი საბოლოოდ ცნობილია).

ამრიგად, ინდიკატორები შეიძლება განისაზღვროს როგორც შერჩეულ ატრიბუტულ ჯგუფებში (მათ შემდგომი მითითებისთვის სიგნალებიდან რიცხვის მიხედვით), ასევე პირდაპირ ინდიკატორის პარამეტრში სიგნალებში (X ან Y). პირველი მეთოდი მოსახერხებელია, თუ ერთი და იგივე ინდიკატორი უნდა იქნას გამოყენებული სხვადასხვა სიგნალებში ან X და Y ერთ სიგნალში.

მიმართულების პარამეტრი განსაზღვრავს მნიშვნელობის მიმართულებას ან ნიშანს გასროლის მდგომარეობისთვის. Execution-ის შესაბამისად, სიგნალის გააქტიურებისას ხორციელდება ერთი ან სხვა მოქმედება.

ჩარჩოს შიგნით, ახლა დადგინდა, რომ ინდიკატორს არ შეიძლება ჰქონდეს 20 პარამეტრზე მეტი, შერჩეული ჯგუფების მაქსიმალური რაოდენობა ინდიკატორის ატრიბუტებით არის 6 (მაგრამ, როგორც გვახსოვს, ინდიკატორები შეიძლება დამატებით დაყენდეს პირდაპირ სიგნალში) და სიგნალები - 8. ეს ყველაფერი შეიძლება შეიცვალოს საწყის კოდში. IndicatN.mqh ფაილი თან ერთვის სტატიის ბოლოს.

ასევე ამ ფაილში, რამდენიმე კლასის სახით, დანერგილია ინდიკატორის პარამეტრების გაანალიზების, მათი გამოძახების, პირობების შემოწმებისა და გადამოწმების შედეგების დარეკვის კოდში (რომელიც იქნება ჩვენი ექსპერტი) დაბრუნების მთელი ლოგიკა.

კერძოდ, ზემოთ განხილული SignalType ჩამოთვლიდან ნებისმიერი მოქმედების განხორციელების აუცილებლობის შესახებ ინსტრუქციების გადმოსაცემად, გამოიყენება მარტივი საჯარო კლასის TradeSignals ლოგიკური ველებით, რომლებიც შეესაბამება აღრიცხვის ელემენტებს:

კლასი TradeSignals ( საჯარო: bool alert; bool buy; bool sell; bool buyExit; bool sellExit; bool ModifySL; bool ModifyTP; int ინდექსი; ორმაგი მნიშვნელობა; სტრიქონი შეტყობინება; TradeSignals (): alert (false), buy (false), გაყიდვა (false), buyExit(false), sellExit(false), ModifySL(false), ModifyTP(false), მნიშვნელობა (EMPTY_VALUE), message("" )() );

საჭირო პირობების დაკმაყოფილების შემთხვევაში, ველები დაყენებულია true. მაგალითად, თუ არჩეულია CloseAll ქმედება, buyExit და sellExit დროშები დაყენებულია TradeSignals ობიექტში.

ინდექსის ველი შეიცავს გააქტიურებული მდგომარეობის სერიულ ნომერს.

მნიშვნელობის ველის გამოყენებით შეგიძლიათ გადასცეთ თვითნებური მნიშვნელობა, მაგალითად, ინდიკატორის მნიშვნელობებიდან მიღებული ახალი გაჩერების დაკარგვის დონე.

და ბოლოს, შეტყობინების ველი შეიცავს შეტყობინებას მომხმარებლისთვის, რომელიც აღწერს სიტუაციას.

ყველა კლასის განხორციელების დეტალები შეგიძლიათ იხილოთ წყაროს კოდში. ის იყენებს დამხმარე სათაურის ფაილებს fmtprnt2.mqh (ფორმატირებული ჟურნალის გამომავალი) და RubbArray.mqh (რეზინის მასივი), რომლებიც ასევე შედის.

ჩარჩოს სათაურის ფაილი IndicatN.mqh უნდა იყოს ჩართული ექსპერტის კოდში #include დირექტივის გამოყენებით. შედეგად, ექსპერტის პარამეტრების დიალოგში შედგენის შემდეგ, ჩვენ მივიღებთ შეყვანის პარამეტრების ჯგუფებს ინდიკატორის ატრიბუტებით:

ნახ.3 ინდიკატორების დაყენება

და სიგნალის განმარტებით:

ნახ.4 სავაჭრო სიგნალების დაყენება

ეკრანის ანაბეჭდები აჩვენებს უკვე შევსებულ თვისებებს. ჩვენ დეტალურად განვიხილავთ მათ, როდესაც გადავალთ ექსპერტი მრჩევლის კონცეფციაზე და დავიწყებთ კონკრეტული სავაჭრო სტრატეგიების ჩამოყალიბებას. აქ უნდა აღინიშნოს, რომ ინდიკატორის ატრიბუტების დაყენებისას, შეგიძლიათ შეცვალოთ ნებისმიერი რიცხვითი პარამეტრი ისეთი გამონათქვამით, როგორიცაა =var1, =var2 და ა.შ. 9-მდე. ისინი ეხება ოპტიმიზაციისთვის განკუთვნილ, ამავე სახელწოდების var1, var2 და ა.შ. ჩარჩოს შეყვანის სპეციალურ პარამეტრებს. მაგალითად, ჩანაწერი:

iMACD@main(=var4,=var5,=var6,ღია)

ნიშნავს, რომ MACD სწრაფი, ნელი და სიგნალის მოძრავი საშუალო პერიოდების პარამეტრების ოპტიმიზაცია შესაძლებელია შეყვანის პარამეტრების var4, var5 და var6 შესაბამისად. და მაშინაც კი, თუ ოპტიმიზაცია გამორთულია, ერთჯერადი ტესტირების დროს, შესაბამისი ინდიკატორის ატრიბუტების მნიშვნელობები წაიკითხება ჩარჩოს მითითებული შეყვანის პარამეტრებიდან.

ტესტის ექსპერტი

კოდირების გასაადვილებლად, ჩვენ გადავიტანთ ყველა სავაჭრო ფუნქციას სპეციალურ კლასში და შევქმნით მას ცალკე სათაურის ფაილად Expert0.mqh. ვინაიდან ჩვენ ვაპირებთ საკმაოდ მარტივი სავაჭრო სისტემების ტესტირებას, კლასი მხოლოდ პოზიციების გახსნისა და დახურვის საშუალებას იძლევა.

ამრიგად, ყველა რუტინული ოპერაცია ინდიკატორებთან და დაკავშირებული ვაჭრობასთან თავსდება სათაურ ფაილებში.

#შეიცავს<მითითებაN.mqh >#შეიცავს<ექსპერტი0.mqh >

უშუალოდ indstats.mq4 ექსპერტის ფაილში იქნება ძალიან ცოტა კოდის ხაზი და მარტივი ლოგიკა.

ვინაიდან Expert Advisor-მა უნდა შეადგინოს და იმუშაოს MetaTrader 5-ში გაფართოების mq5-ზე შეცვლის შემდეგ, ჩვენ დავამატებთ სათაურის ფაილებს, რომლებიც უზრუნველყოფენ კოდების ახალ გარემოში გადატანას.

#ifdef __MQL5__ #include #შეიცავს #შეიცავს #დაასრულე თუ

ახლა მოდით მივმართოთ ექსპერტი მრჩეველის შეყვანის პარამეტრებს.

შეყვანა int ConsistentSignalNumber = 1; შეყვანა int Magic = 0; input float Lot = 0.01 f; int int TradeDuration = 1;

Magic და Lot საჭიროა Expert0.mqh ფაილიდან Expert ობიექტის შესაქმნელად.

ექსპერტი e(Magic, Lot);

ConsistentSignalNumber პარამეტრი შეიცავს სავაჭრო სიგნალების რაოდენობას, რომლებიც ჩვენ ვცდილობთ გავაერთიანოთ საიმედოობის გასაუმჯობესებლად.

TradeDuration პარამეტრი განსაზღვრავს ზოლების რაოდენობას, რომლის დროსაც დაიკავებს ღია პოზიცია. როგორც ზემოთ აღვნიშნეთ, ჩვენ გავხსნით გარიგებებს სიგნალების საფუძველზე და გამოვალთ მათგან 5 ბარის შემდეგ, ე.ი. დღეებში, მას შემდეგ, რაც გამოიყენება D1 ვადები.

OnInit მოვლენის დამმუშავებელში ჩვენ მოვახდინოთ ინდიკატორის ჩარჩოს ინიციალიზაცია.

int OnInit () ( დაბრუნება IndicatN::handleInit(); )

OnTick დამმუშავებელში ჩვენ უზრუნველვყოფთ კონტროლს ზოლის გახსნაზე.

void OnTick () ( სტატიკური თარიღის დრო lastBar; if (lastBar != დრო) ( const RubbArray *ts = IndicatN::handleStart(); ... lastBar = დრო; ))

ახალი ზოლის ფორმირებისას ჩვენ შევამოწმებთ ყველა ინდიკატორს და მათთან დაკავშირებულ პირობებს ინდიკატორის ჩარჩოს ხელახლა გამოძახებით. შედეგად, ჩვენ ვიღებთ გააქტიურებული სიგნალების მასივს - TradeSignals ობიექტები.

ახლა დროა ვისაუბროთ სტატისტიკის დაგროვებაზე.

ჩარჩოს თითოეული მდგომარეობა (მოვლენა), თუ ეს მოხდება, ნაგულისხმევად წარმოქმნის სიგნალს გაფრთხილების დროშით. ჩვენ ამას გამოვიყენებთ ინდიკატორების სიგნალების რაოდენობის დასათვლელად, ასევე რეალიზებული სისტემური მდგომარეობების, ე.ი. შემთხვევები (ბარები), როდესაც ყიდვა ან გაყიდვა წარმატებული იქნება.

სტატისტიკის გამოსათვლელად, ჩვენ აღვწერთ მასივებს.

int ზოლები = 0; // ზოლების/ნიმუშების საერთო რაოდენობა int bull = 0, დათვი = 0; // ზოლების/ნიმუშების რაოდენობა ვაჭრობის ტიპზე int ყიდვა = (0), გაყიდვა = (0); // უპირობო სიგნალების მასივები int buyOnBull = (0), sellOnBear = (0); // პირობითი (წარმატებული) სიგნალების მასივები

ბარით ვაჭრობის ჩვენს შემთხვევაში, თითოეული ბარი არის პოტენციური ახალი შესვლა ვაჭრობაში, რომელიც გრძელდება 5 ბარი. ყოველი ასეთი სეგმენტი ხასიათდება ბრჭყალებში მატებით ან დაცემით და აღინიშნება, როგორც bullish ან bearish, შესაბამისად.

ყიდვა-გაყიდვის ყველა სიგნალი შეჯამდება ყიდვა-გაყიდვის მასივებში და თუ შესაბამისი სიგნალი ემთხვევა სეგმენტის „ბზინვარებას“ ან „დაწევას“, ანუ ის წარმატებულია, ის ასევე გროვდება buyOnBull-ში ან sellOnBear მასივი, ტიპის მიხედვით.

მასივების შესავსებად, მოდით დავწეროთ შემდეგი კოდი OnTick-ში.

const RubbArray *ts = IndicatN::handleStart(); bool up = ყალბი , ქვემოთ = ყალბი ; int buySignalCount = 0 , sellSignalCount = 0 ; for (int i = 0; i< ts.size(); i++) { // სიგნალიზაცია გამოიყენება სტატისტიკის შესაგროვებლადთუ (ts[i].გაფრთხილება) ( // მოვლენების დაყენებისას, ჩამოთვლილი i, // ჰიპოთეზა H_xxx უნდა იყოს პირველი, სანამ სიგნალები S_xxx, // იმიტომ, რომ ჩვენ აქ ვანიჭებთ ზემოთ ან ქვემოთ ნიშნებს if (IndicatN::GetSignal(ts[i].index) == "H_BULL") (bull++; buy.index]++; up = true;) სხვა შემთხვევაში, თუ (IndicatN::GetSignal(ts[i].index) == "H_BEAR") (bear++; sell.index]++; down = true;) სხვა შემთხვევაში, თუ (StringFind (IndicatN::GetSignal(ts[i].index), "S_BUY") == 0) (ყიდვა. index]++; if (up) ( if (PrintDetails) ბეჭდვა ("buyOk " , IndicatN::GetSignal(ts[i].index)); buyOnBull.index]++; ) სხვა თუ (StringFind (IndicatN: :GetSignal(ts[i].index), "S_SELL") == 0 ) ( sell.index]++; if (ქვემოთ) (if (PrintDetails) ბეჭდვა ("sellOk" , IndicatN::GetSignal(ts[i ].index)); sellOnBear.index]++; ) ) if (PrintDetails) Print (ts[i].message); ))

გამომწვევი სიგნალების მასივის მიღების შემდეგ, ჩვენ გავდივართ მის ელემენტებს მარყუჟში. თუ გაფრთხილების დროშა დაყენებულია, ეს არის სტატისტიკის კოლექცია.

სანამ კოდს უფრო ღრმად გავაანალიზებთ, შემოვიღოთ სიგნალების (მოვლენების) დასახელების სპეციალური კონვენცია. ჰიპოთეზები ბაზრის ზრდის ან დაცემის პირობების შესახებ მონიშნული იქნება იდენტიფიკატორებით H_BULL და H_BEAR. ეს მოვლენები უნდა განისაზღვროს ჩარჩოს შეყვანის პარამეტრების გამოყენებით ჯერ - სხვა მოვლენებამდე (ინდიკატორის სიგნალები). ეს აუცილებელია იმისთვის, რომ დადასტურებული ჰიპოთეზების საფუძველზე ჩამოყალიბდეს შესაბამისი ნიშნები - ლოგიკური ცვლადები ზემოთ და ქვემოთ.

ინდიკატორის სიგნალებს უნდა ჰქონდეს S_BUY ან S_SELL-ით დაწყებული იდენტიფიკატორები.

როგორც ხედავთ, ts[i].index გააქტიურებული მოვლენის რიცხვზე მითითების გამოყენებით ვიღებთ მის იდენტიფიკატორს GetSignal ფუნქციის გამოძახებით. თუ ჰიპოთეზები განხორციელდება, ჩვენ ვაახლებთ ზრდის ან დაცემის სექციების ზოგად მრიცხველებს. სიგნალების გენერირების შემთხვევაში, ჩვენ ვინახავთ მათ საერთო რაოდენობას თითოეული ტიპის სიგნალისთვის, ისევე როგორც წარმატების ინდექსს, ანუ მიმდინარე ჰიპოთეზებთან შესაბამისობის რაოდენობას.

შეგახსენებთ, რომ ან H_BULL ჰიპოთეზა ან H_BEAR ჰიპოთეზა მართალია ყველა ზოლზე.

სტატისტიკის შეგროვების გარდა, ექსპერტმა უნდა მხარი დაუჭიროს სიგნალებზე დაფუძნებულ ვაჭრობას. ამ მიზნით, ჩვენ დავამატებთ მარყუჟის სხეულს ყიდვა-გაყიდვის დროშების ჩეკით.

if (ts[i].ყიდვა) ( buySignalCount++; ) else if (ts[i].sell) ( sellSignalCount++; )

ციკლის შემდეგ ვახორციელებთ სავაჭრო ფუნქციას. უპირველეს ყოვლისა, ჩვენ დავხურავთ ღია პოზიციებს (ასეთის არსებობის შემთხვევაში) მითითებული პერიოდის შემდეგ.

if (e.getLastOrderBar() >= TradeDuration) ( e.closeMarketOrders(); ) if (buySignalCount >= ConsistentSignalNumber && sellSignalCount >= ConsistentSignalNumber) (ბეჭდვა ("სიგნალის შეჯახება" ) ("Signal collision" ); e.closeMarketOrders(e.mask(OP_SELL)); if (e.getOrderCount(e.mask(OP_BUY)) == 0) (e.placeMarketOrder(OP_BUY); ) ) სხვა თუ (sellSignalCount >= ConsistentSignalNumber) (ე. closeMarketOrders(e.mask(OP_BUY)); if (e.getOrderCount(e.mask(OP_SELL)) == 0) (e.placeMarketOrder(OP_SELL); ))

თუ ყიდვისა და გაყიდვის სიგნალები ეწინააღმდეგება ერთმანეთს, ჩვენ გამოვტოვებთ ამ პირობას. თუ ყიდვის ან გაყიდვის სიგნალების რაოდენობა უდრის ან აღემატება წინასწარ განსაზღვრულ ConsistentSignalNumber-ს, გახსენით შესაბამისი შეკვეთა.

უნდა აღინიშნოს, რომ ConsistentSignalNumber კონფიგურირებული სიგნალების რაოდენობაზე დაბალ მნიშვნელობაზე დაყენებით, შესაძლებელი იქნება სისტემის ვაჭრობის ტესტირება ყველა ან უმეტესი სტრატეგიის გაერთიანების რეჟიმში. ნორმალურ მუშაობაში ექსპერტი გამოიყენებს კვეთას და არა გაერთიანებას, რადგან ერთობლივი მოვლენების საპოვნელად ConsistentSignalNumber ზუსტად უნდა იყოს სიგნალების რაოდენობის ტოლი. მაგალითად, კონფიგურირებული 3 სიგნალით და 3-ის ტოლი ConsistentSignalNumber, ვაჭრობა განხორციელდება მხოლოდ მაშინ, როდესაც სამივე მოვლენა ერთდროულად მოხდება. თუ ConsistentSignalNumber დაყენებულია 1-ზე, მაშინ ვაჭრობა გაიხსნება 3 სიგნალიდან რომელიმეს (მინიმუმ ერთის) მიღებისთანავე.

OnDeinit დამმუშავებელში ჩვენ გამოვაჩენთ შეგროვებულ სტატისტიკას გაფრთხილებების ან შეკვეთების ისტორიაში ჟურნალში.

ექსპერტი მრჩეველის სრული წყაროს კოდი შეგიძლიათ იხილოთ indstats.mq4 ფაილში.

ყველა სიგნალი უნდა შემოწმდეს ყიდვის ან გაყიდვის ორი ჰიპოთეზის წინააღმდეგ. ამისათვის ჩვენ დავაკონფიგურირებთ H_BULL და H_BEAR სიგნალებს, ასევე მათ ინდიკატორებს.

ბარის ფასების მისაღებად გამოიყენეთ iMA ინდიკატორი 1 პერიოდით. ​​__INDICATOR_1 ჯგუფში დააყენეთ:

სელექტორი = iMA_period_shift_method_price

პარამეტრები = 1,0,sma,ღია

__INDICATOR_2 ჯგუფში ჩვენ გავაკეთებთ მსგავს პარამეტრებს ზოლის ნომრის გარდა - აქ უნდა შეიყვანოთ 5, ზოლების რაოდენობა, რომელსაც გამოვიყენებთ TradeDuration პარამეტრში.

სხვა სიტყვებით რომ ვთქვათ, სტატისტიკის შეგროვების რეჟიმში, ექსპერტი არ ახორციელებს ვაჭრობას, მაგრამ აანალიზებს ციტატების ცვლილებას მე-5 და მე-0 ზოლს შორის, ასევე ინდიკატორის სიგნალებს მე-5 ან მე-6 ზოლზე, გამოყენებული ფასის მიხედვით: ინდიკატორები, რომლებიც მუშაობენ ღია ფასებში, შეგიძლიათ აიღოთ მნიშვნელობები 5-დან, ხოლო ყველა დანარჩენისთვის - 6-დან. სტატისტიკის შეგროვების რეჟიმში, ზოლი ნომერი 5 არის ვირტუალური მიმდინარე ზოლი და ყველა შემდგომი გვაწვდის ინფორმაციას "მომავლის" შესახებ. ზრდის ან დაცემის ბაზრის ჰიპოთეზების განხორციელება.

მოდით დაუყოვნებლივ გავაკეთოთ დათქმა, რომ ვაჭრობის რეჟიმში მივიღებთ სიგნალებს 0 ზოლიდან (თუ ინდიკატორი ღია ფასით არის აგებული) ან ბარიდან 1 (სხვა შემთხვევებში). თუ ექსპერტი არ მუშაობდა გახსნის ფასებზე და აანალიზებდა ტკიპებს, ამ რეჟიმში საჭირო იქნებოდა ინდიკატორის მნიშვნელობების ნახვა ბარი 0-ზე.

ამ ორი რეჟიმის არსებობა - სტატისტიკის შეგროვება და ვაჭრობა - გულისხმობს პარამეტრების სხვადასხვა ნაკრების შექმნის აუცილებლობას, რომლებიც განსხვავდება სამუშაო ზოლების რაოდენობაში. ჩვენ დავიწყებთ სტატისტიკის შეგროვების ნაკრებით, შემდეგ კი მარტივად გადავიყვანთ რეალურ სავაჭროდ.

MA ინდიკატორის ამ ორი ასლის გამოყენებით, ჩვენ დავაყენებთ ჰიპოთეზებს. __SIGNAL_A ჯგუფში შევდივართ:

SIGNAL_A = H_BULL

მდგომარეობა = IndicatorXrelatesToIndicatorY ინდიკატორი X = 1 ინდიკატორი Y = 2 მიმართულება ან ნიშანი = ზევითOrAboveOrPositve ქმედება = გაფრთხილება

მოდით დავაკონფიგურიროთ __SIGNAL_B ჯგუფი იმავე გზით, გარდა მიმართულებისა:

SIGNAL_B = H_BEAR
მიმართულება ან ნიშანი = DownSideOrBelowOrNegative

სავარაუდო სავაჭრო მოდელის შესამოწმებლად, ჩვენ გამოვიყენებთ 3 სტანდარტულ სტრატეგიას ინდიკატორებზე დაყრდნობით:

  • სტოქასტური
  • Bollinger Bands

წინასწარ აღვნიშნოთ, რომ ოპტიმიზებულია ყველა ინდიკატორის პარამეტრები, რომელთაგან ზოგიერთი კონკრეტულად დარჩა ბმულების სახით შეყვანის ცვლადებზე var1, var2 და ა.შ. ამ ჩარჩოს შესაძლებლობის დემონსტრირება. თქვენი პროვაიდერის მონაცემებით დადებითი შედეგების გასამეორებლად, თითოეულ სტრატეგიას სავარაუდოდ ხელახლა ოპტიმიზაცია დასჭირდება.

სტოქასტური სტრატეგიამოიცავს ყიდვას, როდესაც ინდიკატორი კვეთს 20 დონეს ქვემოდან ზემოდან და გაყიდვისას 80 დონის გადაკვეთისას ზემოდან ქვემოდან. ამისათვის ჩვენ განვსაზღვრავთ ჯგუფს __INDICATOR_3:

სელექტორი = dStochastic_K_D_slowing_method_price

პარამეტრები = 14,3,3, sma, დაბალი ბუფერი = მთავარი ბარი = 6

ვინაიდან ინდიკატორი იყენებს მაღალ და დაბალ ფასებს, აუცილებელია აიღოთ ზოლი ნომერი 6 - ბოლო სრულად ჩამოყალიბებული მე-5 ზოლამდე, სადაც ვირტუალური ვაჭრობა იწყება სიგნალის გაშვების შემთხვევაში.

Stochastic ინდიკატორის საფუძველზე, ჩვენ დავაყენებთ ყიდვა-გაყიდვის სიგნალებს. შესყიდვის ჯგუფი:

SIGNAL_C = S_BUY სტოქასტური

მდგომარეობა = IndicatorXcrossesLevelX დონე X = 20 მიმართულება ან ნიშანი = ზევითOrAboveOrPositve

იყიდება ჯგუფი:

SIGNAL_D = S_SELL სტოქასტური

მდგომარეობა = IndicatorXcrossesLevelX დონე X = 80 მიმართულება ან ნიშანი = ქვევით ან ქვემოთ ან უარყოფით

MACD სტრატეგიაშედგება ყიდვისგან, როდესაც მთავარი ხაზი კვეთს სიგნალის ხაზს და გაყიდვას, როდესაც ის კვეთს ქვემოთ.

მოდით დავაკონფიგურიროთ ინდიკატორის ჯგუფი __INDICATOR_4:

ამომრჩევი = dMACD_fast_slow_signal_price

პარამეტრები = =var4,=var5,=var6, ღია ბუფერი = სიგნალის ზოლი = 5

ჩვენ წავიკითხავთ პერიოდებს სწრაფი, ნელი, სიგნალი პარამეტრებიდან var4, var5, var6, რომლებიც ხელმისაწვდომია ოპტიმიზაციისთვის. ახლა არის 6, 21, 6 შესაბამისად. ჩვენ ვიყენებთ 5 ზოლს, რადგან... ჩვენ ვაშენებთ ინდიკატორს ღია ფასის საფუძველზე.

ვინაიდან ინდიკატორების დასაყენებლად ჯგუფების რაოდენობა შეზღუდულია, ჩვენ აღვწერთ მთავარ ბუფერს პირდაპირ სიგნალებში. შესყიდვის ჯგუფი:

SIGNAL_E = S_BUY macd

მდგომარეობა = IndicatorXcrossesIndicatorY Indicator X = iMACD@main(=var4,=var5,=var6,ღია) ინდიკატორი Y = 4 მიმართულება ან ნიშანი = UpSideOrAboveOrPositve

იყიდება ჯგუფი:

SIGNAL_F = S_SELL macd

მდგომარეობა = IndicatorXcrossesIndicatorY ინდიკატორი X = iMACD@main(=var4,=var5,=var6,ღია) ინდიკატორი Y = 4 მიმართულება ან ნიშანი = DownSideOrBelowOrNegative

BollingerBands-ზე დაფუძნებული სტრატეგიაშედგება ყიდვისგან, როდესაც წინა ზოლის მაღალი მაჩვენებელი არღვევს 2 ბარით მარჯვნივ გადატანილი ინდიკატორის ზედა ხაზს და გაყიდვას, როდესაც წინა ზოლის დაბალი მაჩვენებელი არღვევს მარჯვნივ გადატანილი ინდიკატორის ქვედა ხაზს 2 ბარით. ქვემოთ მოცემულია ორი ინდიკატორის ხაზის პარამეტრები.

პარამეტრები = =var1,=var2,2, ტიპიური

ბუფერი = ზედა ბარი = 5

სელექტორი = tBands_period_deviation_shift_price

პარამეტრები = =var1,=var2,2, ტიპიური ბუფერი = ქვედა ბარი = 5

პერიოდი და გადახრა მითითებულია var1-ში და var2-ში, როგორც 7 და 1 შესაბამისად. ორივე შემთხვევაში, ბარი 5 შეიძლება გამოყენებულ იქნას, მიუხედავად ტიპიური ფასის ტიპისა, რადგან ინდიკატორის ხაზები გადაადგილებულია 2 ბარით მარჯვნივ, ე.ი. რეალურად გამოითვლება წარსულ მონაცემებზე.

საბოლოოდ, სიგნალის პარამეტრების ჯგუფები ასე გამოიყურება.

SIGNAL_G = S_BUY ზოლები

მდგომარეობა = IndicatorXcrossesIndicatorY ინდიკატორი X = iMA@0(1,0,sma,high) ინდიკატორი Y = 5 მიმართულება ან ნიშანი = გვერდითი ან ზემოთ ან დადებითი

SIGNAL_H = S_SELL ზოლები

მდგომარეობა = IndicatorXcrossesIndicatorY ინდიკატორი X = iMA@0(1,0,sma, დაბალი) ინდიკატორი Y = 6 მიმართულება ან ნიშანი = ქვევით ან ქვევით ან უარყოფით

ყველა პარამეტრი ნაკრების ფაილების სახით თან ერთვის სტატიის ბოლოს.

შედეგები

სტატისტიკა ინდიკატორებზე

ალბათობების გამოსათვლელად ვიყენებთ 2014.01.01-2017.01.01 პერიოდის სტატისტიკას EURUSD D1 წყვილისთვის. სტატისტიკის შეგროვების რეჟიმის საექსპერტო პარამეტრები შეიცავს indstats-stats-all.set ფაილში.

შეგროვებული მონაცემები ნაჩვენებია ჟურნალში. ქვემოთ მოცემულია მაგალითი:

: ბარები=778 : ხარი=328 დათვი=449 : ყიდვა: 328 0 30 0 50 0 58 0 : ყიდვაOk: 0 0 18 0 29 0 30 0 : გაყიდვა: 0 449 0 22 0 49 0 0 0 6 14 0 28 0 41 : ჯამები: 0.00 0.00 0.60 0.64 0.58 0.57 0.52 0.61 : სტატისტიკა სახელით: : macd=0.576 : bands=0.568 : სტოქასტური = 0.

ზოლების საერთო რაოდენობაა 778, აქედან 328 იყო შესაფერისი 5-დღიანი ყიდვის წარმატებული ვაჭრობისთვის, ხოლო 449 შესაფერისი იყო 5-დღიანი გაყიდვის წარმატებული ვაჭრობისთვის. პირველი 2 სვეტი შეიცავს ჰიპოთეზის მრიცხველებს - იგივე 2 რიცხვს, ხოლო შემდეგი წყვილი სვეტები ეხება შესაბამის სავაჭრო სტრატეგიებს, რომელთაგან თითოეული წარმოდგენილია ყიდვის სვეტით და გაყიდვის სვეტით. მაგალითად, სტოქასტურმა სტრატეგიამ წარმოქმნა 30 ყიდვის სიგნალი, რომელთაგან 18 იყო მომგებიანი და 22 გაყიდვის სიგნალი, რომელთაგან 14 იყო მომგებიანი. თუ შევაჯამებთ წარმატებული სიგნალების საერთო რაოდენობას თითოეული სტრატეგიისთვის და გავყოფთ გენერირებული სიგნალების რაოდენობაზე, მივიღებთ თითოეული მათგანის ეფექტურობას (წარმატების ალბათობას ისტორიულ მონაცემებზე დაყრდნობით):

  • სტოქასტური - 0,615
  • MACD - 0.576
  • ზოლები - 0,568
სატესტო ვაჭრობა

იმისათვის, რომ დარწმუნდეთ, რომ სტატისტიკა სწორად არის გათვლილი, თქვენ უნდა გაუშვათ Expert Advisor სავაჭრო რეჟიმში. ამისათვის თქვენ უნდა დაარედაქტიროთ ზოლის ნომრები პარამეტრებში, შეცვალოთ 5 0-ით, 6 1-ით. გარდა ამისა, თქვენ თანმიმდევრულად უნდა ჩართოთ სავაჭრო სტრატეგიები ერთმანეთის მიყოლებით Action პარამეტრების დაყენებით Buy and Sell ნაცვლად Alert. მაგალითად, სტოქასტური ვაჭრობის შესამოწმებლად, __SIGNAL_C (S_BUY სტოქასტური) ჯგუფში ჩაანაცვლეთ Alert მნიშვნელობა Action პარამეტრში Buy ღირებულებით, ხოლო __SIGNAL_D (S_SELL სტოქასტური) ჯგუფში შეცვალეთ Alert მნიშვნელობა გაყიდვით.

სამივე სტრატეგიის შესაბამისი პარამეტრები მოცემულია, შესაბამისად, ფაილებში indstats-trade-stoch.set, indstats-trade-macd.set, indstats-trade-bands.set.

ამ პარამეტრების ნაკრებით ექსპერტის 3-ჯერ გაშვებით, ჩვენ მივიღებთ 3 ჟურნალს მოკლე სავაჭრო ანგარიშებით. სტატისტიკა ბოლოშია. მაგალითად, სტოქასტურისთვის ვიღებთ ხაზს:

: ყიდულობს: 18/29 0.62 ყიდის: 14/22 0.64 სულ: 0.63

ეს არის რიცხვები რეალური ტრანზაქციის შესახებ: 29 შესყიდვიდან 18 მომგებიანია, 22-დან 14 გაყიდვები მომგებიანია, საერთო სიგნალის ეფექტურობა არის 0,63.

MACD და BollingerBands სტრატეგიების შედეგები ნაჩვენებია ქვემოთ.

: ყიდულობს: 29/49 0,59 ყიდის: 28/49 0,57 სულ: 0,58

: ყიდულობს: 29/51 0,57 ყიდის: 34/59 0,58 სულ: 0,57

მოდით შევაჯამოთ ყველა სტრატეგიის ინდიკატორი ერთ სიაში.

  • სტოქასტური - 0,63
  • MACD - 0.58
  • ზოლები - 0,57

აქ ჩვენ ვხედავთ თითქმის სრულ თანხმობას წინა ქვეპუნქტის თეორიასთან. ზოგიერთი განსხვავება განპირობებულია იმით, რომ სავაჭრო სიგნალები შეიძლება გადაფარონ ერთმანეთს, თუ ისინი 5 ბარის ფარგლებშია და შემდეგ განმეორებითი ვაჭრობა არ გაიხსნება.

რა თქმა უნდა, ჩვენ შეგვიძლია გავაანალიზოთ სავაჭრო ანგარიშები თითოეული სტრატეგიისთვის.


ნახ.5 სტრატეგიის ანგარიში სტოქასტური ინდიკატორის საფუძველზე


ნახ.6 სტრატეგიის ანგარიში MACD ინდიკატორის საფუძველზე


ნახ.7 სტრატეგიის ანგარიში BollingerBands ინდიკატორის საფუძველზე

ფორმულის (4) გამოყენებით, ჩვენ ვიანგარიშებთ თეორიულ ალბათობას, რომ ტრანზაქცია წარმატებული იქნება შესვლისას სამივე ინდიკატორის სინქრონული სიგნალების საფუძველზე.

P(H|ABC) = 0,63 * 0,58 * 0,57 / (0,63 * 0,58 * 0,57 + 0,37 * 0,42 * 0,43) = 0,208278 / (0,208278 + 0,066822 + 0,066822) = 2,76820 = 2,78 , 20,78 ,

ამ სიტუაციის შესამოწმებლად უნდა ჩართოთ სამივე სიგნალი და ასევე შევცვალოთ ConsistentSignalNumber პარამეტრის მნიშვნელობა 1-დან 3-მდე. შესაბამისი პარამეტრები არის indstats-trade-all.set ფაილში.

ტესტერში სავაჭრო ტესტის მიხედვით, ასეთი სისტემის საბოლოო ეფექტურობა პრაქტიკაში არის 0.75:

: ყიდულობს: 4/7 0,57 ყიდის: 5/5 1,00 სულ: 0,75

აქ არის ტესტის ანგარიში:


ნახ.8 ანგარიში 3 ინდიკატორზე დაფუძნებული სტრატეგიების ერთობლიობის შესახებ

ქვემოთ მოცემულია ვაჭრობის ინდიკატორების ცხრილი თითოეული ინდიკატორისთვის ცალკე და მათი სუპერპოზიციისთვის.


მოგება, $ PF DD, $
სტოქასტური 204 2.36 51 41
MACD 159 1.39 98 76
ბენდები 132 1.29 110 64
სულ 68 3.18 12 30

როგორც ვხედავთ, გამარჯვების ალბათობის ზრდა მიიღწევა უფრო იშვიათი, მაგრამ უფრო ზუსტი ჩანაწერების გამო - შემცირდა ტრანზაქციების რაოდენობა და მთლიანი მოგება, მაგრამ მოგების ფაქტორი და მაქსიმალური ვარდნა გაუმჯობესდა მინიმუმ 35%-ით და ზოგიერთ შემთხვევაში - 2-ზე მეტი.

დასკვნა

სტატიაში განხილულია უმარტივესი ვარიანტი ინდიკატორის სიგნალებზე დაყრდნობით სავაჭრო გადაწყვეტილებების მიღების სავარაუდო მიდგომის განხორციელებისთვის. სპეციალური ექსპერტის დახმარებით აჩვენეს, რომ ბეიზის ფორმულით წარმატებული გარიგებების ალბათობის გაზრდის თეორიული გამოთვლები შეესაბამება პრაქტიკაში მიღებულ შედეგებს.

ვინაიდან სიგნალების გენერაცია დისკრეტულია, სხვადასხვა ინდიკატორის სიგნალები შეიძლება არ ემთხვეოდეს და პოტენციურად შესაძლებელია სიტუაცია, როდესაც ინდიკატორების სუპერპოზიცია არ იძლევა ყველა ინდიკატორით დადასტურებულ საერთო სიგნალებს. ამ პრობლემის ერთ-ერთი შესაძლო გამოსავალი არის სიგნალებს შორის დროის ტოლერანტობის შემოღება.

უფრო ზოგად შემთხვევაში, შესაძლებელია გამოვთვალოთ სავაჭრო ჰიპოთეზების განხორციელების ალბათობის სიმკვრივე ინდიკატორების მდგომარეობის (და არა სიგნალების) მიხედვით. მაგალითად, ზედმეტად შეძენილი ან ზედმეტად გაყიდული ღირებულება, რომელიც განისაზღვრება კონკრეტული ოსცილატორის ღირებულებით, იძლევა წარმატებული ჩანაწერების პროცენტს (ალბათობას). გარდა ამისა, წარმატებული ტრანზაქციის ალბათობა, ცხადია, დამოკიდებულია შერჩეულ stop Los-ის და Take Profit-ის პარამეტრებზე, ლოტების მართვის მეთოდებზე და მრავალი სხვა სისტემის პარამეტრებზე. ეს ყველაფერი შეიძლება გაანალიზდეს ალბათობის თეორიის თვალსაზრისით და გამოიყენოთ სავაჭრო გადაწყვეტილებების უფრო ზუსტი, მაგრამ ასევე უფრო რთული გამოთვლების მისაღებად.

ფაილები თან ერთვის ქვემოთ:

  • indstats.mq4 (aka indstats.mq5) - ექსპერტი;
  • common-includes.zip - არქივი გამოყენებული საერთო mqh სათაურის ფაილებით;
  • დამატებითი-mt5-includes.zip - არქივი დამატებითი სათაურის ფაილებით MT5-ისთვის;
  • instats-tester-sets.zip - არქივი მითითებული პარამეტრების ფაილებით;
ჯვარედინი ვალიდაცია არის ცნობილი მეთოდი უცნობი მოდელის პარამეტრების შეფასების მისაღებად. მეთოდის მთავარი იდეაა მონაცემთა ნიმუშის დაყოფა v "ნაკეცებად". V "ნაკეცები" არის შემთხვევით შერჩეული იზოლირებული ქვენიმუშები.

k-ის ფიქსირებული მნიშვნელობის გამოყენებით აგებულია k-უახლოესი მეზობლების მოდელი, რომ მივიღოთ პროგნოზები v-ე სეგმენტზე (დარჩენილი სეგმენტები გამოიყენება მაგალითებად) და კლასიფიკაციის შეცდომა შეფასებულია. რეგრესიის ამოცანებისთვის კვადრატების ჯამი ყველაზე ხშირად გამოიყენება როგორც შეცდომის შეფასება, ხოლო კლასიფიკაციის პრობლემებისთვის უფრო მოსახერხებელია სიზუსტის გათვალისწინება (სწორად კლასიფიცირებული დაკვირვებების პროცენტი).

პროცესი შემდეგ მეორდება თანმიმდევრობით ყველა შესაძლო არჩევანისთვის v. v „ნაკეცების“ (ციკლების) ამოწურვის შემდეგ, გამოთვლილი შეცდომები ხდება საშუალოდ და გამოიყენება როგორც მოდელის სტაბილურობის საზომი (ანუ, საზომი პროგნოზის ხარისხის შეკითხვის წერტილებში). ზემოაღნიშნული ნაბიჯები მეორდება სხვადასხვა k-სთვის და უმცირესი შეცდომის (ან უმაღლესი კლასიფიკაციის სიზუსტის) შესაბამისი მნიშვნელობა მიიღება ოპტიმალურად (ოპტიმალური ჯვარედინი დადასტურების მეთოდის გაგებით).

გთხოვთ, გაითვალისწინოთ, რომ ჯვარედინი ვალიდაცია არის გამოთვლით ინტენსიური პროცედურა და აუცილებელია ალგორითმის გაშვებისთვის დროის მიცემა, განსაკუთრებით თუ ნიმუშის ზომა საკმარისად დიდია.

k პარამეტრის მნიშვნელობის არჩევის მეორე ვარიანტია თავად დააყენოთ მისი მნიშვნელობა. თუმცა, ეს მეთოდი უნდა იქნას გამოყენებული, თუ არსებობს გონივრული ვარაუდები პარამეტრის შესაძლო მნიშვნელობის შესახებ, როგორიცაა მსგავსი მონაცემთა ნაკრების წინა კვლევები.

K-უახლოესი მეზობლების მეთოდი საკმაოდ კარგ შედეგებს აჩვენებს პრობლემების მრავალფეროვნებაში.

ზემოთ მოყვანილი მეთოდის რეალური გამოყენების მაგალითია პროგრამული უზრუნველყოფა Dell-ის ტექნიკური მხარდაჭერის ცენტრი, შემუშავებული Inference-ის მიერ. ეს სისტემა ეხმარება ცენტრის თანამშრომლებს უპასუხონ მეტ მოთხოვნას, დაუყოვნებლივ შესთავაზებენ პასუხებს გავრცელებულ კითხვებზე და საშუალებას აძლევს მათ შევიდნენ მონაცემთა ბაზაში მომხმარებელთან ტელეფონით ყოფნისას. ტექნიკური დახმარების ცენტრის თანამშრომლებს, ამ მეთოდის დანერგვის წყალობით, შეუძლიათ ერთდროულად უპასუხონ ზარების მნიშვნელოვან რაოდენობას. პროგრამული უზრუნველყოფა CBR ამჟამად განლაგებულია Dell Intranet-ზე.

არ არის ძალიან ბევრი მონაცემთა მოპოვების ინსტრუმენტი, რომელიც ახორციელებს k-უახლოესი მეზობლების მეთოდს და CBR მეთოდს. მათ შორის ყველაზე ცნობილი: CBR Express და Case Point (Inference Corp.), Apriori (Answer Systems), DP Umbrella (VYCOR Corp.), KATE ინსტრუმენტები (Acknosoft, საფრანგეთი), Pattern Recognition Workbench (Unica, აშშ), ასევე. ზოგიერთი სტატისტიკური პაკეტი, მაგალითად, სტატისტიკა.

ბაიესის კლასიფიკაცია

ალტერნატიული სახელები: Bayesian modeling, Bayesian სტატისტიკა, Bayesian ქსელის მეთოდი.

თქვენ შეგიძლიათ გაიგოთ მეტი ბაიესის კლასიფიკაციის შესახებ. თავდაპირველად გამოიყენებოდა ბაიესის კლასიფიკაცია ცოდნის ფორმალიზაციაექსპერტთა სისტემების ექსპერტები, ახლა ბაიესის კლასიფიკაცია ასევე გამოიყენება მონაცემთა მოპოვების ერთ-ერთ მეთოდად.

ეგრეთ წოდებული გულუბრყვილო კლასიფიკაცია ან გულუბრყვილო-ბაიეს მიდგომა არის მეთოდის უმარტივესი ვერსია ბაიესის ქსელების გამოყენებით. ამ მიდგომით წყდება კლასიფიკაციის პრობლემები, მეთოდის შედეგია ე.წ. „გამჭვირვალე“ მოდელები.

„გულუბრყვილო“ კლასიფიკაცია საკმაოდ გამჭვირვალე და გასაგები კლასიფიკაციის მეთოდია. მას უწოდებენ "გულუბრყვილო", რადგან ის იწყება იმ ვარაუდიდან, რომ ურთიერთდამოუკიდებლობანიშნები.

გულუბრყვილო კლასიფიკაციის თვისებები:

  1. ყველა ცვლადის გამოყენება და მათ შორის ყველა დამოკიდებულების განსაზღვრა.
  2. ორი დაშვების ქონა ცვლადების შესახებ:
    • ყველა ცვლადი თანაბრად მნიშვნელოვანია;
    • ყველა ცვლადი სტატისტიკურად დამოუკიდებელია, ე.ი. ერთი ცვლადის მნიშვნელობა არაფერს ამბობს მეორის მნიშვნელობაზე.

სხვა კლასიფიკაციის მეთოდების უმეტესობა ვარაუდობს, რომ კლასიფიკაციის დაწყებამდე ობიექტი თანაბრად მიეკუთვნება ამა თუ იმ კლასს; მაგრამ ეს ყოველთვის არ შეესაბამება სიმართლეს.

ვთქვათ, ვიცით, რომ მონაცემების გარკვეული პროცენტი ეკუთვნის კონკრეტულ კლასს. ჩნდება კითხვა, შეგვიძლია თუ არა ეს ინფორმაცია გამოვიყენოთ კლასიფიკაციის მოდელის აგებისას? ამ წინა ცოდნის გამოყენების მრავალი რეალური მაგალითი არსებობს ობიექტების კლასიფიკაციისთვის. ტიპიური მაგალითი სამედიცინო პრაქტიკიდან. თუ ექიმი აგზავნის პაციენტის ტესტის შედეგებს დამატებითი ტესტირებისთვის, ის ანიჭებს პაციენტს კონკრეტულ კლასში. როგორ შეგიძლიათ გამოიყენოთ ეს ინფორმაცია? ჩვენ შეგვიძლია გამოვიყენოთ ის, როგორც დამატებითი მონაცემები კლასიფიკაციის მოდელის აგებისას.

აღინიშნება ბაიესის ქსელების, როგორც მონაცემთა მოპოვების მეთოდის შემდეგი უპირატესობები:

  • მოდელი განსაზღვრავს დამოკიდებულებებს ყველა ცვლადს შორის, ეს აადვილებს სიტუაციების მართვას, რომელშიც ზოგიერთი ცვლადის მნიშვნელობები უცნობია;
  • Bayesian ქსელები საკმაოდ მარტივად არის ინტერპრეტირებული და საშუალებას იძლევა ადვილად გაანალიზდეს „რა იქნებოდა თუ“ სცენარები პროგნოზირებადი მოდელირების ეტაპზე;
  • ბაიესის მეთოდი საშუალებას გაძლევთ ბუნებრივად დააკავშიროთ მონაცემებიდან გამოტანილი ნიმუშები და, მაგალითად, ცალსახად მიღებული ექსპერტის ცოდნა;
  • Bayesian ქსელების გამოყენება თავიდან აიცილებს გადაჭარბების პრობლემას, ანუ მოდელის გადაჭარბებულ გართულებას, რაც მრავალი მეთოდის სისუსტეა (მაგალითად, გადაწყვეტილების ხეები და ნერვული ქსელები).

Naive Bayes მიდგომას აქვს შემდეგი უარყოფითი მხარეები:

  • სწორია პირობითი ალბათობების გამრავლება მხოლოდ მაშინ, როდესაც შეყვანის ყველა ცვლადი ნამდვილად სტატისტიკურად დამოუკიდებელია; მიუხედავად იმისა, რომ ეს მეთოდი ხშირად აჩვენებს საკმაოდ კარგ შედეგებს, როდესაც სტატისტიკური დამოუკიდებლობის პირობა არ არის დაკმაყოფილებული, თეორიულად ეს სიტუაცია უფრო რთული მეთოდებით უნდა მოგვარდეს ბაიესის ქსელების მომზადებაზე დაფუძნებული;
  • უწყვეტი ცვლადების პირდაპირი დამუშავება შეუძლებელია - საჭიროა მათი გადაყვანა ინტერვალურ სკალაზე ისე, რომ ატრიბუტები იყოს დისკრეტული; თუმცა, ასეთმა გარდაქმნებმა შეიძლება ზოგჯერ გამოიწვიოს მნიშვნელოვანი შაბლონების დაკარგვა;
  • კლასიფიკაციის შედეგზე Naive Bayes მიდგომაზე გავლენას ახდენს მხოლოდ შეყვანის ცვლადების ინდივიდუალური მნიშვნელობები; აქ არ არის გათვალისწინებული სხვადასხვა ატრიბუტების მნიშვნელობების წყვილების ან ტრიპლეტების კომბინირებული გავლენა. ამან შეიძლება გააუმჯობესოს კლასიფიკაციის მოდელის ხარისხი მისი პროგნოზირების სიზუსტის თვალსაზრისით, თუმცა გაზრდის ტესტირებული ვარიანტების რაოდენობას.

ბაიესის კლასიფიკაციამ ფართო გამოყენება ჰპოვა პრაქტიკაში.

ბაიესური სიტყვების ფილტრაცია

ახლახან შემოგვთავაზეს ბაიესის კლასიფიკაცია პირადი სპამის ფილტრაციისთვის. პირველი ფილტრი შეიმუშავა პოლ გრეჰემმა. იმისათვის, რომ ალგორითმმა იმუშაოს, ორი მოთხოვნა უნდა დაკმაყოფილდეს.

პირველი მოთხოვნა არის ის, რომ კლასიფიცირებულ ობიექტს უნდა ჰქონდეს საკმარისი რაოდენობის მახასიათებლები. ეს იდეალურად აკმაყოფილებს მომხმარებლის ასოების ყველა სიტყვას, გარდა ძალიან მოკლე და ძალიან იშვიათი.

მეორე მოთხოვნა არის მუდმივი გადამზადება და "სპამი - არა სპამის" ნაკრების შევსება. ასეთი პირობები ძალიან კარგად მუშაობს ლოკალურ ელ.ფოსტის კლიენტებში, რადგან საბოლოო კლიენტიდან „არა სპამის“ ნაკადი საკმაოდ მუდმივია და თუ ის იცვლება, სწრაფად არ იცვლება.

ამასთან, სერვერის ყველა კლიენტისთვის საკმაოდ რთულია „არა-სპამის“ ნაკადის ზუსტად განსაზღვრა, რადგან იგივე წერილი, რომელიც არის სპამი ერთი კლიენტისთვის, არ არის სპამი მეორისთვის. ლექსიკონი ძალიან დიდი აღმოჩნდება, არ არის მკაფიო დაყოფა სპამად და "არა სპამი", რის შედეგადაც კლასიფიკაციის ხარისხი, ამ შემთხვევაში ასოების ფილტრაციის პრობლემის გადაწყვეტა, მნიშვნელოვნად შემცირდა.