| / | Форум |
|
xeon
06.12.2006 00:24
Хочу вынести на суд форумчан свою первую работу.
так появился этот автоопримизатор. Сразу хочу оговорится - эта работа у меня первая, язык я изучал
всего месяц а на С++ -работа автооптимизатора начинаятся с подключения внешней dll
входящей в состав windows //------------------------------ Имена переменных для оптимизации--------------------- 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 //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
|
С начала регистрации прошел месяц. Больше тысячи человек зарегистрировались для участия в Чемпионате. |
|
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; } //Конец функции //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
|
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); } //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
Итак для запуска нам потребуется: ну и прикрепленный файл собственно |
|
chv
17.12.2006 21:46
У нас с Вами в голове бродят похожие идеи - 'Кластер из терминалов MT4'.
|
|
solandr
17.12.2006 22:20
Отличная конструктивная тема! Спасибо что поделились технологией! Многим может это понадобиться. Наверное как всё будет окончательно обкатано, то может быть статью сделаете? Она определённо обогатит раздел статей на этом сайте! |
|
xeon
17.12.2006 22:23
да, и проблемы реализации похоже то-же )))
|
|
xeon
17.12.2006 22:25
solandr писал (а): Отличная конструктивная тема! Спасибо что поделились технологией! Многим может это понадобиться. Наверное как всё будет окончательно обкатано, то может быть статью сделаете? Она определённо обогатит раздел статей на этом сайте! Сначала мысль подобная была, но потом неувидев интереса форумчан к этой теме начала проходить )) |
|
solandr
17.12.2006 22:48
xeon писал (а): Сначала мысль подобная была, но потом неувидев интереса форумчан к этой теме начала проходить )) Необходимость автооптимизации постоянно всплывает то тут то там. В плане обкатки технология это является очень важным, поскольку решает эту проблему. Это как раз Вы и выполнили. Существует конечно же вопрос, касающийся её целесообразности. Но это уже вопрос самих торговых стратегий и решается разными трейдерами по разному. К примеру один из лидеров чемпионата Hendrick говорил что он считает целесообразным оптимизацию своего эксперта по последним 6-ти месяцам к примеру с дальнейшим пересчётом параметров с течением времени http://championship.mql4.com/2006/ru/news/47 Ну а Вы предоставляете трейдерам технологию по автоматиации этого дела! Это ведь здорово и заслуживает внимания! |
|
rsi
17.12.2006 22:57
solandr писал (а): Поддерживаю. Тема интересная. Просто чаще пассивно присутствую
на форуме. Таких слушателей, наверняка тут еще найдется.xeon писал (а): ... Ну а Вы предоставляете трейдерам технологию по автоматиации
этого дела! Это ведь здорово и заслуживает внимания! ... Сначала мысль подобная была, но потом неувидев интереса форумчан
к этой теме начала проходить )) |
|
xeon
18.12.2006 16:23
rsi писал (а): solandr писал (а): Поддерживаю. Тема интересная. Просто чаще пассивно присутствую
на форуме. Таких слушателей, наверняка тут еще найдется.xeon писал (а): ... Ну а Вы предоставляете трейдерам технологию по автоматиации
этого дела! Это ведь здорово и заслуживает внимания! ... Сначала мысль подобная была, но потом неувидев интереса форумчан
к этой теме начала проходить )) Спасибо кончно за поддержку, а то уж я совсем было подумал что тема никому не интересная, но хотелось бы хоть какая то ответная реакция (хотя-бы обматерил бы кто-нибуть корявый код что ли :-) ), чем полное молчание, а то появляется неуверенность в том ли направлении движешся. |
33780 |
Rosh
18.12.2006 16:28
Когда то в общаге был такой студент - Саша Перятинский. Учился
он на мехмате и знал ее очень хорошо. Дипломную работу он написал
не помню уже по какой теме, но помню, что когда он защищался,
то его руководитель уехал на историческую родину (91-92 год где-то)
. Так несмотря на это (отсутствие научного руководителя) , он
защитил на отлично... по одной простой причине - его работу понимал
только он и его быший руководитель :)
|
Авторизуйтесь или зарегистрируйтесь, чтобы добавить комментарий