Экспорт результатов из OMEGA TS в XpressAnalizator.

 

На сайте KonKop'a можно найти популярную программу для анализа результатов торговли XpressAnalizator, фактически ставшую одним из стандартов расчёта эффективности работы торговой стратегии. На этом же сайте имеется описание работы с данной программой, а также функции экспорта из Omega TS и MetaStock.

Функция экспорта из OmegaTS называется $TradeFile. При экспорте результатов торговли, $TradeFile выводит их в процентах от капитала, участвующего в сделке. При этом способ расчёта подходит для акций (и иных аналогичных активов), но никак не подходит для инструментов рынка FOREX (см. предыдущую статью на эту тему - "Расчёты по инструментам рынка FOREX в EasyLanguage").

Для того, чтобы корректно экспортировать результаты, мы внесли небольшие изменения в функцию $TradeFile (измененный вариант называется $TradeFileMod) и используем уже имеющиеся "блоки" кода EasyLanguage  для расчёта размера лота и прибыли/убытка.

Модификация функции состоит в том, что прибыль в %  (переменная Prof) теперь рассчитывается не внутри функции $TradeFileMod, а передаётся ей в виде входного параметра Prof,  рассчитываемого в нашей стратегии.

Исходный текст функции $TradeFileMod приведен ниже.

{***************************************************************
$TradeFile EL function.
Written by Konstantin Kopyrkin (aka konkop) 01.04.2002.
Copyright (c) 2002 konkop

Note: Add to a system code after all entry/exit routines the string:

value12 = $TradeFile("konkop","D:\TradeFiles\");

where:
"konkop" - author's name (set your nickname up to 6 symb.)
"D:\TradeFiles\" - full path for export files (set your path)
****************************************************************}
{modification by Apprentice : profit is not calculated inside the function, it's passed in as parameter - needed for FX symbols}

Input: Author(String), FilePath(String),Prof(NumericSimple);
Vars: TT(0), EnDate(""), ExDate(""), Str1(""), Str2(""), Str3(""), Str4(""), FileName("");
TT = TotalTrades;
if currentbar = 1 then begin

 

if DataCompression = 1 then Str1 = NumToStr(barinterval,0);
if DataCompression = 2 then Str1 = "D";
if DataCompression = 0 then Str1 = "t";
FileName = FilePath + Author + "[" + MidStr(GetStrategyName, 1, 20) + "]" + MidStr(GetSymbolName, 1, 10) + "[" + Str1 + "]" + ".csv";
FileDelete(FileName);
Str2 = {comments}"; The file is created "+ ELDateToString(CurrentDate)+" "+LeftStr(NumToStr(CurrentTime,0),2)
+":"+ RightStr(NumToStr(CurrentTime,0),2) + " with the $TradeFileMod() EL function" + NewLine +
"; developed by Konstantin Kopyrkin. Ekaterinburg Russia. http://konkop.narod.ru"+NewLine+
";%A="+Author+NewLine
+ ";%S="+GetStrategyName+NewLine + ";%T="+GetSymbolName+NewLine + ";%P="+Str1+NewLine;
Str3 = {Base field's name}
"<Strategy>"+","+"<Ticker>"+","+"<Position>"+","+"<EnterDate>"+","+"<ExitDate>"+","+"<Gain>";
FileAppend(FileName, Str2 + Str3 + NewLine);
 

end;  
If TT > TT[1] then begin  
  EnDate = NumToStr(Year(EntryDate(1)) + 1900, 0) + RightStr(NumToStr(EntryDate(1), 0),4);
ExDate = NumToStr(Year(ExitDate(1)) + 1900, 0) + RightStr(NumToStr(ExitDate(1) ,0),4);
{ Prof = (ExitPrice(1) / EntryPrice(1) - 1) * MarketPosition(1);
- now profit is passed as parameter}
Str4 = {base fields}
MidStr(GetStrategyName, 1, 20) +
", "+ MidStr(GetSymbolName, 1, 10) + "," + NumToStr(MarketPosition(1), 0) +","+ EnDate + "," + ExDate + "," + NumToStr(Prof,4);
FileAppend(FileName, Str4 + NewLine);
 
 
end;    
$TradeFileMod = 1;  

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

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

1)  мы должны рассчитать прибыль в процентах от капитала каждый раз при закрытии позиции;

2) теперь для ведения записей мы будем вызывать функцию $TradeFileMod и передавать ей рассчитанную в п.1 прибыль..

Полный текст торгового сигнала приведен ниже.

{-------------------------------------------------------------------------------------------------------------------------------}

{Сигнал работает со следующими валютами: AUD,CAD,CHF,EUR,GBP,JPY,NZD }

Inputs:

Equity(10),Lots(10), {параметры управления капиталом - сумма капитала в тысячах долларов, количество лотов}

 

LogIt(1); {запись результатов в файл: 1 - записываем, другое значение - не записываем}

Length(14),OverBought(70),OverSold(30);{параметры стохастика }

Vars:

Lot_Num(1000), {размер лота} Symbol(""), {наименование валюты} divmul(False), {тип котировки False - прямая, True - обратная}

pmul(0), {курс валюты для делителя}

Trades(0), {количество закрытых позиций} PLperiod(0), {прибыль за период} lastM(0), {номер месяца}

filename(""),{имя файла для вывода результатов}, temp(0) {переменная с результатом в % от капитала},

Kline(0),Dline(0); {значения стохастика}

{-------------------------------------------------------------------------------------------------------------------------------}

{установка начальных значений : выбор типа валюты, назначение имени файла для вывода результатов}

if barnumber=1 then BEGIN

 

 

if Symbol="" then Symbol=GetSymbolName;

if filename="" then filename="c:\temp\"+Symbol+".csv";

FileDelete(filename);

If Symbol="AUD A0-FX" or Symbol="EUR A0-FX" or Symbol="GBP A0-FX" or Symbol="NZD A0-FX" then divmul=true;

if Symbol="CAD A0-FX" or Symbol="CHF A0-FX" or Symbol="JPY A0-FX" then begin

 

 

divmul=false;

Lot_Num=IntPortion(Equity*1000/lots); {размер лота рассчитываем один раз, т.к. он в USD и не зависит от курса}

 

end;

 

END;

{-------------------------------------------------------------------------------------------------------------------------------}

{расчёт размера лота в случае, когда он зависит от курса валюты}

pmul=MedianPrice;

if divmul=true then Lot_Num=IntPortion(Equity*1000/(lots*pmul));

{-------------------------------------------------------------------------------------------------------------------------------}

{непосредственно сам торговый сигнал}

KLine = SlowKCustom(High, Low, Close, Length);

DLine = SlowDCustom(High, Low, Close, Length);

If KLine Crosses Below DLine AND KLine > OverBought AND DLine > OverBought Then Sell ("StchSell") This Bar on Close;

If KLine Crosses Above DLine AND KLine < OverSold AND DLine < OverSold Then Buy ("StchBuy") This Bar on Close;

{-------------------------------------------------------------------------------------------------------------------------------}

{запишем результаты работы в текстовой файл}

if LogIt=1 then begin {записываем результаты в файл }

 

if Trades<>TotalTrades then begin

temp=iff(ExitPrice(1)<>0,ExitPrice(1),1);

 

 

if divmul=false then temp=PositionProfit(1)*100/(temp*equity) else temp=PositionProfit(1)*100/equity; {рассчитаем прибыль в %}

value12=$TradeFileMod("Stoch","C:\results\",temp);

 

end;

end;

{-------------------------------------------------------------------------------------------------------------------------------}

Trades=TotalTrades; {запомним количество завершенных сделок}

{-------------------------------------------------------------------------------------------------------------------------------}

(с) Apprentice 2003