Умен или глупав клиент? Създаване на стратегия от нулата - подробно ръководство Създаване на карти за походова стратегия.

Формиране на стратегия
Не можете да вярвате на аматьори:
плановете им може неочаквано да се осъществят,
и никой не е готов за това.

(А. Кънингам)

В предишните два броя научихме правете прости 2D игри, управление на спрайтове, превъртане на екрана на играта, проследяване на сблъсъци на игрови обекти, изграждане на интерфейс (бутони, мишка, клавиатура, текстови области) и работа в режим на цял екран и прозорец. Всичко това беше направено с помощта на аркадна игра като пример.

Този път ще преминем от аркадни игри към по-сериозен жанр - стратегии. Тук ще трябва да овладеем цяла поредица от нови механизми, но и тук няма да има нищо сложно. В тази статия ние Нека да проучим структурата на походова стратегия(и също стратегия в реално време- още по-лесно е да го направите с LKI-Creator) и ще направим игра като пример, предназначена обаче само за мулти-потребителрежим (и също редактор на картиза нея). С режима за един играч ще се занимаваме в следващия брой на рубриката ни – посветена на основите на изкуствения интелект.

Тъй като това е вече третият урок, няма да навлизаме в подробности всичкопримерен код - за щастие много е направено точно както предишните два пъти. За справка има примерна програма (има много коментари в нея) и предишни статии.

Е, можете да намерите материалите от миналите ни класове на нашия CD, в специално създадения за целта раздел „Игра Направи си сам“.

Формулиране на проблема

Нека напишем стратегическа игра, състояща се от битка между две фантастични армии. Целта на битката е да се заловят няколко обелиски, поставен на картата. Преди битката разгръщаме нашите войски, състоящи се от 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 клетки.

Партито приключва, когато едната страна или превземе повече от половината обелиски, присъстващи на картата, или умре напълно.

Първоначално картата беше зададена в редактора на карти. Има обелиски, дракони и препятствия (обекти, през които не можете да се движите или атакувате).

Подготовка за работа

Преди да започнем, ще трябва да преинсталираме пакета LKI-Създател. Факт е, че в сравнение с последния път в него са направени много промени и допълнения.

(Надявам се, че Делфивече сте инсталирали; ако не, прочетете препоръки по тази тема в предишната ни статия - в юнския брой на списанието или на компактдиска на този брой или на уебсайта.)

Важно е:предишната версия на LKI-Creator имаше някои проблеми със съвместимостта с новите версии на Delphi. В тази версия те са елиминирани.

Вземете файла с програмни текстове и снимки от нашия компактдиск (раздел „Игра със собствените си ръце“) и го разархивирайте в директорията на проекта.

Сега можете да изтеглите необходимите файлове оттук .

Трябва да имаме три поддиректории. One - Units - съхранява DirectX библиотеки и модули на пакета LKI-Creator. В друга - Проект - ще работим; Картинките, които ще ни трябват и предишната версия на нашата аркадна игра са поставени там предварително. В третата - Escort - готова програма, която трябва да успеем.

Сега нека инсталираме (преинсталираме) LKI-Creator. В менюто на Delphi отворете елемента Component и изберете Install Component. Ако вече сте инсталирали този пакет, останете в раздела В съществуващ пакет, в противен случай отидете в раздела В нов пакет и попълнете празните редове, както е показано на фигурата (в горния ред най-лесният начин е да изберете LKI2dEngine. pas файл с помощта на бутона Преглед и в долната част просто запишете LKI). След това щракнете върху OK и изберете Инсталиране. Сега трябва да видите раздела LKI в горния панел на Delphi.

Сега остава само да качим нашия проект. В менюто Файл изберете Отваряне, отворете файла Project\Obelisk.dpr…

Къде е картата, Били? Имаме нужда от карта!

Въпреки това, преди да навлезем в големите неща, ще трябва да поработим още малко върху графичния двигател.

В Star Escort, предишния ни проект, „картата“ нямаше значение: звездите бяха поставени на случаен принцип и не засягаха нищо, а позицията на други обекти беше или посочена директно в кода, или определена случайно. Това не е подходящо за всеки проект. Това означава, че е време да добавим към нашия двигател карта на района.

Вероятно вече се досещате как ще изглежда - поставяме обект на карта в прозореца на проекта и след това го регистрираме в собствеността Картанашия двигател.

Така е... но имаме повече от един клас карти. Нека да разгледаме по-отблизо...

Видове карти

Картата се състои от нещо пейзажИ обектиинсталиран на него. Пейзажът най-често (но не винаги) е разделен на клетки, наречени плочки- плочки.

Както знаем от училищен курс по геометрия, една равнина може да бъде покрита без пропуски или припокривания с правилни многоъгълници от три вида: триъгълник (равностранен), квадрат, шестоъгълник. Триъгълните полета не са особено удобни, така че по-често се използват квадратни клетки или шестоъгълници.

В известен смисъл животът с квадрати е по-лесен: ако имаме двуизмерен масив от клетки, веднага е ясно как да намерим клетките, съседни на дадена клетка. Това са +1 и -1 за всеки от двата индекса. С шестоъгълниците всичко е малко по-сложно... но шестоъгълната дъска има много ценно свойство: всички посоки в нея са еднакви. Това не е така при квадратната мрежа: диагоналите се различават значително от хоризонталите и вертикалите. Следователно за сериозни стратегически изчисления шестоъгълниците може да са по-добри от квадратите.

Има и карти без плочки. LKI-Creator поддържа два типа: графика и пачуърк.

Графична карта е карта, на която само няколко ключови точки имат значение, плюс може би специални зони (например непроходими), а останалото е просто модел, който няма ефект на играта. Ето как често се правят звездни карти, както, да речем, в Master of Orion: звездите и черните дупки са ключови точки, останалото е фон. В този режим понякога правят глобални карти, например за ролева игра.

Пачуърк картата е разделена на зони, а вътре в зоната всички точки не могат да се движат по „пачуърка“. Това е добре за глобални стратегии, където една провинция е минималната единица територия.

Примерни карти от различни игри с указание на вида са на снимките.

Така че мнозинството двуизмеренкартите (триизмерни - специална статия) могат да бъдат разделени на четири класа:

  • Правоъгълна- TLKIRectMap. Това е карта с плочки, клетките са квадрати. Такава карта, например, в Civilization III.
  • Шестоъгълна- TLKIHexMap. Карта с плочки с шестоъгълни клетки. Използва се в много военни игри и не само: това е, например, как традиционно се прави бойната карта на Heroes of Might & Magic.

    Тези два вида карти са потомци на общия клас TLKITileMap.

  • Графовая- TLKGraphMap. Тази карта има фон (свойство на фона)и ключовите точки, подчертани в него, са статични обекти. Позицията на други обекти на тази карта се изразява или чрез обикновени координати (като космически кораб в междузвездното пространство), или чрез препратка към обект (същият кораб в орбита на планета). Това са картите Master of Orion, Arcanum (глобален) и т.н.
  • Пачуърк- TLKIClusterMap. Той има фоново свойство, като това на графиката, и второ свойство - маска, който определя коя точка към кой регион принадлежи и собствеността Граници, който определя връзките между „шредовете“. Ето как са подредени картите например в Medieval: Total War или Victoria.

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

Ъгли на наклон

Но ако мислите, че това изчерпва възможностите на LKI-Creator за показване на карти, тогава много грешите.

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

Обикновено изометрията се използва за подредени карти, докато графичните карти се използват с изглед отгоре, тъй като мащабът на графичните карти обикновено е по-малък. Но има и изключения: например в Medieval: Total War има пачуърк изометрична карта.

Свойството map е отговорно за изометричността Изометричнои два параметъра, които задават ъгъла, под който гледа нашата камера: ФиИ Тета.

Първият е отговорен за въртенето на картата спрямо вертикалната ос: например, ако я настроите на 45 градуса (измерва се в градуси), тогава клетката с правоъгълна мрежа ще бъде ориентирана с ъгъл нагоре, както в Civilization . При Phi=0 една от страните на клетката ще бъде хоризонтална.

Вторият контролира наклона на камерата спрямо вертикалата. За удобство се дава като отношение на хоризонталните и вертикалните единици за дължина. Да кажем, че ако искаме нашата клетка да бъде начертана във височина наполовина по-широка, отколкото е в ширина, трябва да зададем Theta на 2.

С карта с плочки не ни е позволено да избираме тези ъгли произволно: в крайна сметка (все още) нямаме 3D. Те пряко зависят от параметрите на плочките. Например, ако имаме ромбовидна ос с ъгъл нагоре, а вертикалната ос е половината от размера на хоризонталната ос, тогава трябва да зададем параметрите 45 и 2.

Но графичните и пачуърк картите ви дават правото да задавате тези параметри, както желаете (и дори, ако желаете, да ги променяте в процеса), но не трябва да се увличате с това - в допълнение към факта, че такива завои отнемат много време, те също не изглеждат много готино. И не забравяйте, че ако вашата карта е артистична, с картинки, надписи и т.н., тогава те ще се обърнат с нея... Като цяло понякога е по-лесно да нарисувате пачуърк карта, като вземете предвид необходимото въртене - за щастие, разстояния често не играят никаква роля там.

Стави

Пачуърк карта, изглед отгоре.

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

Но има по-хитра опция, когато еднакви плочки са съседни една на друга без промени, а различни се използват с помощта на специална „преходна“ плочка. Това обикновено се прави, ако картата се състои предимно от широки пространства от един тип територия, да речем, големи зелени площи, и отделна клетка не е важна и не трябва да се забелязва от играча. Това е картата Heroes of Might Magic. Но ако всяка клетка се обработва отделно, както в Civilization, тогава този метод не е подходящ и е по-добре ясно да се разделят клетките една от друга. „Стопена“ технология (наричана още маска) се определя от стойността на TileBorderStyle, равна на tileMasked. За тяхното устройство ще говорим друг път - това е доста сложна тема.

Плочка

Елемент на карта - обект на клас TLKITile- има проста структура. Първоначално съдържа: координати, спрайта, който го рисува, кода на типа плочка (който определя какво имаме тук - хълм, пустиня, път, море?) и способност за крос-кънтри (това е от значение в повечето игри). Последният е броят единици за движение, изразходвани за движение през тази плочка земяотряд. За непроходими плочки това е отрицателно число.

Друг параметър - Обекти, списък с обекти, разположени на тази плочка (тип TLKIGameObject).

За да разберете върху коя клетка е щракнато, картата има метод MouseTile(x,y) връща избраната плочка.

Методите за плочки включват IsNeighbour(плочка, разстояние). Тази функция връща true, ако плочката е не повече от клетките на разстоянието от дадената плочка (по подразбиране този параметър е равен на единица, т.е. ако просто напишете IsNeighbour(Tile), функцията ще върне true за непосредствено съседната плочка към дадената плочка За квадратни мрежи тези плочки, които граничат по диагонал, също се считат за „съседи“.

Функции Първи съседИ NextNeighborсе използват за проверка на всички клетки, съседни на дадена. Първият от тях сочи към съседна клетка, а вторият може да бъде извикан само след извикване на първия и дава следващите съседи един по един.

Изброяване на съседи

// Причиняване на увреждане на клетка

процедура TObeliskTile.Damage(dmg: цяло число);

ако(Objects.Count > 0) и// Може да имаме

// не повече от един обект на клетка

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

// не е повреден

Dec(Обекти.Хитове,

// Автоматично изваждане на защита от щети

Max(0,dmg-(Обекти като TObeliskGameObject).Защита);

ако Objects.Hitsthen Die; // Премахваме мъртвите

// Атака с огнена топка

процедура TObeliskTile.Fireball;

варСъсед: TObeliskTile;

Neighbor:= Първи съсед като TObeliskTile;

Neighbor.Damage(6);

Neighbor:= NextNeighbour като TObeliskTile;

доСъсед = нула; // Докато свършат съседите

Пример е в страничната лента „Изброяване на съседи“. Тази процедура изчислява огненото кълбо, удрящо клетка и всички нейни съседи.

Това е интересно: за нейната работа няма никакво значение, имаме шестоъгълна решетка или квадратна.

Често се нуждаем от някои други параметри и обикновено класът от плочки, които изграждат картата, е - потомък TLKITile. Така че в примера - TObeliskTile е наследен от TLKITile.

Важно е:Ако изведем карта с плочки на нашия екран на играта, координатите, както и методите TLKIGameObject, свързани с разстоянието, по подразбиране започват да измерват разстоянието в плочки, а не в точки. Координатите на бутони, икони и др. продължават да се измерват в пиксели! Но този режим може да бъде изключен - това може да бъде полезно за стратегии в реално време.

Избор на карта

И така, нека започнем с правоъгълна решетка (TLKIRectMap), изометрично картографиране (ъглови параметри 0, 1.5). Нека решетката бъде начертана (стил tileBorder). Нека кажем на двигателя, че тази конкретна карта трябва да бъде показана. Досега всички необходими действия са извършени без писане на нито един ред код.

Тези операции трябва да се направят предиинициализация на двигателя, както и декларация на шрифта.

Ще декларираме фигурите, както преди, като спрайтове.

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

Пачуърк карта, изометрична.

Тук има доста трудности. Абсолютно същият двигател, същите декларации за плочки... Интерфейсът, като избиране на плочка, зареждане/запазване и т.н., може лесно да се направи с помощта на стандартни инструменти на Delphi: никой не ни кара да го превключваме в режим на цял екран. Тук няма да анализираме това - всичко е в примерния файл. Примерният код умишлено използва най-простия метод; Ако желаете, можете например да направите палитрата с обекти и палитрата с плочки графични.

Редакторът има само две функции, които не са ни познати. Първият е доста прост: това е нова функция на мишката, създадена специално за карти с плочки. функция TLKIRectMap.SelectTileвръща указател към точната плочка, върху която е щракнато, за да можем лесно да се справим с щракването.

Но вторият нов продукт заслужава по-внимателно разглеждане.

Всъщност има много начини за запазване на данни във файл и четене на данни от него. Избрахме метода, кодиран във файла CannonBase. Cannon е инструмент за четене и писане на наследствени обекти TCannonObjectс проверка на типа и някои други функции.

Нека да разгледаме кода („Напиши карта“).

Вписване на карта

процедура TObeliskMap.Save;

вар i,j: цяло число;

InitSave(FName);

WriteStr(Име на карта);

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

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

за i:=0 да сеКарта. Ширина-1 направи

за j:=0 да сеКарта.Височина-1 направи

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

Ето как работи. Първо трябва да отворите файла, като използвате специална процедура InitSave, чийто единствен параметър е името на файла. След това запазваме заглавката за контрол на типа, като използваме специална процедура WriteHeader. След това записваме всичко необходимо, използвайки процедурата WriteStrза низове и за всички други полета - Пишете(вторият му параметър е размерът на записаните данни в байтове). Можете да напишете свои собствени процедури за обектни полета, ако е необходимо Запазванесъс заглавен запис. Накрая затваряме файла с процедурата FinSave.

Всички обекти, които имат собствен хедър, трябва да бъдат декларирани отделно. В глава Инициализациямодул (незадължителен раздел, който идва след Внедряване, който съдържа команди, които трябва да бъдат изпълнени в самото начало, при стартиране на програмата), трябва да напишете следния ред, например:

RegisterUserName(tpMap, "TObeliskMap");

TpMapе константа, която също трябва да декларирате. Приравнете го, да речем, на 1. И в конструктора на обекта TObeliskMap присвоете стойността на тази константа на параметъра TypeID.

Защо цялата тази врява? Освен съвпадение на типове, вие получавате едно много важно предимство.

Ако файловият формат се промени, да речем, поради добавянето на нови полета, няма да е необходимо да пишете „конвертори“, които преобразуват старите файлове в нови. Вашият код автоматично ще ги прочете.

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

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

Хайде да играем

На първо място, трябва да създадем нов клас, извлечен от TLKIGameObject. Ще ни липсват свойствата на стария. В новия клас трябва да добавите полета за основните характеристики: обхват, движение и т.н.

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

На нашия екран ще приложим бутони TLKIButton под формата на стрелци, мечоносци, магьосници, призраци, рицари.

Първо имаме подредбата. Нека дефинираме зоната на разположение за едната страна като горните три „линии“ на картата, за другата - като долните три „линии“.

Кодът работи по следния начин. При натискане на някой от бутоните се активира инсталацията на съответния боец; Щракването върху незаето квадратче в областта за поставяне поставя фигурата там и деактивира бутона. Веднага след като всички бутони са деактивирани, ходът се прехвърля на врага.

В началото на всеки нов ход всички бутони се включват отново: това се прави, за да е по-лесно човек да забележи на кого още не е приличал. Съответно, щракването върху бутона избира фигурата и веднага щом бъде направен ход, бутонът изчезва. Друг бутон - „Краен ход“ - се появява само след фазата на поставяне.

Последният път вече направихме операции за активиране и деактивиране на интерфейсни елементи, така че няма да анализираме подробно тази операция - вижте примерния код.

Ход на фигура

// Ако избраната клетка е заета от врага, ние атакуваме,

// ако е свободно, ние се движим, ако сме заети със собствените си

// или препятствие - игнорирайте щракването

Плочка:= Map.MouseTile(MouseX, MouseY);

ако(Плочка = нула)// Кликнете извън прозореца на играта

тогаваизход;

// Движещ се

ако(Tile.Objects.Count = 0)

и(Dist(Self)

и неПреместен тогава

// Да проверим дали можем да стигнем до там

ако не HasWay (плочка) тогаваизход;

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

// Играта е походова - движете се веднага

Преместено:= вярно;

//

акоНападнат тогава

Icon.IsVisible:= невярно;

// Атака

ако(Tile.Objects.Count > 0)

и(Dist(Self)

и неНападнат тогава

Obj:= Tile.Objects;

// Нападаме само врагове

ако Obj.Side = Страна тогаваизход;

Obj.Damage(dmg);

Атакувано:= вярно;

// Ако преместването е завършено, премахнете иконата

акоПреместен тогава

Icon.IsVisible:= невярно;

Ходът се обработва по следния начин (вижте „Ход на фигура“). Щракнатата клетка се намира. Ако има враг върху него и той е в обсега, той е наранен; ако е празен и в обсега, фигурата се движи (ако препятствията го позволяват); ако е заето, но не от враг, щракането се игнорира .

Когато и двете страни се приближиха, драконите действаха. Те действат много просто: те избират най-близкия не-дракон, който е в рамките на 7 квадрата от тях и атакуват. Вижте кода на Dragon Actions.

Драконови действия

// Проверка на плочки в рамките на 7 квадрата от дракона

за i:= Max(0, x - 7) да сеМин. (максимален размер, x + 7) направи

за j:= Макс (0, y - 7) да сеМин. (максимален размер, y + 7) направи

ако (Map.Tiles.Objects.Count > 0) и

(Map.Tiles.Objects.Code>1)

// 0 - код за препятствия, 1 - дракон

тогава започвам

// Избор на точка за преместване

ако x=i тогавабрадва:=i

другоако x>i тогавабрадва:=i+2

другобрадва:= i-2;

ако y=j тогава ay:=j

другоако y>j тогава ay:= j+2

друго ay:= j-2;

MoveObj(NO, ax, ay);

// Да атакуваме

Map.Tiles.Damage(12);

// Прекъсване на цикъла: не повече от една атака

// всеки дракон на рунд

Накрая остава само да проверите дали повече от половината обелиски са заети от войски на едната страна - и ако са, тогава спрете играта и обявете победител!


И така, имаме стратегическа игра. Въпреки това, за пълно щастие, това, което липсва, на първо място, е изкуственият интелект, който ще позволи на играта да има режим за един играч (не разглеждаме най-простата процедура за контролиране на дракони). Това ще направим следващия път. Ще се видим след месец!

В следващите броеве

В следващите броеве ще говорим за:

  • системи за частици за показване на дим, искри и др.;
  • работа с прозрачност;
  • триизмерни двигатели;
  • основи на AI;
  • отстраняване на грешки в програмата;
  • създаване на план за игра и скрипт,
  • писане на проектен документ;
  • игрови баланс;
  • мислене чрез игрови герои и техните реплики;
  • работа с Photoshop и 3D пакети;
  • анимации;
  • музика и озвучаване;
  • и още много.

Напълно възможно е да научите как да направите всичко това със собствените си ръце. Скоро ще видите това.

Пишете ни…

За тези, които смятат, че пакетът може да бъде допълнен с нещо: първо, не забравяйте, че на нашия диск днес все още няма окончателната версия на пакета, а само тази, която изпълнява функциите, описани в нашите статии. Може би някои от вашите идеи вече са реализирани и чакат своя ред (вижте страничната лента „В бъдещи издания“). И във всеки случай: когато ни предлагате идея, опитайте се да обосновете защо вашето предложение е полезно за много игри наведнъж, а не само за вашата конкретна.

За самостоятелна работа

Докато чакате следващия брой, можете да работите върху свой собствен проект или да се опитате да подобрите този. Ето няколко идеи за ваша собствена реализация:

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

Ами ако в реално време?

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

  • не е необходимо поле Скорост на игратав класа TObeliskObject- използвайте Speed ​​​​от основния двигател (скоростта на движение по екрана е равна на скоростта на играта);
  • целочисленото изчисляване на разстоянията е деактивирано;
  • кодът за движение на фигурата се пренаписва, като се вземе предвид фактът, че е необходимо да се начертае траектория около препятствията;
  • Премахва се бутонът "край на хода".

Това е всичко. Ще се опитате ли да го направите сами?

Смятам вашата компания за една от най-силните на пазара на консултантски услуги у нас. Харесва ми, че засягаш широк спектър от управленски проблеми и ги покриваш достатъчно качествено и задълбочено.Намирам много полезна информация в публикациите на вашата компания, защото винаги е интересно да се запознаете с опита на професионалистите и да се поучите от тях.

Борисюк Юрий Александрович, консултант по управление, доктор на техническите науки

Много харесвам поредицата от майсторски класове, които преподавате.Лично аз, след като преди това бях ръководител на завод, започнах да променям подхода си към управлението, вкл. благодарение на информацията, получена от вас. Тя по някакъв начин реагира на това, което направих и наблюдавах във фабриката. Оттогава започнах да мисля колко неефективни са индустриалните възможности на Русия и колко огромен е потенциалът и как може да се реализира това. След като лично се запознах с проблемите на различни предприятия (понякога приятели ме канят като експерт), виждам колко много може да се направи, как да се повиши ефективността и ефективността.

Дрягин Олег Борисович

Да, харесвам вашите майсторски класове,много систематичен подход, познаване на материала на високо ниво и, разбира се, много практически опит по въпросите, които се разглеждат. Това, което ме привлича е, чеПрофесионализмът на Александър и високото ниво на професионални познания по темата ми позволяват да погледна по различен начин на вече познатите неща. От моя гледна точка това еМного е важно и необходимо да погледнете по нов начин на нещата, които познавате, защото... По време на хирургическа работа много често окото се „замъглява“ и вие спирате да виждате всъщност очевидни неща.

Елена Федаш, HR директор, ATB Corporation, Днепропетровск.

В тази статия едва ли ще засегна нещо непознато. Всички изчисления са прости и разбираеми за всеки, който знае какво е Ajax. Вече написах статия за това как да комбинирам клиент със сървър в игри в реално време (). В тази статия разглеждам същите проблеми, които се отнасят за походовите игри.

И така, какво е походова игра? В Wikipedia можете да намерите следното определение походова стратегия - е жанр компютърни игри, чиято основна характеристика е, че играчите се редуват да правят ходове, за разлика от стратегията в реално време. Бих опростил малко това определение:

  • Стратегия стъпка по стъпка - е походова стратегическа игра.
  • Стратегическа игра - Това е жанр игри, в които ключът към постигането на победа е планирането и стратегическото мислене..
  • Походова игра - е жанр от игри, чиято основна характеристика е, че играчите се редуват да правят ходове.
Походовите игри включват:
  • Походови стратегии
  • Игри на карти
  • Настолни игри (шах, го, монопол и др.)
Отбелязвам, че походовите игри налагат по-малко ограничения върху сложността на протокола за взаимодействие в сравнение с игрите в реално време. а именно времето за реакция на конкретно събитие не играе ключова роля. На играча обикновено се дават 10 секунди, за да вземе решение. Дори ако пингът е гигантски, да речем 3 секунди, тогава играчът все още има 7 секунди за размисъл. Освен това пингът може да скача и скача, но това изобщо не ни интересува (в игрите в реално време тази ситуация практически убива всеки протокол).

Обикновено (в 95% от походовите игри) точно един играч взема решението във всеки един момент. Следователно броят на исканията, на които трябва да отговорим адекватно, се стеснява.

Ето защо, когато създаваме протокол, ще се фокусираме предимно върху лекотата на неговото внедряване и поддръжка. Това ще ни позволи да реализираме повече печалба за по-кратко време.

Горното разсъждение се основава на 2-месечното развитие на определена игра с карти.

Умен или глупав клиент?

Първо, нека решим колко „умен“ може да бъде нашият клиент. Обсъждам дали си струва да дублирам логиката на приложението (правилата на играта) на клиента. Разбира се, сървърът трябва да е интелигентен, за да предотврати потенциално хакване на приложението. Но струва ли си да преподавате бизнес логика на клиента?

Това пряко зависи от това колко тежи пълното количество данни за състоянието на вашата игра. Ако това количество данни е голямо, отнема много време за събиране на сървъра и се прехвърля към клиента, тогава има смисъл да внедрите част от логиката на клиента, за да разтоварите сървъра. Например в Civilization индикаторът за използваната памет винаги е извън класациите. Можете ли да създадете нещо подобно, като оставите само потребителския интерфейс на клиента?

От друга страна, колкото по-умен е клиентът, толкова по-скъпа ще бъде разработката на играта. Нека отбележа, че времето за разработка на сървъра не зависи по никакъв начин от ерудицията на клиента. Дори ако клиентът е супер-дупер-мега умен, ако потребителят иска да презареди прозореца на браузъра, сървърът ще трябва да събере и събере всички данни за играта, за да ги прехвърли на клиента. А ла „Зареждане на запазена игра“. Заключение: Интелигентният клиент може да ускори приложение, но винаги ще изисква допълнителни ресурси за разработване на приложението.

Предлагам следното тест:

1. Обемът на канала позволява ли?

Оценете средното тегло на пълното количество данни за състоянието на играта. След това умножете по средния брой заявки към сървъра за секунда. Ако полученото число надвишава капацитета на канала за изходящи данни, тогава глупавият клиент е неприемлив. Ако този брой надвишава 20% от изходящия канал, тогава трябва да помислите дали ще работи?

2. Трудоемко ли е?

Оценете сложността на алгоритъма за събиране на данни за играта (за части от секундата). Тук вземете предвид всички заявки към базата данни. След това умножете по средния брой заявки към сървъра за секунда. Ако времето надвишава една секунда, тогава глупав клиент е неприемлив. Ако това число надвишава 200 ms, тогава трябва да помислите дали ще издържи?

Продължение:

В днешно време можете лесно да намерите много стратегии за търговия, единственият проблем е, че повечето от тях или не работят, или не са достатъчно ефективни. В такава ситуация създаването на стратегия от нулата е отлично решение на проблема.

И въпреки че във всяка конкретна ситуация създаването на превозно средство ще бъде различно, основните етапи остават същите. Тоест, можете да създадете нещо като универсално ръководство, последователно преминавайки през всички етапи и накрая ще получим напълно работеща система.

Въпреки че ще разгледаме варианта за създаване на стратегия от нулата, започвайки с идея и завършвайки с въвеждането на филтър и окончателното развитие на автомобила, това не означава, че всички готови системи трябва да бъдат незабавно изхвърлени като очевидно неефективни . Няколко TS могат да се използват като основа и просто да се добавят няколко филтъра, за да се отсеят фалшивите сигнали.

Основни етапи на създаване на стратегия

Ако вземете произволно 5-7 индикатора и се опитате да създадете работещо превозно средство от тях, тогава е малко вероятно да излезе нещо полезно. Първо трябва да обмислите основната идея на стратегията и едва след това да преминете към избора на инструменти. Може да се предложи следната последователност от действия:

  • ако системата е създадена от нулата, тогава първата стъпка е да се работи върху идеята. На този етап просто трябва да решите какъв ще бъде вашият стил на търговия, например дали транзакциите ще се извършват по тенденцията или срещу нея, или може би стратегията е планирана изключително за пробив. Все още не мислим за конкретни неща;
  • След като изберете подходящия стил на търговия, можете да започнете да изяснявате детайлите. Преди да изберете инструменти, трябва ясно да определите работещите валутни двойки и времеви рамки, време за търговия и т.н.;

важно! Когато избирате времева рамка, не е препоръчително да отивате твърде малка, особено ако търговецът няма опит в спекулациите на малки времеви интервали. За начинаещи е по-добре да не слизате под H1-H4, можете да прочетете повече за избора на оптимален интервал от време.

  • следващият етап е изборът на подходящи инструменти и тук изобилието от избор може да изиграе лоша шега на търговеца, защото той има на разположение десетки индикатори, възможността да използва свещник, вълна, технически и фундаментален анализ. От цялото това разнообразие трябва да изберете няколко инструмента, които най-добре отговарят на желания от вас стил на търговия;
  • Едно от основните правила на всяка стратегия е, че полученият сигнал трябва да бъде потвърден от няколко филтъра, но е препоръчително да ограничите броя им. Например, за индикаторните стратегии е нежелателно броят на индикаторите да надвишава 3-4, в противен случай ще има объркване в сигналите и ако планирате да работите с технически анализ, тогава индикаторите ще играят спомагателна роля;
  • разработени са правила за поддържане на позицията, резултатът трябва да бъде алгоритъм от действия за всеки сценарий;
  • последният етап е да стартирате превозното средство първо на сметка с история, а след това на демо сметка, или още по-добре, на реална центова сметка. Основната цел е да се тества жизнеспособността на стратегията в реални условия, а реална сметка (дори цент) ще ви позволи да почувствате цялата гама от емоции, от еуфория до горчивината на загубите.

Можете също така да посъветвате да не се закачате за сложността на превозното средство. Практиката показва, че прекомерната сложност изобщо не е показател за ефективност. Колкото по-опростена е системата, толкова по-лесна е търговията.

Какво трябва да бъде включено в автомобила

Създаването на стратегия е малко като строителен комплект; просто трябва да изберете правилните части. Когато създавате превозно средство, можете и трябва да използвате:

  • показатели. Освен това не трябва да преследвате нито техния брой, нито прекомерната сложност дори в напълно механични превозни средства, достатъчни са 3-5 броя;
  • графични модели - добре познати знамена, знамена, триъгълници, глава и рамене, двойно дъно и върхове все още работят добре;
  • графични конструкции;
  • Фибо нива;
  • елементи на фундаментален анализ - сега е трудно да се правят пари само от новини, но е необходимо да се вземе предвид икономическият календар в търговията. Поне просто преместете транзакциите на рентабилност преди публикуването на важна статистика за САЩ или Европа или дори напълно затворете печалбата.

Съществуват и редица техники, чиито ползи са съмнителни:

  • Мартингейл е първоначално непечеливша тактика, единственият шанс за успех е, че преди загубата ще можете да върнете сумата на депозита и да спечелите малко;

  • Също така е нежелателно да се използва заключване, освен ако не е абсолютно необходимо; тогава е доста трудно да напуснете замъка;
  • Също така е по-добре да не използвате сигнали отвън. Сигналите отвън означават, например, сравнение на броя продавачи/купувачи, различни индекси на настроението на повечето търговци и т.н. Но има и редица ресурси, които можете да слушате, например Autochartist дава добри сигнали въз основа на графични модели;
  • Също така е по-добре да не използвате елементи на вълнов анализ (поне за начинаещи). Въпреки че тук има изключения, например търговията на Wolfe Waves се основава именно на вълнов анализ, но не е особено сложна.

Разработване на проста индикаторна стратегия

Да приемем, че основната идея на стратегията е да се търгува изключително в посока на тенденцията. Освен това ще влезете на пазара не в момента на появата на тенденция, което е доста рисковано, а след завършване на малка корекция.

Стратегията трябва да работи на почти всяка валутна двойка; това е необходимо, защото поради голямата времева рамка сигналите няма да се появяват много често. Така че ситуацията ще бъде оценена едновременно с помощта на 5-7 валутни двойки. Що се отнася до времевата рамка, D1 е подходяща; ние изхождаме от факта, че Forex в началния етап е само допълнение към основната работа, следователно ще търгуваме на ежедневни свещи.

Сега трябва да решите как точно ще се определи моментът за влизане. Има много опции за идентифициране на тенденция:

  • визуално - но оценката на очите няма да ви позволи да разработите ясни правила за търговия;
  • използване на една или повече подвижни средни;
  • според стойността на индикатора ADX, ако е повече от 30, тогава има силна тенденция, по-малко от 20, пазарът е спокоен;
  • използване на графични конструкции;
  • Bollinger Bands ви позволява да прецените силата на тренда по разстоянието между горната и долната граница на канала.

Като цяло има много опции, но тъй като стратегията трябва да бъде възможно най-проста, ще се съсредоточим върху подвижните средни. Или по-скоро една MA, ще съдим за посоката на тренда по позицията на цената спрямо нея. Можете да започнете с периоди, които осредняват цената за цял период от време (седмица, месец, тримесечие и т.н.), например 20 ще осредни цената за последния месец. Най-трудното нещо е да изберете подходящия период на MA, но тук ще трябва да продължите по принцип проба-грешка.

Основната идея на търговията ще бъде следната: изчакваме да се появи движението на тренда, след това следва корекция в рамките на един ден, след края й се сключва сделка. Ако всичко това е представено под формата на ясни правила, тогава алгоритъмът на действията ще изглежда така (използвайки примера за покупки):

  • първо проверяваме ценовата позиция спрямо MA, цената трябва да е над линията;
  • След това трябва да намерим движение на тренда, имаме нужда от свещ с голямо тяло и малки сенки (препоръчително е стойността на сянката да не надвишава 10-15% от размера на тялото на свещта);
  • тя трябва да бъде последвана от свещ с малък дневен диапазон (разстояние от High до Close). Цената на затваряне не трябва да достига ниво от 50% от предходния ден - в този ден се извършва корекция на цената.

В този случай корекцията може да се извърши според 2 сценария:

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

Що се отнася до поддържане на позиция и защитни поръчки, стоп загубата трябва да бъде поставена поне отвъд средата на свещта с голямо тяло. За да получите целевото ниво, достатъчно е да отделите стойността на същата свещ от нивото на покупка, можете да използвате плаващ стоп.

Правилата на стратегията са формирани, остава само да се тества в действие. Практиката показва, че дори такъв прост алгоритъм произвежда повече от половината печеливши сделки (и ако прехвърлите сделката на нула по-рано, вероятността от загуба намалява).

Влизане в началото на тренда

TS, предложен по-горе, пропуска част от движението на тренда, но не изисква много време за анализ на пазара. Ако е възможно да проследите поведението на цената за деня, тогава можете да опитате да яздите тенденцията в самото начало на нейното формиране. Така че основната идея на стратегията е да влезете на пазара, след като цената започне да напуска хоризонталния канал.

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

Това не е революционен подход; Бил Уилямс използва нещо подобно в своя прочут Алигатор. Така че този показател дори може да се вземе като основа на TS.

Ако добавим Alligator със стандартни настройки към H1, виждаме, че той дава много фалшиви сигнали; нашата задача е да ги отсеем. За да направим това, ще влезем на пазара с чакаща поръчка и нивото на нейното поставяне ще се определи с помощта на фрактали.

В резултат на това работният процес ще изглежда така (използвайки примера за покупки):

  • Търсим плоска област на графиката (всички линии на алигатора са хаотично преплетени една с друга);
  • След това имате нужда от фрактална свещ (и тя трябва да бъде разположена над линиите, без дори да ги докосвате с долната сянка);
  • стоп поръчка за покупка се поставя точно над нейния максимум, а защитна поръчка се поставя отвъд долната граница на зоната на консолидация;
  • TP е или фиксиран (50-70 p), или използвайте плаващ стоп. Като цяло е доста трудно да се предскаже силата на движението на тенденцията, така че е по-добре да използвате плаващ стоп, отколкото фиксиран TP или да определите целевото ниво, като използвате същия технически анализ.

Този пример не е разработване на стратегия от нулата, а по-скоро лека адаптация на вече позната стратегия към съвременния пазар.

Пример за проста комбинирана система

Идеята остава същата - влизане в края на корекцията, но ще решим този проблем по друг начин. Целта остава същата - да определим момента на завършване на корекцията и да влезем в посоката на тенденцията, но ако по-рано използвахме подвижната средна, сега ще използваме нивата на Фибо и осцилатора, за да определим завършването на връщането назад.

Ще се интересуваме от ясно изразено движение на тенденцията, което може да се определи и визуално. След това просто трябва да разтегнете нивата на Фибо към него, това е необходимо, за да определите потенциалните нива за завършване на корекцията. Най-значимото ниво на корекция е 38,2% е позволено да се търгува при отскоци от 50% и 61,8%.

Но фактът, че цената докосва нивото на Фибо, не е достатъчно потвърждение; Stochastic може да се справи доста добре с тази задача (можете да опитате да използвате RSI за същата цел). Например, за транзакция за покупка, цената трябва да е близо до нивото на корекция, а Stochastic по това време трябва да е в зоната на свръхпродаденост.

След като цената докосне нивото, ние изчакваме, докато Stochastic напусне зоната на свръхпродаденост и купуваме. Стопът може да бъде поставен отвъд следващото ниво на корекция, а TP може да бъде поставен поне на скорошния връх преди началото на оттеглянето.

Фибо нивата и осцилаторът са само минимумът, необходим за получаване на сигнал. Ако желаете, можете да усложните системата, като въведете допълнителни филтри.

Стратегии, базирани на технически анализ

Ако техническият анализ се използва в неговата чиста форма, тогава задачата става малко по-проста; вече не е необходимо да се разработва превозно средство от нулата. Има редица техники и инструменти, чиято ефективност е проверена през годините, а търговецът може само да избере подходящите и да ги използва в конструкции.
По принцип за успешна търговия е достатъчно:

  • трендови линии - изграждаме ги на различни времеви рамки, започвайки от най-високата и постепенно слизайки към работната;
  • Фибо нива, те трябва да бъдат разтегнати до значителни ценови движения в историята. Нивата на корекция от 38.2, 50 и 61.8% ще бъдат от ключово значение, практиката показва, че корекцията най-често завършва на тези точки;
  • MT4 също така прилага редица други инструменти за технически анализ, например вили Andrews, набор от инструменти на Gann, няколко вида канали и др.

Но за сравнително точна прогноза нивата на Фибо и трендовите линии са достатъчни; областите на концентрации на нива и линии обикновено действат като подкрепа/съпротива. Търговията може да се извършва както за пробив, така и за отскок от нива и линии.

Що се отнася до допълнителните филтри, можете да добавите модели на свещници и някакъв индикатор за търсене на отклонения (същият Stochastic или MACD). Можете да прочетете повече за използването на технически анализ.

Филтри за системи за търговия

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

Има редица филтри, които ще отговарят на почти всяка стратегия:

  • ситуация на по-високи времеви рамки. Ако, например, стратегията се изпълнява на H1 според механична стратегия, тогава няма да е излишно да погледнете какво се случва на H4 и D1;
  • среден дневен диапазон, което означава разстоянието, което цената изминава средно на ден при търговия в рамките на деня, това ще помогне за филтрирането на редица сигнали. Нека си представим, че през деня цената се движи средно със 100-120 пипса, ако в един от дните цената до вечерта вече е преминала 90-100 пипса в една посока и TS дава сигнал за влизане на пазара в същата посока, тогава има смисъл да го игнорирате, статистиката казва, че трафикът е малко вероятно да продължи през този ден;

важно! Спазването на това правило ще доведе до факта, че някои печеливши сделки ще бъдат пропуснати, но съотношението печеливши/губещи сделки ще се увеличи.

  • Броят на свещите след формирането на сигнала също има значение, има дори филтър от 5 свещи, на който ще се спрем по-подробно.

Когато TS даде сигнал, тогава в идеалния случай ситуацията трябва да започне да се развива в наша полза почти веднага след приключване на сделката (което означава на следващите 1-3 свещи). Ако това не се случи, тогава колкото повече време е минало от сключването на сделката, толкова по-малко влияние върху пазара ще имат онези фактори, които са имали значение, когато търговецът е влязъл на пазара. Тяхното влияние избледнява с времето.

Можете да вземете 5 свещи като критерий; ако след сключване на сделка цената не се е преместила в печеливша посока за 5 свещи, тогава е по-добре да затворите сделката ръчно. Това означава сценарий, при който графиката остава на мястото си, но ако цената е отишла в нерентабилната страна, тогава този филтър не се прилага.

Това условие важи за почти всички времеви рамки (с изключение на m1-m5). Разбира се, все още има възможност цената, движейки се около една марка, да се движи в правилната посока, но нашият избор е стабилността. По-добре е да пожертвате няколко печеливши сделки, но избягвайте 3-5 непечеливши.

Обобщаване

Започването на работа без система за търговия е като смърт, всеки търговец трябва да помни това. В този случай загубата на депозита е само въпрос на време.

Изборът на подходящо превозно средство не е труден, освен това можете да намерите добри работещи системи в публичното пространство. Можете също така да се притеснявате за създаването на своя собствена стратегия, особено след като това не изисква познаване на езици за програмиране, просто трябва да имате представа и поне основни познания за това как работи пазарът и какви индикатори се използват за какви цели.

Самият процес напомня сглобяването на конструктор - първо поставяме проблем, а след това просто избираме необходимите инструменти за решаването му. След като проверите историята, можете да продължите към TS теста на демо или центова сметка.



 

Може да е полезно да прочетете: