Створення стратегії з нуля – докладний посібник. Розумний чи дурний клієнт? Створити покрокову стратегію

theme_park:
IНам знадобиться:
спрайт будівлі
спрайт меню
спрайти різних кнопок таких як:
срайт з написом (будівництво, будівництво, побудувати і т.д.)
віконце, яке будить з'являтися
малюнок з будівлею,
1) інше самі будемо додавати
2) слово підробні-створив сам, т.к. нам доведеться підробляти під свій вихідник)
IIПриступимо:
1) створюємо все що написано в пункті I крім 1)
Створимо глобальну змінну під назвою money, встановіть будь-яку початкову кількість грошей
Також зробимо об'єкт mouse & keyboard
Створюємо текст назвемо його info, зробимо подію always, у ньому створюємо action:
вибираємо info у виборі дій вибираємо set text у тексті пропишемо ось це:
"Money:" &(global("money").
2) додамо меню, головним завданням меню: не заважати, а допомагати гравцеві орієнтуватися (як воно може заважати?-легко, якщо ви поставите його по середині гри); перш ніж зробити меню створимо новий layer, який назвемо menu, в його пропорціях ( налаштуваннях, опціях) у пункті display пропишемо:


в ньому додамо спрайт і візьмемо зображення меню, яке було в матеріалах (пункт I) і помістимо наше меню в затишне містечко де воно не заважатиме, але буде видимим на екрані
помістимо також кнопку з предделочных матеріалів (пункт I) з написом БУДУВАТИ (або щось таке)
покладемо її на меню
тепер заходимо до Event Sheet Editor
створюємо подію(#бла-бла-бла#-це моє повідомлення(пояснення) вам тільки замість бла-бла-бла буде стояти мій коментар для вас;>>-дія;ll-розподіл віконцями наприклад:

mouse&keyboard ll on object clicked ll left clicked to object #кнопка вашого меню з написом БУДУВАТИ(або щось таке)##інше потім (див. 3пункт)#
3)тепер Найскладніше(я розбив це на два пункти щоб це не було настільки за дивно),
створюємо спрайт із передробкових матеріалів "віконце, яке буде з'являтися"
потім створюємо порожній спрайт під назвою p1, віконце відсунемо за межі екрана, а p1 поставимо на місце де має з'явитися ваше віконце при натисканні кнопки будувати (або щось у цьому роді ЧВЕР)
чудово! Тепер переходимо в event sheet editor
пропишемо не дороблену подію до кінця:
Text ll set text ll bla-bla-bla)
mouse&keyboard ll on object clicked ll left clicked to object #кнопка вашого меню з написом БУДУВАТИ(чи щось таке)#>>
4)Друга частина найскладнішого:
створимо спрайт спрайт де буде намальовано зображення будівлі (підробні матеріали) назвемо h1
створимо порожній спрайт, назвемо p2, тепер помістимо його на місце де має відкритися віконце,
створимо спрайт-теж віконце (передробні матеріали), в віконці красиво напишемо назву будівлі, її вартість та опис (за бажанням) назвемо i1
створимо ще один порожній спрайт, під назвою р3, помістимо його поряд з р2, щоб він торкався р2 тільки верхнім лівим кутом
тепер створимо кілька подій, але спочатку до робимо минулу подію однією новою дією:
mouse&keyboard ll on object clicked ll left clicked to object #кнопка вашого меню з написом БУДУВАТИ(чи щось у цьому роді)#>> sistem ll ;Y-не міняємо# to object p1
>>sistem ll create object relative to object ll #ваше друге віконце# #номер layer під ім'ям menu# #X;Y-не міняємо# to object p2
Нам ще треба зробити йому подію:
копіюємо подію та інвертуємо
new event
mouse&keyboard ll is over object ll h1>>system ll creat object to relative to object ll i1 #номер layer під ім'ям menu# #X;Y-не міняємо# to object p3
Зробимо спрайт з будівлею (користуйся підробними матеріалами) назвемо house
Створимо вікно де з'являтимуться наші будівлі при їх виборі в меню назвемо rlo
події:
mouse&keyboard ll on object clicked ll left clicked to h1>>system ll create to object relative to object ll house #номер layer під іменем menu# #X;Y-не міняємо# to object rlo
>> sistem ll subtract from value ll #кількість грошей, яка має відібратися при будівництві#
тепер подію, щоб будувати було не можна
я вам розповім мій колишній спосіб заборони (коли закінчу писати досліджу ще один спосіб, якому мене про синіло коли я згадав гру theme park world)
події:
house ll on collision with another object ll to house
>>house ll destroy
>> sistem ll subtract from value ll - #подвоєна кількість грошей яка віднялася при будівництві##помітьте ви повинні поставити - кількість#
у принципі все.
IIIщо хочу сказати:

Мене дуже засмутив крах моєї гри. Вона була стратіжка, і за її схемою складена ця стаття. Попрошу сильно не критикувати, писав довго, знайдете мовні помилки пишіть виправлю
а ось вихідник на розтерзання, дивіться, в принципі там все так само як і тут написано тільки це була демонстративна версія гри. Головне ні чого не міняти, а то за глючить!
користуйтесь, експериментуйте, перевіряйте, робіть що хочете мені все рівно

KaMiKaZa:
Усі "системні" висловлювання потрібно внести до тегу "Код".
Тоді, гадаю, краще буде.
Ще, мені здається, скрин тут би не завадили. А також вихідник для новачків.

theme_park:
я не вмію робити скрині подій.

ну це не обов'язково.

iamnp:
theme_park , є спеціальна кнопка на клаві - PrintScreen

theme_park:
я знаю просто деякі інакше роблять. Тим більше у кожного свій спрайт
і якщо я понаставлю всі ці спрайти, мало кому буде зрозуміло.
ну може хто плюсане? Не дарма ж я корився?

burlachenko:
Щоб такий урок когось зацікавив, його потрібно відповідно оформити, а тут "аби було".
І все-таки якщо буде бажання, трохи, коли буде час "пригарніть" його будь ласка.

theme_park:
окей, прийду зі школи добре.
ПС. додав вихідник

Serega Lebedev:

iamnp , а куди ці скріни потім подіються?

KaMiKaZa:

Буфер обміну.
Зайди до будь-якої текстовий редактор, та виконай операцію "Вставити", або натисніть Ctrl+V.

У цій статті навряд чи я торкнуся чогось незвіданого. Всі викладки прості та зрозумілі будь-кому, хто знає, що таке Ajax. Я вже писав статтю про те, як слід поєднувати клієнт із сервером у реал-тайм іграх (). У цій статті я вирішую ті ж проблеми стосовно покрокових ігор.

Отже, що таке покрокова гра? У вікіпедії можна знайти таке визначення покрокової стратегії - це жанр комп'ютерних ігор, основною особливістю якого є те, що гравці здійснюють ходи по черзі, на противагу стратегії в реальному часі. Я б трохи спростив це визначення:

  • Покрокова стратегія - це стратегічна покрокова гра.
  • Стратегічна гра - це жанр ігор, в якому запорукою досягнення перемоги є планування та стратегічне мислення.
  • Покрокова гра - це жанр ігор, основною особливістю якого є те, що гравці здійснюють ходи по черзі.
До покрокових ігор належать:
  • Покрокові стратегії
  • Карточні ігри
  • Настільні ігри (шахи, го, монополія та ін.)
Зауважу, що покрокові ігри накладають менше обмежень на складність протоколу взаємодії проти реал-тайм іграми. А саме, час реакції на ту чи іншу подію ключової ролі не відіграє. Гравцеві зазвичай відводиться від 10 секунд часу на ухвалення рішення. Навіть якщо пінг гігантський, скажімо, 3 секунди, то гравцеві залишається ще цілих 7 секунд на роздуми. Крім того, пінг може стрибати та стрибати, а нас це зовсім не хвилює (у реал-тайм іграх така ситуація практично вбиває будь-який протокол).

Зазвичай (95% покрокових ігор) у будь-який момент часу рішення приймає рівно один гравець. Отже, звужується безліч запитів, куди ми маємо адекватно реагувати.

Тому при створенні протоколу ми орієнтуватимемося насамперед на простоту його реалізації та підтримки. Це дозволить нам отримати більший прибуток за менший час.

Міркування, що наводяться, мають під собою опору 2-місячної розробки деякої карткової гри.

Розумний чи дурний клієнт?

Для початку, давайте визначимося, наскільки розумним може бути наш клієнт. Я міркую про те, чи варто дублювати логіку програми (правила гри) на клієнта. Безумовно, сервер повинен бути розумним, щоб запобігти потенційному зламу програми. Але чи варто навчати бізнес-логіці клієнт?

Це залежить від того, скільки важить повний обсяг даних про стан вашої гри. Якщо цей обсяг даних великий, довго збирається на сервері і передається клієнту, то має сенс частину логіки реалізувати клієнта, щоб розвантажити сервер. Наприклад, у Civilization датчик використовуваної пам'яті завжди зашкалює. Чи зможете ви створити щось подібне, залишивши на клієнті виключно UI?

З іншого боку, чим розумніший клієнт, тим дорожче коштуватиме розробка гри. Зауважу, що від ерудиції клієнта час розробки сервера не залежить. Нехай навіть клієнт супер-пупер-мега розумний, якщо користувач захоче перезавантажити вікно браузера, серверу доведеться збирати і компонувати всі дані про гру для передачі їх клієнту. А ля "Завантаження збереженої гри". Висновок: розумний клієнт може прискорити роботу програми, але він завжди вимагатиме додаткових ресурсів для розробки програми.

Пропоную наступний тест:

1. Чи дозволяє обсяг каналу?

Оцініть середню вагу повного обсягу даних про стан гри. Далі помножте на середню кількість запитів до сервера за секунду. Якщо отримана кількість перевищить обсяг вихідного каналу передачі, дурний клієнт неприпустимий. Якщо це число перевищить 20% вихідного каналу, то варто задуматись, чи потягне?

2. Чи велика трудомісткість?

Оцініть трудомісткість алгоритму збору даних про гру (у частках секунди). Тут же зважте на всі запити до бази даних. Далі помножте на середню кількість запитів серверу за секунду. Якщо час перевищить одну секунду, дурний клієнт неприпустимий. Якщо це число перевищить 200 мс, то варто задуматись, чи потягне?

Продовження:

Привіт всім! Зараз я розповім вам як зробити просту ртс-ку (РТС - RTS - Real Time Strategy тобто стратегія в реальному часі) відкриваємо гамак 8.1 (на 8.0 працездатність не гарантується) створюємо об'єкт objControl, тобто це буде наш головний об'єкт створимо подію створення ( Create) Додати подію => Створення (Add event => Create) подія створення робиться всього один раз - при створенні, натискаємо на вкладку control в правому вертикальному менюі натискаємо ПКМ по Execute code (Виконати код) і пишемо код (краще не копіювати код, а писати його самому, так набагато легше запам'ятати):

200?"200px":""+(this.scrollHeight+5)+"px");">startx=0; //Оголошуємо змінну початку точки по х
starty = 0; //Оголошуємо змінну початку точки по у
draw_rect=false; //Не малюємо прямокутник вибору


Змінна частина пам'яті, яка містить інформацію. Вони мають своє ім'я, за допомогою якого Ви можете звернутись до них. Змінні GML можуть містити реальне число або рядок. Наприклад, стіл - це змінна, дерев'яна або скляна - значення
Тепер створюємо подію кроку (Step, Add Event = > Step) і виконуємо операцію заново (натискаємо ПКМ Execute code (Виконати код)):

200?"200px":""+(this.scrollHeight+5)+"px");">
if mouse_check_button_pressed(mb_left) // Якщо ЛКМ натиснута
{
draw_rect=true; //Ми малюємо прямокутник
startx=mouse_x; //Стартова х позиція = положення х миші
starty=mouse_y; //Стартова у позиція = становище у миші
with all selected=false; //Це поки що не оголошена змінна, що вона робитиме ми дізнаємося пізніше
}

If mouse_check_button_released(mb_left) // Якщо ЛКМ відпущена
{
draw_rect=false; //Ми не малюємо прямокутник
for(i=0;i<=instance_number(par);i+=1) //Читайте про цикл for ниже
{
ii = instance_find (par, i); //Ми шукаємо поки що не зроблений об'єкт
if(collision_rectangle(startx,starty,mouse_x,mouse_y,ii,true,false)) //Ось наш прямокутник колізії (дотику)
{
ii.selected=true;
}
}
}

Код великий і складний, поки ми дізнаємося про оператора умови if:
Код з if виконується так:

200?"200px":""+(this.scrollHeight+5)+"px");">
if (умова)
{
дія
}

Також у ньому може бути оператор else (інакше), приклад:

200?"200px":""+(this.scrollHeight+5)+"px");">if (умова)
{
дія
}
else
{
дія 2
}

А for – це оператор циклу, він виконується так:

200?"200px":""+(this.scrollHeight+5)+"px");">
for (<переменная> ; <выражение> ;<действие переменной>)
{
<действия>
}


оператор для дуже потужної речі, він дуже допомагає у важких ситуаціях

Оператор - вбудовані в ЯП дії, наприклад, найпоширеніша це int, if, else, string, switch, for, case, break, exit, і т.д.

Тепер також створюємо подію малювання (draw) і таким чином пишемо:

200?"200px":""+(this.scrollHeight+5)+"px");">if draw_rect=true
{
alpha = .8;
draw_rectangle_color(startx,starty,mouse_x,mouse_y,c_green,c_green,c_green,c_green,true);
}

Тут все легко, ось те саме тільки російською:
якщо нам потрібно малювати прямокутник, то ми вибираємо прозорість та малюємо прямокутник
ось аргументи

200?"200px":""+(this.scrollHeight+5)+"px");">draw_rectangle_color(x1,y1,x2,y2,color 1, color 2, color 3, color 4, outline)


outline - чи малюватиметься лише грань (true) чи залитий прямокутник (false)
Ми знайшли нове слово - константа, це замінене словом числове вираз або код, в гамаку є константи:

200?"200px":""+(this.scrollHeight+5)+"px");">true (правда) - 1
false (брехня) - 0
pi - 3.1415...


Ну ось, розібралися, тепер нам потрібно створити новий об'єкт – батьківський об'єкт, який підключатиметься до дочірніх. Назвемо його par (щоб змінити ім'я потрібно змінювати код на подію кроку контрольного об'єкта), на подію створення пишемо:

200?"200px":""+(this.scrollHeight+5)+"px");">selected=false; //Ось і наша змінна, чи вибраний об'єкт

Це все. Тепер нам звичайно потрібен об'єкт, який може пересуватися, називаємо його objTest, в подію створення пишемо код:

200?"200px":""+(this.scrollHeight+5)+"px");">gox=x; //Куди йти по х...
goy=y; //по у
selected=false; //Ми не вибрані =)
object_set_parent(self,par) //Ось і вибір батька

Нова дія:

200?"200px":""+(this.scrollHeight+5)+"px");">object_set_parent(ind,obj)

Встановлює батьківський об'єкт об'єкта з ім'ям ind.
І новий оператор: self, він означає, що дія буде переходити до себе
Не бійтеся, ще трохи залишилося, на подію кроку:

200?"200px":""+(this.scrollHeight+5)+"px");">if distance_to_point(gox,goy) > 20
{
mp_potential_step(gox,goy,6,solid);
}
if(selected=true) && mouse_check_button_pressed(mb_right)
{
gox=mouse_x;
goy=mouse_y;

Формування стратегії
не можна довіряти дилетантам:
їх плани можуть несподівано спрацювати,
а до цього ніхто не готовий.

(А. Канінгем)

У двох попередніх випусках ми навчилися робити нескладні двовимірні ігри, керувати спрайтами, прокручувати ігровий екран, відстежувати зіткнення ігрових об'єктів, будувати інтерфейс (кнопки, миша, клавіатура, текстові області) та працювати у повноекранному та віконному режимах. Усе це робилося з прикладу аркадної гри.

Цього разу ми перейдемо від аркад до «серйознішого» жанру – стратегій. Тут нам доведеться освоїти цілу серію нових механізмів, але нічого складного не буде тут. У цій статті ми вивчимо пристрій покрокової стратегії(а також і стратегії реального часу- її з ЛКІ-Creator"ом робити навіть простіше) і зробимо для прикладу гру, розраховану, проте, тільки на розрахований на багато користувачіврежим (а також редактор картдля неї). Поодиноким режимом ми займемося в наступному випуску нашої рубрики - присвяченому основ штучного інтелекту.

Оскільки це вже третє заняття, ми не подробиці розбиратимемо веськод прикладу - благо багато зроблено так само, як у два попередні рази. Для довідок є програма-приклад (у ній чимало коментарів) та попередні статті.

Ну а матеріали наших минулих занять ви можете знайти на нашому компакт-диску, у спеціально створеному для цього розділі «Гра своїми руками».

Постановка задачі

Напишемо стратегічну гру, що складається з бою двох фентезі-армій. Мета битви - захоплення кількох обелісків, розставлені по карті. Перед битвою ми розставляємо свої війська, що складаються з 6 мечників, 4 лучників, 2 лицарів, 2 магівта 1 привид, у межах відведеної нам території. Крім них, на карті бувають нейтральні дракони.

Характеристики бійців
Боєць Пересування Хіти Дальнобійність Пошкодження Захист Здібності
Мечник4 8 1 7 2 -
Лучник4 5 7 5 1 -
Лицар3 15 1 9 4 Лікування, лицарський удар
Маг3 12 5 6 0 Вогненна куля
Привид4 7 2 5 5 Регенерація
Дракон6 30 2 12 5 Політ

Характеристики бійців представлені у таблиці. Лікування- це право разів за бій вилікувати сусіднього воїна (крім примари) до повного здоров'я. Лицарський удар- право разів за гру завдати потрійних ушкоджень. Вогненна куля- Атака мага знімає хіти не тільки з безпосередньої мети, але і з навколишніх квадратів. Регенерація- Відновлення по 1 хіту за хід. Політ- право пересуватися через перешкоди.

Гра йде в розрахованому на багато користувачів режимі, у варіанті Hot Seat (гра з одного комп'ютера, ходи по черзі). Після ходу гравців роблять свій хід нейтральні дракони, атакуючи будь-якого супротивника в радіусі 7 клітин.

Партія закінчується, коли одна зі сторін або захоплює більше половини присутніх на карті обелісків, або повністю гине.

Карта задана спочатку у редакторі карт. На ній розставлені обеліски, дракони та перешкоди (об'єкти, через які не можна рухатися та атакувати).

Підготовка до роботи

Перед початком роботи нам потрібно буде перевстановити пакет ЛКІ-Creator. Справа в тому, що порівняно з минулим разом до нього внесено чимало змін та доповнень.

(Сподіваюсь що Delphiу вас уже встановлено; якщо ні, то рекомендації на цю тему читайте у нашій попередній статті - у червневому номері журналу або на CD цього номера або на сайті.)

Це важливо:у попередній версії ЛКІ-Creator були деякі проблеми сумісності з новими версіями Delphi. У цьому варіанті вони усунені.

Візьміть з нашого компакт-диска (розділ «Гра своїми руками») файл із текстами програм та картинками та розпакуйте його в каталог проектів.

Тепер ви можете завантажити потрібні файли звідси .

У нас має вийти три підкаталоги. В одному – Units – зберігаються бібліотеки DirectX та модулі пакету ЛКІ-Creator. В іншому – Project – ми будемо працювати; туди заздалегідь покладені картинки, які нам знадобляться, та попередня версіянашої аркади. У третьому – Escort – готова програма, яка має у нас вийти.

Тепер встановимо (переустановимо) ЛКІ-Creator. У меню Delphi відкрийте пункт Component, у ньому виберіть Install Component. Якщо у вас вже було встановлено цей пакет, залишайтеся на закладці Into existing package, інакше перейдіть на закладку Into new package і заповніть порожні рядки, як показано на малюнку (у верхньому рядку найпростіше вибрати файл LKI2dEngine.pas за допомогою кнопки Browse, а в нижньою просто запишіть LKI). Після цього натисніть OK та виберіть Install. У верхній панелі Delphi має з'явитися закладка LKI.

Тепер залишилося лише завантажити наш проект. У меню File вибираємо Open, відкриваємо файл Project \ Obelisk.dpr ...

Де карта, Біллі? Нам потрібна мапа!

Однак перш, ніж зайнятися «високими матеріями», нам знадобиться ще трохи попрацювати над графічним двигуном.

У «Зоряному ескорті», нашому попередньому проекті, «карта» жодного значення не мала: зірки розставлялися випадково і не впливали ні на що, а становище інших об'єктів або ставилося прямо в коді, або визначалося випадково. Це годиться далеко не для будь-якого проекту. А значить, нам час додати до нашого двигуна карту місцевості.

Як це буде виглядати, ви, ймовірно, вже здогадуєтеся - ставимо на вікно проекту об'єкт-карту, а потім прописуємо її як Mapнашого двигуна.

Так воно так… але у нас далеко не один клас карти. Подивимося детальніше…

Типи карт

Карта складається з якогось ландшафтуі об'єктів, встановлені на ньому. Ландшафт найчастіше (але не завжди) розбитий на клітини, які називають tiles- плитками.

Як відомо нам із шкільного курсу геометрії, площину можна без проміжків та накладень покрити правильними багатокутниками трьох типів: трикутник (рівносторонній), квадрат, шестикутник. Трикутні поля не надто зручні, тому частіше застосовуються квадратні клітини або шестикутники-«гекси».

З квадратами, в певному сенсі, жити простіше: якщо у нас є двовимірний масив клітин, одразу зрозуміло, як знайти сусідні із заданою клітиною. Це +1 та -1 по кожному з двох індексів. З шестикутниками все дещо складніше… зате гексагональна дошка має дуже цінну властивість: усі напрямки в ній однакові. У квадратної сітки це не так: діагоналі суттєво відрізняються від горизонталей та вертикалей. Тому для серйозних стратегічних розрахунків шестикутники можуть бути кращими за квадрати.

Бувають і неплиткові карти. ЛКІ-Creator підтримує два їх типи: графові та клаптеві.

Графова карта - це карта, на якій значення мають лише кілька ключових точок, плюс, можливо, особливі області (наприклад, непрохідні), а решта - просто візерунок, що не має ігрового ефекту. Так часто робляться зіркові карти, як, скажімо, у Master of Orion: зірки та чорні дірки – ключові точки, решта – фон. Ще в цьому режимі іноді роблять глобальні карти, наприклад, рольової гри.

Шматкова карта розбита на області, і всередині області всі точки однакові, рухатися по «клаптику» не можна. Це добре для глобальних стратегій, де провінція – мінімальна одиниця території.

Приклади карт із різноманітних ігор, із зазначенням типу - на малюнках.

Отже, більшість двовимірнихкарт (тривимірні – особлива стаття) можна розділити на чотири класи:

  • Прямокутна- TLKIRectMap. Це плиткова карта, клітини – квадрати. Така карта, наприклад, у Civilization III.
  • Шестикутна- TLKIHexMap. Плиткові карти з шестикутними клітинами. Використовується в багатьох wargames, і не тільки: так, наприклад, традиційно робилася бойова карта Heroes of Might & Magic.

    Два ці типи карт - нащадки загального класу TLKITileMap.

  • Графова- TLKIGraphMap. Ця картка має фон (властивість Background)та виділені на ній ключові точки – статичні об'єкти. Положення інших об'єктів на цій карті виражається або звичайними координатами (як у космічного корабля в міжзоряному просторі), або прив'язкою до об'єкта (той самий корабель - на орбіті планети). Такими є карти Master of Orion, Arcanum (глобальна) і так далі.
  • Шматкова- TLKIClusterMap. Вона має властивість фону, як і графова, і друга властивість - маска (Mask), Яке визначає, яка точка до якої області належить, та властивість Borders, що задає зв'язок між «клаптями». Так влаштовані карти, наприклад, Medieval: Total War або Victoria.

Це важливо:класи карт описані над модулі LKI2dEngine, а LKI2dMap.

Кути нахилу

Але якщо ви думаєте, що цим і вичерпуються можливості ЛКІ-Creatorа по відображенню карт, то ви сильно помиляєтеся.

Карта може бути представлена видом зверхуабо ж ізометричним- Погляд під кутом до вертикалі. Наприклад, карта Civilization III або Heroes of Might & Magic IV - ізометричні, а Civilization I прийнятий вид зверху.

Зазвичай ізометрія в ходу у плиткових карток, а графові обходяться видом зверху, оскільки масштаб у графових карток зазвичай дрібніший. Але бувають і винятки: наприклад, у Medieval: Total War – клаптева ізометрична карта.

За ізометричність відповідає властивість карти IsIsometricі два параметри, що задають кут, під яким дивиться наша камера: Phiі Theta.

Перший відповідає за поворот карти щодо вертикальної осі: наприклад, якщо задати його рівним 45 градусів (він вимірюється саме в градусах), то клітина прямокутної решітки буде орієнтована кутом нагору, як у Civilization. При Phi=0 одна із сторін клітини буде горизонтальною.

Другий управляє нахилом камери по відношенню до вертикалі. Для зручності він заданий як співвідношення горизонтальних та вертикальних одиниць довжини. Скажімо, якщо ми хочемо, щоб наша клітина малювалася по висоті вдвічі менше, ніж по ширині, нам треба надати Theta значення 2.

При плитковій карті вибирати ці кути довільно нам не дано: все-таки у нас (поки що) не 3D. Вони залежать від параметрів плиток. Наприклад, якщо вона у нас ромбоподібна, кутом вгору, і вертикальна вісь вдвічі менша за горизонтальну, то ми повинні задати параметри 45 і 2.

А ось графові та клаптеві карти дають право призначати ці параметри як завгодно (і навіть, за бажання, змінювати їх у процесі), але захоплюватися цим не слід – крім того, що такі повороти забирають чимало часу, вони ще й не надто чудово виглядають. І не забудьте, що, якщо карта у вас художня, з картинками, написами тощо, то вони повернуться разом з нею… Взагалі, клаптеву карту часом буває простіше відмалювати вже з урахуванням потрібного повороту – благо відстані там часто не відіграють жодної ролі .

Стики

Клаптлива карта, вид зверху.

У плиткових карток є ще одна проблема - стикування плиток. Нею управляє параметр TileBorderStyle. Найчастіше це tileStraight, режим, в якому плитки просто прилягають один до одного без будь-яких крайових ефектів, або tileBorder, в якому малюються лінії, що відсікають одну плитку від іншої - межі клітин (в останньому випадку не забудьте визначити колірграти у параметрі TileBorderColor).

Але є й хитріший варіант, коли однакові плитки прилягають одна до одної без змін, а різні – з використанням спеціальної «перехідної» плитки. Так роблять зазвичай, якщо карта складається здебільшого з широких просторів одного типу території, скажімо, великих зелених площ, а окрема клітина не важлива і не повинна помічатися гравцем. Такою є карта Heroes of Might Magic. А ось якщо кожна клітина обробляється окремо, як у Civilization, тоді цей метод не годиться, і краще чітко відокремити клітини одна від одної. «Злитна» технологія (її ще називають масочної) задається значенням TileBorderStyle, рівним tileMasked. Про їхній пристрій ми поговоримо в інший раз – це досить складна тема.

Плитка

Елемент картки - об'єкт класу TLKITile- має просту структуру. У ньому спочатку закладені: координати, спрайт, що його малює, код типу плитки (за яким визначається, що у нас тут - пагорб, пустеля, дорога, море?) та прохідність (це актуально в більшості ігор). Остання – це кількість одиниць ходу, які витрачаються на пересування через цю плитку сухопутнимзагоном. Для непрохідних плиток тут стоїть негативне число.

Ще один параметр - Objects, список об'єктів, що знаходяться на цій плитці (типу TLKIGameObject).

Щоб дізнатися, якою клітиною клацнули мишкою, у карти є метод MouseTile(x, y), що повертає вибрану плитку.

Серед методів плитки є IsNeighbour(Tile, Distance). Ця функція повертає істину, якщо плитка Tile віддалена від даної не більше, ніж на Distance клітин (за замовчуванням цей параметр прирівнюється одиниці, тобто, якщо ви напишете просто IsNeighbour(Tile), функція дасть істину для прилеглої до даної плитки.) ґрати «сусідами» вважаються і ті плитки, що межують по діагоналі.

Функції FirstNeighbourі NextNeighbourвикористовуються для перевірки всіх клітин, сусідніх із цією. Перша з них вказує на якусь клітину-сусіда, а другу можна викликати лише після виклику першої, і вона видає наступних сусідів по одному.

Перебір сусідів

// Нанесення пошкоджень по клітці

procedure TObeliskTile.Damage(dmg: integer);

if(Objects.Count > 0) and// У нас може бути

// не більше одного об'єкта на клітці

(Objects.ID > 0) // Пасивні об'єкти

// не пошкоджуються

Dec(Objects.Hits,

// Автоматично віднімаємо з пошкоджень захист

Max(0,dmg-(Objects as TObeliskGameObject).Defense);

if Objects.Hitsthen Die; // Забираємо вбитих

// Атака вогненною кулею

procedure TObeliskTile.Fireball;

var Neighbour: TObeliskTile;

Neighbour:= FirstNeighbour as TObeliskTile;

Neighbour.Damage(6);

Neighbour:= NextNeighbour as TObeliskTile;

until Neighbour = nil; // Поки не закінчаться сусіди

Приклад – на урізанні «Перебір сусідів». Ця процедура обраховує удар вогненною кулею по клітині та всім її сусідам.

Це цікаво: для її роботи абсолютно неважливо, шестикутні у нас грати або квадратні.

Часто нам потрібні ще якісь параметри, і зазвичай клас плиток, з яких складається картка - нащадок TLKITile. Так і в прикладі - TObeliskTile успадковано від TLKITile.

Це важливо:якщо ми вносимо на наш ігровий екран плиткову карту, координати, а також методи TLKIGameObject, пов'язані з дистанцією, за замовчуванням починають вимірювати відстань у плитках, а не в точках. Координати ж кнопок, значків тощо. продовжують мірятися у пікселах! Але цей режим можна і відключити - це корисно для стратегій реального часу.

Вибір картки

Отже, візьмемо спочатку прямокутну решітку (TLKIRectMap), ізометричне відображення (кутові параметри 0, 1.5). Нехай сітка у нас малюється (стиль tileBorder). Вкажемо двигун, що саме цю карту треба відображати. Поки що всі необхідні дії вчинені без написання єдиного рядка коду.

Ці операції треба зробити доініціалізації движка, як і оголошення шрифтів.

Фігурки оголосимо, як і раніше – спрайтами.

Редактор картки

Шматкова карта, ізометричної.

Проблем тут досить небагато. Такий же двигун, такі ж оголошення плиток ... Інтерфейс, як вибір плитки, завантаження / збереження і т.п., можна легко зробити стандартними засобами Delphi: ніхто ж не змушує нас переводити його в повноекранний режим. Розбирати це тут ми не будемо – все є у файлі з прикладом. У коді прикладу свідомо використано найпростіший спосіб; за бажання можна, наприклад, палітру об'єктів і палітру плиток робити графічними.

У редакторі є лише дві незнайомі нам особливості. Перша досить проста: це нова функція миші, призначена спеціально для «плиткових» карток. Функція TLKIRectMap.SelectTileповертає нам покажчик саме ту плитку, по якій клацнули мишею, так що ми легко можемо обробити натискання.

А ось друга новинка заслуговує на більш ретельний розгляд.

Взагалі існує безліч способів зберігати у файл і зчитувати з нього дані. Ми вибрали спосіб, закодований у файлі CannonBase. Cannon - це засіб для зчитування та запису об'єктів-нащадків TCannonObjectз контролем типів та деякими іншими особливостями.

Подивимося на код («Запис картки»).

Запис картки

procedure TObeliskMap.Save;

var i,j: integer;

InitSave(FName);

WriteStr(MapName);

Write(Map.Width, SizeOf(Map.Width));

Write(Map.Height, SizeOf(Map.Height));

for i:=0 to Map.Width-1 do

for j:=0 to Map.Height-1 do

Write(Map.Tiles.Code, SizeOf(integer);

Ось як це працює. Спочатку потрібно відкрити файл спеціальною процедурою InitSave, яка має єдиний параметр - ім'я файлу. Потім зберігаємо заголовок для контролю типів – спеціальною процедурою WriteHeader. Потім записуємо все, що нам потрібне, використовуючи процедуру WriteStrдля рядків, а для решти всіх полів - Write(її другий параметр - розмір даних, що записуються в байтах). У міру потреби для полів-об'єктів можна написати власні процедури Save c записом заголовка. Зрештою, закриваємо файл процедурою FinSave.

Усі об'єкти, які мають свій заголовок, треба окремо оголосити. В розділі Initializationмодуля (необов'язковий розділ, що йде після Implementation, в якому знаходяться команди, які треба виконати на самому початку, при запуску програми) ви повинні написати такий, наприклад, рядок:

RegisterUserName(tpMap, "TObeliskMap");

TpMap- це константа, яку ви теж маєте оголосити. Прирівняйте її, скажімо, 1. А в конструкторі об'єкта TObeliskMap надайте значення цієї константи параметру TypeID.

Навіщо така метушня? Окрім перевірки відповідності типів, ви отримуєте одну дуже важливу перевагу.

Якщо формат файлу зміниться, скажімо, через додавання нових полів – вам не знадобиться писати жодних «конвертерів», які перетворюють старі файли на нові. Ваш код автоматично прочитає їх.

Такий код автоматично ініціалізує нове поле як порожнє, якщо воно не збережене. А записувати файл можна, просто додавши рядок WriteStr(Name) у кінець.

Примітка:якщо вам все одно поки що незрозуміло, для чого такий процес, не турбуйтеся. Можна користуватися звичнішими методами запису-збереження. Але в справді масштабних ігрових проектах цей шлях дає неабиякі переваги.

Граємо

Насамперед нам потрібно створити новий клас, породжений від TLKIGameObject. Властивостей старого нам не вистачатиме. У новому класі потрібно додати поля для основних характеристик: далекобійності, пересування тощо.

Це важливо:наш старий параметр швидкості залишається з нами, але він означає швидкість руху фішки по екрану, а не ту відстань, яку вона пройде за хід. Якби ми робили стратегію реального часу, нам не знадобилося б нового параметра, а так - доведеться його вводити.

На наш екран нанесемо кнопки TLKIButton у формі лучників, мечників, мага, привидів, лицарів.

Спочатку у нас йде розстановка. Визначимо зону розміщення для однієї сторони як верхні три рядки карти, для іншої - як нижні три рядки.

Код влаштований так. При натисканні будь-яку з кнопок активізується установка відповідного бійця; клацання по незайнятій клітині в області розміщення поміщає фігурку туди і відключає кнопку. Як тільки всі кнопки відключені – хід передається противнику.

На початку кожного нового ходу всі кнопки вмикаються знову: це робиться для того, щоб людині було простіше помітити, ким вона ще не була схожа. Відповідно, клацання по кнопці виділяє фігурку, а як тільки хід зроблено - кнопка зникає. Ще одна кнопка – «Кінець ходу» – з'являється тільки після фази розміщення.

Ми вже робили минулого разу операції з включення та відключення інтерфейсних елементів, так що докладно розбирати цю операцію не будемо - подивіться в коді прикладу.

Хід фігури

// Якщо обрана клітина зайнята супротивником - атакуємо,

// якщо вільна - пересуваємося, якщо зайнята своїми

// або перешкодою - ігноруємо натискання

Tile:= Map.MouseTile(MouseX, MouseY);

if(Tile = nil)// Клацніть за межами ігрового вікна

then exit;

// Переміщення

if(Tile.Objects.Count = 0)

and(Dist(Self)

and not Moved then

// Перевіряємо, чи вдається прийти туди

if not HasWay(Tile) then exit;

MoveObj(ID, Tile.x, Tile.y);

// Гра походова - переміщуємо відразу ж

Moved:= true;

//

if Attacked then

Icon.IsVisible:= false;

// Атака

if(Tile.Objects.Count > 0)

and(Dist(Self)

and not Attacked then

Obj:= Tile.Objects;

// Атакуємо лише ворогів

if Obj.Side = Side then exit;

Obj.Damage(dmg);

Attacked: = true;

// Якщо хід зроблено повністю - прибираємо значок

if Moved then

Icon.IsVisible:= false;

Хід обробляється так (див. «Хід фігури»). Знаходиться клітка, якою клацнули. Якщо на ній ворог, і вони в межах далекобійності - йому завдається шкоди, якщо вона порожня і в межах дальності ходу - фігура переміщається (якщо дозволяють перешкоди), якщо вона зайнята, але не ворогом - натискання ігнорується.

Коли були схожі обидві сторони, діють дракони. Вони діють дуже просто: вибирають найближчого недракона, який знаходиться в межах 7 клітин від них, і атакують. Див. код «Дії дракона».

Дії дракона

// Перевіряємо плитки в межах 7 клітин від дракона

for i:= Max(0, x - 7) to Min(MaxSize, x + 7) do

for j:= Max(0, y - 7) to Min(MaxSize, y + 7) do

if (Map.Tiles.Objects.Count > 0) and

(Map.Tiles.Objects.Code>1)

// 0 - код перешкоди, 1 - дракона

then begin

// Вибираємо точку для переміщення

if x=i then ax:= i

else if x>i then ax:= i+2

else ax: = i-2;

if y=j then ay:= j

else if y>j then ay:= j+2

else ay: = j-2;

MoveObj(NO, ax, ay);

// Атакуємо

Map.Tiles.Damage(12);

// Перериваємо цикл: не більше однієї атаки

// кожним драконом за раунд

Зрештою, залишилося тільки перевірити, чи не зайнято більше половини обелісків військами однієї сторони – і якщо зайнято, то зупинити гру та оголосити переможця!


Отже, у нас вийшла стратегічна гра. Однак для повного щастя не вистачає, в першу чергу, штучного інтелекту, який дозволить надати грі однокористувацький режим (найпростішу процедуру управління драконами не рахуємо). Їм-то ми і займемося наступного разу. До зустрічі за місяць!

У майбутніх номерах

У наступних номерах ми поговоримо про:

  • системах «часток» (particles) для відображення диму, іскор тощо;
  • роботу з прозорістю;
  • тривимірних двигунах;
  • основи AI;
  • налагодження програми;
  • створення задуму та сценарію гри,
  • написання дизайн-документа;
  • ігровий баланс;
  • продумування ігрових персонажів та їх реплік;
  • роботі з Photoshop та тривимірними пакетами;
  • анімації;
  • музиці та озвучці;
  • та багато іншого.

Все це цілком реально навчитися робити своїми руками. Ви скоро в цьому переконаєтесь.

Пишіть нам…

Тим, хто вважає, що пакет можна чимось доповнити: по-перше, не забудьте, що на нашому диску сьогодні ще не фінальна версіяпакета, а лише та, у якій реалізовані описані у наших статтях функції. Можливо, щось із ваших ідей вже реалізовано і чекає на свою чергу (див. врізку «У майбутніх номерах»). І в будь-якому випадку: пропонуючи нам якусь ідею, спробуйте обґрунтувати, чому ваша пропозиція корисна відразу для багатьох ігор, а не лише для вашої конкретної.

Для самостійної роботи

В очікуванні наступного номера можна зайнятися власним проектом, а можна спробувати вдосконалити цей. Ось кілька ідей для самостійної реалізації:

  • розділити об'єкти-перешкоди на знищені (дерева та кущі) та незнищенні (камені), і зробити так, щоб вогняні кулі та дихання дракона спалювали рослинність;
  • організувати дома, де спрацювала вогненна атака, ями (бура клітина) чи палаючий кілька ходів пожежу (червона клітина);
  • дозволити мечникам та лицарям прикривати сусідів, даючи їм +1 до захисту;
  • зробити рух фігурок по екрану плавним.

А якщо у реальному часі?

Зробити стратегію в реальному часі не складніше, якщо тільки надати гравцям різні засоби введення. Найпростіше зробити це через мережу - про це ми поговоримо в одному з найближчих номерів. Ще знадобляться такі зміни:

  • не знадобиться поле GameSpeedу класу TObeliskObject- користуємося швидкістю Speed ​​з базового двигуна (швидкість переміщення по екрану дорівнює ігровій швидкості);
  • відключається цілісний обрахунок відстаней;
  • переписується код руху фігури - з урахуванням того, що треба змалювати траєкторію в обхід перешкод;
  • забирається кнопка "кінець ходу".

От і все. Спробуєте зробити самі?

У нинішні часи легко можна знайти масу торгових стратегій, проблема лише в тому, що більша їх частина або не працює, або недостатньо ефективна. У такій ситуації створення стратегії з нуля – чудове вирішення проблеми.

І хоча в кожній конкретній ситуації створення ТЗ відрізнятиметься, основні етапи залишаються одними й тими самими. Тобто можна створити щось подібне до універсального керівництва, послідовно пройшовши через всі етапи, на виході отримаємо цілком працездатну систему.

Хоча розглядатимемо варіант створення стратегії з нуля, починаючи з ідеї та закінчуючи введенням фільтром і остаточним доведенням ТЗ до розуму, це не означає, що всі готові системи відразу потрібно відкинути як свідомо неефективні. Ряд ТС цілком можна використовувати як основу і просто додати кілька фільтрів для того, щоб відсіяти помилкові сигнали.

Основні етапи створення стратегії

Якщо взяти навмання штук 5-7 індикаторів і намагатися створити з них робочу ТЗ, щось придатне навряд чи вийде. Спершу потрібно продумати основну ідею стратегії і потім переходити до підбору інструментів. Можна запропонувати таку послідовність дій:

  • якщо система створюється з нуля, перший крок – робота над ідеєю. На цьому етапі потрібно просто визначитися з тим, яким буде стиль торгівлі, наприклад, по тренду виконуватимуться угоди або проти, а можливо стратегія планується виключно пробійною. Поки що про конкретику не думаємо;
  • Після вибору відповідного стилю торгівлі можна приступати до опрацювання деталей. Перед підбором інструментів потрібно чітко визначитися з робочими валютними парами та таймфреймами, часом торгівлі тощо;

Важливо! При виборі таймфрейму небажано сильно дрібнити, особливо якщо у трейдера немає досвіду спекуляцій на малих часових інтервалах. Для новачків взагалі краще не спускатися нижче за Н1-Н4, докладніше про вибір оптимального часового інтервалу можна прочитати.

  • Наступний етап - підбір відповідних інструментів, і ось тут велика кількість вибору може зіграти з трейдером злий жарт, адже в його розпорядженні десятки індикаторів, можливість використовувати свічковий, хвильовий, технічний, фундаментальний аналіз. З усього цього розмаїття потрібно вибрати кілька інструментів, які найкраще підходять під передбачуваний стиль торгівлі;
  • одне з головних правил будь-якої стратегії – отриманий сигнал повинен підтверджуватись кількома фільтрами, але бажано обмежити їх кількість. Наприклад, для індикаторних стратегій небажано, щоб число індикаторів перевищувало 3-4, інакше виникне плутанина в сигналах, а якщо працювати планується з використанням теханалізу, то індикатори взагалі виконуватимуть допоміжну роль;
  • розробляються правила супроводу позиції, в результаті має бути алгоритм дій на будь-який варіант розвитку подій;
  • останній етап - обкатка МС спочатку на історії, а потім і на демо-рахунку, а краще на реальному центовому рахунку. Основна мета – перевірка життєздатності стратегії в реальних умовах, а реальний рахунок (нехай навіть центовий) дозволить відчути весь спектр емоцій, починаючи від ейфорії і закінчуючи гіркотою втрат.

Ще можна порадити не зациклюватись на складності МС. Практика показує, що надмірна складність зовсім не показник ефективності. Чим простіше систематим легше торгувати.

Що варто включити до ТЗ

Створення стратегії трохи нагадує конструктор, потрібно лише успішно підібрати деталі. При створенні ТЗ використовувати можна і потрібно:

  • індикатори. Причому не варто гнатися ні за їх числом, ні за надмірною складністю, навіть у повністю механічних ТС достатньо 3-5 штук;
  • графічні патерни – добре відомі прапори, вимпели, трикутники, голова та плечі, подвійні дно та вершина, як і раніше, добре відпрацьовують;
  • графічні побудови;
  • Фібо рівні;
  • елементи фундаментального аналізу – зараз заробляти виключно на новинах складно, але враховувати економічний календар у торгівлі необхідно. Хоча б просто переставити угоди на збитки перед виходом важливої ​​статистики по США чи Європі, а то й повністю закрити прибуток.

Є й низка прийомів, користь яких викликає сумніви:

  • мартингейл - спочатку збиткова тактика, єдиний шанс на успіх полягає в тому, що до моменту зливу вдасться відбити величину депозиту і трохи заробити;

  • локування без крайньої потреби також використовувати небажано, потім вийти із замку досить важко;
  • сигнали з боку краще не використовувати. Під сигналами з боку мається на увазі, наприклад, порівняння кількості продавців/покупців, різні індекси настрою більшості трейдерів і т. д. Але є й ряд ресурсів, яких можна прислухатися, наприклад, Авточартист дає непогані сигнали по графічних патернах;
  • елементи хвильового аналізу також краще не використовувати (принаймні новачкам). Хоча і тут є винятки, наприклад, торгівля по Хвилях Вульфа заснована саме на хвильовому аналізі, але складністю не відрізняється.

Розробка найпростішої індикаторної стратегії

Припустимо, що основна ідея стратегії – торгівля виключно у напрямі тренду. Причому входити в ринок буде не в момент зародження тренду, що досить ризиковано, а після невеликої корекції.

Стратегія має працювати практично на будь-якій валютній парі, це необхідно тому, що через великий таймфрейм сигнали виникатимуть не дуже часто. Тож оцінюватиме ситуацію одночасно за 5-7 валютними парами. Що стосується таймфрейму, то підійде D1, виходимо з того, що форекс на початковому етапі - лише доповнення до основної роботи, тому й торгуватимемо на денних свічках.

Тепер потрібно визначитися з тим, як саме визначатиметься момент для входу. Варіантів ідентифікації тренда можна вигадати чимало:

  • візуально – але оцінка на око не дозволить виробити чітких правил торгівлі;
  • за допомогою однієї або декількох ковзних середніх;
  • за значенням індикатора ADX, якщо більше 30 - сильний тренд, менше 20 - на ринку штиль;
  • за допомогою графічних побудов;
  • Bollinger Bands дозволяє судити про силу тренду на відстані між верхньою і нижньою межами каналу.

Загалом, варіантів багато, але так як стратегія потрібна максимально проста, зупинимося на середніх, що ковзають. А точніше однієї МА, судити про направлення тренду будемо за становищем ціни щодо неї. Почати можна з періодів, що усереднюють ціну за цілий проміжок часу (тиждень, місяць, квартал тощо), наприклад, 20 – усереднить ціну за минулий місяць. Найскладніше - підібрати відповідний період МА, але тут вже доведеться діяти шляхом спроб і помилок.

Основна ідея торгівлі полягатиме в наступному – чекаємо на прояв трендового руху, далі слідує корекція протягом одного дня, після її закінчення укладається угода. Якщо все це подати у вигляді чітких правил, то алгоритм дій виглядатиме так (на прикладі покупок):

  • спершу перевіряємо положення ціни щодо МА, ціна має бути вищою за лінію;
  • далі потрібно знайти трендовий рух, нам потрібна свічка з великим тілом та малими тінями (бажано, щоб величина тіні не перевищувала 10-15% від величини тіла свічки);
  • після неї повинна йти свічка з малим денним діапазоном (відстань від High до Close). Ціна Close не повинна сягати рівня 50% від попереднього дня – у цей день відбувається корекція ціни.

При цьому корекція може проходити за двома сценаріями:

  • коли формується свічка з довгою тінню знизу відкривати угоду можна відразу на закритті дня. Така форма свічки свідчить, що корекція вже завершилася;
  • можливий варіант, коли корекційна свічка закривається щонайменше, тобто. відкот ще не завершився, в такому випадку потрібно почекати як закриється свічка, якщо вона біла, можна відкривати довгу позицію.

Що стосується супроводу позиції та захисних ордерів, то стоп-лос слід поставити як мінімум за середину свічки з великим тілом. Щоб отримати цільовий рівень, достатньо відкласти від рівня покупки величину тієї ж свічки, можна скористатися трейлінг-стопом.

Правила стратегії сформовані, залишилося лише перевірити її у справі. Практика показує, що навіть такий нехитрий алгоритм видає більше половини прибуткових угод (а якщо переводити угоду в нуль раніше, то ймовірність отримання збитків зменшується).

Вхід на початку тренду

Запропонована вище ТЗ пропускає частину трендового руху, проте не вимагає багато часу на аналіз ринку. Якщо є можливість відстежувати поведінку ціни дня, можна спробувати осідлати тренд на початку його формування. Отже, основна ідея стратегії полягає в тому, щоб увійти в ринок після того, як ціна почне виходити з горизонтального каналу.

І тут дуже важливо отримати достовірний сигнал вчасно, на початку зародження тренду. На допомогу знову можуть прийти ковзні середні, ось тільки використовуватимуться вони дещо інакше, ніж у попередній стратегії. Можна взяти кілька МА з різними періодами і судити про формування тренду щодо їхнього розташування один щодо одного.

Це не революційний підхід, щось подібне використав ще Білл Вільямс у своєму знаменитому Алігаторі. Тож цей індикатор навіть можна взяти як основу МС.

Якщо додати Алігатор зі стандартними налаштуваннями на Н1, то видно, що він дає чимало хибних сигналів, наше завдання – відсіяти їх. Для цього входитимемо в ринок будемо відкладеним ордером, а рівень його виставлення визначатиметься за допомогою Фракталів.

У результаті схема роботи виглядатиме так (на прикладі покупок):

  • шукаємо флетову ділянку на графіку (всі лінії Алігатора хаотично переплетені одна з одною);
  • далі потрібна фрактальна свічка (причому вона повинна розташовуватись над лініями, не торкаючись їх навіть нижньою тінню);
  • ордер buy stop виставляється трохи вище за її максимум, а захисний ордер – за нижньою межею зони консолідації;
  • ТР або фіксований (50-70 п), або використовувати трейлінг-стоп. Взагалі, передбачити силу трендового руху досить складно, тому краще використовувати трейлінг-стоп, ніж фіксований ТР або визначати цільовий рівень за допомогою того ж теханалізу.

Цей приклад - не розробка стратегії нуля, а швидше невелика адаптація вже відомої стратегії під сучасний ринок.

Приклад простої комбінованої системи

Ідея все та ж – вхід на закінчення корекції, але вирішувати це завдання будемо іншим способом. Мета залишається колишньою - визначити момент завершення корекції і увійти в напрямку тренду, але якщо раніше ми застосовували середню ковзну, то тепер буде використовувати Фібо рівні і осцилятор для визначення завершення відкату.

Нас цікавитиме яскраво виражений трендовий рух, його можна визначити і візуально. Після цього потрібно просто розтягнути рівні Фібо на нього, це потрібно для визначення потенційних рівнів завершення корекції. Найбільше значення має рівень корекції 38,2%, допускається торгувати на відбій від 50% і 61,8%.

Але самого факту торкання ціною Фібо рівня мало, потрібне підтвердження. З цим завданням непогано може впоратись Стохастик (можна спробувати застосувати RSI з тією ж метою). Наприклад, для угоди на купівлю потрібно, щоб ціна знаходилася неподалік рівня корекції, а Стохастик у цей час був у зоні перепроданості.

Після того, як відбувається дотик ціною рівня, чекаємо поки Стохастик вийде із зони перепроданості та купує. Стоп можна поставити за наступний рівень корекції, а ТР розмістити щонайменше на недавньому максимумі, що передує початку відкату.

Фібо рівні та осцилятор – лише необхідний мінімум, необхідний отримання сигналу. За бажання можна ускладнити систему, ввівши додаткові фільтри.

Стратегії на основі технічного аналізу

Якщо буде використовуватися теханаліз у чистому вигляді, то завдання дещо спрощується, розробляти ТЗ з нуля вже не потрібно. Є низка прийомів та інструментів, ефективність яких перевірена роками, а трейдеру залишається лише вибрати відповідні та використовувати їх при побудовах.
В принципі, для успішної торгівлі достатньо:

  • трендових ліній – їх будуємо на різних таймфреймах, починаючи зі старшого та поступово опускаючись до робітника;
  • Фібо рівнів, їх слід розтягувати на значні рухи ціни на історії. Ключове значення матимуть рівні корекції 38,2, 50 і 61,8%, практика показує, що корекція найчастіше завершується саме у цих позначок;
  • в МТ4 реалізовано й інших інструментів теханалізу, наприклад, вила Ендрюса, набір інструментів Ганна, кілька видів каналів тощо.

Але для досить правильного прогнозу вистачить Фібо рівнів і трендовий ліній, зони накопичень рівнів і ліній зазвичай виступають у ролі підтримки/опору. Торгівля може вестись як на пробій, так і на відбій від рівнів та ліній.

Що стосується додаткових фільтрів, то можна додати свічкові патерни і який-небудь індикатор для пошуку дивергенцій (той же Стохастик або MACD). Докладніше про застосування теханалізу можна прочитати.

Фільтри для торгових систем

Будь-яка ТЗ, навіть якщо ідея робоча і в цілому торгівля йде прибутково, генерує чимало сигналів і частина з них є збитковою. Вже після формування правил системи можна використовувати низку універсальних фільтрів, які допоможуть підтягнути співвідношення прибуткових/збиткових угод.

Є низка фільтрів, які підійдуть практично під будь-яку стратегію:

  • ситуація на старших таймфреймах Якщо, наприклад, стратегія ведеться на Н1 по механічній стратегії, то не зайвим буде поглянути на те, що відбувається на Н4 та D1;
  • середній денний діапазон, мається на увазі відстань, яку ціна проходить в середньому за день, при внутрішньоденній торгівлі це допоможе відфільтрувати ряд сигналів. Припустимо, що за день ціна в середньому проходить 100-120 п, якщо в один із днів ціна до вечора вже пройшла в одному напрямку пунктів 90-100, а ТЗ дає сигнал на вхід у ринок у тому ж напрямку, тобто сенс його проігнорувати , статистика каже, що рух у цей день навряд чи продовжиться;

Важливо! Дотримання цього правила призведе до того, що частина прибуткових угод буде втрачена, натомість підвищиться співвідношення прибуткових/збиткових угод.

  • значення має і кількість свічок після формування сигналу, є навіть фільтр 5 свічок, на ньому зупинимося докладніше.

Коли ТЗ дає сигнал, то в ідеалі ситуація повинна почати розвиватися на нашу користь практично відразу ж після укладання угоди (мається на увазі наступні 1-3 свічки). Якщо цього не відбувається, то чим більше пройшло часу з моменту укладання угоди, тим менший вплив на ринок вплинуть на ті фактори, які мали значення, коли трейдер входив у ринок. Їхній вплив згасає з часом.

Як критерій можна прийняти 5 свічок, якщо після укладання угоди ціна не пішла в прибуткову сторону протягом 5 свічок, то угоду краще закрити вручну. Мається на увазі варіант розвитку подій, коли графік залишається на місці, якщо ціна пішла в збиткову сторону, то цей фільтр не застосовується.

Ця умова застосовується практично до всіх таймфреймів (за винятком m1-m5). Звичайно, зберігається ймовірність, що ціна, потоптавшись біля однієї позначки, піде у потрібний бік, але наш вибір – стабільність. Краще пожертвувати парою прибуткових угод, проте уникнути 3-5 збиткових.

Підбиття підсумків

Починати працювати без торгової системи смерті так само, це має запам'ятати кожен трейдер. Злив депозиту в такому випадку - лише питання часу.

Вибрати відповідну ТЗ не складе труднощів, навіть у вільному доступі можна знайти хороші робочі системи. Можна потурбуватися і створенням своєї стратегії, тим більше, що для цього не потрібне знання мов програмування, достатньо наявності ідеї і хоча б базових знань щодо того, як ринок працює і які індикатори і для яких цілей використовуються.

Сам процес нагадує збір конструктора - спочатку ставимо завдання, а потім просто підбираємо потрібні інструменти для її вирішення. Після перевірки історії можна переходити до тесту ТС на демо- чи центовому рахунку.


Top