Список форумов AmiSite.ru AmiSite.ru
Форум по Ами
 FAQ  •  Поиск  •  Пользователи  •  Группы   •  Регистрация  •  Профиль  •  Войти и проверить личные сообщения  •  Вход
 Report Charts Следующая тема
Предыдущая тема
Начать новую тему  Ответить на тему
Автор Сообщение
kyiv.maxim



Зарегистрирован: 26.03.2010
Сообщения: 23

СообщениеДобавлено: Вт Окт 04, 2011 6:40 am Ответить с цитатой Вернуться к началу

Доброго дня!

Подскажите, как перенастроить 1. Portfolio Equity.afl из ....\AmiBroker\Formulas\Report Charts, что бы отображал для сравнения график Buy&Hold.
Спасибо.
Посмотреть профиль Отправить личное сообщение
Nero Wolfe



Зарегистрирован: 17.03.2010
Сообщения: 174

СообщениеДобавлено: Ср Окт 05, 2011 2:34 pm Ответить с цитатой Вернуться к началу

В Portfolio Equity.afl должно быть так:
Код:
function PlotGradientArea( array, caption, ColorTop, ColorBottom )
{
 bkclr = GetChartBkColor();

 HH = HighestVisibleValue( array );
 if( NOT IsNull( hh ) ) SetChartBkGradientFill( ColorTop, ColorBottom, bkclr, Null, HH );
 Plot( array, Caption, ColorBlend( ColorBottom, colorBlack ), styleNoLabel );
 PlotOHLC( HH, HH, array, HH, "", bkclr, styleNoLabel | styleNoTitle | styleCloud, Null, Null, 0, -10 );
 Plot( Foreign("~~~LAST", "Close"), "BuyAndHold", colorBlue, styleOwnScale);
}

Title = "Portfolio Equity = " + C;
PlotGradientArea( C, "Portfolio Equity", colorLightOrange, colorPaleGreen );

//SetChartOptions(3, chartShowDates );


и потом в код системы (обычно в начало) нужно добавить:
Код:
AddToComposite(C, "~~~LAST", "C", atcFlagDeleteValues | atcFlagEnableInBacktest );

_________________
Если вас грызет совесть, выбейте ей зубы, и пусть она вас нежно обсасывает.
Посмотреть профиль Отправить личное сообщение
spitfire



Зарегистрирован: 29.04.2010
Сообщения: 729
Откуда: Moscow

СообщениеДобавлено: Ср Окт 05, 2011 2:57 pm Ответить с цитатой Вернуться к началу

Не работает. Добавил и в начало, и в конец - вижу только свою эквитю Smile
UPD. Пардон, все работает, это я не увидел что в portfolio equity надо добавить строчку Embarassed
Посмотреть профиль Отправить личное сообщение ICQ Number
kyiv.maxim



Зарегистрирован: 26.03.2010
Сообщения: 23

СообщениеДобавлено: Пт Окт 07, 2011 11:33 am Ответить с цитатой Вернуться к началу

Nero Wolfe,
спасибо! То что и требовалось!
Посмотреть профиль Отправить личное сообщение
Nero Wolfe



Зарегистрирован: 17.03.2010
Сообщения: 174

СообщениеДобавлено: Пн Окт 10, 2011 10:19 am Ответить с цитатой Вернуться к началу

Еще есть полезный с моей точки зрения код, который давал ubertrader.
Нужно в папке Report Charts создать файл с именем 3. Month Profit.afl (хотя оно может быть и другим) вот с таким содержанием:
Код:
SetBarsRequired(1000000,1000000);
eq = Foreign("~~~EQUITY", "C" );

yr = Year();
mo = Month();

YearChange = yr != Ref( yr, -1 );
MonChange = mo != Ref( mo, -1 );

FirstYr = 0;
LastYr = 0;

startbar = 0;

////////////////////////////
// SKIP non-trading bars
////////////////////////////
for( i = 0; i < BarCount; i++ )
{
  if( eq[ i ] )
  {
    startbar = i;
    break;
  }
}

////////////////////////////
// collect yearly / monthly changes in equity
// into dynamic variables
////////////////////////////

LastYrValue = eq[ startbar  ];
LastMoValue = eq[ startbar  ];

MaxYrProfit = MinYrProfit = 0;
MaxMoProfit = MinMoProfit = 0;

for( i = startbar + 1; i < BarCount; i++ )
{
  if( YearChange[ i ] || i == BarCount - 1 )
  {
    Chg = ( eq[ i ] - LastYrValue );
    VarSet("ChgYear"+ yr[ i - 1 ], Chg );

    MaxYrProfit = Max( MaxYrProfit, Chg );
    MinYrProfit = Min( MinYrProfit, Chg );

    if( FirstYr == 0 ) FirstYr = yr[ i - 1 ];
    LastYr = yr[ i ];

    LastYrValue = eq[ i ];
  }

  if( MonChange [ i ] || i == BarCount - 1 )
  {
    mon = mo[ i - 1 ];

    Chg = ( eq[ i ] - LastMoValue );

    VarSet("ChgMon" + yr[ i - 1 ] + "-" + mon, Chg );
    VarSet("SumChgMon"+ mon, Chg + Nz( VarGet("SumChgMon"+ mon ) ) );
    VarSet("SumMon" + mon, 1 + Nz( VarGet("SumMon"+ mon ) ) );
 
    MaxMoProfit = Max( MaxMoProfit, Chg );
    MinMoProfit = Min( MinMoProfit, Chg );

    LastMoValue = eq[ i ];
  }
}

/////////////////////////////////////////////////
// Drawing code & helper functions
////////////////////////////////////////////////

GfxSetOverlayMode( 2 );

CellHeight = (Status("pxheight")-1)/(LastYr - FirstYr + 3 );
CellWidth = (Status("pxwidth")-1)/14;
//GfxSelectFont( "Tahoma", 8.5 );
GfxSelectFont( "Tahoma", 8.5 , 1, False, False, 0.3);


GfxSetBkMode( 1 );

function PrintInCell( string, row, Col )
{
 Color =  ColorRGB( IIf( row == 0 || col == 0 || col == 13, 220, 255 ), 255, IIf( row % 2, 255, 220 ) );
 GfxSelectSolidBrush( Color   );
 GfxRectangle( Col * CellWidth,
                    row * CellHeight, (Col + 1 ) * CellWidth + 1,
                    (row + 1 ) * CellHeight  + 1);
 GfxDrawText( string, Col * CellWidth + 1,
                    row * CellHeight + 1,
                    (Col + 1 ) * CellWidth, (row + 1 ) * CellHeight, 32+5 );
}

YOffset = 25;
XOffset = 15;

function DrawBar( text, bar, numbars, y, Miny, Maxy )
{
 BarWidth = (Status("pxwidth") - 4 * XOffset )/( numbars + 1 );
 BarHeight = Status("pxheight") - 2 * YOffset;
 relpos = ( y - Miny ) / (Maxy - Miny );

 xp = XOffset + ( bar + 0.5 ) * BarWidth;
 yp = YOffset + BarHeight * ( 1 - relpos );
 xe = XOffset + ( bar + 1 ) * BarWidth;
 ye = YOffset + BarHeight * ( 1 - ( -miny )/( maxy - miny ) );
 
 if( y > 0 )
 {
 GfxGradientRect( xp, yp,
                  xe , ye,
                  ColorHSB( 70, 255 * relpos, 255 ), ColorHSB( 70, 20, 255 ) );
 }
 else
 {
 GfxGradientRect( xp, ye,
                  xe , yp,
                  ColorHSB( 0, 20, 255 ), ColorHSB( 0, 255 * ( 1 - relpos ), 255 ) );
 }
 GfxSelectFont( "Tahoma", 8.5 , 1, False, False, 0.3);
 GfxTextOut( text, xp, ye );
// GfxTextOut( StrFormat("%.2f", y ), xp, yp );
// GfxSelectFont( "Tahoma", 8.5 );
}   

function DrawLevels( Miny, Maxy )
{
  range = Maxy - Miny;

  grid = grid = round(range / 20 / 100)* 100;
/*
  if( range < 10 ) grid = 1;
  else
  if( range < 20 ) grid = 2;
  else
  if( range < 50 ) grid = 5;
  else
  if( range < 100 ) grid = 10;
  else
  if( range < 200 ) grid = 20;
  else
  if( range < 500 ) grid = 50;
  else
  if( range < 5000 ) grid = 500;
  else
  if( range < 10000 ) grid = 1000;
*/


//  _TRACE("grid = "+grid +" range "+range );
 
  width = Status("pxwidth") - 4 * XOffset;
  height = Status("pxheight") - 2 * YOffset;

  GfxSelectPen( colorBlack, 1, 2 );
  for( y = grid * ceil( Miny / grid ); y <= grid * floor( Maxy / grid ); y += grid )
  {
    yp =  YOffset + Height * ( 1 -  ( y - Miny ) / (Maxy - Miny ) );

    GfxMoveTo( XOffset, yp );
    GfxLineTo( XOffset + width , yp );
    GfxTextOut( ""+ y, XOffset + 2 + width, yp );
  }

  GfxSelectPen( colorBlack, 1, 0 );
  GfxMoveTo( XOffset, YOffset );
  GfxLineTo( XOffset + width, YOffset );
  GfxLineTo( XOffset + width, YOffset + Height );
  GfxLineTo( XOffset , YOffset + Height );
  GfxLineTo( XOffset , YOffset );
}

function DrawYear(  text, bar, numbars)
{
 BarWidth = (Status("pxwidth") - 4 * XOffset )/( numbars + 1 );
 BarHeight = Status("pxheight") - 2 * YOffset;

 height = Status("pxheight") - 2 * YOffset;

 xp = XOffset + ( bar + 0.5 ) * BarWidth;
 
 GfxSelectFont( "Tahoma", 12 , 700);
 GfxTextOut( text, xp, BarHeight );
 GfxSelectPen( colorGrey40, 1, 2 );

  GfxMoveTo( xp - 0.25  * BarWidth, YOffset );
  GfxLineTo( xp - 0.25  * BarWidth, Status("pxheight") );
 GfxSelectFont( "Tahoma", 8.5 );

}


MonthNames = "Jan,Feb,Mar,Apr,May,Jun,Jul,Aug,Sep,Oct,Nov,Dec";

function DisplayProfitTable( )
{
 Header = "Year,"+MonthNames+",Yr Profit%";
 for( Col = 0; (Colname = StrExtract( Header, Col ) ) != ""; Col++ )
 {
  PrintInCell( ColName, 0, Col );
 }

 Row = 1;
 for( y = FirstYr; y <= LastYr; y++ )
 {
  PrintInCell( StrFormat("%g", y ), Row, 0 );
  PrintInCell( StrFormat("%.1f%", VarGet("ChgYear" + y ) ), Row, 13 );
  for( m = 1; m <= 12; m++ )
  {
   Chg = VarGet("ChgMon" + y + "-" + m);
   if( Chg )
     PrintInCell( StrFormat("%.1f%", Chg ), Row, m );
   else
     PrintInCell( "N/A", Row, m );
  }
  Row++;
 }

 PrintInCell("Mon. Avg", Row, 0 );
 for( m = 1; m <= 12; m++ )
 {
   PrintInCell( StrFormat("%.1f%",  Nz( VarGet("SumChgMon" + m)/VarGet("SumMon" + m ) ) ), Row, m );
 }

}

function DisplayYearlyProfits()
{
 Bar = 0;
 for( y = FirstYr; y <= LastYr; y++ )
 {
   Chg = VarGet("ChgYear" + y );
   DrawBar( ""+y, Bar++, ( LastYr - FirstYr + 1 ), Chg, MinYrProfit, MaxYrProfit );
 }
 GfxTextOut("Yearly % Profit chart", 10, 10 );
 DrawLevels( MinYrProfit, MaxYrProfit );
}

function DisplayMonthlyProfits()
{
 Bar = 0;
 MaxBars = 0;
 MinAvgProf = 99999999999999999;
 MaxAvgProf = 0;

for( y = FirstYr; y <= LastYr; y++ )
 {
  for( m = 1; m <= 12; m++ )
  {
   Chg = VarGet("ChgMon" + y + "-" + m);
   if(IsEmpty(Chg))
      continue;
   Maxbars++;
   MinAvgProf = Min( MinAvgProf, Chg );
   MaxAvgProf = Max( MaxAvgProf, Chg );
//   _TRACE("Maxavg: " + MaxAvgProf + "MinAvg " + MinAvgProf);
  }
}

 for( y = FirstYr; y <= LastYr; y++ )
 {
  for( m = 1; m <= 12; m++ )
  {
   Chg = VarGet("ChgMon" + y + "-" + m);


//DrawBar("" + y + "\n" + StrExtract(MonthNames, m-1 ), Bar++, ( LastYr - FirstYr + 1 ) * 13, Chg, MinAvgProf , MaxAvgProf );   

   if( !IsEmpty(Chg) )
//      DrawBar("" + y + "\n" + StrExtract(MonthNames, m-1 ), Bar++, MaxBars, Chg, MinAvgProf , MaxAvgProf );   
      DrawBar("" + (m) , Bar++, MaxBars, Chg, MinAvgProf , MaxAvgProf );   
   
   if(m == 1)
   {
      DrawYear("" + y, Bar-1, MaxBars);
   }
  }

 }
DrawLevels( MinAvgProf , MaxAvgProf );


/*

//--------
 Bar = 0;
 MinAvgProf = MaxAvgProf = 0;
 for( y = 1; y <= 12; y++ )
 {
   Chg = VarGet("SumChgMon" + y ) / VarGet("SumMon" + y );
   MinAvgProf = Min( MinAvgProf, Chg );
   MaxAvgProf = Max( MaxAvgProf, Chg );
 }

 for( y = 1; y <= 12; y++ )
 {
   Chg = VarGet("SumChgMon" + y ) / VarGet("SumMon" + y );
   DrawBar( StrExtract(MonthNames, y-1 ), Bar++, 13, Chg, MinAvgProf , MaxAvgProf );
 }
 GfxTextOut("Avg. Monthly % Profit chart", 10, 10 );

 DrawLevels( MinAvgProf , MaxAvgProf );
*/
}

///////////////////////////
// This function checks if currently selected symbol
// is portfolio equity
//////////////////////////
function CheckSymbol()
{
 if( Name() != "~~~EQUITY" )
 {
  GfxSelectFont( "Tahoma", 20 );
  GfxSetBkMode( 2 );
  GfxTextOut("For accurate results switch to ~~~EQUITY symbol", 10, 10 );
 }
}

////////////////////////////
// Main program - chart type switch
////////////////////////////
type = ParamList("Chart Type", "Avg. Monthly Profits|Profit Table|Yearly Profits", 0 );

switch( type )
{
 case "Profit Table":
         DisplayProfitTable(); 
         break;
 case "Yearly Profits":
         DisplayYearlyProfits();
         break;
 case "Avg. Monthly Profits":
         DisplayMonthlyProfits();
         break;
}

CheckSymbol();

//
//   Exploration Monthly profits
//
if(Status("Action") == actionExplore)
{
Filter = 0;
SetOption("NoDefaultColumns", True );
fi = 0;

DT = 0;
mRet = 0;

for( y = FirstYr; y <= LastYr; y++ )
 {
  for( m = 1; m <= 12; m++ )
  {   
   Chg = VarGet("ChgMon" + y + "-" + m);
   if(IsEmpty(Chg))
      continue;
   Filter[fi] = 1;
   DT[fi] = 10000 * (y - 1900) + 100 * m + 1;
   mRet[fi] = Chg;   
   fi++;
  }
}

AddColumn(DateTimeConvert( 2, DT ), "Date", formatDateTime);
AddColumn(mRet, "MonthReturn", 1.1);
//AddColumn(StDev(mRet,12), "StDev(12) MoRetrn", 1.2);
//AddColumn(MA(mRet,12), "Avg(12) MoRetrn", 1.2);
//AddColumn(MA(mRet,12) / StDev(mRet,12), "ModSR MoRetrn", 1.2);

}


После этого в отчете появится график распределения прибылей/убытков по месяцам в виде гистограммы.

_________________
Если вас грызет совесть, выбейте ей зубы, и пусть она вас нежно обсасывает.
Посмотреть профиль Отправить личное сообщение
spitfire



Зарегистрирован: 29.04.2010
Сообщения: 729
Откуда: Moscow

СообщениеДобавлено: Пн Окт 10, 2011 11:13 am Ответить с цитатой Вернуться к началу

Прикольно, спасиба! Cool Давай еще выложи что-нить полезное Smile
Посмотреть профиль Отправить личное сообщение ICQ Number
Показать сообщения:      
Начать новую тему  Ответить на тему


 Перейти:   



Следующая тема
Предыдущая тема
Вы не можете начинать темы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете голосовать в опросах
Вы не можете вкладывать файлы
Вы не можете скачивать файлы


Powered by phpBB © 2001, 2002 phpBB Group :: FI Theme :: Часовой пояс: GMT + 3

File Attachment © by Meik Sievertsen