В поисках священной "граали"... - страница 9

 
Hoper23 >>:
Проблема в том, что цель задачи предельна ясна, но смутно представляется возможность его реализации на языке MQL, так как с функцией встроенного массива тестера-оптимизатора  я пока не знаком. Сейчас пытаюсь перечитать юзырсмануал на MQL, но пока не нахожу этого блока. А вот самопальный оптимизатор от thecore не то что бы не вселяет доверия, просто немного не понятен. Там переменные как то помороченно постоенны, анотации нет и в корне расходятся в работоспособной версией из ранее предложенной ссылки. Если не сложно, уважаемый thecore, поясни свою точку зрения оптимизатора, тока так, что бы можно было впихнуть все 19 параметров и автозамену результатом.

Мне странно это слышать от программиста, но постараюсь разложить по полочкам (не разжевать):

1. Предположим у Вас есть некая функция с N количеством входных параметров

Function(n1,n2,..,n19);

2.Параметры 

n1 изменяется от n1Min до n1Max с шагом n1Step

....

n19 изменяется от n19Min до n19Max с шагом n19Step


Вам нужно:

- Перебрать все (для линейного способа) входящие параметры или не все (для способа быстрого схождения) входящие параметры.

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

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

- Вам нужно написать блок анализа этих результатов, который будет принимать решение о том, насколько этот результат 

хорош.

Я так понимаю, у Вас вызывает затруднение блок анализа. Потому, что если Вы не знаете, как написать функцию или как 

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

основы программирования.

Что делает блок анализа:

1.Он берет самый старый бар BAR_Y, которые, вы хотите анализировать, и подсовывает текущие на момент Y данные в вашу

функцию. Т.е. ваша функция думает, что BAR_Y - это TimeCurrent.

2.Теперь берем столько баров в глубину истории, сколько брала бы Ваша Function(n1,n2,..,n19) если бы она была на баре 0.

и получаем какой то результат.

Например, Ваша стратегия ищет по iMA3,iMA2,iMA1 экстремум. Тогда мы имеем iMA_Y+2,iMA_Y+1,iMA_Y

Если это точка экстремума - останавливаемся, если нет делаем Y++;

OK. Мы нашли точку экстремума в месте t, т.е. iMAt+2,iMAt+1,iMAt

3.Теперь нам нужно вычислить, что сработает TP или SL

Т.е. от точки t делаем шаг в сторону уменьшения баров t-1 и анализируем расстояние от Open[t] до High[t] и до Low[t],

а потом от Open[t] до High[t-1] и до Low[t-1], если не наступили TP или SL идем дальше - берем t-2 и так пока не сработает

TP или SL или вместе.

Это мы нашли ПЕРВОЕ условие для Function(n1,n2,..,n19).

Сохраняем результат,

Дальше делаем t-- и проделываем операцию анализа до бара 0.

4.Сдвигаем Y-- и повторяем процесс.

Таким образом, мы находим все срабатывания нашей функции Function(n1,n2,..,n19) до текущего момента.

5.Анализируем текущим момент и смотрим, были ли подобные ситуации в прошлом и чем они закончились.

6.Сохраняем результат.

7.Берем следующий набор параметров n1,,n19 для Function(n1,n2,..,n19) и проверяем его

8.так повторяем до тех пор, пока не закончатся параметры.

9.Выбираем наилучший набор параметров или несколько наборов и в соответствии с их рекомендацией выставляем BUY, SELL или

ничего не делаем.

Вот и все.

Надеюсь, получилось сложно, потому, что это ДЕЙСТВИТЕЛЬНО сложно.


 
Hoper23 >>:
Проблема в том, что цель задачи предельна ясна, но смутно представляется возможность его реализации на языке MQL, так как с функцией встроенного массива тестера-оптимизатора  я пока не знаком. Сейчас пытаюсь перечитать юзырсмануал на MQL, но пока не нахожу этого блока. А вот самопальный оптимизатор от thecore не то что бы не вселяет доверия, просто немного не понятен. Там переменные как то помороченно постоенны, анотации нет и в корне расходятся в работоспособной версией из ранее предложенной ссылки. Если не сложно, уважаемый thecore, поясни свою точку зрения оптимизатора, тока так, что бы можно было впихнуть все 19 параметров и автозамену результатом.

Кстати, не начинайте с блока перебора значений - его написать значительно проще, чем анализатор.

И, если все мной изложенное покажется Вам слишком сложным поищите авто оптимизатор от xeon.

Он использует оптимизатор MetaTrader-а. Не ищите встроенной функции автооптимизации. Ее нет.

 
Figar0 >>:

Вот здесь есть индикатор klot'a с ГА оптимизатором встроеным в индикатор.

Я думаю до генетического анализа Hoper23 не дойдет не зависмо от того битая ссылка или нет.

Тем более, что она не битая.

 

thecore==>по вашему рассуждению, так же как и по моему, получается for(S = Sstart; S <= Send; S += Sstep), ну, в общих чертах. Вот что у меня получилось

void Optimization()
{
 int StartBar = iBarShift(Symbol(), 0, TimeCurrent()-60*(EndDate+OptimDuration));
 int EndBar = iBarShift(Symbol(), 0, TimeCurrent()-60*EndDate);
 int Count = 0;
 double CurRF = -999999;
 ArrayInitialize(EqualProfit, 0);
 ArrayInitialize(TransCount, 0);
 ArrayInitialize(MaxDrowDown, 0);
 for(S = Sstart; S <= Send; S += Sstep)
 for(O = Ostart; O <= Oend; O += Ostep)
 for(I = Istart; I <= Iend; I += Istep)
 for(G = Gstart; G <= Gend; G += Gstep)
 for(M = Mstart; M <= Mend; M += Mstep)
 for(CC = CCstart; CC <= CCend; CC += CCstep)
 for(CCI = CCIstart; CCI <= CCIend; CCI += CCIstep)
 for(F_EMA = F_EMAstart; F_EMA <= F_EMAend; F_EMA += F_EMAstep)
 for(S_EMA = S_EMAstart; S_EMA <= S_EMAend; S_EMA += S_EMAstep)
 for(SMA = SMAstart; SMA <= SMAend; SMA += SMAstep)
 for(stK = stKstart; stK <= stKend; stK += stKstep)
 for(stP = stPstart; stP <= stPend; stP += stPstep)
 for(stD = stDstart; stD <= stDend; stD += stDstep)
 for(W = Wstart; W <= Wend; W += Wstep)
 for(H = Hstart; H <= Hend; H += Hstep)
 for(C = Cstart; C <= Cend; C += Cstep)
 for(Skill = Skillstart; Skill <= Skillend; Skill += Skillstep)
 for(SkillMAX = SkillMAXstart; SkillMAX <= SkillMAXend; SkillMAX += SkillMAXstep)
 for(shirina = shirinastart; shirina <= shirinaend; shirina += shirinastep)
   {
    int CurTrans =0;
    double CurOpenPrice = 0;
    int EqualMax = 0;
    int EqualMin = 0;
     for(int i = StartBar; i >= EndBar; i--)
      {
       EqualMin = MathMin(EqualProfit[Count], EqualMin);
       if(EqualProfit[Count] > EqualMax)
        {
         MaxDrowDown[Count] = MathMax(MaxDrowDown[Count], EqualMax-EqualMin);
         EqualMax = EqualProfit[Count];
         EqualMin = EqualMax;
        }
        MaxDrowDown[Count] = MathMax(MaxDrowDown[Count], EqualMax-EqualMin);
    if(EqualProfit[Count] != 0)
     if(CurRF < MaxDrowDown[Count]/EqualProfit[Count])
      {
       CurRF = MaxDrowDown[Count]/EqualProfit[Count];
       int Num = Count;
       int BestS = S;
       int BestO = O;
       int BestI = I;
       int BestG = G;
       int BestM = M;
       int BestCC = CC;
       int BestCCI = CCI;
       int BestF_EMA = F_EMA;
       int BestS_EMA = S_EMA;
       int BestSMA = SMA;
       int BeststK = stK;
       int BeststP = stP;
       int BeststD = stD;
       int BestW = W;
       int BestH = H;
       int BestC = C;
       int BestSkill = Skill;
       int BestSkillMAX = SkillMAX;
       int Bestshirina = shirina;

        }
     
    Count++;
   } // Цикл переменных 
 
   
 Alert("Оптимизация завершена. Прибыль max ", EqualProfit[Num]," пунктов. Сделок ", TransCount[Num], ". Просадка ", MaxDrowDown[Num]);
 Alert("Параметры: S = ", BestS, ", O = ", BestO, ", I = ", BestI, ", G = ", BestG, ", M = ", BestM, ", CC = ", BestCC, ", CCI = ", BestCCI,
  ", F_EMA = ", BestF_EMA, ", S_EMA = ", BestS_EMA, ", SMA = ", BestSMA, ", stK = ", BeststK, ", stP = ", BeststP, ", stD = ",BeststD,
   ", W = ", BestW, ", H = ", BestH, ", C = ", BestC, ", Skill = ", BestSkill, ", SkillMAX = ", BestSkillMAX, ", shirina = ", Bestshirina);
 LastOptim = TimeCurrent();
 GlobalVariableSet("LastOptimization", LastOptim);
 if(CurRF < 0)
  if(MessageBox("Фактор восстановления меньше нуля./nПринимать данные оптимизированные параметры?", "Вопрос", MB_YESNO) == IDNO) 
    return;    
        BestS = S;
        BestO = O;
        BestI = I;
        BestG = G;
        BestM = M;
        BestCC = CC;
        BestCCI = CCI;
        BestF_EMA = F_EMA;
        BestS_EMA = S_EMA;
        BestSMA = SMA;
        BeststK = stK;
        BeststP = stP;
        BeststD = stD;
        BestW = W;
        BestH = H;
        BestC = C;
        BestSkill = Skill;
        BestSkillMAX = SkillMAX;
        Bestshirina = shirina;

 GlobalVariableSet("AutoS", S);
 GlobalVariableSet("AutoO", O);
 GlobalVariableSet("AutoI", I);
 GlobalVariableSet("AutoG", G);
 GlobalVariableSet("AutoM", M);
 GlobalVariableSet("AutoCC", CC);
 GlobalVariableSet("AutoCCI", CCI);
 GlobalVariableSet("AutoF_EMA", F_EMA);
 GlobalVariableSet("AutoS_EMA", S_EMA);
 GlobalVariableSet("AutoSMA", SMA);
 GlobalVariableSet("AutostK", stK);
 GlobalVariableSet("AutostP", stP);
 GlobalVariableSet("AutostD", stD);
 GlobalVariableSet("AutoW", W);
 GlobalVariableSet("AutoH", H);
 GlobalVariableSet("AutoC", C);
 GlobalVariableSet("AutoSkill", Skill);
 GlobalVariableSet("AutoSkillMAX", SkillMAX);
 GlobalVariableSet("Autoshirina", shirina);
Дальше стопор - не знаю как зафиксировать положительный результат и подставить автоматом в переменную.
 
Hoper23 писал(а) >>

Ыыыыы..... "Ссылка, по которой вы попали на эту страницу является «мертвой» или удаленной." Ништяк направление!!! Чем то похоже на направление - иди на х...й. (без обид, так, в прикол)

Вот она благодарность), мне за ссылку, klot'y за фактически готовое решение на блюде), там тебе и тестер и оптимизатор, только немного подправь под свои нужды... И все открывается.

 

Отвечаю не открывается!!!


 
Hoper23 >>:

thecore==>по вашему рассуждению, так же как и по моему, получается for(S = Sstart; S <= Send; S += Sstep), ну, в общих чертах. Вот что у меня получилось

1.Не пытайтесь решить задачу в лоб.

Зачем Вам сохранять ВСЕ варианты всех возможных решений.

Вы же не математическую задачу решаете. Вы ищете на истории ситуацию подобную той, которая у Вас 

сегодня и сейчас сложилась, чтобы принять решение, что делать.

Поэтому, сначала опишите текущую ситуацию и ищите конкретно ее.

Это сократит количество проходов, переменных и результатов в РАЗЫ.

Дальше стопор - не знаю как зафиксировать положительный результат и подставить автоматом в переменную.

На первом этапе я сохранял в файл. Получалось на истории порядка 10,000-50,000 выигрышных вариантов.

потом анализировал в Excel. 

2.Не ищите точное совпадение. Мы же не синусоиду описываем.

3.Напишите сначала блок сбора данных для ОДНОЙ переменной, отладьте, а потом добавите еще 18 или сколько там их у Вас.

 

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

Combination = MathFloor((L1End-L1Start)/L1Step)*MathFloor((L2End-L2Start)/L2Step);
 

Вот эта гадость призвана оптимизировать в автономном режиме

extern int setWeek   = 0;          //День недели старта оптимизации
extern int setHour   = 02;         //Час старта оптимизации
extern int setMinute = 25;         //Минута старта оптимизации
extern int ProgNumber= 2;          //номер программы оптимизации
extern bool OptimStart=false;
extern bool report=false;
#include <MacroAutoOptimization.mqh> 


int init() {


 if(IsOptimization()){
    string Str;
    int Cmd,Step,HandleStep;    
    HandleStep=FileOpen("ExpertMessage.csv", FILE_CSV|FILE_READ|FILE_WRITE,0x7F);
    if(HandleStep>0){
       Str  = FileReadString(HandleStep);
       Cmd  = StrToInteger(StringSubstr(Str,0,StringFind(Str,";",0)));
       Step = StrToInteger(StringSubstr(Str,StringFind(Str,";",0)+1,StringLen(Str)-StringFind(Str,";",0)-1))+1;
       FileSeek(HandleStep,0,SEEK_SET);
       FileWrite(HandleStep,Cmd+";"+Step);
       FileClose(HandleStep);
  }} 

  
   return(0);
  }


int deinit()
  {
   Comment("Привет!");
   return(0);
  }

int start()
{

 if(IsOptimization()==false && IsTesting()==false){
        double Itog[][17];
        int TecWeek=TimeDayOfWeek(TimeLocal());
        int TecHour=TimeHour(TimeLocal());
        int TecMinute=TimeMinute(TimeLocal());
        if(!OptimStart){  
           if(TecWeek==setWeek){  
              if(TecHour==setHour){ 
                 if(TecMinute>=setMinute && TecMinute<setMinute+4){ 
                    if(AutoStart(ProgNumber,Itog)<0){Print("Оптимизация завершилась неудачей!");}
                    deinitialization();
                    OptimStart=true;
                    report=true;
        }}}}
        if(TecHour!=setHour){OptimStart=false;}              //Обнуление флага старта оптимизации
        if(ArrayRange(Itog,0)>0){
//         Переменные для оптимизации
           stK     = Itog[0][7];
           stP   = Itog[0][8];
           stD  = Itog[0][9];
           W = Itog[0][10];
           H  = Itog[0][11];
           C  = Itog[0][12];
           CCI  = Itog[0][13];
           F_EMA  = Itog[0][14];
           S_EMA  = Itog[0][15];
           SMA  = Itog[0][16];
           shirina  = Itog[0][17];
           S  = Itog[0][18];
           O  = Itog[0][19];
           I  = Itog[0][20];
           M  = Itog[0][21];
           G  = Itog[0][22];
           CC  = Itog[0][23];
           if(report){
              Print("Новые параметры ",stK," | ",stP," | ",stD," | ",W," | ",H," | ",C," | ",CCI," | ",F_EMA," | ",S_EMA," | ",SMA," | ",shirina," | ",S," | ",O," | ",I," | ",M," | ",G," | ",CC);
              report=false;
     }}}   

К ней идет библа

бла-бла-бла

А к ней еще библа

бла-бла-бла

И НИХРЕНА ОНА НЕ РОБИТ...точнее что то сумбурное сама с собой мутит, чета проц напрягает, но никаких изменений в переменных и что то шустро все делает - пара секунд и все. НЕ пойму.
 
Hoper23 >>:

Вот эта гадость призвана оптимизировать в автономном режиме

К ней идет библа

А к ней еще библа

И НИХРЕНА ОНА НЕ РОБИТ...точнее что то сумбурное сама с собой мутит, чета проц напрягает, но никаких изменений в переменных и что то шустро все делает - пара секунд и все. НЕ пойму.



Вы начали работать с автооптимизатором от xeon

TestCommander (autooptimization) Инструмент трейдера

так у него и спрашивайте. 

Кстати, этот продукт уже платный, если я правильно помню.

В нем есть help, там все доходчиво объясняется. 

Причина обращения: