MQL4 - automated forex trading   /  

Форум

автооптимизатор

К списку тем  | 1 2 3 4 5 6 7 Авторизуйтесь или зарегистрируйтесь, чтобы создать новую тему

avatar
1774
xeon 06.12.2006 00:24 

Хочу вынести на суд форумчан свою первую работу.


Есть предположение что эксперт с подогнанными под историю параметрами будет первое время
(пуст и достаточно небольшое) прибыльно торговать. Идея проверить это предположение родилась на форуме
в ветке "Идеальная механическая торговая система" основной принцп состоит в том что-бы
каждые сутки в указанное время запускалась оптимизация и полученные после
оптимизации параметры автоматом записывались в переменные советника.
Для реализации этой идеи я решил взять готового советника "MACD Sample" из пакета мт4 и
вставить в него свою функцию реализующее задуманное.

так появился этот автоопримизатор.

Сразу хочу оговорится - эта работа у меня первая, язык я изучал всего месяц а на С++
раньше мне программировать не доводилось.
Так что прошу сильно ногами не пинать и головой об пол не бить :).
Описание работы

-работа автооптимизатора начинаятся с подключения внешней dll входящей в состав windows
она нужна для копирования файлов в каталог оптимизатора и обратно, а так-же для
запуска терминала тестера с параметрами оптимизации.
-далее определяем все необходимые переменные (даны подробные коментарии в программе)
-следующим шагом сформируем ini файл с параметрами для тестера, запишем параметры в массив и выгрузим в файл
-потом этот ini файл скопируем в папку тестера чтобы он смог к нему добраться и прочитать
-далее запускаем тестер и ждем окончания оптимизации (если отимизация будет происходить слишком долго то нужно
увеличить время ожидания в переменной TimeOut)
-после окончания оптимизации сформированный тестером файл отчета скопируем его назад в папку с экспертом
-потом считаем из файла строки в массив и начнем их обрабатывать.
-после считывания файл удалим, чтоб не плодить лишние копии.
-следующим шагом вытащим из строк текста нужные нам цыфры, тоесть:
количество сделок, Общую прибыль, прибыльность, матожидание, а также значения переменнх
которые мы оптимизировали.
-далее необходимо выбрать лучшие параметры из полученных и записать их в качестве текущих для дальнейшей работы
для этого отсортируем массив с данными в порядке очередности заданным в переменных в разделе "приоритеты Фильтрации"
постепенно отсеивая неподходящие значения.
Осталось записать отсеенные значения в заданные в начале переменные.

//------------------------------ Имена переменных для оптимизации---------------------
string Per1          = "FastEMA";
string Per2          = "SlowEMA";
string Per3          = "TakeProfit";
string Per4          = "TrailingStop";
//-------------------------------------------
extern double TimeTest = 23.45;             //Время запуска оптимизации
extern int TestDay     = 5;                 //Количество дней для тестирования
int Flag;
//-------------------------------------------
 
#import  "shell32.dll"                       //Подключим dll (входит в состав windows)       
  int ShellExecuteA(int hwnd,string lpOperation,string lpFile,string lpParameters,string lpDirectory,int nShowCmd); 
#import
//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~



article

Месяц регистрации позади

С начала регистрации прошел месяц. Больше тысячи человек зарегистрировались для участия в Чемпионате.


avatar
1774
xeon 06.12.2006 00:28 

/

//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
//--------------------------------------- Локальные переменные -----------------------------------------------------
void Tester()
    {
string NameMTS         = "MACD Sample2.1";                                 //Имя советника
string NameFileSet     = "MACDSample2.1.set";                              //Имя set файла для тестера
string PathTerminal    = TerminalPath()+"\experts\files";                  //Путь к терминалу 
string PathTester      = "D:\Program Files\MetaTrader - Masterforex";      //Путь к тестеру
string FileOptim       = "optimise.ini";                                   //Имя ini файла для тестера
string FileOptim1      = "\optimise.ini";                                  
datetime DeyStart      = TimeLocal()-86400*TestDay;                        //Расчет даты старта
datetime DeyStop       = TimeLocal();                                      //Расчет даты старта
string DateStart       = TimeToStr(DeyStart,TIME_DATE);                    //Дата напчала оптимизации
string DateStop        = TimeToStr(DeyStop,TIME_DATE);                     //Дата окончания оптимизации
string FileReport      = "FileReport_"+Symbol()+"_"+DateStop+".htm";       //Имя файла отчета тестера
string FileReport1     = "\FileReport_"+Symbol()+"_"+DateStop+".htm";
int    KvoPptk         = 10;                                               //Количество попыток скопировать файл отчета
int    TimeOut         = TestDay*35000;  // (сек * кво дней)                 Время ожидания окончания работы оптимизатора
//-------------------------------- Автоустановка периода ------------------------------
string Per;
 
if(Period()==PERIOD_M1) {Per = "M1";}
if(Period()==PERIOD_M5) {Per = "M5";}
if(Period()==PERIOD_M15){Per = "M15";}
if(Period()==PERIOD_M30){Per = "M30";}
if(Period()==PERIOD_H1) {Per = "H1";}
if(Period()==PERIOD_H4) {Per = "H4";}
 
//------------------------ Расставим приоритеты Фильтрации ----------------------------
double MinTrades       = TestDay-3;                                        //Минимальное количество сделок
int Gross_Profit       = 3;                                                //Общая прибыль
int Profit_Factor      = 1;                                                //Прибыльность 
int Expected_Payoff    = 2;                                                //Мат ожидание
 //----------------------
int StepRes            = TestDay*10;                                       //Количество строк для сортировки
 
//-------------------------------Прочие промежуточные переменные------------------------
int    copyini;
int    start;
int    opttim;
int    file;
int    Pptk;
int    OptimArraySize;
int    P1,P2,P3,P4,P1k,P2k,P3k,P4k;
int    ClStep,ClStepRazm,GrProf,GrProfRazm,TotTrad,TotTradRazm,ProfFact,ProfFactRazm,ExpPay,ExpPayRazm;
int    text;
int    index;
int    kol;
int    NumberStr;
int    NumStr;
int    test;
int    GrosPr;
int    ResizeArayNew;
int    PrCycle;
 
double kol1,kol2,kol3,kol4,kol5,kol6,kol7,kol8,kol9;
double TotalTradesTransit;
double PrFactDouble;
double Prior1, Prior2, Prior3, transit, transit1, transit2, transit3, transit4;
double NewPrior, NewPrior1, NewPrior2, NewPrior3, Sort, SortTrans;
 
string FileLine; 
string ini;
string CycleStep,GrossProfit,TotalTrades,ProfitFactor,ExpectedPayoff;
string Perem1,Perem2,Perem3,Perem4; 
string select;
 
//----------------------------------- Подготовим массивы -------------------------
string ArrayOpttim[15]; 
string ArrayStrg[10]; 
double ArrayData[10][9]; 
double ArrayTrans[10][9];
 
//------------------------------Подготовим ini файл для оптимизации----------------
                           
           ArrayOpttim[0] = ";optimise strategy tester";             
           ArrayOpttim[1] = "ExpertsEnable=false";                        //Вкл/Выкл эксперты
           ArrayOpttim[2] = "TestExpert="+NameMTS;                        //Наименование файла эксперта
           ArrayOpttim[3] = "TestExpertParameters="+NameFileSet;          //Наименование файла с параметрами
           ArrayOpttim[4] = "TestSymbol="+Symbol();                       //Инструмент
           ArrayOpttim[5] = "TestPeriod="+Per;                            //Период
           ArrayOpttim[6] = "TestModel=0";                                //Режим моделирования
           ArrayOpttim[7] = "TestRecalculate=true";                       //Пересчитать
           ArrayOpttim[8] = "TestOptimization=true";                      //Оптимизация
           ArrayOpttim[9] = "TestDateEnable=true";                        //Использовать дату
           ArrayOpttim[10]= "TestFromDate="+DateStart;                    //Дата начала тестирования
           ArrayOpttim[11]= "TestToDate="+DateStop;                       //Дата окончания тестирования
           ArrayOpttim[12]= "TestReport="+FileReport;                     //Имя файла отчета
           ArrayOpttim[13]= "TestReplaceReport=true";                     //Перезапись файла отчета
           ArrayOpttim[14]= "TestShutdownTerminal=true";                  //Закрыть терминал по завершению
           
//------------------------------- Запишем данные в ini файл --------------------------                 
  
  OptimArraySize=ArraySize(ArrayOpttim);                                  //Выясним размер массива
  opttim=FileOpen(FileOptim,FILE_CSV|FILE_WRITE,0x7F);                    //Откроем фал для записи
  if(opttim>0)
    {
     for(int i=0; i<OptimArraySize; i++)
        {
         ini=ArrayOpttim[i];                                              //из массива в переменную
         FileWrite(opttim, ini);                                          //из переменной в файл
        } 
         FileClose(opttim);                                               //закроем файл
    }
  
//-------------------------- скопируем ini файл в песочницу тестера ----------
    copyini = ShellExecuteA(0,"Open","xcopy","\""+PathTerminal+FileOptim1+"\" \""+PathTester+"\" /y","",3);
    Sleep(1000);                                                   //подождем секундочку
    if(copyini<0){Alert("Не удалось скопировать ini файл");Print("Неудалось скопировать файл "+FileOptim);return(0);}
   
//---------------------------------- Запустим Тестер -------------------------
    start   = ShellExecuteA(0,"Open","terminal.exe",FileOptim,PathTester,3);
    if( start<0){Print("Неудалось запустить тестер "); return(0);}
//------------------------ скопируем файл отчета в песочницу терминала -------
     Sleep(TimeOut);                                              //подождем окончания оптимизации
     for(Pptk=0;Pptk<KvoPptk;Pptk++)
         {
          ShellExecuteA(0,"Open","xcopy","\""+PathTester+FileReport1+"\" \""+PathTerminal+"\" /y","",3);
          Sleep(6000);                                             //подождем
          file=FileOpen(FileReport,FILE_READ,0x7F);                //Откроем файл отчета для чтения
             
          if(file<0)
            {  
             Sleep(6000);                                          //ещё подождем
            }
          else break;             
          }
      if(file<0){Alert("Не удалось скопировать файл отчета");Print("Неудалось скопировать файл "+FileReport);return(0);}
 
//---------------- Чтение из файла в массив ----------------------------------
   while(FileIsEnding(file)==false)                                //Пока не наступил конец файла - цикл
        {
         FileLine=FileReadString(file);                            //Прочитаем строку из файла отчета
         index=StringFind(FileLine, "title", 20);                  //Найдем нужную строку и установим точку отсчета
         if(index>0)
              {
               ArrayResize(ArrayStrg,NumStr+1);                    //Увеличиваем размер массива
               ArrayStrg[NumStr]=FileLine;                         //Записываем в массив строки из файла
               NumStr++;
              }
          }
          
    FileClose(file);                                               //Закроем файл
    FileDelete(FileReport);                                        //Удалим файл чтоб не плодить копии
    
    ArrayResize(ArrayData,NumStr);                                 //Установим размер массива по количеству считанных из файла строк
    for(text=0;text<NumStr;text++)
       {
        select=ArrayStrg[text]; 
 
//-------------------------------------------------------------------------
//                    Обработка текста отчета  (Отделяем мух от котлет)       
        //---------------------Позиция Проход-----------------------------
        ClStep=StringFind(select, "; \">",20)+4;                                       //Найдем начало позиции
        ClStepRazm=StringFind(select, "</td>",ClStep);                                 //Найдем конец позиции
        CycleStep = StringSubstr(select, ClStep, ClStepRazm-ClStep);                   //Считаем Сумму
        //---------------- Позиция Прибыль -------------------------------
        GrProf=StringFind(select, "<td>",ClStepRazm);                                  //Найдем начало позиции
        GrProfRazm=StringFind(select, "</td>",GrProf);                                 //Найдем конец позиции
        GrossProfit = StringSubstr(select, GrProf+4,GrProfRazm-(GrProf+4));            //Считаем Сумму
         //-------------Позиция Всего Сделок -----------------------------
        TotTrad=StringFind(select, "<td>",GrProfRazm);                                 //Найдем начало позиции
        TotTradRazm=StringFind(select, "</td>",TotTrad);                               //Найдем конец позиции
        TotalTrades = StringSubstr(select, TotTrad+4,TotTradRazm-(TotTrad+4));         //Считаем Сумму
        //-------------Позиция Прибыльность--------------------------------
        ProfFact=StringFind(select, "<td>",TotTradRazm);                               //Найдем начало позиции
        ProfFactRazm=StringFind(select, "</td>",ProfFact);                             //Найдем конец позиции
        ProfitFactor = StringSubstr(select, ProfFact+4,ProfFactRazm-(ProfFact+4));     //Считаем Сумму
       //-------------Позиция Мат Ожидание---------------------------------
        ExpPay=StringFind(select, "<td>",ProfFactRazm);                                //Найдем начало позиции
        ExpPayRazm=StringFind(select, "</td>",ExpPay);                                 //Найдем конец позиции
        ExpectedPayoff = StringSubstr(select, ExpPay+4,ExpPayRazm-(ExpPay+4));         //Считаем Сумму
      
        //------------------------------------------------------------------
        
        //-------------Позиции переменных----------------------------------------
        P1=StringFind(select, Per1,20);                                                //Найдем начало позиции
        P1k=StringFind(select, ";",P1);                                                //Найдем конец позиции
        Perem1 = StringSubstr(select,P1+StringLen(Per1)+1,P1k-(P1+1+StringLen(Per1))); //Считаем Переменную
        P2=StringFind(select, Per2,20);                                                //Найдем начало позиции
        P2k=StringFind(select, ";",P2);                                                //Найдем конец позиции 
        Perem2 = StringSubstr(select,P2+StringLen(Per2)+1,P2k-(P2+1+StringLen(Per2))); //Считаем Переменную
        P3=StringFind(select, Per3,20);                                                //Найдем начало позиции
        P3k=StringFind(select, ";",P3);                                                //Найдем конец позиции
        Perem3 = StringSubstr(select,P3+StringLen(Per3)+1,P3k-(P3+1+StringLen(Per3))); //Считаем Переменную
        P4=StringFind(select, Per4,20);                                                //Найдем начало позиции
        P4k=StringFind(select, ";",P4);                                                //Найдем конец позиции
        Perem4 = StringSubstr(select,P4+StringLen(Per4)+1,P4k-(P4+1+StringLen(Per4))); //Считаем Переменную
 //-----------------------Переведем в числовой формат----------------------------
       TotalTradesTransit=StrToDouble(TotalTrades);
       if(MinTrades < TotalTradesTransit         )                    //Отфильтруем по количеству сделок
           {
            PrFactDouble = StrToDouble(ProfitFactor);
            if(PrFactDouble==0){PrFactDouble=1000;}                    //Убираем 0 в прибыльности для правильного анализа
            ArrayData[text][0]=ResizeArayNew;
            ArrayData[text][1]=StrToDouble(GrossProfit);                                
            ArrayData[text][2]=TotalTradesTransit;
            ArrayData[text][3]=PrFactDouble;
            ArrayData[text][4]=StrToDouble(ExpectedPayoff);
            ArrayData[text][5]=StrToDouble(Perem1);
            ArrayData[text][6]=StrToDouble(Perem2);
            ArrayData[text][7]=StrToDouble(Perem3);
            ArrayData[text][8]=StrToDouble(Perem4);
            ResizeArayNew++; 
            }
       }
 
 //------------------------------Анализатор---------------------------------------------------------------      
   ArraySort(ArrayData,ResizeArayNew,0,MODE_DESCEND); 
   ArrayResize(ArrayTrans, ResizeArayNew-1);
           
   for(int PrioStep=1;PrioStep<4;PrioStep++)
      { 
       for(PrCycle=0;PrCycle<ResizeArayNew;PrCycle++)
          { 
           Sort     = ArrayData[PrCycle][0];
           Prior1   = ArrayData[PrCycle][1];             
           transit  = ArrayData[PrCycle][2];
           Prior2   = ArrayData[PrCycle][3];             
           Prior3   = ArrayData[PrCycle][4];             
           transit1 = ArrayData[PrCycle][5];
           transit2 = ArrayData[PrCycle][6];
           transit3 = ArrayData[PrCycle][7];
           transit4 = ArrayData[PrCycle][8]; 
        
           if(PrioStep==1)
             {
              //Подготовимся к 1 сортировке
              if(Gross_Profit   ==1){SortTrans=Prior1;}
              if(Profit_Factor  ==1){SortTrans=Prior2;}
              if(Expected_Payoff==1){SortTrans=Prior3;}
             }
 
           if(PrioStep==2)
             {
              //Восстановимся
              if(Gross_Profit   ==1){Prior1=Sort;}
              if(Profit_Factor  ==1){Prior2=Sort;}
              if(Expected_Payoff==1){Prior3=Sort;} 
              
              //Подготовимся ко 2 сортировке
              if(Gross_Profit   ==2){SortTrans=Prior1;}
              if(Profit_Factor  ==2){SortTrans=Prior2;}
              if(Expected_Payoff==2){SortTrans=Prior3;}
             }
           if(PrioStep==3)
             {
              //Восстановимся
              if(Gross_Profit   ==2){Prior1=Sort;}
              if(Profit_Factor  ==2){Prior2=Sort;}
              if(Expected_Payoff==2){Prior3=Sort;} 
              
              //Подготовимся к 3 сортировке
              if(Gross_Profit   ==3){SortTrans=Prior1;}
              if(Profit_Factor  ==3){SortTrans=Prior2;}
              if(Expected_Payoff==3){SortTrans=Prior3;}
             }          
    
           ArrayTrans[PrCycle][0] = SortTrans;
           ArrayTrans[PrCycle][1] = Prior1;
           ArrayTrans[PrCycle][2] = transit;
           ArrayTrans[PrCycle][3] = Prior2;
           ArrayTrans[PrCycle][4] = Prior3;
           ArrayTrans[PrCycle][5] = transit1;
           ArrayTrans[PrCycle][6] = transit2;
           ArrayTrans[PrCycle][7] = transit3;
           ArrayTrans[PrCycle][8] = transit4;
          }
          ArraySort(ArrayTrans,StepRes,0,MODE_DESCEND);               //Отсортируем массив
          ArrayResize(ArrayData,StepRes);                             //Обрежем лишнее
          ArrayResize(ArrayTrans,StepRes);                            //Обрежем лишнее
          for(int CopyAr=0;CopyAr<StepRes;CopyAr++)
             {
              ArrayData[CopyAr][0]=ArrayTrans[CopyAr][0];
              ArrayData[CopyAr][1]=ArrayTrans[CopyAr][1];
              ArrayData[CopyAr][2]=ArrayTrans[CopyAr][2];
              ArrayData[CopyAr][3]=ArrayTrans[CopyAr][3];
              ArrayData[CopyAr][4]=ArrayTrans[CopyAr][4];             
              ArrayData[CopyAr][5]=ArrayTrans[CopyAr][5];             //Per1    Переменная 1 
              ArrayData[CopyAr][6]=ArrayTrans[CopyAr][6];             //Per2    Переменная 2
              ArrayData[CopyAr][7]=ArrayTrans[CopyAr][7];             //Per3    Переменная 3
              ArrayData[CopyAr][8]=ArrayTrans[CopyAr][8];             //Per4    Переменная 4
 
             }
         
           StepRes=StepRes/2;
          }
//--------------------- Запись новых параметров в переменные --------
       FastEMA      = ArrayTrans[0][5];                               
       SlowEMA      = ArrayTrans[0][6];
       TakeProfit   = ArrayTrans[0][7];
       TrailingStop = ArrayTrans[0][8];
       
       Comment(Per1," ",FastEMA,"  | ",Per2," ",SlowEMA,"  | ",Per3," ",TakeProfit,"  | ",Per4," ",TrailingStop);
       Print(Per1," ",FastEMA,"  | ",Per2," ",SlowEMA,"  | ",Per3," ",TakeProfit,"  | ",Per4," ",TrailingStop);
 
     return;
 
      }  //Конец функции 
 
//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~



avatar
1774
xeon 06.12.2006 00:30 
//------------------- 1 раз в сутки оптимизируемся на истории и устанавливаем параметры --------------------------------
 
if(!IsOptimization()||!IsTesting())               // не запускать в режиме оптимизации и тестирования
  {  
   double TimeLoc = StrToDouble(TimeToStr(TimeLocal(),TIME_MINUTES))+(Minute()*0.01); //Текущее время
 
   if(Flag == 0 && TimeLoc >= TimeTest && TimeLoc < TimeTest+5){Flag = 1;Tester();}
   if(TimeLoc > TimeTest+0.15){Flag = 0;}            //если с момента запуска прошло больше 15 минут то обнулим флаг
   Comment(TimeLoc," <> ",TimeTest,"   ",TimeTest-TimeLoc,"\n",Per1," ",FastEMA,"  | ",Per2," ",SlowEMA,"  | ",Per3," ",TakeProfit,"  | ",Per4," ",TrailingStop);
 
  }
 
//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~


Инструкция по установке.

Итак для запуска нам потребуется:
1) пара терминалов МТ4 при этом на том где будем запускать оптимизацию должна
быть закачана история котировок на весь необходимый период.
Назовем их чтоб не путатся -"Терминал" и терминал-"Тестер"
Далее-
2) Скопируем файлы эксперта "MACD Sample2.1.mq4" и "MACD Sample2.1.ex4" в папки с экспертами - в папку где "терминал"
и в папку где терминал-"Тестер".
3) Запустим терминал-"Тестер", и запустим тестер стратегий, в свойствах эксперта нужно подготовить вариант оптимизации
(установить параметры переменных которые хотим оптимизировать не более - 4 переменных ) и сохранить в файл с именем - "MACDSample2. 1. set"
так же имена этих переменных нужно записать
в разделе -"Имена переменных для оптимизации" и в разделе "Запись новых параметров в переменные"
4) Теперь нужно в разделе "Локальные переменные" указать путь к терминал-"Тестер"у
для этого вместо строки "D:\Program Files\MetaTrader - Masterforex"; нужно написать путь к папке с установленным у вас
терминал-"Тестер"ом.
(Все эти сложности в подготовке связаны
1. с невозможностью работы с внешними файлами из эксперта
2. невозможностью одновременного запуска одного и того-же терминала)
Все теперь можно запускать эксперта "MACD Sample2.1.ex4" - как обычно повесив его на график.
при первом запуске эксперт сразу-же запустит терминал-"Тестер" проведет оптимизацию и полученные значения запишет в выбранные переменные
далее эксперт будет запускаться каждые сутки в указанное время
в левом верхнем углу можно увидеть текущие значения выбранных переменных, а так же текущее время, установленное
время проведения оптимизации.

ну и прикрепленный файл собственно

Прикрепленные файлы:
  MACDeSample2.1_1.mq4 (24.65 KB)

avatar
1276
chv 17.12.2006 21:46 

У нас с Вами в голове бродят похожие идеи - 'Кластер из терминалов MT4'.
Только способы реализации разные, а общая идея схожа - накопление данных об итогах тестирования.



avatar
863
solandr 17.12.2006 22:20 

Отличная конструктивная тема! Спасибо что поделились технологией! Многим может это понадобиться. Наверное как всё будет окончательно обкатано, то может быть статью сделаете? Она определённо обогатит раздел статей на этом сайте!


avatar
1774
xeon 17.12.2006 22:23 
да, и проблемы реализации похоже то-же )))

avatar
1774
xeon 17.12.2006 22:25 
solandr писал (а):

Отличная конструктивная тема! Спасибо что поделились технологией! Многим может это понадобиться. Наверное как всё будет окончательно обкатано, то может быть статью сделаете? Она определённо обогатит раздел статей на этом сайте!


Сначала мысль подобная была, но потом неувидев интереса форумчан к этой теме начала проходить ))

avatar
863
solandr 17.12.2006 22:48 
xeon писал (а):

Сначала мысль подобная была, но потом неувидев интереса форумчан к этой теме начала проходить ))

Необходимость автооптимизации постоянно всплывает то тут то там. В плане обкатки технология это является очень важным, поскольку решает эту проблему. Это как раз Вы и выполнили. Существует конечно же вопрос, касающийся её целесообразности. Но это уже вопрос самих торговых стратегий и решается разными трейдерами по разному. К примеру один из лидеров чемпионата Hendrick говорил что он считает целесообразным оптимизацию своего эксперта по последним 6-ти месяцам к примеру с дальнейшим пересчётом параметров с течением времени http://championship.mql4.com/2006/ru/news/47
Ну а Вы предоставляете трейдерам технологию по автоматиации этого дела! Это ведь здорово и заслуживает внимания!

avatar
954
rsi 17.12.2006 22:57 
solandr писал (а):
xeon писал (а):
... Сначала мысль подобная была, но потом неувидев интереса форумчан к этой теме начала проходить ))
... Ну а Вы предоставляете трейдерам технологию по автоматиации этого дела! Это ведь здорово и заслуживает внимания!
Поддерживаю. Тема интересная. Просто чаще пассивно присутствую на форуме. Таких слушателей, наверняка тут еще найдется.

avatar
1774
xeon 18.12.2006 16:23 
rsi писал (а):
solandr писал (а):
xeon писал (а):
... Сначала мысль подобная была, но потом неувидев интереса форумчан к этой теме начала проходить ))
... Ну а Вы предоставляете трейдерам технологию по автоматиации этого дела! Это ведь здорово и заслуживает внимания!
Поддерживаю. Тема интересная. Просто чаще пассивно присутствую на форуме. Таких слушателей, наверняка тут еще найдется.

Спасибо кончно за поддержку, а то уж я совсем было подумал что тема никому не интересная, но хотелось бы хоть какая то ответная реакция (хотя-бы обматерил бы кто-нибуть корявый код что ли :-) ), чем полное молчание, а то появляется неуверенность в том ли направлении движешся.

avatar
Модератор
33780
Rosh 18.12.2006 16:28 
Когда то в общаге был такой студент - Саша Перятинский. Учился он на мехмате и знал ее очень хорошо. Дипломную работу он написал не помню уже по какой теме, но помню, что когда он защищался, то его руководитель уехал на историческую родину (91-92 год где-то) . Так несмотря на это (отсутствие научного руководителя) , он защитил на отлично... по одной простой причине - его работу понимал только он и его быший руководитель :)

К списку тем   | 1 2 3 4 5 6 7  

Авторизуйтесь или зарегистрируйтесь, чтобы добавить комментарий