Найти в Дзене

Модернизация торговых Роботов для построения Автоматической Фермы.

Оглавление

Здравствуйте уважаемые Читатели. Сегодня я расскажу как правильно модернизировать торговых Роботов. Но начну, по просьбе читателя, с рассказа о еще одном бесплатном роботе из терминала А-инвестиции, Альфа брокера.

Андрей Ч.
Вы наверняка разбирались со стратегией "Invest_Grid", не могли бы рассказать о ее «Анатомии» также подробно, логика работы, какие коды за что отвечают, переменные в отчете как формируются. Эта стратегия обычно упоминается вскользь, как похожая на StepByStep, а в чем отличие, плюсы, минусы? Я пробовал тестировать разные акции этими двумя роботами и во многих случаях Invest_Grid показывал лучший результат. А размер кода у этой стратегии в 2 раза короче.

Робот " Invest_Grid" по структуре ничем не отличается от Робота "StepByStep_v2", все блоки в этих Роботах одинаковые, но вот концепции заложенные в эти роботы отличаются и отличие в принципе построения уровней, то есть в 4 блоке. Суть отличия в следующем. Робот StepByStep_v2 при резком падении котировки акции (например на дивидендном ГЭПе цена Лукойла снизилась на 5,1%) производит покупку акций указанных в параметре докупки Q, и добавит только один уровень и начинает торговать этот уровень. Если у нас параметр DeltaPrice = 1% то у нас в уровнях образуется "Дырка" в 4%, при закрытии ГЭПа нижний уровень продастся и сразу купится новые Q акций, что уменьшит "Дырку" до 3% и так будет продолжаться пока "Дырка" не закроется и начнут торговаться ранее купленные уровни. То есть весь рост котировок Роботом отработается, но через покупку недостающих уровней.

А Робот Invest_Grid в случае подобного ГЭПа Лукойла (на 5,1%) и при тех же параметрах Робота поступит по другому, он сразу купить все пропущенные 5 уровней. То есть Робот Invest_Grid не не оставит "Дырку" между уровнями, а скрупулезно заполнит уровнями всю просадку цены в нашем примере с ГЭПом Лукойла в 5,1%. Но учитывая то, что акции будут куплены на просадке цены, а уровни будут заполнены с шагом падения 1% ((в нашем примере параметр DeltaPrice = 1%), у нас получается, что на втором уровне разница между ценой покупки и ценой уровня получается 1% (значит доходность получится 2%), а на 5 уровне разница между ценой покупки и ценой уровня 4% (доходность при продаже уровня будет аж 5%).

Получается, что Робот Invest_Grid за счет заполнения уровней без "дырки" доходнее Робота StepByStep_v2 на резких падениях и ГЭПах. Но за это нам придется заплатить большим расходом КЭШа на заполнение уровней.

Вывод. Если ваш портфель находится в стадии накопления с регулярными пополнениями, то есть и КЭШ у вас регулярно пополняется то Робот Invest_Grid даст вам не немного большую доходность, резкие падения на несколько процентов и дивидендные ГЭПы не каждый день происходят. Но если у вас портфель уже сформирован и (или) нет возможности пополнять КЭШ, то лучше использовать Робот StepByStep_v2 который более экономно обращается с КЭШем. Тут выбор только за вами, исходя из ваших финансовых возможностей и планов.

Как правильно модернизировать Робота.

Многих пользователей, которые запустили пробных роботов, напрягает, момент завершения цикла, когда робот останавливается и его приходится перезапускать или запускать нового Робота. Конечно Роботы перезапустятся сами, если после последней продажи цена упадет на процент заданный для закупки. Вот только после обвального падения 2022 года рынок хоть и медленно, с остановками, но растет, по крайней мере мой набор акций. Поэтому самостоятельного перезапуска Робота неизвестно сколько придется ждать, надеюсь можно и не дождаться и акции вернутся к докризисным ценам. Модернизацию Робота для автоматического перезапуска считаю целесообразной. При внесении изменений в Робота советую производить модернизацию по одной функции, тогда если внесенные изменения вам не понравятся вы легко можете откатиться на предыдущего модернизированного Робота.

Пошаговая инструкция модернизации Робота StepByStep_v2 для автоматического перезапуска.

И так приступим.

№1
№1

Открываем "Библиотеку стратегий" выбираем Робота StepByStep_v2 и кликаем мышкой на выделенный красным прямоугольник. Откроется окно создания и внесение изменений в Робота. Переименовываем робота, я заменил цифру 2 на цифру 3. Также советую добавить описание внесенных изменений, Робот может работать у вас годами и вы просто забудете, какие изменения внесли.

№2
№2

Жмем "Next" и переходим в следующее окно.

№3
№3

В данном окне мы видим текст программы (скрипта). Мы можем внести изменение прямо в этом окне, но это неудобно, тем более если изменения большие. Поэтому лучше выделить и скопировать текст программы, и внести изменения в любом текстовом редакторе, достаточно блокнота из Виндовс. Но лучше все же установить бесплатную программу "notepad++", это тоже блокнот но он больше подходит для работы с программами. Мне в нем важна функция, если кликнуть на какое то слово, то это слово выделится по всему тексту, что очень удобно для замены одного параметра другим.

№4
№4

Скопировали текст в блокнот и ищем в тексте "Правило 2.". Именно в него нам нужно внести изменение. Правило в которое вносим изменение выглядит так:

//Правило 2. Если цена упала и кол-во меньше допустимого,
// то покупаем и добавляем цену покупки в начало списка
if (Input1.Close[0] <= MinPrice* (1.0 - 0.01 * DeltaPercent) && pos + Q <= LongLimit )
{
if(activeOrder != null && !activeOrder.IsStatusTerminal)
{
if(activeOrder.OrderDirection != OrderDirection.Buy)
CancelActiveOrders(true);
return;//ждём исполнения уже выставленной заявки
}

EnterLongLimit(MinPrice* (1.0 - 0.01 * (DeltaPercent - OrderSlippage)), Q);
var lastSignal = GetLastSignalInfo();
if(lastSignal != null)
{
lastSignalId = lastSignal.SignalID;
lastSignalProcessed = 0;
}
}

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

//Правило 2. Если цена упала и кол-во меньше допустимого,
// то покупаем и добавляем цену покупки в начало списка
if (Input1.Close[0] <= MinPrice* (1.0 - 0.01 * DeltaPercent) && pos + Q <= LongLimit
|| (xPosition == 0 && inited) )
{
if(activeOrder != null && !activeOrder.IsStatusTerminal)
{
if(activeOrder.OrderDirection != OrderDirection.Buy)
CancelActiveOrders(true);
return;//ждём исполнения уже выставленной заявки
}
// если все распродали покупаем Q
if (xPosition == 0 && inited)
{
EnterLong(Q);
}
else

{
EnterLongLimit(MinPrice* (1.0 - 0.01 * (DeltaPercent - OrderSlippage)),Q);

}
var lastSignal = GetLastSignalInfo();
if(lastSignal != null)
{
lastSignalId = lastSignal.SignalID;
lastSignalProcessed = 0;
}
}

Обратите внимание строчку EnterLongLimit(MinPrice* (1.0 - 0.01 * (DeltaPercent - OrderSlippage)),Q); мы выделяем фигурными скобками, это не обязательно, но так работать будет правильнее. В Правиле 2 важно, что бы все открытые скобки и фигурные и простые были открыты и затем закрыты.

Коротко объясню, что мы изменили. Сверху, к проверке падения цены на заданный для покупке процент, мы добавили проверку что Робот завершил цикл (xPosition == 0) и робот ранее был запущен и отработал цикл (inited). || это логическое ИЛИ, означает, что может быть выполнено или условие проверки на падение цены или завершение цикла. && это логическое И, означает, что тут должно быть одновременно выполнено условие и завершение цикла Роботом и это должен быть не первый запуск Робота. Следующие изменение непосредственно производят маркетную покупку акций для образования уровня.

Внеся все изменения в нашем блокноте, снова копируем измененный текст программы Робота из блокнота и заменяем первоначальный текст робота в окне из которого его копировали на наш измененный текст. Проверяем, что скопировали правильно и жмем кнопку "Компилировать". Если мы все сделали без ошибок то унас должна появиться строчка "скрипт успешно скомпилирован". Как на скриншоте №5.

№5
№5

Далее жмем Кнопку "Сохранить", затем "Next". Открывается окно поздравления.

№6
№6

Жмем кнопку "Завершить" и у нас в диспетчере появляется новый Робот StepByStep_v3. и мы его можем запускать в работу.

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

Модернизация Робота StepByStep_2 для раздельного выставления процентов для докупки и продажи уровней.

Тут нам придется внести изменение в несколько блоков программы Робота. Но общий принцип со скриншотами смотрите выше. Советую для внесения изменений не пропускать пункты переименования нового Робота и добавление описания вносимых изменений.

Сначала нам нужно заменить параметр (строчку)

AddParameter("DeltaPercent", 1, "% изменения цены для докупки и продажи", 0);

на два параметра (две строчки)

AddParameter("DeltaPercentBuy", 2.5, "% изменения цены для докупки", 0);
AddParameter("DeltaPercentSell", 2.5, "% изменения цены для продажи", 0);

Заметьте, в этих строчках стоят сейчас цифры 2,5, это означает изменение на 2,5%. То есть проценты можно указывать не только как целые числа, но и с десятыми и сотыми долями процента.

Затем в блоке индикатора в строке

AddChartIndicator("MY.str_Invest_Grid", new Dictionary <string, string>{{"Price", "MinPrice"},{"PL", "DeltaPercent"},{"Delta", "DeltaPercent"}, {"Type", "Type"}});

меняем параметр DeltaPercent на параметр DeltaPercentSell и параметр DeltaPercentBuy соответственно, у нас должно получится

AddChartIndicator("MY.str_Invest_Grid", new Dictionary <string, string>{{"Price", "MinPrice"}, {"PL", "DeltaPercentSell"}, {"Delta", "DeltaPercentBuy"}, {"Type", "Type"}});

В блоке корректировки уровней в стоке

avp += avpStart * 0.01* DeltaPercent;

меняем параметр DeltaPercent на параметр DeltaPercentBuy

avp += avpStart * 0.01* DeltaPercentBuy;

Далее, в блоке покупки, при падении цены на заданный процент, в строке

if (Input1.Close[0] <= MinPrice* (1.0 - 0.01 * DeltaPercent) && pos + Q <= LongLimit )

меняем параметр DeltaPercent на параметр DeltaPercentBuy

if (Input1.Close[0] <= MinPrice* (1.0 - 0.01 * DeltaPercentBuy) && pos + Q <= LongLimit )

И в том же блоке покупки, при падении цены, меняем в строке

EnterLongLimit(MinPrice* (1.0 - 0.01 * (DeltaPercent - OrderSlippage)), Q);

меняем параметр DeltaPercent на параметр DeltaPercentBuy

EnterLongLimit(MinPrice* (1.0 - 0.01 * (DeltaPercentBuy - OrderSlippage)), Q);

В блоке продажи, при росте цены, в строке

if (Input1.Close[0] >= MinPrice* (1.0 + 0.01 * DeltaPercent) && pos > 0 )

меняем параметр DeltaPercent на параметр DeltaPercentSell

if (Input1.Close[0] >= MinPrice* (1.0 + 0.01 * DeltaPercentSell) && pos > 0 )

И так же в том же блоке продажи, при падении цены в строке

CloseLongLimit(MinPrice* (1.0 + 0.01 * (DeltaPercent - OrderSlippage)), vSell);

меняем параметр DeltaPercent на параметр DeltaPercentSell

CloseLongLimit(MinPrice* (1.0 + 0.01 * (DeltaPercentSell - OrderSlippage)), vSell);

Полученный в итоге откорректированный нами текст программы Робота, копируем и вставляем в "Мастер стратегий" так же как описано в предыдущей главе.

Внимание. После копирования не забудьте нажать кнопку "Скомпилировать" и кнопку "Сохранить" перед тем как нажать кнопку "Next" и перейти к окну завершения создания робота.

Если вы, для внесения изменений, установили блокнот NotePad++. внести все изменения вам будет гораздо проще. Нужно будет просто дважды кликнуть мышкой по слову DeltaPercent и это слово будет подсвечено зеленым цветом во всей программе смотри скриншот ниже

№7
№7

и найти нужную строку и параметр который нужно попенять не составит труда. По сути, вам останется к параметру DeltaPercent в нужных местах дописывать окончание Buy или Sell без пробела и с большой буквы.

PS. В следующей статье я опишу как заменить уже работающего вашего Робота, на Робота с откорректированной программой с сохранением всех сделок и уровней покупок. Если это будет вам интересно.