or
public
MainWindow()
{
InitializeComponent();
IList<DataHeader> headerList = DataService.Instance.HeaderList;
for
(
int
i = 0; i < headerList.Count; i++)
{
DataHeader curentHeader = headerList[i];
GridViewBoundColumnBase column;
if
(curentHeader.Name ==
"AMOUNT"
)
{
column =
new
CGridViewNumColumn();
}
else
{
column =
new
GridViewDataColumn();
}
column.DataMemberBinding =
new
Binding(
"DataItemList["
+ i +
"]"
)
{
UpdateSourceTrigger = UpdateSourceTrigger.LostFocus
};
column.Header = curentHeader.Caption;
column.UniqueName = curentHeader.Name;
GridControl.Columns.Add(column);
}
DataContext = DataService.Instance.Data;
}
internal
class
CGridViewNumColumn : GridViewBoundColumnBase
{
public
override
FrameworkElement CreateCellEditElement(GridViewCell cell,
object
dataItem)
{
BindingTarget = RadMaskedTextInput.ValueProperty;
var input =
new
RadMaskedTextInput
{
HorizontalContentAlignment = HorizontalAlignment.Right,
Culture = CultureInfo.GetCultureInfo(
"en-GB"
),
FormatString =
"n2"
,
Mask =
""
,
MinWidth = 100,
SelectionOnFocus = SelectionOnFocus.SelectAll
};
input.SetBinding(BindingTarget, CreateValueBinding());
input.LostFocus += InputOnLostFocus;
return
input;
}
private
void
InputOnLostFocus(
object
sender, RoutedEventArgs routedEventArgs)
{
var input = sender
as
RadMaskedTextInput;
if
(input ==
null
)
throw
new
ArgumentNullException(
"sender"
);
if
(
string
.IsNullOrWhiteSpace(input.Value))
{
input.Value =
string
.Empty;
return
;
}
double
value;
//Format the number for frontend.
const
NumberStyles style = NumberStyles.Float | NumberStyles.AllowThousands;
if
(!
double
.TryParse(input.Value, style, input.Culture,
out
value))
{
input.Value =
"0"
;
}
input.Text = value.ToString(input.FormatString, input.Culture);
//Format the number for back-end. Extra precisions will be removed.
if
(!
double
.TryParse(input.Text, style, input.Culture,
out
value))
{
input.Value =
"0"
;
}
input.Value = value.ToString(input.Culture);
}
private
Binding CreateValueBinding()
{
var valueBinding =
new
Binding
{
Mode = BindingMode.TwoWay,
NotifyOnValidationError =
true
,
ValidatesOnExceptions =
true
,
Path =
new
PropertyPath(DataMemberBinding.Path.Path)
};
return
valueBinding;
}
}
public
abstract
class
IBacktestOption
{
#region fields
private
double
mGearing;
public
double
Gearing {
get
{
return
mGearing; }
set
{ mGearing = value; } }
private
double
? mGlobalCap;
public
double
? GlobalCap {
get
{
return
mGlobalCap; }
set
{ mGlobalCap = value; } }
private
double
? mGlobalFloor;
public
double
? GlobalFloor {
get
{
return
mGlobalFloor; }
set
{ mGlobalFloor = value; } }
public
string
Nom {
get
;
set
; }
#endregion
protected
IBacktestOption(
double
aGearing,
double
? aGlobalCap,
double
? aGlobalFloor)
{
Gearing = aGearing;
GlobalCap = aGlobalCap;
GlobalFloor = aGlobalFloor;
}
public
abstract
Dictionary<DateTime, IResultatsBacktest> GetOptionResults(IBacktesting backtest);
public
abstract
bool
CheckOption();
}
class
OptionCall : IBacktestOption, IEditableObject, INotifyPropertyChanged
{
#region fields
private
double
mStrike;
public
double
Strike {
get
{
return
mStrike; }
set
{ mStrike = value; } }
OptionCallData backupOptParamData;
private
int
mID;
public
struct
OptionCallData
{
internal
int
ID;
internal
double
Strike;
internal
double
? CapGlobal;
internal
double
? FloorGlobal;
internal
double
Gearing;
}
public
int
ID
{
get
{
return
mID; }
}
#endregion Fields
#region constructors
public
static
OptionCall CreateNewOptionCall(
double
strike,
double
gearing = 1,
double
? cap =
null
,
double
? floor =
null
)
{
return
new
OptionCall(strike,gearing,cap,floor);
}
public
OptionCall(
double
strike,
double
gearing = 1,
double
? cap =
null
,
double
? floor =
null
) :
base
(gearing,cap,floor)
{
Strike = strike;
Nom =
"Call"
;
}
#endregion
public
override
Dictionary<DateTime, IResultatsBacktest> GetOptionResults(IBacktesting backtest)
{
/* ... */
}
public
override
bool
CheckOption()
{
return
true
;
}
#region Edition
public
void
BeginEdit()
{
}
public
void
CancelEdit()
{
mStrike =
this
.backupOptParamData.Strike;
GlobalCap =
this
.backupOptParamData.CapGlobal;
GlobalFloor =
this
.backupOptParamData.FloorGlobal;
Gearing =
this
.backupOptParamData.Gearing;
}
public
void
EndEdit()
{
this
.backupOptParamData.Strike = mStrike;
this
.backupOptParamData.CapGlobal = GlobalCap;
this
.backupOptParamData.FloorGlobal = GlobalFloor;
this
.backupOptParamData.Gearing = Gearing;
}
#endregion Edition
#region Events
public
event
PropertyChangedEventHandler PropertyChanged;
private
void
NotifyPropertyChanged(
string
info)
{
if
(PropertyChanged !=
null
)
PropertyChanged(
this
,
new
PropertyChangedEventArgs(info));
}
#endregion Events
}
class
CallSpread : IBacktestOption, IEditableObject, INotifyPropertyChanged
{
#region fields
private
double
mStrike1;
public
double
Strike1 {
get
{
return
mStrike1; }
set
{ mStrike1 = value; } }
private
double
mStrike2;
public
double
Strike2 {
get
{
return
mStrike2; }
set
{ mStrike2 = value; } }
OptionCallData backupOptParamData;
private
int
mID;
public
struct
OptionCallData
{
internal
int
ID;
internal
double
Strike1;
internal
double
Strike2;
internal
double
? CapGlobal;
internal
double
? FloorGlobal;
internal
double
Gearing;
}
public
int
ID
{
get
{
return
mID; }
}
#endregion Fields
#region constructors
public
static
CallSpread CreateNewCallSpread(
double
strike1,
double
strike2,
double
gearing = 1,
double
? cap =
null
,
double
? floor =
null
)
{
return
new
CallSpread(strike1, strike2, gearing, cap, floor);
}
public
CallSpread(
double
strike1,
double
strike2,
double
gearing = 1,
double
? cap =
null
,
double
? floor =
null
) :
base
(gearing,cap,floor)
{
Strike1 = Math.Min(strike1, strike2);
Strike2 = Math.Max(strike1, strike2);
Nom =
"Call Spread"
;
}
#endregion
public
override
Dictionary<DateTime, IResultatsBacktest> GetOptionResults(IBacktesting backtest)
{
/* ... */
}
public
override
bool
CheckOption()
{
return
true
;
}
#region Edition
public
void
BeginEdit()
{
}
public
void
CancelEdit()
{
mStrike1 =
this
.backupOptParamData.Strike1;
mStrike2 =
this
.backupOptParamData.Strike2;
GlobalCap =
this
.backupOptParamData.CapGlobal;
GlobalFloor =
this
.backupOptParamData.FloorGlobal;
Gearing =
this
.backupOptParamData.Gearing;
}
public
void
EndEdit()
{
this
.backupOptParamData.Strike1 = mStrike1;
this
.backupOptParamData.Strike2 = mStrike2;
this
.backupOptParamData.CapGlobal = GlobalCap;
this
.backupOptParamData.FloorGlobal = GlobalFloor;
this
.backupOptParamData.Gearing = Gearing;
}
#endregion Edition
#region Events
public
event
PropertyChangedEventHandler PropertyChanged;
private
void
NotifyPropertyChanged(
string
info)
{
if
(PropertyChanged !=
null
)
PropertyChanged(
this
,
new
PropertyChangedEventArgs(info));
}
#endregion Events
}
<
telerik:RadDataForm
Grid.Column
=
"1"
Margin
=
"12,0,6,21"
Grid.ColumnSpan
=
"2"
HorizontalContentAlignment
=
"Stretch"
VerticalContentAlignment
=
"Stretch"
ItemsSource
=
"{Binding BacktestOpt}"
CommandButtonsVisibility
=
"Cancel,Commit,Edit,Navigation"
Grid.Row
=
"1"
Height
=
"456"
Grid.RowSpan
=
"2"
/>
private
ViList<IBacktestOption> mBacktestOpt;
public
ViList<IBacktestOption> BacktestOpt
{
get
{
if
(mBacktestOpt ==
null
&& Formule == 0)
{
ViList<IBacktestOption> newBacktestOpt =
new
ViList<IBacktestOption>();
newBacktestOpt.Add(Creators.CreateNewOptionCall(0));
this
.mBacktestOpt =
new
ViList<IBacktestOption>(newBacktestOpt);
Formule = PayoffFormule.CALL;
}
return
mBacktestOpt;
}
set
{
mBacktestOpt = value;
OnPropertyChanged(
"BacktestOpt"
);
}
}
private
PayoffFormule mFormule;
public
PayoffFormule Formule
{
get
{
return
mFormule; }
set
{
mFormule = value;
switch
(mFormule)
{
case
PayoffFormule.CALL :
Backtest.Option = Creators.CreateNewOptionCall(0);
break
;
case
PayoffFormule.PUT :
Backtest.Option = Creators.CreateNewOptionPut(0);
break
;
case
PayoffFormule.ASIAN_CALL:
Backtest.Option = Creators.CreateNewAsianCall(0);
break
;
case
PayoffFormule.ASIAN_PUT:
Backtest.Option = Creators.CreateNewAsianPut(0);
break
;
case
PayoffFormule.CALL_SPREAD:
Backtest.Option = Creators.CreateNewCallSpread(0,0.15);
break
;
default
:
break
;
}
BacktestOpt.Add(Backtest.Option);
OnPropertyChanged(
"BacktestOpt"
);
OnPropertyChanged(
"Formule"
);
}
}
private
PayoffFormule mFormule;
public
PayoffFormule Formule
{
get
{
return
mFormule; }
set
{
mFormule = value;
BacktestOpt.RemoveAt(0);
switch
(mFormule)
{
case
PayoffFormule.CALL :
Backtest.Option = Creators.CreateNewOptionCall(0);
break
;
case
PayoffFormule.PUT :
Backtest.Option = Creators.CreateNewOptionPut(0);
break
;
case
PayoffFormule.ASIAN_CALL:
Backtest.Option = Creators.CreateNewAsianCall(0);
break
;
case
PayoffFormule.ASIAN_PUT:
Backtest.Option = Creators.CreateNewAsianPut(0);
break
;
case
PayoffFormule.CALL_SPREAD:
Backtest.Option = Creators.CreateNewCallSpread(0,0.15);
break
;
default
:
break
;
}
BacktestOpt.Add(Backtest.Option);
OnPropertyChanged(
"BacktestOpt"
);
OnPropertyChanged(
"Formule"
);
}
}
GridViewDataColumn col =
new
GridViewDataColumn();
col.Header = column.Name;
col.DataMemberBinding = binding;
col.DataType = column.DataType;
col.IsSortable =
true
;
if
(column.DataType ==
typeof
(Int64))
{
col.DataMemberBinding.Converter =
new
LongConverter();
}
public
class
LongConverter : IValueConverter
{
public
object
Convert(
object
value, Type targetType,
object
parameter, System.Globalization.CultureInfo culture)
{
//Int64? convertedValue = (Int64)value;
//if (convertedValue.HasValue)
//{
// return convertedValue.Value;
//}
//else
//{
// return "";
//}
return
"N/A"
;
}
public
object
ConvertBack(
object
value, Type targetType,
object
parameter, System.Globalization.CultureInfo culture)
{
if
(value.ToString().ToUpper() ==
string
.Empty)
{
return
new
Int64();
}
else
{
return
Int64.Parse(value.ToString());
}
}
}
public
Theme ThisApplicationTheme
{
get
{
return
StyleManager.ApplicationTheme; }
set
{
StyleManager.ApplicationTheme = value;
var binding =
new
Binding(
"ThisApplicationTheme"
) { Source =
this
, Mode = BindingMode.OneWay };
foreach
(Window window
in
Application.Current.Windows)
{
foreach
(var element
in
GetWindow(window).ChildrenOfType<FrameworkElement>().ToList())
{
element.SetBinding(StyleManager.ThemeProperty, binding);
}
}
Application.Current.MainWindow.SetBinding(StyleManager.ThemeProperty, binding);
}
}
<
telerik:RadChart
Name
=
"RadChartDemo"
Grid.ColumnSpan
=
"3"
Content
=
""
Margin
=
"10"
Grid.Row
=
"2"
BorderThickness
=
"0"
>
<
telerik:RadChart.DefaultView
>
<
telerik:ChartDefaultView
>
<
telerik:ChartDefaultView.ChartArea
>
<
telerik:ChartArea
>
<
telerik:ChartArea.ZoomScrollSettingsY
>
<
telerik:ZoomScrollSettings
ScrollMode
=
"ScrollAndZoom"
/>
</
telerik:ChartArea.ZoomScrollSettingsY
>
<
telerik:ChartArea.ZoomScrollSettingsX
>
<
telerik:ZoomScrollSettings
ScrollMode
=
"ScrollAndZoom"
/>
</
telerik:ChartArea.ZoomScrollSettingsX
>
</
telerik:ChartArea
>
</
telerik:ChartDefaultView.ChartArea
>
<
telerik:ChartDefaultView.ChartTitle
>
<
telerik:ChartTitle
Content
=
"Tons Per Day"
HorizontalAlignment
=
"Center"
/>
</
telerik:ChartDefaultView.ChartTitle
>
</
telerik:ChartDefaultView
>
</
telerik:RadChart.DefaultView
>
</
telerik:RadChart
>