all_trade(Светлана)
all_trade(Светлана) личный блог
09 ноября 2013, 17:25

80 % убыточных сделок (картинки внутри)

В середине октября (этого года), после очередного торгового для меня посетила мысль «а что если попробовать запрограммировать свой алгоритм и посмотреть, что покажет тест этого алгоритма?!?!?» Ну в конце концов, не буду же я сидеть и «фигачить» от открытия до закрытия, по 5 дней в неделю, всю жизнь!!! Подумала и решила — возьмусь за программирование!!!
Почитала в интернете про эту тему — врубатся в это дело надо год-два, а то и 5 лет. Энтузиазма мне это не прибавило, и решила что пора начинать, а там видно будет, когда пойдут первые результаты. Впереди 5 лет — всё успею =)
Начала гуглить, кто в какой программе пишет своих роботов и решила что я буду осваивать Amibroker. Начла копать как что делать — нашла чудесный сайт по этой программе!!! Пол дня сидела разбиралась с установкой, далее неделя ушла на освоение интерфейса программы и как сней вообще работать (как котировки загонять, куда формулы писать и т.п.)
С горем по полам загнала котировки RIZ3 в эту адскую программу (а скажу я вам что там не все так просто как в Айфоне, и даже не как в Андроиде ни разу).
Полторы недели читала форумы и статьи, вникала, что и как там кодировать, пробовала. Не получалось, искала ошибки и снова пробовала. Ну, думаю, так и продут 5 лет в кодировании этого несчастного алгоритма, который я объясню школьнику за 2 минуты а эта «адская» программа ну никак не желает меня понять!!! Вроде я не блондинка и читаю всё как надо, но не идет и всё. Взяла 2 дня передыху, после чего села и начала вникать в каждую строчку этого вреднючего кода.
Сидела, записывала всё что делаю и бац — тестер выдал результат!
Во! Получилось!!! =) Просмотрела всё еще разок, что да как делала, записала схему как этому «электронику» объяснять что надо делать и запрограммировала свою самую простую торговую стратегию.

В самом коде строчек 20 и все дело заняло 5 минут. Настроила парметры тестреа и запустила нализ.
80 % убыточных сделок (картинки внутри)
80 % убыточных сделок (картинки внутри)
Программа выдала 80% убыточных сделок причем показала профит (23,54%) за тестируемый период =)
Загнала алгоритм второй стратегии
80 % убыточных сделок (картинки внутри)
80 % убыточных сделок (картинки внутри)
и этот тоже дал 80% лосей, но доходность показал в 46,59% за тот же период (живучий, гаденыш).
(Лоси побежали как раз после 22 числа, похоже что лонговый алгоритм надо вырубать и включать шортовый, да бы не устраивать просадку по счету)
Стратегия простая (для двух алгоритмов), только в лонг (вход по графику, без всяких индикаторов, АТР-ов и пр.), стоп за экстремум и чёткий тейкпрофит. Никаких уловок с трейлинг стопами, выходами на клиринг, закрытий в конце дня и т.п. Рабочий объем 10 контрактов (поставила стоимость 9000 р за контракт т.к. в какие то моменты менялось ГО). Начало с 11 сентября взяла потому что примерно где то в это время стало возможным (ликвидность, спред и т.п.) торговать этот контракт.
Визуально проверила — сделки в тех местах где надо, с кодом не ошиблась.
Теперь буду разбираться как этого электроника прикрутить к квику, в запасе врое ест еще 5 лет на «разбирательства». Или может пойти путем по проще, папу пенсионера посадить за ноут бук и пускай кнопки нажимает по сигналу, тем более что садовая пора закончилась =) А я тем временем еще алгоритмов понапишу =)
34 Комментария
  • ben
    09 ноября 2013, 17:29
    Папу пожалейте!
      • Sergiovy
        10 ноября 2013, 07:28
        all_trade(Светлана_Е.), Не знаю, как прикрепить файл.
        Можно прямо отсюда скопировать — лучше, чтобы во время копирования регистр был англ…
        Насчет даты из квика — раньше была проблема, что квик затирает старые данные. Сейчас не знаю — решена ли?
        Я пользовался старым экспортером. вроде как то получалось.
        Называетс так:
        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);
        }
        }
        • Nemo_2000
          10 ноября 2013, 11:00
          Sergiovy, я сейчас начинаю осваивать программирование в QPILE. Сейчас пробую пользоваться Notepad++ для создания кода. Мщжет подскажете лучший вариант, или способы настройки, так как пока не обнаружил настройки синтаксиса для QPILE и использую аналогичные для с# :)
          • Sergiovy
            10 ноября 2013, 17:47
            Nemo_2000, Я не писал никогда ничего под QPile… Sorry.
          • Sergiovy
            10 ноября 2013, 17:48
            all_trade(Светлана_Е.), Это в основном не мой а Механизатора. моя там дохлая система впереди…
            может пару наглядных индикаторов — чтобы сразу на экране видеть результаты, а не гонять тестер по мелочам…
  • AlexTR
    09 ноября 2013, 17:54
    Сколько стоит Амиброкер?
  • Nemo_2000
    09 ноября 2013, 21:18
    А зачем прикручивать? В квике есть QPILE. Так любая стратегия может быть в него забита. Там вопрос как раз с тестированием. Ваш Amibroker, насколько вижу, платный. А таких платных прог полно… Вот если бы кто подсказал бесплатную прогу… пусть и с ограниченным функционалом…
      • Nemo_2000
        10 ноября 2013, 11:34
        all_trade(Светлана_Е.), Я не кассирша среднего магазина.
  • bonifaciy
    09 ноября 2013, 21:24
    тут вон, в соседнем блоге грят, что потрачено более 2 ярдов грина на таких вот электроникофф)) так что, если Ваш буит прибыльным в реале, смело звоните голдманам с морганами и быстро быстро впарьте им...;)
  • Shved
    09 ноября 2013, 21:30
    а че тслаб не угодил?
    • alex
      09 ноября 2013, 22:37
      Shved, наши не ищут легких путей )
  • skatino
    09 ноября 2013, 22:14
    я бы потратил еще немного времени и прогнал систему на предыдущих контрактах… хотя бы этого года :)
    а еще лучше захватить немного прошлых лет…
      • Cobra
        10 ноября 2013, 20:29
        all_trade(Светлана_Е.), на сайте финама скачай историю котировок по нужному тебе инструменту
      • НеГрустин
        11 ноября 2013, 00:01
        all_trade(Светлана_Е.), минуток — два года максимум за один раз.
        Тут www.finam.ru/analysis/profile0442F00007/default.asp
  • RuSh
    09 ноября 2013, 23:22
    В этом случае алгоритм работал до его тестирования на истории
  • НеГрустин
    10 ноября 2013, 04:12
    Свет, настоятельно рекомендую освоить QPILE.
    Для подобной цели — самое то!
    Разбираться особо долго не придётся — второй иностранный учится гораздо легче ;)
    А если ещё и в школе Бэйсик учили — за полдня освоите))))

    Ничего никуда «прикручивать» не придётся — он (язык этот) в QUIK уже «вделан.»

    Литература по теме — здесь: www.quik.ru/user/download/ Нужная ссылка: Руководство пользователя. Восьмая глава — док-файл в этом архиве.

    Будут вопросы — обращайтесь — пришлю простенькую рабочую программку для препарирования. Хоть и не полноценный бот, но в работе оч. помогает.

    Успехов.
    • Rookie
      10 ноября 2013, 16:03
      НеГрустин, какой нахрен QPILE, если там уже LUA прикрутили. Но бак-тестинг там же не сделаешь.
      • НеГрустин
        10 ноября 2013, 17:11
        Rookie, ты б ещё ей сразу на VRML'е писать посоветовал!
        Ты же видишь: она начинающая — пусть сначала Бэйсик освоит))))
      • НеГрустин
        10 ноября 2013, 17:14
        Rookie, к тому же бэктест она уже сделала — результат: две полоски!!! (Эквити и дроудаун всмысле)))))))
        Теперь ей надо просто систему «в бой» отправить.
  • ves2010
    10 ноября 2013, 08:43
    смотри среднюю сделку… если меньше 0.1% торговать не получится… так же запрети торговать на первой и последней свече
      • Rookie
        10 ноября 2013, 16:06
        all_trade(Светлана_Е.), а проскальзывание и комиссии учтены? С ними результат может быть совсем другим.

Активные форумы
Что сейчас обсуждают

Старый дизайн
Старый
дизайн