Данный подраздел предназначен для размещения написанных мной в разное время программ, индикаторов (функций) и торговых сигналов. Некоторые из них упоминаются в различных материалах сайта.
"BondCalculator"
Эта программа предназначена для вычисления основных показателей рынка облигаций - модифицированной дюрации и выпуклости, доходности к погашению и приведённой стоимости и "чистой" цены облигаций федерального займа и других подобных инструментов с фиксированным доходом. Программа написана в среде VBA на базе приложения Microsoft Excel и представляет собой книгу Excel, включающую пользовательский интерфейс для ввода параметров конкретной облигации и получения в качестве результата вышеназванных показателей рынка облигаций, а также базу данных, содержащую параметры обращающихся на отечественном долговом рынке облигаций федерального займа, и соответствующий интерфейс для её редактирования, посредством которого пользователь может самостоятельно добавлять и удалять интересующие его инструменты. Программа проста в использовании и не требует специальных навыков. Тем не менее, на первом листе книги Excel содержатся достаточно подробные инструкции по работе с программой. В разделе "Облигации" помещены скриншоты некоторых диалоговых окон программы "BondCalculator", иллюстрирующие результаты её применения.
*В текущую версию программы (от 11.03.2004) внесены некоторые изменения, повышающие удобство пользования и корректность вычислительных процедур, а также расширяющие спектр используемых инструментов. Владельцам более ранних выпусков рекомендую скачать данную версию.
Данная функция, написанная на Easy Language для Omega ProSuite, служит для иллюстрации применения различных методик управления капиталом, описанных в подразделе "Money Management", и вычисляет количество контрактов (лотов), необходимых для открытия очередной позиции, соответствующее выбранному пользователем методу. Для использования данной функции нужно поместить ссылку на неё в код торгового сигнала. Ниже размещён пример вставки функции в код простой торговой системы "MMParabolic", представляющей из себя в результате обычный Parabolic, дополненный механизмом определения количества открываемых контрактов.
Для выбора той или иной техники управления капиталом используется переменная ввода Method, принимающая значения от 0 до 8, соответствующие следующим методам Money Management:
0 - торговля всем имеющимся капиталом в каждой сделке;
1 - торговля фиксированным количеством денег в каждой сделке;
2 - торговля фиксированным количеством контрактов в каждой сделке;
3 - торговля фиксированным процентом капитала в каждой сделке;
4 - торговля количеством капитала, зависящим от рыночной волатильности;
5 - пересечение кривых доходности;
6 - Martingale method;
7 - AntiMartingale method;
8 - OptimalF method;
Использование OptimalF method требует некоторых пояснений. Во-первых, при тестировании данной методики управления капиталом количество торгуемых контрактов равно 1 (почему так - читайте раздел, посвящённый данному методу), следовательно, размер комиссионных, устанавливаемый на вкладке "Costs", должен соответствовать этому количеству. Во-вторых, для отображения результатов тестирования используется окно "Message log", в котором последовательно выводятся для каждой сделки дата, номер, MaxHPR, OptimalF, процент начального капитала, соответствующий данному значению OptimalF, и, наконец, название тестируемой техники.
Для корректной работы функции необходимо открыть вкладку "Inputs" программы "ProSuite" и ввести значения начального капитала (CapitalIni) и других параметров, соответствующие используемым в тестируемой торговой стратегии:
PrcntCapital - торговля фиксированным процентом капитала в каждой сделке (method 3);
FixContract - торговля фиксированным количеством контрактов в каждой сделке (method 2);
TradeRisk - показатель риска на сделку (method 4);
Rfactor - коэффициент риска (method 4);
Код для Omega ProSuite:
"MMMethods"
{Description: Examples of some methods of Money Management.
Provided By: Alex Draga, (c) Copyright 2002
********************************************************************}
Inputs: CapitalIni(numeric),{amount of initial capital}
PrcntCapital(numeric),{percent of capital when trading part of assets}
FixContract(numeric),{fixed amount traded in each trade of contracts}
TradeRisk(numeric),{percent risk at trade}
Rfactor(numeric),{multiplier of risk}
Method(numeric);
Vars: TradeAmount(0),MeraRiska(0),CurrentCapital(0),BigLoss(0),MP(0),
TEquity(0),HPR(1),MaxHPR(0),f(0),OptF(1),FirstPrice(0),mm1(0),
mm4(0),mm5(0),mm6(0),mm7(0),mm9(0);
Arrays: Trades[200](0);
CurrentCapital=(CapitalIni+NetProfit+OpenPositionProfit);
mm1=floor(CurrentCapital/close);
If method=0 Then TradeAmount=mm1;{trade of full capital}
If method=1 Then TradeAmount=floor(CapitalIni/close);{trade of fixed capital}
If method=2 Then TradeAmount=FixContract;{trade of fixed amount of contracts}
If method=3 Then TradeAmount=mm1*PrcntCapital;{trade of percent of capital}
If method=4 Then begin {trade of percent of capital, depending from current market volatility}
MeraRiska=Pos(C-C[7]);
Value1=TradeRisk/((XAverage(MeraRiska,10)*Rfactor)/close);
Value2=floor((CurrentCapital*Value1)/close);
If Value2>mm1 Then
mm4=mm1
else
mm4=Value2;
TradeAmount=mm4;
End;
If method=5 Then begin {trade at cross EMA of equity's}
If CurrentCapital[1]<>0 Then
TEquity =TEquity+((CurrentCapital/CurrentCapital[1])-1)*100
else
TEquity =0;
If XAverage(TEquity,21)>=XAverage(TEquity,65)Then
mm5=mm1
else
mm5=floor(mm1*0.25);
TradeAmount=mm5;
End;
If method=6 Then begin {trade with Martingale method}
If Sign(PositionProfit(0))>0 Then begin
If Sign(PositionProfit(1))+ Sign(PositionProfit(2))<2 Then mm6=mm1*2;
end
else
If Sign(PositionProfit(0))<0 Then begin
If Sign(PositionProfit(1))+ Sign(PositionProfit(2))>-2 Then mm6=floor(mm1*0.5);
end
else
mm6=mm1;
TradeAmount=mm6;
End;
If method=7 Then begin {trade with AntiMartingale method}
If Sign(PositionProfit(1))>0 Then mm7=floor(mm1*0.5)
else
If Sign(PositionProfit(1))<0 Then mm7=mm1*2
else
mm7=mm1;
TradeAmount=mm7;
End;
If method=8 Then begin {trade with OptimalF method}
If LargestLosTrade =0 then BigLoss=-1 else BigLoss=LargestLosTrade;
MP=MarketPosition(0);
If EntryPrice(1)=0 and EntryPrice<>0 then FirstPrice=EntryPrice;
If MP<>MP[1]and MP[1]<>0 then begin
For Value3 = 199 DownTo 0 Begin
Trades[Value3+1] = Trades[Value3];
End;
Trades[0]=-PositionProfit(1);
For f = 100 DownTo 1 Begin
HPR=1;
For Value4 = TotalTrades DownTo 0 Begin
HPR=HPR*(1+((Trades[Value4]/BigLoss)*f/100));
End;
If HPR>MaxHPR then begin
MaxHPR=HPR;
OptF=f/100;
End;
End;
mm9=floor(CurrentCapital/(BigLoss/-OptF));
value10=(mm9*FirstPrice)/CapitalIni;
Print("Trade #",NumToStr(TotalTrades,0)," ",NumToStr(MaxHPR,3)," ",NumToStr(OptF,2)," ",NumToStr(value10,3));
End;
TradeAmount=1;
End;
MMMethods=TradeAmount
"MMParabolic"
{Description : Parabolic Short&Long Entry
Provided By : Alex Draga, 2002.
********************************************************************}
Input: AccFactor(.02),CapitalIni(1000),PrcntCapital(0.5),
FixContract(1),TradeRisk(0.05),Rfactor(1.5),Method(0);
Variable: ParabolicValue(0);
ParabolicValue = Parabolic(AccFactor);
If Low < ParabolicValue Then begin
ExitLong Next Bar at ParabolicValue Stop;
Value1=MMMethods(CAPITALINI, PRCNTCAPITAL, FIXCONTRACT, TRADERISK, RFACTOR, METHOD);
Sell Value1 contracts Next Bar at ParabolicValue Stop;
end;
If High > ParabolicValue Then begin
ExitShort Next Bar at ParabolicValue Stop;
Value1=MMMethods(CAPITALINI, PRCNTCAPITAL, FIXCONTRACT, TRADERISK, RFACTOR, METHOD);
Buy Value1 contracts Next Bar at ParabolicValue Stop;
end;
Данный индикатор служит для графического представления результатов применения методики управления капиталом OptimalF путём отображения основных расчётных показателей данного метода, т.е. - OptimalF и процента начального капитала, соответствующего данному значению OptimalF. Индикатор состоит из двух линий - розового и жёлтого цветов. Розовая линия показывает, как меняется значение Optimal f по мере "продвижения" системы вправо. Жёлтая линия соответствует доле капитала, необходимой для инвестирования в каждую сделку.
Для корректного отображения индикатора необходимо ввести значение начального капитала, соответствующее используемому в тестируемой торговой стратегии, и соблюсти следующие условия: количество торгуемых в каждой сделке контрактов фиксированно (почему так - читайте раздел, посвящённый данному методу), следовательно, размер комиссионных, устанавливаемый на вкладке "Costs", должен соответствовать этому количеству. В подразделе "money management" раздела "Риск-менеджмент" помещён скриншот окна программы "Omega ProSuite", иллюстрирующий результаты применения индикатора " OptimalF" к торговой системе "Parabolic".
Код для Omega ProSuite:
"OptimalF"
{*******************************************************************
Description: This indicator calculates a value of Optimal f and fraction
of the capital required for realization of this strategy.
Provided By: Alex Draga, (c) Copyright 2002
********************************************************************}
Inputs: CapitalIni(1000);
Vars: CEq(0),OEq(0),MP(0),FirstPrice(0),Trade(0),TradeCount(-1),
MaxLos(0),f(0),HPR(0),MaxHPR(0),OptF(0),CapFract(0);
Array: Trades[200](0);
CEq=I_ClosedEquity+CapitalIni;
OEq=I_OpenEquity+CapitalIni;
MP=I_MarketPosition;
If FirstPrice=0 Then begin
If OEq<>OEq[1] and OEq[1]=CapitalIni Then FirstPrice=Open;
end;
If CEq <> CEq[1] then begin
Trade = (CEq-CEq[1]);
TradeCount=TradeCount+1;
If Trade < MaxLos Then MaxLos = Trade;
end;
If MP<>MP[1]and MP[1]<>0 then begin
For Value3 = 199 DownTo 0 Begin
Trades[Value3+1] = Trades[Value3];
End;
Trades[0]=-Trade;
If MaxLos<>0 Then begin
For f = 100 DownTo 1 Begin
HPR=1;
For Value4 = TradeCount DownTo 0 Begin
HPR=HPR*(1+((Trades[Value4]/MaxLos)*f/100));
End;
If HPR>MaxHPR then begin
MaxHPR=HPR;
OptF=f/100;
End;
End;
End;
CapFract=(floor(CEq/(MaxLos/-OptF))*FirstPrice)/CapitalIni;
End;
Plot1(OptF,"OptimalF",magenta);
Plot2(CapFract,"CapitalF",yellow);
Данные индикаторы, предложенные в 1998 году Мелом Уиднером и модифицированные впоследствии М.Королюком (Moysha-online) и мной, автоматически размечают уровни поддержки ("SwingLow") или сопротивления ("SwingHigh"). Каждый из индикаторов позволяет задавать произвольное количество баров справа и слева от ценового экстремума (отдельно для каждой стороны) и выбирать элемент цены (FieldHigh or FieldLow), используемый трейдером для определения уровней, т.е. Open, Close, High или Low. Количество последних отображаемых уровней также регулируется и ограничено четырьмя. Для уменьшения или увеличения числа уровней надо удалить или добавить соответствующие строке в коде индикаторов.
Разместите вышеназванные индикаторы в одном окне, выберите способ отображения - "точки", цвета - по своему усмотрению, параметры - по желанию :-). Для большего удобства рекомендую (в MetaStock'е) сохранить график как шаблон, чтобы легче было применять его впоследствии к различным бумагам.
Код для MetaStock'a:
"SwingHigh"
Rightbars:=Input("Enter number of bars on the right:",1,25,4);
Leftbars:=Input("Enter number of bars on the left:",1,25,4);
PrcFld:=Input("Enter Pricefield: 1=Close, 2=Open, 3=High, 4=Low ",1,4,3);
X:=If(PrcFld=1,CLOSE,If(PrcFld=2,OPEN,If(PrcFld=3,HIGH,LOW)));
Y:= Input("Enter amount of levels:",1,4,1);
R1:= ValueWhen(1,Ref(X,-Rightbars)=HHV(X,Rightbars+Leftbars+1), Ref(X,-Rightbars)) ;
R2:= ValueWhen(2,Ref(X,-Rightbars)=HHV(X,Rightbars+Leftbars+1), Ref(X,-Rightbars)) ;
R3:= ValueWhen(3,Ref(X,-Rightbars)=HHV(X,Rightbars+Leftbars+1), Ref(X,-Rightbars)) ;
R4:= ValueWhen(4,Ref(X,-Rightbars)=HHV(X,Rightbars+Leftbars+1), Ref(X,-Rightbars)) ;
R1;
If(Y>=2,R2,R1);
If(Y>=3,R3,R1);
If(Y>=4,R4,R1);
"SwingLow"
Rightbars:=Input("Enter number of bars on the right:",1,25,4);
Leftbars:=Input("Enter number of bars on the left:",1,25,4);
PrcFld:=Input("Enter Pricefield: 1=Close, 2=Open, 3=High, 4=Low ",1,4,4);
X:=If(PrcFld=1,CLOSE,If(PrcFld=2,OPEN,If(PrcFld=3,HIGH,LOW)));
Y:= Input("Enter amount of levels:",1,4,1);
S1:= ValueWhen(1,Ref(X,-Rightbars)=LLV(X,Rightbars+Leftbars+1), Ref(X,-Rightbars)) ;
S2:= ValueWhen(2,Ref(X,-Rightbars)=LLV(X,Rightbars+Leftbars+1), Ref(X,-Rightbars)) ;
S3:= ValueWhen(3,Ref(X,-Rightbars)=LLV(X,Rightbars+Leftbars+1), Ref(X,-Rightbars)) ;
S4:= ValueWhen(4,Ref(X,-Rightbars)=LLV(X,Rightbars+Leftbars+1), Ref(X,-Rightbars)) ;
S1;
If(Y>=2,S2,S1);
If(Y>=3,S3,S1);
If(Y>=4,S4,S1);
Код для Omega ProSuite:
"SwingHigh"
{Written by: Alex Draga 12.10.1999
Description: This indicator plot a resistance levels as strings of points.
****************************************}
Inputs:LRHStren(4),RRHStren(3),Price(High),Levels(1);
Array: Resistance[4](1);
If PivotHighVSBar(1, Price, LRHStren, RRHStren, RRHStren+1)=RRHStren Then Begin
For Value1 = Levels DownTo 0 Begin
Resistance[Value1+1] = Resistance[Value1];
End;
Resistance[1] = Price[RRHStren];
End;
If Levels > 0 Then Plot1[RRHStren](Resistance[1],"LastResist",Magenta);
If Levels > 1 Then Plot2[RRHStren](Resistance[2],"Resistance",Red);
If Levels > 2 Then Plot3[RRHStren](Resistance[3],"Resistance",Red);
If Levels > 3 Then Plot4[RRHStren](Resistance[4],"Resistance",Red);
"SwingLow"
{Written by: Alex Draga 12.10.1999
Description: This indicator plot a support levels as strings of points.
****************************************}
Inputs:LRLStren(4),RRLStren(3),Price(Low),Levels(1);
Array: Support[4](1);
If PivotLowVSBar(1, Price, LRLStren, RRLStren, RRLStren+1)=RRLStren Then Begin
For Value1 = Levels DownTo 0 Begin
Support[Value1+1] = Support[Value1];
End;
Support[1] = Price[RRLStren];
End;
If Levels > 0 Then Plot1[RRLStren](Support[1],"LastSupport",Green);
If Levels > 1 Then Plot2[RRLStren](Support[2],"Support",DarkCyan);
If Levels > 2 Then Plot3[RRLStren](Support[3],"Support",DarkCyan);
If Levels > 3 Then Plot4[RRLStren](Support[4],"Support",DarkCyan);
Данный индикатор состоит из двух индикаторов – "Low Volatility" и "High Volatility" – и определяет расстояние (в процентах от текущей цены закрытия) до ближайшего уровня поддержки ("Low Volatility") или сопротивления ("High Volatility"), в зависимости от того, какой из этих уровней ближе в момент расчёта (подробнее смотрите в разделе "Риск-менеджмент"). Каждый из индикаторов позволяет задавать произвольное количество баров справа и слева от ценового экстремума (отдельно для каждой стороны) и выбирать элемент цены (FieldHigh or FieldLow), используемый для определения уровней, т.е. Open, Close, High или Low.
Если Вы ранее уже загрузили индикаторы "SwingHigh" и "SwingLow", автоматически рассчитывающие уровни сопротивления/поддержки, то Вы можете использовать "облегчённый" вариант индикатора "SupResOscillator", имеющий в коде прямые ссылки на эти функции. В этом случае при расчёте уровней сопротивления/поддержки будут использоваться значения "по умолчанию" этих индикаторов.
Разместите вышеназванные индикаторы в одном окне, выберите способ отображения - "гистограмма", цвета - по своему усмотрению, параметры - по желанию :-). Для большего удобства рекомендую сохранить график как шаблон, чтобы легче было применять его впоследствии к различным бумагам.
Код для MetaStock'a:
"Low Volatility"
Rightbars:=Input("Input number bars of right:",1,25,4);
Leftbars:=Input("Input number bars of left:",1,25,4);
FieldHigh:=Input("Input Pricefield for Resistance: 1=C, 2=O, 3=H, 4=L ",1,4,3);
FieldLow:=Input("Input Pricefield for Support: 1=C, 2=O, 3=H, 4=L ",1,4,4);
X:=If(FieldHigh=1,CLOSE,If(FieldHigh=2,OPEN,If(FieldHigh=3,HIGH,LOW)));
Y:=If(FieldLow=1,CLOSE,If(FieldLow=2,OPEN,If(FieldLow=3,HIGH,LOW)));
SwingHigh:= ValueWhen(1,Ref(X,-Rightbars)=HHV(X,Rightbars+Leftbars+1), Ref(X,-Rightbars)) ;
SwingLow:= ValueWhen(1,Ref(Y,-Rightbars)=LLV(Y,Rightbars+Leftbars+1), Ref(Y,-Rightbars)) ;
If(C<SwingHigh AND C< SwingLow ,(C-Min(SwingLow, SwingHigh))/C*100,If(C<SwingHigh, (C -SwingHigh )/C*100,0));
"High Volatility"
Rightbars:=Input("Input number bars of right:",1,25,4);
Leftbars:=Input("Input number bars of left:",1,25,4);
FieldHigh:=Input("Input field for Resistance: 1=C, 2=O, 3=H, 4=L ",1,4,3);
FieldLow:=Input("Input field for Support: 1=C, 2=O, 3=H, 4=L ",1,4,4);
X:=If(FieldHigh=1,CLOSE,If(FieldHigh=2,OPEN,If(FieldHigh=3,HIGH,LOW)));
Y:=If(FieldLow=1,CLOSE,If(FieldLow=2,OPEN,If(FieldLow=3,HIGH,LOW)));
SwingHigh:= ValueWhen(1,Ref(X,-Rightbars)=HHV(X,Rightbars+Leftbars+1), Ref(X,-Rightbars)) ;
SwingLow:= ValueWhen(1,Ref(Y,-Rightbars)=LLV(Y,Rightbars+Leftbars+1), Ref(Y,-Rightbars)) ;
If(C>SwingHigh AND C> SwingLow ,(C-Max(SwingLow, SwingHigh))/C*100,If(C>SwingLow, (C -SwingLow )/C*100,0));
Следующий простой индикатор, построенный, как ясно из названия, на базе ROC (Rate of Change), позволяет отображать разными цветами положительные и отрицательные полуотклонения цен актива. PaintROC позволяет выбирать метод расчёта - абсолютный (в пунктах) или относительный (в процентах) - и период, за который вычисляется отклонение цен. Так как в MetaStock'е нельзя изменить цвет индикатора в зависимости от какого-либо условия, для изображения двухцветного индикатора приходится использовать два окрашенных в разные цвета индикатора - ROCplus и ROCminus -, которые размещаются в одном окне. В отличие от MetaStock'а в Omega ProSuite встроенный язык программирования Easy Language предоставляет возможность изменять цвет индикатора в зависимости от выполнения того или иного условия, что позволяет в данном случае обойтись одним индикатором.
Разместите вышеназванные индикаторы в одном окне, выберите способ отображения - "гистограмма", цвета - по своему усмотрению, параметры - по желанию :-). Для большего удобства рекомендую сохранить график как шаблон, чтобы легче было применять его впоследствии к различным бумагам.
Код для MetaStock'a:
"ROCplus"
period:=Input("Enter period a calculation:",1,25,1);
metod:=Input("Choose method a calculation: 1 -pt, 2 -% ",1,2,1);
If((C-Ref(C,-period))>0,If(metod = 1,C-Ref(C,-period),((C-Ref(C,-period))/Ref(C,-period))*100),0);
"ROCminus"
period:=Input("Enter period a calculation:",1,25,1);
metod:=Input("Choose method a calculation: 1 -pt, 2 -% ",1,2,1);
If((C-Ref(C,-period))<0,If(metod = 1,C-Ref(C,-period),((C-Ref(C,-period))/Ref(C,-period))*100),0);
Код для Omega ProSuite:
"PaintROC"
{Written by: Alex Draga 12.04.2002
Description: This indicator allows to display different colours positive and negative deflections
****************************************}
Inputs: Period(1), Metod(1);
Vars: PaintR(0);
If Metod > 1 then PaintR =((Close - Close [Period]) /Close [Period])*100;
If Metod < 2 then PaintR =Close - Close [Period];
If (Close - Close [Period]) > 0 then begin
Plot1(PaintR,"Up",Green);
End;
If (Close - Close [Period]) < 0 then begin
Plot2(PaintR,"Down",Red);
End;
Данный индикатор позволяет отображать финансовые результаты сделок в виде гистограммы, на которой зелёным цветом выделены прибыльные сделки (WinTrade), а красным, соответственно, убыточные (LosTrade). Высота столбиков гистограммы соответствует процентному изменению капитала в результате сделки. Также в окне индикатора в виде жёлтой линии отражается информация о средней величине прибыльных сделок (AvgWinTrade) и в виде розовой линии о средней величине убыточных сделок (AvgLosTrade), а красная точечная линия (dotted line) отражает размер максимального убытка на сделку (MaxLoss). Для корректного отображения индикатора необходимо ввести значение начального капитала, соответствующее используемому в тестируемой торговой стратегии. В разделе "Риск-менеджмент" помещён скриншот окна программы "Omega ProSuite", иллюстрирующий результаты применения индикатора "MyTrades" к торговой системе "Parabolic".
Код для Omega ProSuite:
"MyTrades"
{ Description: This indicators plots percentage Profits/Loss per trade and AvgWin and AvgLoss.
Copyright(c) alexdraga, 2002
****************************************}
Inputs: CapitalIni(1000);
Vars: Curve(0),Trade(0),Coler(0),WinTrade(0),LosTrade(0),ZeroLine(0),MaxLos(0)
,WinCount(0),LosCount(0),AvgWinTrade(0),AvgLosTrade(0),Width(0);
Arrays: WinTrades[100](0),LosTrades[100](0);
Curve=(I_ClosedEquity/CapitalIni);
If Curve <> Curve[1] then
Trade = (((1+Curve)/(1+Curve[1]))-1)*100
else
Trade = 0;
If Trade>0 and Curve <> Curve[1]then begin
WinTrade=Trade;
WinCount=WinCount+1;
Coler=Green ;
Width=3;
For Value1 = 99 DownTo 0 Begin
WinTrades[Value1+1] = WinTrades[Value1];
End;
WinTrades[0] = WinTrade;
Value2=Summation_a(WinTrades, 100);
AvgWinTrade=Value2/WinCount;
End;
If Trade<0 and Curve <> Curve[1]then begin
LosTrade=Trade;
If LosTrade < MaxLos Then MaxLos = LosTrade;
LosCount=LosCount+1;
Coler=Red ;
Width=3;
For Value3 = 99 DownTo 0 Begin
LosTrades[Value3+1] = LosTrades[Value3];
End;
LosTrades[0] = LosTrade;
Value4=Summation_a(LosTrades, 100);
AvgLosTrade=Value4/LosCount;
End;
If Trade=0 then begin
Coler=LightGray ;
Width=1;
End;
Plot1(Trade,"Trades",Coler,Width);
Plot2(MaxLos,"MaxLoss",Red);
Plot3(AvgWinTrade,"AvgWinTrade",Yellow);
Plot4(AvgLosTrade,"AvgLosTrade",Magenta);
Если Вам не нравится это название, можете заменить его, к примеру, на "ItsDrawDown" или "TheirDrawDown" J. Данный индикатор состоит из двух индикаторов - "MyDrawDown" и "MyEquity" - и позволяет отображать относительную (в процентах от текущего капитала) величину DrawDown's в виде гистограммы красного цвета и размер Maximum DrawDown (также, естественно, в процентном выражении) в виде толстой розовой линии, а также кривые доходности, отражающие относительную (в процентах от начального капитала) динамику изменения стоимости капитала. Жёлтая кривая показывает стоимость капитала как в процессе поддержания открытой позиции, так и по результатам уже закрытых позиций, голубая линия отражает стоимость активов по итогам завершённых сделок.
Для корректного отображения индикатора необходимо ввести значение начального капитала, соответствующее используемому в тестируемой торговой стратегии, и разместить вышеназванные индикаторы в разных окнах (желательно). В разделе "Риск-менеджмент" помещён скриншот окна программы "Omega ProSuite", иллюстрирующий результаты применения индикатора "MyDrawDown" к торговой системе "Parabolic".
Код для Omega ProSuite:
"MyDrawDown"
{Written by: Alex Draga 12.05.2002
Description: This indicators plots percentage DrawDowns & MaxDrawDown.
Copyright(c) alexdraga, 2002
****************************************}
Inputs: CapitalIni(1000);
Vars: Yield(0),DD(0),EquityPick(0),MaxDD(0);
Yield=(I_OpenEquity/CapitalIni);
If Yield > EquityPick Then EquityPick = Yield;
If Yield < EquityPick Then
DD = (((1+Yield)/(1+EquityPick))-1)*100
else
DD = 0;
If DD < MaxDD Then MaxDD = DD;
Plot1(DD,"DD",Red);
Plot2(MaxDD,"MaxDD",Magenta);