В середине октября (этого года), после очередного торгового для меня посетила мысль «а что если попробовать запрограммировать свой алгоритм и посмотреть, что покажет тест этого алгоритма?!?!?» Ну в конце концов, не буду же я сидеть и «фигачить» от открытия до закрытия, по 5 дней в неделю, всю жизнь!!! Подумала и решила — возьмусь за программирование!!!
Почитала в интернете про эту тему — врубатся в это дело надо год-два, а то и 5 лет. Энтузиазма мне это не прибавило, и решила что пора начинать, а там видно будет, когда пойдут первые результаты. Впереди 5 лет — всё успею =)
Начала гуглить, кто в какой программе пишет своих роботов и решила что я буду осваивать Amibroker. Начла копать как что делать — нашла чудесный сайт по этой программе!!! Пол дня сидела разбиралась с установкой, далее неделя ушла на освоение интерфейса программы и как сней вообще работать (как котировки загонять, куда формулы писать и т.п.)
С горем по полам загнала котировки RIZ3 в эту адскую программу (а скажу я вам что там не все так просто как в Айфоне, и даже не как в Андроиде ни разу).
Полторы недели читала форумы и статьи, вникала, что и как там кодировать, пробовала. Не получалось, искала ошибки и снова пробовала. Ну, думаю, так и продут 5 лет в кодировании этого несчастного алгоритма, который я объясню школьнику за 2 минуты а эта «адская» программа ну никак не желает меня понять!!! Вроде я не блондинка и читаю всё как надо, но не идет и всё. Взяла 2 дня передыху, после чего села и начала вникать в каждую строчку этого вреднючего кода.
Сидела, записывала всё что делаю и бац — тестер выдал результат!
Во! Получилось!!! =) Просмотрела всё еще разок, что да как делала, записала схему как этому «электронику» объяснять что надо делать и запрограммировала свою самую простую торговую стратегию.
В самом коде строчек 20 и все дело заняло 5 минут. Настроила парметры тестреа и запустила нализ.
Программа выдала 80% убыточных сделок причем показала профит (23,54%) за тестируемый период =)
Загнала алгоритм второй стратегии
и этот тоже дал 80% лосей, но доходность показал в 46,59% за тот же период (живучий, гаденыш).
(Лоси побежали как раз после 22 числа, похоже что лонговый алгоритм надо вырубать и включать шортовый, да бы не устраивать просадку по счету)
Стратегия простая (для двух алгоритмов), только в лонг (вход по графику, без всяких индикаторов, АТР-ов и пр.), стоп за экстремум и чёткий тейкпрофит. Никаких уловок с трейлинг стопами, выходами на клиринг, закрытий в конце дня и т.п. Рабочий объем 10 контрактов (поставила стоимость 9000 р за контракт т.к. в какие то моменты менялось ГО). Начало с 11 сентября взяла потому что примерно где то в это время стало возможным (ликвидность, спред и т.п.) торговать этот контракт.
Визуально проверила — сделки в тех местах где надо, с кодом не ошиблась.
Теперь буду разбираться как этого электроника прикрутить к квику, в запасе врое ест еще 5 лет на «разбирательства». Или может пойти путем по проще, папу пенсионера посадить за ноут бук и пускай кнопки нажимает по сигналу, тем более что садовая пора закончилась =) А я тем временем еще алгоритмов понапишу =)
если квик с электроником подружатся то пожалею =)
Можно прямо отсюда скопировать — лучше, чтобы во время копирования регистр был англ…
Насчет даты из квика — раньше была проблема, что квик затирает старые данные. Сейчас не знаю — решена ли?
Я пользовался старым экспортером. вроде как то получалось.
Называетс так:
QUIK2AMIBROKER_DataPlugin.dll
Положить в папку plugin
Важна версия.
Вообще на сайте все эти роботы есть и в неск вариантах.
////////// Правила системы ///////////////
// 2 контракта по умолчанию
SetPositionSize(2,4);
SetTradeDelays(0,0,0,0);
SetOption(«AllowPositionShrinking»,0); // Вкл (1) выкл (0)возможность открытия позиции, если денег не хватает
//SetOption(«InitialEquity»,3); // Начальный капитал
SetOption(«AllowSameBarExit»,0); // Вкл (1) выкл (0) возможность выхода на баре входа
SetOption(«ActivateStopsImmediately»,0); // Вкл (1) выкл (0) активацию стопа на баре входа
SetOption(«FuturesMode»,1); // Вкл (1) выкл (0) режим «Тестирование фьючерсов»
SetOption(«ReverseSignalForcesExit»,0); // Вкл (1) выкл (0) вход в противоположную позицию при противп. сигнале
SetOption(«PriceBoundChecking»,1); // Вкл (1) выкл (0) проверку соответствия bp/sp/shp/cp диапазону h-l
//SetTradeDelays(0,0,0,0); // Задержка торгов
SetBarsRequired( 1000, 0 );
//Проскальзывание
Slpg=Param(«Slpg»,100,0,250,1);
LS=Param(«LS»,0,0,150,5);
//LS=0;
SS=Param(«SS»,0,0,150,5);
//SS=0;
//VOLSY
DiffVol=Param(«DVol»,0.53,0,4,0.01);
//DiffVol=1.5;
//Vol=Ref(H,-1)/Ref(C,-1)*1000-Ref(L,-1)/Ref(C,-1)*1000;
Vol=(H-L)/C*1000;
Flat=Ref(Vol,-1)<DiffVol;
VolOfset=IIf(Flat,Param(«VO»,150,0,500,5),0);
PerBuy=Param(«PB», 18,2,25,1);
//PerBuy = Optimize(«PB», 3,2,9,1);
//PerBuy=3;
PerSell=Param(«PS», 6,2,25,1);
//PerSell = Optimize(«PS», 6,2,9,1);
//PerSell=6;
//PerSh = Optimize(«PSh», 3,3,6,1);
//PerSh =7;
PerSh=PerSell;
//PerCov = Optimize(«PCo», 8,6,12,1);
//PerCov =3;
PerCov =PerBuy;
Buy=H>(Ref(HHV(H,PerBuy),-1)+VolOfset+LS);
BuyPrice=Ref(HHV(H,PerBuy),-1)+VolOfset+Slpg+LS;
BuyPriceR=Ref(HHV(H,PerBuy),-1)+VolOfset+LS;
Sell=L<(Ref(LLV(L,PerSell),-1)-VolOfset-SS);
SellPrice=Ref(LLV(L,PerSell),-1)-VolOfset-Slpg-SS;
SellPriceR=Ref(LLV(L,PerSell),-1)-VolOfset-SS;
Short=Sell;
ShortPrice=SellPrice;
//Short=L<Ref(LLV(L,PerSh),-1);
//ShortPrice=Ref(LLV(L,PerSh),-1)-Slpg;
Cover=Buy;
CoverPrice=BuyPrice;
//Cover=H>Ref(HHV(H,PerCov),-1);
//CoverPrice=Ref(HHV(H,PerCov),-1)+Slpg;
Equity(1,0);
N=Cum(Buy)+Cum(Short);
//dist = 1*ATR(10);
dist=100;
for( i = 0; i < BarCount; i++ )
{
if( Buy[i] ) PlotText( «Buy\n@» + BuyPrice[ i ], i, L[ i ]-dist[i], colorBlue );
if( Sell[i] ) PlotText( «Sell\n@» + SellPrice[ i ], i, H[ i ]+dist[i]*2.5, colorRed );
//if( Short[i] ) PlotText( «Short\n@» + ShortPrice[ i ], i, H[ i ]+dist[i], colorRed );
//if( Cover[i] ) PlotText( «Cover\n@» + CoverPrice[ i ], i, L[ i ]-dist[i]*2.5, colorBlue );
}
PlotShapes(Buy*shapeSmallUpTriangle,colorBlue,0,L,-10);
PlotShapes(Sell*shapeSmallDownTriangle,colorRed,0,H,-10);
//PlotShapes(IIf(Short,shapeHollowSmallDownTriangle,0),colorRed,0,H,-20);
//PlotShapes(IIf(Cover,shapeHollowSmallUpTriangle,0),colorBlue,0,L,-20);
//Plot(Tr,«Tr»,colorBlack,styleOwnScale);
Plot(HHV(H,PerBuy)+VolOfset+LS,«Buy»,colorBlue);
Plot(LLV(L,PerSell)-VolOfset-SS,«Sell»,colorRed);
//Plot(LLV(BaseSh,PerEMASh),«Short»,colorRed);
//Plot(HHV(BaseCov,PerEMACov),«Cover»,colorYellow);
//Plot(Vol,«V»,colorBlue,32768);
//Plot(Ref(L,-1),«SL»,colorRed);
//Plot(Ref(H,-1),«BL»,colorBlue);
Plot(Equity(1,0),«EQ»,colorYellow,32768);
//Plot(MA(Equity(1,0),150),«EQ»,colorYellow,styleOwnScale,32);
Plot(N,«N»,colorOrange,32768,256);
BuySellL= IIf(BarsSince(Buy) < BarsSince(Sell),1,0);
BuySellS= IIf(BarsSince(Short) < BarsSince(Cover),-1,0);
BuySell= BuySellL + BuySellS;
//Звук
AlertIf( Buy, «SOUND c:/WINDOWS/Media/notify.wav», «Длинная позиция»,0,1+2+4+8);
AlertIf( Sell, «SOUND c:/WINDOWS/Media/notify.wav», «Выход из длинной позиции»,0,1+2+4+8);
AlertIf( Short, «SOUND c:/WINDOWS/Media/notify.wav», «Короткая позиция»,0,1+2+4+8);
AlertIf( Cover, «SOUND c:/WINDOWS/Media/notify.wav», «Выход из короткой позиции»,0,1+2+4+8);
//////////////////////////////////////////////////////////////////////////////////////////////
//PlotShapes(Buy*shapeDigit1,colorBlue,0,L,-50 );
//PlotShapes(Sell*shapeDigit2,colorGreen,0,H,50 );
//PlotShapes(Short*shapeDigit3,colorRed,0,H,35 );
//PlotShapes(Cover*shapeDigit4,colorYellow,0,L,-35 );
//PlotShapes(Buy*shapeUpArrow,colorBlue,0,L,-20);
//PlotShapes(Sell*shapeDownArrow,colorGreen,0,H,-20);
//PlotShapes(Short*shapeSmallDownTriangle,colorRed,0,H,-10);
//PlotShapes(Cover*shapeSmallUpTriangle,colorYellow,0,L,-10);
//Plot( Volume, _DEFAULT_NAME(), colorLavender, styleNoTitle | styleHistogram | styleOwnScale | styleThick | styleNoLabel, maskHistogram, 2 );
TickerID=1; // уникальный для каждого индикатора номер
Ticker=«RIH0_1»; // название бумаги в Амиброкере. На другой бумаге работать не будет
TimeFrame=15; // таймфрейм в минутах. На других таймфреймах работать не будет
Classcode=«SPBFUT»; // код класса бумаги
Seccode=«RIH0»; // код бумаги
Account="***********"; // ваш аккаунт на бирже
Client="********"; // код клиента
Zapis=ParamToggle(«Записывать транзакции в файл?»,«No|Yes»,1);
Lots=Param(«Количество лотов в заявке », 1, 1, 100, 1); // сколько лотов желаете торговать
FileName=«C:/Trans/trans.tri»; // слэши прямые — имя файла с транзакциями для квика
Otstup=0.1; // в процентах. заявка будет выставлена хуже текущей цены на столько процентов
StepPr=5; // минимальный шаг цены контракта
Point=0; // количество знаков после запятой в цене
Title = StrFormat("{{NAME}} — {{INTERVAL}} {{DATE}} Open %g, Hi %g, Lo %g, Close %g (%.1f%%) {{VALUES}}", O, H, L, C, SelectedValue( ROC( C, 1 ) ) )+
"\n Индикатор, отправляющий сигналы в Quik"+
"\n\\c-1 Система: "+EncodeColor(colorGreen)+_DEFAULT_NAME()+
"\n\\c-1 Инструмент: "+EncodeColor(colorGreen)+Ticker+" ("+Seccode+")"+
"\n\\c-1 Записываются ли транзакции в файл: "+EncodeColor(colorGreen)+WriteIf(Zapis==1,«да»,«нет»)+
"\n\\c-1 Текущая чистая позиция: "+EncodeColor(colorGreen)+Lots*BuySell;
//Формирование транзакции
procedure savetrifile(stransid,sstr) {
f=fopen(FileName,«r»);
found=0;
if (f) {
while (!feof(f)) {
s=fgets(f);
if (StrFind(s,stransid)>0) {
found=1;
}
}
fclose(f);
}
if (found==0) {
f=fopen(FileName,«a»);
if (f) {
fputs(sstr+"\n",f);
fclose(f);
}
}
}
function makeandsave(sOper,sOperID,sprice) {
CCS="";
if (Client!="") { CCS=" CLIENT_CODE="+Client+";"; }
transid=StrFormat(«TRANS_ID=%g%g%g%g;»,TickerID,sOperID,LastValue(Ref(DayOfYear(),-1)),LastValue(Ref(TimeNum(),-1)));
str=StrFormat(transid+«PRICE=%1.»+Point+«f;QUANTITY=%g;OPERATION=»+sOper+";CLASSCODE="+Classcode+"; ACTION=NEW_ORDER; TYPE=L; SECCODE="+Seccode+"; ACCOUNT="+Account+";"+CCS,sprice,Lots);
savetrifile(transid,str);
}
if ((Now(3)==LastValue(DateNum()))AND (BarCount>1) AND Zapis==1 AND(Name()==Ticker)AND(TimeFrame==Interval()/60)AND((Buy[BarCount-1]==1)OR(Sell[BarCount-1]==1)OR(Short[BarCount-1]==1)OR(Cover[BarCount-1]==1)))
{
ifbuy=IIf(Buy[BarCount-1]==1,1,0);
ifsell=IIf(Sell[BarCount-1]==1,1,0);
ifshort=IIf(Short[BarCount-1]==1,1,0);
ifcover=IIf(Cover[BarCount-1]==1,1,0);
if (ifbuy) {
//price=StepPr*int( ((1+Otstup/100)*BuyPriceR[BarCount-1])/StepPr);
price=62500;
makeandsave(«B»,1,price);
}
if (ifsell) {
//price=StepPr*int( ((1-Otstup/100)*SellPriceR[BarCount-1])/StepPr);
price=67500;
makeandsave(«S»,2,price);
}
if (ifshort) {
//price=StepPr*int( ((1-Otstup/100)*SellPriceR[BarCount-1])/StepPr);
price=67500;
makeandsave(«S»,3,price);
}
if (ifcover) {
//price=StepPr*int( ((1+Otstup/100)*BuyPriceR[BarCount-1])/StepPr);
price=62500;
makeandsave(«B»,4,price);
}
}
спасибо. «чужой» код, конечно, страшная штука, но думаю для освоения подойдет =)
может пару наглядных индикаторов — чтобы сразу на экране видеть результаты, а не гонять тестер по мелочам…
smart-lab.ru/blog/76883.php
www.amibroker.com/
тут все есть. Пожалуйста.
в нашем городе кассирша (среднего магазина) получает 20 т.р. в месяц. На амиброкер хватит и даже еще останется =) Это же не 1200 долларов в месяц как за блумберговский терминал! Низнаю что тут можно сэкономить…
У амиброкера мне понравился логотип =)
а еще лучше захватить немного прошлых лет…
как найду где скачать историю котировок — сразу протестирую =)
Тут www.finam.ru/analysis/profile0442F00007/default.asp
Для подобной цели — самое то!
Разбираться особо долго не придётся — второй иностранный учится гораздо легче ;)
А если ещё и в школе Бэйсик учили — за полдня освоите))))
Ничего никуда «прикручивать» не придётся — он (язык этот) в QUIK уже «вделан.»
Литература по теме — здесь: www.quik.ru/user/download/ Нужная ссылка: Руководство пользователя. Восьмая глава — док-файл в этом архиве.
Будут вопросы — обращайтесь — пришлю простенькую рабочую программку для препарирования. Хоть и не полноценный бот, но в работе оч. помогает.
Успехов.
Ты же видишь: она начинающая — пусть сначала Бэйсик освоит))))
Теперь ей надо просто систему «в бой» отправить.
ок, погляжу. Спасибо =)