Все знают как порой бывает неудобен интерфейс нового WealthLab. Например, у нас открыт график, но для того чтобы посмотреть на сколько акций (контрактов) и по какой цене выставлять ордер, нам надо перейти во вкладку Alerts, там запомнить количество акций (контрактов), цену ордера и перейти обратно в график чтобы визуально посмотреть где будет ордер. Но пока будете рассматривать график, уже забудете количество акций или цену, или и то и другое. В старом WealthLab было все продумано и ордера появлялись внизу графика, поэтому никуда переключаться не было нужды.
Поэтому, для удобства рекомендую создать новую панель и туда вынести описание ордера, например вот так:
Но, интересно, что стандартным способом получалось что ордера на открытие позиции отображались правильно, а на закрытие позиции цена всегда была равна нулю. Пришлось написать на форум WealthLab, где быстро получил ответ от Eugene (это их главный представитель) о том что напрямую это сделать не получится, так как что-то там у них не так, но можно все провернуть окольными путями. И привел пример кода.
Вроде бы все работает нормально. Только одна незначительная загвоздка теперь. Если тестировать фьючерсы, то, как и прежде, ордера на открытие позиции отображаются нормально, а вот на закрытие позиции получается что-то такое:
Sell 1 contract of ES at Stop 2097.826256522141421
Правильнее было бы, конечно так:
Sell 1 contract of ES at Stop 2097.75
Потому что шаг цены для фьючерса ES — 0,25.
Если интересно, привожу код. Пример системы — покупаем на пробой двухбарного канала по high, продаем на пробой двухбарного канала по low. Остальной код для отображения ордера в верхней панели:
using System;
using System.Collections.Generic;
using System.Text;
using System.Drawing;
using WealthLab;
using WealthLab.Indicators;
namespace WealthLab.Strategies
{
public class MyStrategy : WealthScript
{
protected override void Execute()
{
ChartPane zPane = CreatePane( 10, true, true );
Font font = new Font("Arial", 10, FontStyle.Regular);
for(int bar = 20; bar < Bars.Count; bar++)
{
if (IsLastPositionActive)
{
Position p = LastPosition;
double exitPrice = Lowest.Value(bar, Low, 2);
p.Tag = (object)exitPrice;
SellAtStop(bar+1, p, exitPrice);
}
else
{
BuyAtStop(bar+1, Highest.Value(bar, High, 2));
}
for( int i = 0; i < Alerts.Count; i++ )
{
WealthLab.Alert a = Alerts[i];
bool exit = (a.AlertType == TradeType.Sell || a.AlertType == TradeType.Cover);
string basis = exit == true ? ((double)a.Position.Tag).ToString() : a.BasisPrice.ToString();
DrawText( zPane, a.AlertType + " " + a.Shares + " contracts of " + a.Symbol + " at " + a.OrderType + " " + basis,
0, 0, Color.White, Color.Black, font);
}
}
}
}
}