ПАРНЫЙ ТРЕЙДИНГ , от практики к теории

transcendreamer

Местный знаток
double*MNK_INDyK=INDyK1-(SUM_EQWY*(ST2-xx)*TREND);

это дельта портфеля и тренда
которую ты суммируешь в диапазоне баров
в итоге ты делишь на диапазон и получаешь средний квадрат ошибки
в принципе замечаний нет
хотя корень для порядка надо бы взять чтобы было RMS error
(если данные были подготовлены правильно то все окей)
но это можно было бы получить стандартным образом из алглиба
однако не видно что ты делаешь дальше
среднеквадратичная ошибка не всегда лучший способ оценки модели
кроме того я подозреваю что тренд ты предварительно не оптимизируешь
поэтому качество модели будет посредственное

if(INDyK1>SUM_EQWY*(ST2-xx)*TREND)

здесь очевидно оценивается положение портфеля относительно трендовой
это очень хорошее дело например для поиска цены входа

тут ты просто подсчитываешь число баров выше трендовой
аналогичный фрагмент ниже трендовой для падающего портфеля
и число баров недостаточно трендовых
замечаний особо нет (если конечно ты понимаешь что делаешь)
для экономности я бы рекомендовал создавать промежуточные переменные
например для SUM_EQWY*(ST2-xx)*TREND
так и работать будет быстрее и читать удобнее

TREND_UP_1/NO_TREND_1)>=TREND_NAL
оценка трендовости через долю числа точек это конечно ваххабизм
но формально ошибки здесь нет
почему ваххабизм:
трендовый портфель по определению несёт в себе трендовый компонент
поэтому сравнивать его с трендовой линией имеет смысл только для точки
для всего отрезка это будет довольно случайный результат
так как портфель как правило не может расти экспоненциально
он лишь обвивается вокруг трендовой
поэтому будет нормальным когда половина баров ниже трендовой
и это никак не свидетельствует что тренд плохой
кроме того в твоей реализации нужно было сделать масштабирование
так как иногда даже флэтовый портфель может выше тренда
например его в начале интервала выкинуло вверх а потом он начал флэтить
если кфц тренда при этом невысокий то тренд недогонит
возможно ты делаешь масштабирование а в этом фрагменте просто не видно
но если не делаешь - тогда ты вдвойне ваххабит
результаты будут случайными
да и вообще делать подгонку тренда под неоптимизированный портфель
ну это все равно что устраивать гонки на грузовиках с прицепом
я бы рекомендовал пересмотреть подход
и начать лучше с самого начала
с постановки задачи
поиск трендовых портфелей?
окей тогда лучше всего оптимизировать пучок под тренд
и дальше уже фильтровать результаты в пучке
можно пойти иначе
можно оценить трендовость компонентов
отфильтровать их
и уже после этого собирать портфель

а найдутся покупатели на мой комп со всем его содержимым???
ты слишком уникальный разработчик чтобы ктото смог это продолжить
 

ara66676

Активный участник
это дельта портфеля и тренда
которую ты суммируешь в диапазоне баров
в итоге ты делишь на диапазон и получаешь средний квадрат ошибки
в принципе замечаний нет
хотя корень для порядка надо бы взять чтобы было RMS error
(если данные были подготовлены правильно то все окей)
но это можно было бы получить стандартным образом из алглиба
однако не видно что ты делаешь дальше
среднеквадратичная ошибка не всегда лучший способ оценки модели
кроме того я подозреваю что тренд ты предварительно не оптимизируешь
поэтому качество модели будет посредственное



здесь очевидно оценивается положение портфеля относительно трендовой
это очень хорошее дело например для поиска цены входа


тут ты просто подсчитываешь число баров выше трендовой
аналогичный фрагмент ниже трендовой для падающего портфеля
и число баров недостаточно трендовых
замечаний особо нет (если конечно ты понимаешь что делаешь)
для экономности я бы рекомендовал создавать промежуточные переменные
например для SUM_EQWY*(ST2-xx)*TREND
так и работать будет быстрее и читать удобнее


оценка трендовости через долю числа точек это конечно ваххабизм
но формально ошибки здесь нет
почему ваххабизм:
трендовый портфель по определению несёт в себе трендовый компонент
поэтому сравнивать его с трендовой линией имеет смысл только для точки
для всего отрезка это будет довольно случайный результат
так как портфель как правило не может расти экспоненциально
он лишь обвивается вокруг трендовой
поэтому будет нормальным когда половина баров ниже трендовой
и это никак не свидетельствует что тренд плохой
кроме того в твоей реализации нужно было сделать масштабирование
так как иногда даже флэтовый портфель может выше тренда
например его в начале интервала выкинуло вверх а потом он начал флэтить
если кфц тренда при этом невысокий то тренд недогонит
возможно ты делаешь масштабирование а в этом фрагменте просто не видно
но если не делаешь - тогда ты вдвойне ваххабит
результаты будут случайными
да и вообще делать подгонку тренда под неоптимизированный портфель
ну это все равно что устраивать гонки на грузовиках с прицепом
я бы рекомендовал пересмотреть подход
и начать лучше с самого начала
с постановки задачи
поиск трендовых портфелей?
окей тогда лучше всего оптимизировать пучок под тренд
и дальше уже фильтровать результаты в пучке
можно пойти иначе
можно оценить трендовость компонентов
отфильтровать их
и уже после этого собирать портфель


ты слишком уникальный разработчик чтобы ктото смог это продолжить

это была только часть которую я думаю как ускорить, как и раньше я говорил что не хочу собирать портфель из слонов и попугаев, или это слоны разной масти в одном портфеле, или это стаи попугаев разных пород в одном портфеле....
я прикреплю код оценки ситуации , понимаю что сложно читать чужой код, но если посмотришь может и будет дельным чтото поменять...
PHP:
//------------------------------------------------------------------// 
 if(iTime(NULL,TF,0)>prev_time&&Prognoz_Valut==false&&PositionsTotal()==0)
   {
     OSHIBKA_ETALON_1=1000000000;OSHIBKA_ETALON_2=1000000000;RAZNOST_ETALON=0;RAZNOST_ETALON2=100000;
     Symbol1="";Symbol2="";Symbol3="";Symbol4="";sym1="";sym2="";sym3="";sym4="";
     LOT1=0;LOT2=0;LOT3=0;LOT4=0;LOT111=0;LOT222=0;LOT333=0;LOT444=0;
     ArrayInitialize(MaXIMUM1,-10000); 
     ArrayInitialize(MiNIMUM1,10000);
     ArrayInitialize(MaXIMUM2,-10000); 
     ArrayInitialize(MiNIMUM2,10000);
     w=0;
     //Alert("++ РАСЧИТАЕМ НОВЫЙ СИНТЕТИК ++");
     for( w=3875; w>0; w--)
        {
         
         Symbol1=StringSubstr(SYMBOL_MASS[w],0,6);
         Symbol2=StringSubstr(SYMBOL_MASS[w],7,6);
         Symbol3=StringSubstr(SYMBOL_MASS[w],14,6);
         Symbol4=StringSubstr(SYMBOL_MASS[w],21,6);
         //Print(Symbol1+"  "+Symbol2+"  "+Symbol3+"  "+Symbol4);
//------------------------------------------------------------------//
         if(StringFind(Symbol1,"JPY")<0) punkt1=1; else punkt1=100;
         if(StringFind(Symbol2,"JPY")<0) punkt2=1; else punkt2=100;
         if(StringFind(Symbol3,"JPY")<0) punkt3=1; else punkt3=100;
         if(StringFind(Symbol4,"JPY")<0) punkt4=1; else punkt4=100;
         LOT1=NormalizeDouble(lot*(1*punkt1/MarketInfo(Symbol1,MODE_BID)),2);   
         LOT2=NormalizeDouble(lot*(1*punkt2/MarketInfo(Symbol2,MODE_BID)),2);   
         LOT3=NormalizeDouble(lot*(1*punkt3/MarketInfo(Symbol3,MODE_BID)),2); 
         LOT4=NormalizeDouble(lot*(1*punkt4/MarketInfo(Symbol4,MODE_BID)),2);
         double pun11=0,pun12=0,pun13=0,pun14=0;
         if(StringFind(Symbol1,"JPY",0)<0) pun11=100000; else pun11=1000;
         if(StringFind(Symbol1,"JPY",0)<0) pun12=100000; else pun12=1000;
         if(StringFind(Symbol1,"JPY",0)<0) pun13=100000; else pun13=1000;
         if(StringFind(Symbol1,"JPY",0)<0) pun14=100000; else pun14=1000;
         double Eqwyty1=10*LOT1*MarketInfo(Symbol1,MODE_TICKVALUE);
         double Eqwyty2=10*LOT2*MarketInfo(Symbol2,MODE_TICKVALUE);
         double Eqwyty3=10*LOT3*MarketInfo(Symbol3,MODE_TICKVALUE);
         double Eqwyty4=10*LOT4*MarketInfo(Symbol4,MODE_TICKVALUE); 
         double SUM_EQWY=Eqwyty1+Eqwyty2+Eqwyty3+Eqwyty4;
         //Alert("+++ ПУНКТ ПРИБЫЛИ = "+(string)SUM_EQWY);
//-------------------------------------------------------------------------------------------------//
         
         for(int variant=0;variant<8;variant++)
            {
             
             if(variant==0){LOT111=LOT1;LOT222=LOT2;LOT333=LOT3;LOT444=LOT4;OP1="BUY";OP2="BUY";OP3="BUY";OP4="BUY";}
             if(variant==1){LOT111=LOT1;LOT222=LOT2;LOT333=LOT3;LOT444=(-1)*LOT4;OP1="BUY";OP2="BUY";OP3="BUY";OP4="SELL";}
             if(variant==2){LOT111=LOT1;LOT222=LOT2;LOT333=(-1)*LOT3;LOT444=LOT4;OP1="BUY";OP2="BUY";OP3="SELL";OP4="BUY";}
             if(variant==3){LOT111=LOT1;LOT222=LOT2;LOT333=(-1)*LOT3;LOT444=(-1)*LOT4;OP1="BUY";OP2="BUY";OP3="SELL";OP4="SELL";}
             if(variant==4){LOT111=LOT1;LOT222=(-1)*LOT2;LOT333=LOT3;LOT444=LOT4;OP1="BUY";OP2="SELL";OP3="BUY";OP4="BUY";}
             if(variant==5){LOT111=LOT1;LOT222=(-1)*LOT2;LOT333=LOT3;LOT444=(-1)*LOT4;OP1="BUY";OP2="SELL";OP3="BUY";OP4="SELL";}
             if(variant==6){LOT111=LOT1;LOT222=(-1)*LOT2;LOT333=(-1)*LOT3;LOT444=LOT4;OP1="BUY";OP2="SELL";OP3="SELL";OP4="BUY";}
             if(variant==7){LOT111=LOT1;LOT222=(-1)*LOT2;LOT333=(-1)*LOT3;LOT444=(-1)*LOT4;OP1="BUY";OP2="SELL";OP3="SELL";OP4="SELL";}
             
             SUMMA_MNK_1=0;SUMMA_MNK_2=0;
             TREND_DOWN=false;KORR_UP=false;TREND_UP=false;KORR_DOWN=false;FLAAT=false;
             RAZNOST1=0;RAZNOST2=0;
             TREND_UP_1=0;TREND_DOWN_1=0;NO_TREND_1=1;
             //----------------ПЕРВЫЙ УЧАСТОК-----------
             double INDyK5=Equity_4I_Pairs(Symbol1,Symbol2,Symbol3,Symbol4,ST2,TF,ST1,LOT111,LOT222,LOT333,LOT444);
             double INDyK6=Equity_4I_Pairs(Symbol1,Symbol2,Symbol3,Symbol4,ST2,TF,ST,LOT111,LOT222,LOT333,LOT444);
             if((INDyK5>(SUM_EQWY*(ST2-ST1)*TREND) && (INDyK5-INDyK6)<=(INDyK5/Trend_Flat)) ||
                (INDyK5<(SUM_EQWY*(ST2-ST1)*TREND*(-1)) && (INDyK5-INDyK6)<=(INDyK5/Trend_Flat)))
                {
             //------------- IF RAZNOST1 == 0 ----------
             if(RAZNOST1==0)
               {
                //Alert("=== ОПРЕДЕЛЯЕМ ПЕРВЫЙ УЧАСТОК ===");
                for(int xx=ST2;xx>=ST1;xx--)
                    {
                     double INDyK1=Equity_4I_Pairs(Symbol1,Symbol2,Symbol3,Symbol4,ST2,TF,(xx),LOT111,LOT222,LOT333,LOT444);
                     //Alert("=== ИНДЮК № "+(string)(ST2-xx)+" === "+(string)INDyK1);
                     if(INDyK1>MaXIMUM1[variant][w]) { MaXIMUM1[variant][w]=INDyK1; }
                     if(INDyK1<MiNIMUM1[variant][w]) { MiNIMUM1[variant][w]=INDyK1; }
                     if(INDyK1>SUM_EQWY*(ST2-xx)*TREND)
                       {
                        TREND_UP_1++;
                       }
                     if(INDyK1<(-1)*SUM_EQWY*(ST2-xx)*TREND)
                       {
                        TREND_DOWN_1++;
                       }
                     if(INDyK1<SUM_EQWY*(ST2-xx)*TREND && INDyK1>(-1)*SUM_EQWY*(ST2-xx)*TREND)
                       {
                        NO_TREND_1++;
                       }    
                     if(xx==ST1)
                       {
                        RAZNOST1=MaXIMUM1[variant][w]-MiNIMUM1[variant][w];
                        if(TREND_UP_1>TREND_DOWN_1 && (TREND_UP_1/NO_TREND_1)>=TREND_NAL){TREND_UP=true;}
                        if(TREND_UP_1<TREND_DOWN_1 && (TREND_DOWN_1/NO_TREND_1)>=TREND_NAL){TREND_DOWN=true;}
                       }
                    } 
                }
             //------------- IF RAZNOST2 == 0 ----------
             if(RAZNOST2==0)
               {
                //Alert("=== ОПРЕДЕЛЯЕМ ВТОРОЙ УЧАСТОК ===");
                for(int xx=ST1;xx>=ST;xx--)
                    {
                     double INDyK2=Equity_4I_Pairs(Symbol1,Symbol2,Symbol3,Symbol4,ST1,TF,(xx),LOT111,LOT222,LOT333,LOT444);
                     double INDyK22=Equity_4I_Pairs(Symbol1,Symbol2,Symbol3,Symbol4,ST2,TF,(xx),LOT111,LOT222,LOT333,LOT444);
                     if(INDyK22>MaXIMUM2[variant][w]) { MaXIMUM2[variant][w]=INDyK22; }
                     if(INDyK22<MiNIMUM2[variant][w]) { MiNIMUM2[variant][w]=INDyK22; }
                     if(xx==ST)
                       {
                        RAZNOST2=MaXIMUM2[variant][w]-MiNIMUM2[variant][w];
                       }
                    } 
                } 
                 
             //------------- ВЫЧИСЛЯЕМ ОШИБКУ ПЕРВОГО УЧАСТКА -------------------
             
             for(int xx=ST2;xx>=ST1;xx--)
                { 
                 double INDyK1=Equity_4I_Pairs(Symbol1,Symbol2,Symbol3,Symbol4,ST2,TF,(xx),LOT111,LOT222,LOT333,LOT444);
                 double MNK_INDyK=INDyK1-(SUM_EQWY*(ST2-xx)*TREND);
                 SUMMA_MNK_1=SUMMA_MNK_1+(MNK_INDyK*MNK_INDyK);
                 if(xx==ST1){SUMMA_MNK_1=SUMMA_MNK_1/(ST2-ST1);}
                }
                  
             //------------- ВЫЧИСЛЯЕМ ОШИБКУ ВТОРОГО УЧАСТКА -------------------
             
             for(int xxx=ST1;xxx>=ST;xxx--)
                { 
                 double INDyK2=Equity_4I_Pairs(Symbol1,Symbol2,Symbol3,Symbol4,ST1,TF,(xxx),LOT111,LOT222,LOT333,LOT444);
                 double MNK_INDyK2=INDyK2;
                 SUMMA_MNK_2=SUMMA_MNK_2+(MNK_INDyK2*MNK_INDyK2);
                 if(xxx==ST){SUMMA_MNK_2=SUMMA_MNK_2/(ST1-ST);}
                }
                
             
             if(TREND_UP==true && SUMMA_MNK_1<OSHIBKA_ETALON_1 && SUMMA_MNK_2<OSHIBKA_ETALON_2 && RAZNOST2<RAZNOST_ETALON2
                && MathAbs(RAZNOST2) < MathAbs(RAZNOST1/Trend_Flat)&& RAZNOST1 > RAZNOST_ETALON)
               { 
                PROFIT=RAZNOST2*TAKE_PROFIT;
                STOP_LOSS=RAZNOST2;
                RAZNOST_ETALON=RAZNOST1;
                RAZNOST_ETALON2=RAZNOST2;   
                MINIMUM_UP=MiNIMUM2[variant][w];
                MAXIMUM_UP=MaXIMUM2[variant][w];
                OSHIBKA_ETALON_1=SUMMA_MNK_1;
                OSHIBKA_ETALON_2=SUMMA_MNK_2;
                sym1=Symbol1;sym2=Symbol2;sym3=Symbol3;sym4=Symbol4;
                Operation1=OP1;Operation2=OP2;Operation3=OP3;Operation4=OP4;
                lot11=LOT111;lot22=LOT222;lot33=LOT333;lot44=LOT444;
                Alert("МАКСИМУМ 1= "+(string)MaXIMUM1[variant][w]+" МИНИМУМ 1= "+(string)MiNIMUM1[variant][w]);
                Alert("МАКСИМУМ 2 = "+(string)MaXIMUM2[variant][w]+" МИНИМУМ 2 = "+(string)MiNIMUM2[variant][w]);
                Alert(" OSHIBKA = "+(string)OSHIBKA_ETALON_1);
                Alert(" OSHIBKA_2 = "+(string)OSHIBKA_ETALON_2);
                Alert(" RAZNOST = "+(string)RAZNOST1);
                Alert(" RAZNOST_2 = "+(string)RAZNOST2);
                Alert("+++ TREND UP +++");
                Alert(sym1+"= "+Operation1+" "+sym2+"= "+Operation2+" "+sym3+"= "+Operation3+" "+sym4+"= "+Operation4);
                Prognoz_Valut=true;
                Lot_Raschet=true;
                SIGNAL_UP=true;
                SIGNAL_DOWN=false;
                MINIMUM_DOWN=0;MAXIMUM_DOWN=0;
                TREND_DOWN=false;KORR_UP=false;TREND_UP=false;KORR_DOWN=false;
               }
                
             if(TREND_DOWN==true && SUMMA_MNK_1<OSHIBKA_ETALON_1 && SUMMA_MNK_2<OSHIBKA_ETALON_2 && RAZNOST2<RAZNOST_ETALON2
                && MathAbs(RAZNOST2) < MathAbs(RAZNOST1/Trend_Flat) && RAZNOST1 > RAZNOST_ETALON)
               {
                PROFIT=RAZNOST2*TAKE_PROFIT;
                STOP_LOSS=RAZNOST2;
                RAZNOST_ETALON=RAZNOST1;
                RAZNOST_ETALON2=RAZNOST2;
                MINIMUM_DOWN=MiNIMUM2[variant][w];
                MAXIMUM_DOWN=MaXIMUM2[variant][w];
                OSHIBKA_ETALON_1=SUMMA_MNK_1;
                OSHIBKA_ETALON_2=SUMMA_MNK_2;
                sym1=Symbol1;sym2=Symbol2;sym3=Symbol3;sym4=Symbol4;
                Operation1=OP1;Operation2=OP2;Operation3=OP3;Operation4=OP4;
                lot11=LOT111;lot22=LOT222;lot33=LOT333;lot44=LOT444;
                Alert("МАКСИМУМ 1= "+(string)MaXIMUM1[variant][w]+" МИНИМУМ 1= "+(string)MiNIMUM1[variant][w]);
                Alert("МАКСИМУМ 2 = "+(string)MaXIMUM2[variant][w]+" МИНИМУМ 2 = "+(string)MiNIMUM2[variant][w]);
                Alert(" OSHIBKA = "+(string)OSHIBKA_ETALON_1);
                Alert(" OSHIBKA_2 = "+(string)OSHIBKA_ETALON_2);
                Alert(" RAZNOST = "+(string)RAZNOST1);
                Alert(" RAZNOST_2 = "+(string)RAZNOST2);
                Alert("+++ TREND DOWN +++" );
                Alert(sym1+"= "+Operation1+" "+sym2+"= "+Operation2+" "+sym3+"= "+Operation3+" "+sym4+"= "+Operation4);
                Prognoz_Valut=true;
                Lot_Raschet=true;
                SIGNAL_DOWN=true;
                SIGNAL_UP=false;
                MINIMUM_UP=0;MAXIMUM_UP=0;
                TREND_DOWN=false;KORR_UP=false;TREND_UP=false;KORR_DOWN=false;
               }
              } 
            }      
          } 
      prev_time=iTime(NULL,TF,0);
          
    }
 

ara66676

Активный участник
как добавочный момент для понимания что и как я оцениваю под трендом....
предистория:
1 - хороший тренд это 100(старых) пунктов за два три часа.
2 - я нахожу стоимость пункта для портфеля.
3 - нахожу портфель с хорошим трендом на определённом участке( во входных параметрах).
4 - проверяю был ли флет этого портфеля на следующем участке (задаётся также во входных параметрах)
ну а дальше уже просто проверка на пробой....
всё вроде работает, блин только долго очень....
 

ivanivan

Местный житель
как добавочный момент для понимания что и как я оцениваю под трендом....
предистория:
1 - хороший тренд это 100(старых) пунктов за два три часа.
2 - я нахожу стоимость пункта для портфеля.
3 - нахожу портфель с хорошим трендом на определённом участке( во входных параметрах).
4 - проверяю был ли флет этого портфеля на следующем участке (задаётся также во входных параметрах)
ну а дальше уже просто проверка на пробой....
всё вроде работает, блин только долго очень....

вместо очень многа букаф пару скринов полученных кривулек приложи)
 

ara66676

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

ivanivan

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

поясни-тест чего? синтез кривульки или советника по ней?
 

ara66676

Активный участник
поясни-тест чего? синтез кривульки или советника по ней?

советник по кривульке )
синтеза можно много понаделать, а вот работает или нет этот синтез советник и покажет, в моём примере получается 3875*8=31000 кривулек из 4 валютных пар, каждый час проверяются на соответствие модели, если есть такая идёт в торговлю ...
 
Последнее редактирование:

ara66676

Активный участник
ну так я не резалты теста прошу показать,а кривульку-синтетик, который ты получил
приношу свои извинения, но индюков на мт5 пока не пишу, мне проще этот алгоритм сразу в сов затолкать чем 31000 кривулек рассматривать...
 

ivanivan

Местный житель
приношу свои извинения, но индюков на мт5 пока не пишу, мне проще этот алгоритм сразу в сов затолкать чем 31000 кривулек рассматривать...

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

ara66676

Активный участник
ну так я не резалты теста прошу показать,а кривульку-синтетик, который ты получил

ВОТ показываю кривульку которую расчитал робот, красная вертикальная жирная стартовая точка,синяя вертикальная конечная точка тренда. От синей до зелёной участок флета в пять раз меньший чем трендовый ход. сразу за зелёной вертикальной вход в позицию (пробой флета вверх).
Синтетик состоит из :
AUDUSD= BUY 1.33
EURCAD= SELL 0.68
GBPAUD= SELL 0.57
GBPJPY= SELL0.74
gbpusd-h1-e-global-trade.png
 

ivanivan

Местный житель
ВОТ показываю кривульку которую расчитал робот, красная вертикальная жирная стартовая точка,синяя вертикальная конечная точка тренда. От синей до зелёной участок флета в пять раз меньший чем трендовый ход. сразу за зелёной вертикальной вход в позицию (пробой флета вверх).
Синтетик состоит из :
AUDUSD= BUY 1.33
EURCAD= SELL 0.68
GBPAUD= SELL 0.57
GBPJPY= SELL0.74
gbpusd-h1-e-global-trade.png

видел я что-то подобное в теме по баблокосу)) возможно,вот это сможет спасти жизнь отцу русской демократии и облегчить ему расчеты))
_https://www.mql5.com/ru/code/1146
 

ara66676

Активный участник
видел я что-то подобное в теме по баблокосу)) возможно,вот это сможет спасти жизнь отцу русской демократии и облегчить ему расчеты))
_https://www.mql5.com/ru/code/1146

я уже не раз скачивал и пытался освоить алглиб, но, как и раньше говорил повторюсь. Не понимая сути как и что вычисляется не могу применять тот или инной код. а посему ко всему приходится доходить путём изучений основ математического анализа. Сначала нарисую, потом для себя докажу, в ходе доказательсва получу убеждения и навык и потом его использую. А в слепую брать и пользоваться я не знаю как.... алглиб состоит из кучи, большой кучи функций, и что какая и как делает я не могу разобрать, скажем так она написана грамотно и для грамотных, а я то ведь обычный чел после школы ни фига не видел книжек ))) потому мне трудно понимать...
 

ivanivan

Местный житель
я уже не раз скачивал и пытался освоить алглиб, но, как и раньше говорил повторюсь. Не понимая сути как и что вычисляется не могу применять тот или инной код. а посему ко всему приходится доходить путём изучений основ математического анализа. Сначала нарисую, потом для себя докажу, в ходе доказательсва получу убеждения и навык и потом его использую. А в слепую брать и пользоваться я не знаю как.... алглиб состоит из кучи, большой кучи функций, и что какая и как делает я не могу разобрать, скажем так она написана грамотно и для грамотных, а я то ведь обычный чел после школы ни фига не видел книжек ))) потому мне трудно понимать...

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

ara66676

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

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

transcendreamer

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

Не понимая сути как и что вычисляется не могу применять тот или инной код.
-- вполне понятная ситуация, поэтому рекомендуется потратить небольшое время на изучение вот этого текста _http://www.statistica.ru/theory/osnovy-lineynoy-regressii/ и здесь не требуется специальных знаний, а затем вот это: _http://www.statistica.ru/theory/mnozhestvennaya-lineynaya-regressiya/ прочитав эти два недлинных текста каждый сумеет применять регрессию для любых задач (там скриншоты программы statistica, весьма полезный пакет для изучения, конечно не такой крутой как R зато полностью подобен экселю и наглядный)

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

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

операции с текстовыми строками лучше производить не полагаясь на жёстко заданные позиции символов, а использовать правильный парсинг строк, например ты обрезаешь символьную строку чтобы вытащить имя инструмента из неё и делаешь это 4 раза, хорошо что у тебя только 4 инструмента, а если бы их было 10 или 20? посмотри функцию DefineFormula из "модельера"....

аналогично со стоимостью пункта, посмотри на функцию ContractValue, хотя в твоем случае тебе достаточно брать текущую стоимость поэтому ты можешь ограничиться price_range/ticksize*tickvalue; а вместо StringFind(Symbol1,"JPY") лучше использовать
стандартные функции SymbolInfoString(Symbol1,SYMBOL_CURRENCY_BASE) и SymbolInfoString(Symbol1,SYMBOL_CURRENCY_PROFIT) а вообще для определения пункта цены служит функция SymbolInfoDouble(symbol,SYMBOL_POINT) и тогда не придется корячится с проверками на наличие йены, рекомендую почитать описание стандартных функций в справке, там много полезного...

ручное программирование вариантов (переменная variant) это настолько архаика что кажется даже древние чернобородые шумеры из Междуречья взглянули бы с ужасом на этот код.... попробуй создать нормальный массив направлений int DIRECTIONS[4], где +1 будет положительное а -1 отрицательное направление и сделай 4 вложенных цикла с перебором значений, тогда потом будешь просто умножать лоты на соответствующее значений из DIRECTIONS и все будет хорошо...

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

оценка эквити на участках - это в принципе нормальный метод, но нужно помнить что портфели могут скакать, поэтому лучше сначала сгладить эквити каким-нибудь мувингом и оценивать уже его, это будет более плавная статистика...... что же касается самого подхода то я уже писал выше какие тут могут быть недостатки, стандартные ошибки модели не так уж много информации дают, а учитывая что собственно говоря никакой модели ты и не строил, то это вообще информация в воздухе висит, с тем же успехом (и даже более надёжно) можно было бы оценивать отклонения от мувинга например периода 144 и получать состояния отклонённости портфеля

писать русские слова латиницей это дурной тон! Prognoz_Valut=true; Lot_Raschet=true; выглядит это ужасно
 
Последнее редактирование модератором:

acronis7

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

вот справка по lrbuild.
Код:
lrbuild function

/*************************************************************************
Linear regression

Subroutine builds model:

    Y = A(0)*X[0] + ... + A(N-1)*X[N-1] + A(N)

and model found in ALGLIB format, covariation matrix, training set  errors
(rms,  average,  average  relative)   and  leave-one-out  cross-validation
estimate of the generalization error. CV  estimate calculated  using  fast
algorithm with O(NPoints*NVars) complexity.

When  covariation  matrix  is  calculated  standard deviations of function
values are assumed to be equal to RMS error on the training set.

INPUT PARAMETERS:
    XY          -   training set, array [0..NPoints-1,0..NVars]:
                    * NVars columns - independent variables
                    * last column - dependent variable
    NPoints     -   training set size, NPoints>NVars+1
    NVars       -   number of independent variables

OUTPUT PARAMETERS:
    Info        -   return code:
                    * -255, in case of unknown internal error
                    * -4, if internal SVD subroutine haven't converged
                    * -1, if incorrect parameters was passed (NPoints<NVars+2, NVars<1).
                    *  1, if subroutine successfully finished
    LM          -   linear model in the ALGLIB format. Use subroutines of
                    this unit to work with the model.
    AR          -   additional results


  -- ALGLIB --
     Copyright 02.08.2008 by Bochkanov Sergey
*************************************************************************/
void alglib::lrbuild(
    real_2d_array xy,
    ae_int_t npoints,
    ae_int_t nvars,
    ae_int_t& info,
    linearmodel& lm,
    lrreport& ar);

есть два графика eurusd и gbpusd. как одному из них коэффициент подобрать с помощью этой функции?
кто шарит?
 

transcendreamer

Местный знаток
но тоже нихрена не понял)))
да как же так? вот ты же сам ниже фрагмент пастишь

мутить регрессию в индикаторах
это как? о_О

Y = A(0)*X[0] + ... + A(N-1)*X[N-1] + A(N)
это уравнение линейной регрессии
обычный многочлен
в особом представлении не нуждается
единственно что я выбрасываю свободный член
ведь у меня изначально профиты единичного лота всех инструментов
(профиты = дельта стоимостей по времени)
поэтому свободный член мне не нужен и я использую LRBuildZ
а если брать стоимость контрактов as is (не профит) тогда был бы нужен
тогда точка старта будет не нуль
на мой взгляд удобнее когда портфель растет из нуля

covariation matrix, training set errors
это пока благополучно пропускаем
это не так уж важно сейчас

что пихать на вход

XY - training set, array [0..NPoints-1,0..NVars]
матрица данных
в ней должны быть ряды данных эквити всех инструментов 1 лота

* NVars columns - independent variables
сначала все инструменты в произвольном порядке рядов

* last column - dependent variable
в последний ряд заводим целевую функцию
либо эталонную корзину

NPoints - training set size, NPoints>NVars+1
число точек данных (должно быть больше чем число инструментов+1)

NVars - number of independent variables
число инструментов в портфеле

что на выходе

код статуса

LM - linear model in the ALGLIB format.
собственно модель
это объект специального типа
из него надо достать (LRUnpack) корни уравнения

какая-то хрень

есть два графика eurusd и gbpusd. как одному из них коэффициент подобрать с помощью этой функции?
один заводим в матрицу как обычно
второй тоже в матрицу но в качестве функции (независимой переменной)
получаем корни
точнее тут будет 1 корень только для первого
второй благополучно переносим в другую часть уравнения
для него коэффициент = -1
в готовом виде все есть в функции CalculateOptimization
 
Верх