Не Грааль, просто обычненький такой - Баблокос!!! - страница 701

 

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

Это функции для генератора пучка всех возможных синтетиков и два фильтра: NRMSE (нормированная среднеквадратичная ошибка) и тест на волатильность (справа не должно быть меньше чем слева).

Потом как будут силы, оформлю, выложу в кодобазу...

Массив структур SYMBOL хранит данные по всем символам, массив структур SYNTH - по синтетикам...

Массив element содержит ссылки (индексы) на символы...

Остальные элементы структур самоочевидны из их названий...

Функция задается в виде y = TrendCoeff * (x ^ TrendPower) соответственно можно делать тренд или рут или степенную...

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

К этому можно прикрутить свои торговые функции и логику сетапа (я специально этого здесь не касался потому что это отдельная тема)...

Это всё только касается каноничной классики баблокоса, то есть без наворотов ММ и прочего (сплиты там и т.п.)

Если кому-то будет полезно то буду рад, а если нет, то можете хулить😀


input int ModelBars=100;
input int ForwardBars=50;
input int BackwardBars=100;

input double TrendCoeff=-100;
input double TrendPower=1;

input double MaxNRMSE=0.1;
input double MinVolIndex=1;
input double MinCorrRate=0.01;


struct SYMBOL
  {
   string            name;
   double            ticksize;
   double            tickvalue;
   double            price[];
   string            base;
   string            profit;
   double            equity[];
  };

struct SYNTH
  {
   int               element[];
   double            volume[];
   double            equity[];
   double            RMSE;
   double            NRMSE;
   double            volmodel;
   double            volback;
   double            volindex;
  };

SYMBOL symbols[];
SYNTH synths[];

double datamodel[];

int MaxElements;
int MaxSymbols;
int MaxSynths;
int ibest;
int TotalBars;
int BarStart;
int BarFinish;


//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
void InitSymbols()
  {

   MaxElements=4;
   MaxSymbols=28;

   ArrayResize(symbols,MaxSymbols);

   symbols[00].name="AUDCAD";
   symbols[01].name="AUDCHF";
   symbols[02].name="AUDJPY";
   symbols[03].name="AUDNZD";
   symbols[04].name="AUDUSD";
   symbols[05].name="CADCHF";
   symbols[06].name="CADJPY";
   symbols[07].name="CHFJPY";
   symbols[08].name="EURAUD";
   symbols[09].name="EURCAD";
   symbols[10].name="EURCHF";
   symbols[11].name="EURGBP";
   symbols[12].name="EURJPY";
   symbols[13].name="EURNZD";
   symbols[14].name="EURUSD";
   symbols[15].name="GBPAUD";
   symbols[16].name="GBPCAD";
   symbols[17].name="GBPCHF";
   symbols[18].name="GBPJPY";
   symbols[19].name="GBPNZD";
   symbols[20].name="GBPUSD";
   symbols[21].name="NZDCAD";
   symbols[22].name="NZDCHF";
   symbols[23].name="NZDJPY";
   symbols[24].name="NZDUSD";
   symbols[25].name="USDCAD";
   symbols[26].name="USDCHF";
   symbols[27].name="USDJPY";

   for(int i=0; i<MaxSymbols; i++)
     {
      symbols[i].name   =SymbolPostfix+symbols[i].name+SymbolPostfix;
      symbols[i].base   =SymbolInfoString(symbols[i].name,SYMBOL_CURRENCY_BASE);
      symbols[i].profit =SymbolInfoString(symbols[i].name,SYMBOL_CURRENCY_PROFIT);
     }

   for(int i=0; i<MaxSymbols; i++)
      if(SymbolInfoInteger(symbols[i].name,SYMBOL_VISIBLE)==false)
        {
         Print("Symbol missing: "+symbols[i].name);
         ErrorFlag=true;
         return;
        }

   int data[];
   int count=0;

   while(GetCombo(data,MaxElements,MaxSymbols))
     {

      bool valid=true;

      for(int i=0; i<MaxElements; i++)
        {
         int count_base=0;
         int count_profit=0;

         for(int j=0; j<MaxElements; j++)
           {
            if(symbols[data[i]].base==symbols[data[j]].base)
               count_base++;
            if(symbols[data[i]].base==symbols[data[j]].profit)
               count_base++;
            if(symbols[data[i]].profit==symbols[data[j]].base)
               count_profit++;
            if(symbols[data[i]].profit==symbols[data[j]].profit)
               count_profit++;
           }

         if(count_base>1)
            valid=false;
         if(count_profit>1)
            valid=false;
        }

      if(valid)
        {
         count++;
         ArrayResize(synths,count);
         ArrayResize(synths[count-1].element,MaxElements);
         ArrayResize(synths[count-1].volume,MaxElements);
         for(int i=0; i<MaxElements; i++)
           {
            synths[count-1].element[i]=data[i];
            synths[count-1].volume[i]=0;
           }
        }

     }

   MaxSynths=count;

   Print(count," combinations generated");

  }
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
bool GetCombo(int& array[], int M, int N)
  {

   if(ArraySize(array) != M)
     {
      ArrayResize(array,M);
      for(int i = 0; i < M; i++)
         array[i] = i;
      return true;
     }

   for(int i = M - 1; i >= 0; i--)
      if(array[i] < N - M + i)
        {
         array[i]++;
         for(int j = i; j < M - 1; j++)
            array[j + 1] = array[j] + 1;
         return true;
        }

   return false;
  }
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
void GetPrices()
  {

   if(ErrorFlag)
      return;

   for(int i=0; i<MaxSymbols; i++)
      ArrayResize(symbols[i].price,TotalBars);

   for(int j=0; j<TotalBars; j++)
     {
      datetime time=iTime(_Symbol,_Period,j);
      for(int i=0; i<MaxSymbols; i++)
        {
         int shift=iBarShift(symbols[i].name,_Period,time);
         double close=iClose(symbols[i].name,_Period,shift);

         if(close==0)
           {
            Print("Error getting data for: ",symbols[i].name);
            ErrorFlag=true;
            return;
           }

         else
            symbols[i].price[j]=close;
        }
     }

   Print("Data collected for all symbols");

  }
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
void CalcEquity()
  {

   if(ErrorFlag)
      return;

   for(int i=0; i<MaxSymbols; i++)
     {
      ArrayResize(symbols[i].equity,TotalBars);
      symbols[i].ticksize=SymbolInfoDouble(symbols[i].name,SYMBOL_TRADE_TICK_SIZE);
      symbols[i].tickvalue=SymbolInfoDouble(symbols[i].name,SYMBOL_TRADE_TICK_VALUE);
     }

   for(int i=0; i<MaxSymbols; i++)
      for(int j=0; j<TotalBars; j++)
        {
         symbols[i].equity[j]=
            (symbols[i].price[j]-symbols[i].price[BarStart])
            /symbols[i].ticksize*symbols[i].tickvalue;
        }

   Print("Equity calculated for all symbols");

  }
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
void CalcModel()
  {

   if(ErrorFlag)
      return;

   ArrayInitialize(datamodel,0);

   for(int j=0; j<=BarStart; j++)
     {
      int x=BarStart-j;
      datamodel[j]=TrendCoeff*MathPow(x,TrendPower);
     }

   Print("Model function calculated");

  }
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
void CalcRegress()
  {

   if(ErrorFlag)
      return;

   CLinearModelShell shell;
   CLRReportShell report;
   CMatrixDouble datamatrix(ModelBars,MaxElements+1);

   int i,j,k,info;
   double roots[];
   ArrayResize(roots,MaxElements);

   for(k=0; k<MaxSynths; k++)
     {

      for(i=0; i<MaxElements; i++)
         for(j=0; j<ModelBars; j++)
            datamatrix[j].Set(i,symbols[synths[k].element[i]].equity[BarStart-j]);

      for(j=0; j<ModelBars; j++)
         datamatrix[j].Set(MaxElements,datamodel[BarStart-j]);

      CAlglib::LRBuildZ(datamatrix,ModelBars,MaxElements,info,shell,report);

      if(info<0)
        {
         Print("Error in regression model");
         ErrorFlag=true;
         return;
        }

      CAlglib::LRUnpack(shell,roots,MaxElements);

      for(i=0; i<MaxElements; i++)
         synths[k].volume[i]=roots[i];

      synths[k].RMSE=report.GetRMSError();
      synths[k].NRMSE=synths[k].RMSE/
                      MathAbs(datamodel[BarFinish]-datamodel[BarStart]);

     }

   Print("All regression models calculated");

  }
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
void CalcSynths()
  {

   if(ErrorFlag)
      return;

   for(int k=0; k<MaxSynths; k++)
     {
      ArrayResize(synths[k].equity,TotalBars);
      ArrayInitialize(synths[k].equity,0);

      for(int j=0; j<TotalBars; j++)
         for(int i=0; i<MaxElements; i++)
           {
            synths[k].equity[j]+=
               symbols[synths[k].element[i]].equity[j]*
               synths[k].volume[i];
           }
     }

  }
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
void TestNRMSE()
  {

   if(ErrorFlag)
      return;

   double min=DBL_MAX;

   for(int k=0; k<MaxSynths; k++)
      if(synths[k].NRMSE<min)
        {
         min=synths[k].NRMSE;
         ibest=k;
        }

   string formula="";
   for(int i=0; i<MaxElements; i++)
      formula += symbols[synths[ibest].element[i]].name + "=" +
                 DoubleToString(synths[ibest].volume[i],LotsDigits) + " ";
   Print(formula);

   Print("Best: ",ibest);
   Print("Start: ",iTime(_Symbol,_Period,BarStart));
   Print("Finish: ",iTime(_Symbol,_Period,BarFinish));
   Print("RMSE: ",synths[ibest].RMSE);
   Print("NRMSE: ",synths[ibest].NRMSE);

   if(synths[ibest].NRMSE<=MaxNRMSE)
      Print("Quality test passed");
   else
      ValidSetup=false;

  }
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
void TestVolIndex()
  {

   if(ErrorFlag)
      return;

   double model[];
   double backward[];

   ArrayResize(model,ModelBars);
   ArrayResize(backward,BackwardBars);

   for(int j=0; j<ModelBars; j++)
      model[j]=synths[ibest].equity[BarStart-j];

   for(int j=0; j<BackwardBars; j++)
      backward[j]=synths[ibest].equity[BarStart+j+1];

   synths[ibest].volmodel=MathStandardDeviation(model);

   synths[ibest].volback=MathStandardDeviation(backward);

   synths[ibest].volindex=
      synths[ibest].volmodel/MathStandardDeviation(backward);

   Print("Vol.model: ",synths[ibest].volmodel);
   Print("Vol.back: ",synths[ibest].volback);
   Print("Vol.index: ",synths[ibest].volindex);

   if(synths[ibest].volindex>=MinVolIndex)
      Print("Volatility test passed");
   else
      ValidSetup=false;

  }
 
transcendreamer #:

Ну ладно... приободрил... спасибо...

а то что ни день то новые финансовые ограничения и санкции (да сижу под санкциями блин неудобно как вышло)

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

и самое неприятное что есть еще такие которые всему этому радуются упыри какие-то...

а такие периоды даже шатается уверенность в человечестве и в телеологии логоса вообще...

иной раз думаешь что черт возьми хаос восторжествует и можно не беспокоиться...

но пока живы пророки мы не сдадимся хаосу...

слава баблокосу, магистрам слава!

🤠

P.S. желаю удачи со стартом этого нового проекта или пари которое вы наметили!

P.P.S. вернусь через некоторое время к этой теме

Да какой я пророк - просто ЛЮблю + Цифры(=Цифер)=ЛюЦифер = МАТеМАТиК ( матерюсь много )
Обычный "Карлсон" который живет на Крыше = Привидение с мо+тором ( ну или Молотом Тора = Мьёльнер ), не то что Клаус Шваб со Шваброй



( или Эндрю Карлсин )


Мож я вааще "жульничаю" как Эндрю Карлсин - тупо натырил из будущего информации и здесь модным ТУСом "прикидываюсь" )))
Как пел Михаил Круг "и не очко (=око) так губит, а к одиннадцати ТУС"...
 
transcendreamer #:

Если кому-то будет полезно то буду рад, а если нет, то можете хулить😀


Какой изощрённый тлен. Нет чтоб сразу на завод пойти.
 
transcendreamer #:

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

Это функции для генератора пучка всех возможных синтетиков и два фильтра: NRMSE (нормированная среднеквадратичная ошибка) и тест на волатильность (справа не должно быть меньше чем слева).

Потом как будут силы, оформлю, выложу в кодобазу...

Массив структур SYMBOL хранит данные по всем символам, массив структур SYNTH - по синтетикам...

Массив element содержит ссылки (индексы) на символы...

Остальные элементы структур самоочевидны из их названий...

Функция задается в виде y = TrendCoeff * (x ^ TrendPower) соответственно можно делать тренд или рут или степенную...

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

К этому можно прикрутить свои торговые функции и логику сетапа (я специально этого здесь не касался потому что это отдельная тема)...

Это всё только касается каноничной классики баблокоса, то есть без наворотов ММ и прочего (сплиты там и т.п.)

Если кому-то будет полезно то буду рад, а если нет, то можете хулить😀

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

Опять же, можно создать новое направление современного искусства - рисование посредством эквити портфелей) Для популяризации направления следует начать с эротических изображений)

y=f(x)

 
Aleksey Nikolayev #:

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

Опять же, можно создать новое направление современного искусства - рисование посредством эквити портфелей) Для популяризации направления следует начать с эротических изображений)


Сиськи это круто - сразу видно "системный подход" )))

 
James Doe

Sherlock is back?

 
Aleksey Nikolayev #:

Sherlock is back?

Who is Sherlock? Who is you?!
 
Alexandr Krivoshey #:
Сиськи это круто - сразу видно "системный подход" )))

Все мы немножко сисадмины)

 
transcendreamer #:

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

Это функции для генератора пучка всех возможных синтетиков и два фильтра: NRMSE (нормированная среднеквадратичная ошибка) и тест на волатильность (справа не должно быть меньше чем слева).

Потом как будут силы, оформлю, выложу в кодобазу...

Массив структур SYMBOL хранит данные по всем символам, массив структур SYNTH - по синтетикам...

Массив element содержит ссылки (индексы) на символы...

Остальные элементы структур самоочевидны из их названий...

Функция задается в виде y = TrendCoeff * (x ^ TrendPower) соответственно можно делать тренд или рут или степенную...

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

К этому можно прикрутить свои торговые функции и логику сетапа (я специально этого здесь не касался потому что это отдельная тема)...

Это всё только касается каноничной классики баблокоса, то есть без наворотов ММ и прочего (сплиты там и т.п.)

Если кому-то будет полезно то буду рад, а если нет, то можете хулить😀




в коде слов конечно много, но это местная традиция

единственное, напрягло :


Слово "base" собираются закейвордить ???

matrix, vector видимо показалось мало...

 
James Doe #:
Who is Sherlock? Who is are you?!

Ok, NotSherlock