Открытый проект - тестер-оптимизатор своими силами

 
Появилась идея написать свой тестер в виде индикатора. Требование - при минимальных переделках советник должен подходить для обоих тестеров - штатного и самописного. Это достигается добавлением приставки my к стандартным константам и функциям. Оптимизация тоже вполне допустима.
Шаблон написал, необходимо реализовать торговые функции посредством написания собственных функций.
Кто спец - присоединяйтесь. Торговые функции через манипуляции массивами. Также нужны спецы по нанесению объектов на график - изображать стрелками/черточками уровни открытия, стопов и тейк-профитов.
Также необходимо организовать вывод в файл истории ордеров и числовых серий для открытия диаграмм в Excel'е. В общем, все по взрослому :)

Все в принципе продумал, но я не универсал.

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

//+------------------------------------------------------------------+
//|                                                   SelfTester.mq4 |
//|                      Copyright © 2005, MetaQuotes Software Corp. |
//|                                        http://www.metaquotes.net |
//+------------------------------------------------------------------+
#property copyright "Copyright © 2005, MetaQuotes Software Corp."
#property link      "http://www.metaquotes.net"

#property indicator_separate_window
#property indicator_buffers 3
#property indicator_color1 Red
#property indicator_color2 DarkBlue
#property indicator_color3 LawnGreen
//---- input parameters
extern int       mySpread=4;
extern int       BeginYear=2002;
extern int       BeginMonth=1;
extern int       BeginDay=1;
extern string    ReportName="report";
extern int       Param1=8;
extern int       Param2=13;
extern double    myDepo=10000.0;
extern double    mylots=0.1;
extern int       myTakeProfit=100.0;
extern int       myStopLoss=80.0;
extern int       myTrailingStop=20;
//---- buffers
double myBalance[];
double myEquity[];
double myProfit[];
//+------------------------------------------------------------------+
//| Custom indicator initialization function                         |
//+------------------------------------------------------------------+
int init()
  {
//---- indicators
   SetIndexStyle(0,DRAW_LINE);
   SetIndexBuffer(0,myBalance);
   SetIndexStyle(1,DRAW_LINE);
   SetIndexBuffer(1,myEquity);
   SetIndexStyle(2,DRAW_LINE);
   SetIndexBuffer(2,myProfit);
   double TradeOrdersArray[100][14];
   double ClosedOrdersArray[2000][14];
   int myOrdersTotal=0;
   double myOrderOpenPrice=0.0;
   double myOrderLots=0.0; 
   string myOrderComment=""; 
   int myOrderMagicNumber;
   int myOrderOpenTime;
   double myOrderProfit=0.0;
   double myOrderStopLoss=0.0;
   double myOrderTakeProfit=0.0;
   int myOrderTicket;
   int myOrderType; 

   int myOP_BUY=0;
   int myOP_SELL=1;
   int myOP_BUYLIMIT=2;
   int myOP_BUYSTOP=3;
   int myOP_SELLLIMIT=4;
   int myOP_SELLSTOP=5;
//----
   return(0);
  }
//+------------------------------------------------------------------+
//| Custor indicator deinitialization function                       |
//+------------------------------------------------------------------+
int deinit()
  {
//---- TODO: add your code here
   
//----
   return(0);
  }
//+------------------------------------------------------------------+
//| Custom indicator iteration function                              |
//+------------------------------------------------------------------+
int start()
  {
   int    counted_bars=IndicatorCounted();
//---- TODO: add your code here
   
//----
   return(0);
  }
//+------------------------------------------------------------------+




 
Что за крякозяблики появились - и сам не знаю. Будут желающие - выложу где-нибудь на другом форуме .
 
2 Rosh
Не совсем понятно, что ты хочешь сказать этой заготовкой. На мой взгляд, должен получиться набор функций, считающих профит и заодно отмечающий на графике места вхождений/стопов? А движок принятия решений у каждого будет свой?

И сразу пару советов:
extern int       BeginYear=2002


лучше заменить на

extern string       BeginDate="2002.01.01 18:00"


- сразу можно работать с конструкцией типа

Time[i] > StrToTime(BeginDate)



Да и наверно, такие штуки

double myOrderOpenPrice=0.0;
double myOrderLots=0.0; 


тоже будет удобнее хранить как

#define LOTS 0;
#define OPEN_PRICE 1;

double MyOrder[2] = {0.0, 0.0};
.....................
MyOrder[OPEN_PRICE] = Open[i];
.....................
 


но это в общем-то мелочи...

 
Filin, ты не в теме. Зачем определять константу
#define LOTS 0;

Это же входная переменная для тестера.

А это откуда взялось?

#define OPEN_PRICE 1;


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

double myOrderOpenPrice=0.0;
double myOrderLots=0.0; 

являются близнецами встроенных в mql-4. Я же писал, что цель такая, чтобы наш тестер и встроенный тестер понимали советника
с минимальными переделками.

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

Тщательнее надо, тщительней..:)

 
Что за крякозяблики появились - и сам не знаю. Будут желающие - выложу где-нибудь на другом форуме .

Это появилось недавно. При переносе текста из MQL сюда, русские буквы представляются таким вот образом. Такую же штуку с русскими буквами делает FronPage.
 
Я думал, крякозяблики обратно в русские буквы переведутся при копировании и вставке в файл индикатора. Оказалось не так. Вечером выложу на другом форуме
и сообщу ссылку.
 
Rosh,
а нельзя ли мусор стереть?
А то смотреть невозможно.
Это наверное глючек форума, хостинга или МТ при копировании скриптов с русским текстом.
 
Тестировать таким образом можно. И достаточно качественно. Но, к сожалению, универсализма не получится.
Я потратил на такие тесты пару недель. На первый взгляд кажется всё просто. Набор стандартных функций - и вперёд.
Но набор этот - семечки: открытие/закрытие, подсчет профита/лосса, рисование стрелочек/черточек.
Основное и самое главное заключается в алгоритме открытия/закрытия, который, допустим, уже описан в каком-то эксперте. Перетащить этот алгоритм
целиком не получится. Только частями. А потом отслеживание "безошибочности" полученного кода... Плюс, связанные с этим процессом всякого
рода заморочки... Короче, получается написание с нуля отдельной программы на ту же тему второй раз. После всего этого за 1 секунду получаешь
либо неудовлетворительный результат, либо стрелки стоят не там, либо закрытие не в тех местах. И опять лезешь в текст программы, и опять по новой...
Мозг работает вместо отладчика, на какое-то время превращаешься в приставку для монитора... В конце концов, на третий день тест проходит
вроде бы нормально, но убеждаешься, что стратегия "не очень". И на этом этапе, практически всё! Т.к. проверять таким образом следующую стратегию
не возникает никакого желания. Для чего я всё это написал? Идея привлекательная. И в принципе работающая. Но, поверьте, наскоком она
не решается. Если говорить о шаблоне, то это должен быть очень фундаментальный шаблон, т.е. очень приличная, продуманная разработка. В общем,
программа не из самых простых. И если кто-то после прочтения данного опуса не будет ломать копья в рамках описанного, т.е. воспользуется этим моим
небольшим, но всё-таки практическим опытом и двинется дальше, не теряя понапрасну времени, то, может, что-то и получится. Тогда все страждущие
(и я в том числе) скинутся и поставят автору памятник. :)
 
Ладно, вечером сделаю одну функцию(как обещал), все будет понятнее. Пока при своем мнении - при правильной разработке тестера можно будет
использовать родные советники с косметическими переделками. Первой "жертвой" намечен MACD_sample.mq4 .
 
Rosh,
а нельзя ли мусор стереть?
А то смотреть невозможно.
Это наверное глючек форума, хостинга или МТ при копировании скриптов с русским текстом.


"Мусор" убран. Программеры , наверно, знают - как в лом этот мусор(комментарии) писать :)

Кто-нибудь знает - правильно я определил на основе стандвартных эти константы?
  int myOP_BUY=0;
   int myOP_SELL=1;
   int myOP_BUYLIMIT=2;
   int myOP_BUYSTOP=3;
   int myOP_SELLLIMIT=4;
   int myOP_SELLSTOP=5;


имеются ввиду конкретные значения.

 
Чайник я, зачем изобретать велосипед. Сделаем тупо:

   int myOP_BUY=OP_BUY;
   int myOP_SELL=OP_SELL;
   int myOP_BUYLIMIT=OP_BUYLIMIT;
   int myOP_BUYSTOP=OP_BUYSTOP;
   int myOP_SELLLIMIT=OP_SELLLIMIT;
   int myOP_SELLSTOP=OP_SELLSTOP;


Правда, не знаю заранее реакцию компилятора, пропустит он торговые константы в теле индикатора или нет?
Скорей всего пропустит.