tester

Document Sample
tester Powered By Docstoc
					                                         Forex tester
     Программа для тестирования торговых стратегий на исторических данных а также торговый
терминал разработанный под апи от MetaQuotes. Может работать с торговой платформой
MetaTrader версии 3 и 4. А также использоваться для ручного тестирования стратегий на истории.


     Главное окно программы:

                     главное меню              тулбар




                                                            график выбранной
                                                            валютной пары




     окна
     котировок,
     тикового
     графика и
     статистики

                                                                                 осцилляторы




              открытые позиции,
              новости, история                          дата, open, high, low,
              счета, журнал                             close, volume
                                                        текущего бара под
                                                        курсором
1. Главное меню.

1.1. File – содержит следующие опции
     Import history data – загрузить историю котировок*.
     Export tick data (for history testing) – экспортировать тиковые данные для тестирования
        истории*.
     Export account history to 'history.txt' – записать историю счета в файл history.txt.
     Export bars in csv file – экспортировать бары в файл формата csv*.
     Recount indicators – пересчитать все индикаторы*.
     Rebuild all – перестроить все бары базируясь на минутках и пересчитать все индикаторы*.

   * эти опции недоступны при тестировании истории и во время прямого соединения с сервером
   MT3. Для того чтобы сделать эти опции доступными необходимо открыть options  Server
   settings  Where to connect и установить режим "Connect to MT3 server", также программа не
   должна быть соединена с сервером. В данном режиме гарантируется целостность истории.

1.2. Statistics – содержит 2 опции
     Profit by hours – диаграмма распределения профита/лосса по часам, можно выбрать
        просмотр по всем месяцам вместе или по одельному месяцу. Иногда помогает
        отфильтровать явно убыточные часы торговли по тестируемой стратегии.
     Profit by days and hours – диаграмма распределения профита/лосса по месяцам и отдельным
        часам. Показывает динамику изменения прибыльности каждого часа с течением времени.
        Себя особо не оправдала...

1.3. Options – диалог настройки параметров программы.
1.4. Help – немного об авторе.

Диалог Import history data
Предназначен для импорта истории. Важно! импортрировать можно только минутки! программа
конечно проглотит другие таймфреймы но интерпретирует их как минутные бары в результате
получится ерунда. Минутки можно скачать с сайта Альпари по адресу
http://www.alpari-idc.ru/ru/dc/databank.php . Качать надо в формате Metastock. Порядок импорта
данных может быть совершенно произвольным.




CurrencyName – имя валюты куда импортировать данные – не перепутайте!
Spred – программа выставит текущий спред по валюте чтобы обрезать тени формата MT3, но
раньше спред был другим поэтому можно его поменять руками для более ранних периодов.
File – откуда импортировать.
Need correction… - если данные в формате МТ3 то тени будут обрезаны (на сайте альпари все
данные в формате МТ3, были во всяком случае до последнего времени), если свечи построены по
биду то эту опцию надо очистить.
Time shift to MSK – на сайте альпари время в архивах точно по MSK, если импортировать с
других провайдеров то возможно у них время сдвинуто.
Диалог Export tick data
Для тестирования истории необходимо сначала сделать экспорт данных за интересующий период
и указать как моделировать тики.




From date – с какого числа экспортировать
To date – по какое число
Export currency – какие валюты экспортировать
Generation method – каким методом сгенерировать тики
    Generate randomly by real volume – сгенерирует случайным образом тики внутри свечи
      где обязательно будут присутствовать high, open, low, close, в количестве volume.
    Generate point by point – генерирует тики через один поинт если свеча восходящая то
      движение будет open  low  high  close, если свеча нисходящая то движение будет
      open  high  low  close.
    Generate only by open/close/high/low – для ускорения тестирования тики будут содержать
      только open/close/high/low каждой минутной свечи, промежуточные тики игнорируются.

Файлы для каждой валюты будут сгенерированы в каталоге HistoryTest как <CurrencyName>.dat.
Диалог Export bars to cvs file




From date – от какой даты экспортировать
To date – по какую дату экспортировать
Currency name – какую валюту брать
Timeframe – бары какого периода экспортировать

Файл будет записан в корневом каталоге программы в виде <имя валюты>_<период>.cvs

Опшинсы




How to show profit – задает как показывать профит в окне открытых позиций, окне истории и
диаграмме профита.
Reconnect period – эта опция задает частоту реконнекта при подключении к MT3 серверу,
поскольку апи долго не живет в свободном полете.
To step by ticks divide bar on – в режиме тестирования истории возможно сделать остановку и
трассировать историю по шагам, эта опция задает на сколько частей делить один бар для каждого
шага поскольку трассировать по тикам слишком долго, а так будет прогоняться сразу целый кусок
тиков.
Where to connect – задает куда подключаться программе
   Connect to MT3 server – подключение к реальному серверу Metatrader 3
   Connect to CMS server – подключение к серверу провайдера CMS
   Connect to history server – будет эмулировать работу реального сервера на самом деле
      работая с ранее экспортированными тиками.




Timer delay – задает задержку между вбрасыванием следующей серии тиков в миллисекундах.
Time step – задает размер пакета вбрасываемых тиков.

Тики берутся одновременно по всем валютам и сортируются по времени.
Настройки параметров валют (эта информация будет использована при тестировании истории):
Currency – валютная пара
Digits – число цифр после запятой в котировке
Spread – размер спреда в пунктах
Point – наименьший возможный шаг котировки
Lot – размер 1 лота в базовой валюте
Primary – основная валюта
Swap long – процент за перенос длинной позиции через день в пунктах
Swap short – процент за перенос короткой позиции через день в пунктах

Можно добавлять, удалять и редактировать валюты в списке.
2. Тулбар.

Основные инструменты



     1        2        3       4   5   6   7   8   9   10   11 12 13 14    15        16 17

   1. Соединиться с сервером (историей).
   2. Отключиться от сервера (истории).
   3. Быстрый тест.
   4. Установить ордер.
   5. Установить отложенный ордер.
   6. Изменить ордер.
   7. Закрыть ордер.
   8. Удалить отложенный ордер.
   9. Увеличить масштаб диаграммы.
   10. Уменьшить масштаб диаграммы.
   11. Сдвигать диаграмму вправо вместе с новыми барами.
   12. Остановить/продолжить тестирование истории (активно только при подключении к
       истории).
   13. Разрешить/запретить исполнение стратегии.
   14. Параметры стратегии.
   15. Задать скорость поступления тиков в режиме тестирования.
   16. Добавить индикатор.
   17. Показать список индикаторов.

Панель таймфреймов.




Дополнительные инструменты.




    1    2    3    4       5

   1. Режим курсора – в этом режиме с помощью мыши можно таскать график котировок.
   2. Режим перекрестия – в этом режиме выводится горизонтальная и вертикальная линии для
      точного позиционирования и определения цены/времени на текущем графике.
   3. Установить 2 противоположных ордера от текущей цены.
   4. Сделать шаг на один бар – активно при паузе в тестировании истории.
   5. Сделать шаг на несколько тиков (число тиков задается в опшинсах) - активно при паузе в
      тестировании истории.
Режим быстрого тестирования.




Вызывается кнопкой в виде молнии с тулбара. Предназначен для быстрого тестирования
стратегий. В этом режиме не обновляются графики, обновляется только график дохода, статистика
и панель истории. Поэтому имеет смысл во время тестирования переключиться на график профита
и открыть окно статистики. Все остальное время уделяется расчетам, на моей машине данные за
год по одной валюте рассчитываются за 2 минуты что есть гуд.  Можно задать рассчет за любой
период в пределах экспортированных данных для тестирования. Для большего удобства
настройки дат введены 2 кнопки – Set year задает период с начала года Year по его конец, и Set
Month – задает период с начала месяца по его конец используя данные Year и Month.
Тестирование можно прервать в любой момент кнопкой Stop или просто закрыть окно.
Подключение стратегий для тестирования




Теперь есть возможность подключать свои стратегии для тестирования. Стратегии должны быть
скомпиллированы в виде dll и помещены в папку Strategies, при запуске программа просматривает
эту папку и составляет список стратегий которые можно увидеть нажав кнопку на тулбаре. Если
новая стратегия добавлена во время работы программы то программу надо перезапустить чтобы
она нашла новый файл. Стратегии можно запрещать и разрешать для тестирования помечая их
галочкой в окне Strategies list. Также можно запретить и разрешить их все скопом нажав кнопку
[13] на тулбаре. Смотри файл описания интерфейсов для dll и пример стратегии в каталоге
"Examples".

Пример стандартного окна настройки параметров стратегии:




Подробнее о написании стратегий смотри соответствующий раздел ниже.
Описание где чего лежит:

Каталоги:

Data         – здесь хранятся данные для разных провайдеров и истории, - массивы баров,
             индикаторов, настройки индикаторов, тиковая история, параметры валют и всякое
             такое.

Examples     – интерфейсы для разработки стратегий и примеры

Logs         – логи работы

Sounds       – всякие звуки честно свистнутые из метатрейдера

Strategies   – это каталог для подключаемых стратегий в dll, программа при запуске ищет
             стратегии в этом каталоге и если они удовлетворяют заданным параметрам
             добавляет их в список стратегий

TmpFiles     – временно создаваемые файлы
Разработка и подключение стратегий

Пример стратегии и файлы лежат в каталоге Examples и написаны на Delphi 7-й версии. Далее все
примеры я буду приводить на этом языке (если кто-то захочет портировать интерфейсы на С++
буду рад сотрудничеству).

Стратегия должна быть скомпиллирована в формате dll библиотеки и экспортировать следующие
процедуры:

процедура инициализации стратегии получает как параметр интерфейс доступа к данным
вызывается один раз при загрузке стратегии когда стратегия добавляется в список
procedure InitStrategy(MainInterface: TMainInterface); stdcall;

процедура деинициализации стратегии
procedure DoneStrategy; stdcall;

процедура сброса начальных данных, вызывается при каждом коннекте к серверу или начале
тестирования на истории
procedure ResetStrategy; stdcall;

процедура получения котировки, вызывается при каждом новом поступлении котировки для всех
валют, при этом выставляются предопределенные переменные Bid, Ask, Point, Symbol, Digits и
прочие для валюты котировки
procedure GetSingleTick; stdcall;

вызов собственного окна диалога параметров стратегии (опционально) если стандартное окно
параметров чем-то не устраивает и хочется больше, если эта процедура отсутствует то будет
вызвано стандартное окно настройки параметров
procedure ShowPropsDialog; stdcall;

exports
  InitStrategy,
  DoneStrategy,
  ResetStrategy,
  // опционально
  // ShowPropsDialog,
  GetSingleTick,
  // эта процедура находится в модуле StrategyInterface.pas и тоже должна быть экспортирована
  ReplaceStr;


Интерфейс доступа к данным

В целом интерфейс доступа к данным копирует процедуры, функции и предопределенные
переменные языка MQL4 клиента Метатрейдер 4 фирмы Metaquotes. Он выполнен в виде COM
объекта реализующего данные функции. Этот объект передается стратегии в процедуре
InitStrategy на этапе инициализации и должен быть сохранен для обеспечения доступа к данным. В
процедуре деинициализации DoneStrategy это интерфейс должен быть освобожден. Все описания
объектов и констант находятся в файлах "StrategyInterface.pas", "DllInterface.pas",
"StratConstants.pas".
procedure InitStrategy(MainInterface: TMainInterface); stdcall;
begin
 // сохранение интерфейса во внутренней переменной
 MainIntrf := MainInterface;
 with MainIntrf do
   begin
      ....
   end;
end;

procedure DoneStrategy; stdcall;
begin
 ....
 MainIntrf := nil; // освобождение интерфейса
end;


Методы доступа к данным. Собственно для получения информации о методах можно
пользоваться справкой по MQL4, в большинстве эти методы полностью копируют аналогичные
процедуры и функции языка MQL.

type
 //------------------------------------------------------
 // main data interface
 //------------------------------------------------------
 TMainInterface = Interface
   // get currency information
   // Symbol - name of currency
   // info - pointer to currency info, nil if not found
   // result: true if success
   function GetCurrencyInfo(Symbol: PChar; var info: PCurrencyInfo): boolean; stdcall;

  // send instant order
  // Symbol - name of currency
  // OperationType - ot_Sell, ot_Buy
  // LotSize - lot size
  // StopLoss - stop loss
  // TakeProfit - take profit
  // OrderHandle - order handle, if fails -1
  // result: true if success
  function SendInstantOrder(Symbol: PChar; OperationType: integer;
           LotSize, StopLoss, TakeProfit: double;
           var OrderHandle: integer): boolean; stdcall;

  // send pending order
  // Symbol - name of currency
  // OperationType - pt_SellStop, pt_SellLimit, pt_BuyStop, pt_BuyLimit
  // LotSize - lot size
  // StopLoss - stop loss
  // TakeProfit - take profit
  // ExecutionPrice - price of order execution
  // OrderHandle - order handle, if fails -1
  // result: true if success
  function SendPendingOrder(Symbol: PChar; OperationType: integer;
           LotSize, StopLoss, TakeProfit, ExecutionPrice: double;
           var OrderHandle: integer): boolean; stdcall;
// modify order
// OrderHandle - order handle
// NewPrice - new price
// StopLoss - new stop loss
// TakeProfit - new take profit
// result: true if success
function ModifyOrder(OrderHandle: integer; NewPrice, StopLoss,
         TakeProfit: double): boolean; stdcall;

// delete order
// OrderHandle - order handle
// result: true if success
function DeleteOrder(OrderHandle: integer): boolean; stdcall;

// close order
// OrderHandle - order handle
// result: true if success
function CloseOrder(OrderHandle: integer): boolean; stdcall;

// get order information
// OrderHandle - order handle
// info - order information
// result: true if success
function GetOrderInfo(OrderHandle: integer; var info: TTradePosition): boolean; stdcall;

// get last error description
function GetLastError: PChar; stdcall;

// set currency and timeframe (to use open/close/high/low/volume/time arrays)
// Symbol - name of currency
// TimeFrame - desired timeframe (PERIOD_M1..PERIOD_D1)
// result: true if success
function SetCurrencyAndTimeframe(Symbol: PChar;
         TimeFrame: integer): boolean; stdcall;

// set property
// PropertyID - property identifier
// value - property value
procedure SetProperty(PropertyID: integer; value: OLEVariant); stdcall;

// register option
// OptionName - name of option
// OptionType - type of option
// OptPtr - pointer to option
// size - option size in bytes
procedure RegOption(OptionName: PChar; OptionType: integer;
         OptPtr: pointer); stdcall;

// add option value for enum types
// OptionName - name of option
// value - name of value
procedure AddOptionValue(OptionName, value: PChar); stdcall;

// set option range for ot_Integer, ot_Longword, ot_Double
// OptionName - name of option
 // LowValue - low available range value
 // HighValue - high available range value
 procedure SetOptionRange(OptionName: PChar; LowValue, HighValue: double); stdcall;

 // set option precision (for double only)
 // OptionName - name of option
 // digits - number of digits after '.'
 procedure SetOptionDigits(OptionName: PChar; digits: word); stdcall;

 // select order and get info
 function OrderSelect(index, flags: integer;
         pool: integer = MODE_TRADES): boolean; stdcall;
 function OrderProfit: double; stdcall;
 function OrderProfitPips: double; stdcall;
 function OrderClosed(OrderHandle: integer): boolean; stdcall;
 function HistoryTotal: integer; stdcall;
 function OrdersTotal: integer; stdcall;
 function OrderOpenTime: TDateTime; stdcall;
 function OrderCloseTime: TDateTime; stdcall;
 function OrderLots: double; stdcall;
 function OrderTicket: integer; stdcall;
 function OrderType: integer; stdcall;
 function OrderStopLoss: double; stdcall;
 function OrderTakeProfit: double; stdcall;
 function OrderOpenPrice: double; stdcall;
 function OrderClosePrice: double; stdcall;
 function OrderSymbol: PChar; stdcall;

 procedure Print(s: PChar); stdcall;

 // predefined variables
 function bid: double; stdcall;
 function ask: double; stdcall;
 function Symbol: PChar; stdcall;
 function Digits: integer; stdcall;
 function Point: double; stdcall;

 // data arrays
 function iOpen(Symbol: PChar; TimeFrame, shift: longword): double; stdcall;
 function iClose(Symbol: PChar; TimeFrame, shift: longword): double; stdcall;
 function iHigh(Symbol: PChar; TimeFrame, shift: longword): double; stdcall;
 function iLow(Symbol: PChar; TimeFrame, shift: longword): double; stdcall;
 function iVolume(Symbol: PChar; TimeFrame, shift: longword): double; stdcall;
 function iTime(Symbol: PChar; TimeFrame, shift: longword): TDateTime; stdcall;
 function iBars(Symbol: PChar; TimeFrame: integer): longword; stdcall;

 // available after calling SetCurrencyAndTimeframe
 function Open(shift: longword): double; stdcall;
 function Close(shift: longword): double; stdcall;
 function High(shift: longword): double; stdcall;
 function Low(shift: longword): double; stdcall;
 function Volume(shift: longword): double; stdcall;
 function Time(shift: longword): TDateTime; stdcall;
 function Bars: longword; stdcall;
end;
Фух, умаялся я писать, будет настроение – продолжу  вобщем смотрите пример стратегии из
strategy.dpr в каталоге Examples.

				
DOCUMENT INFO
Categories:
Tags:
Stats:
views:11
posted:12/3/2011
language:Russian
pages:15