Для удобства WL

Все знают как порой бывает неудобен интерфейс нового WealthLab. Например, у нас открыт график, но для того чтобы посмотреть на сколько акций (контрактов) и по какой цене выставлять ордер, нам надо перейти во вкладку Alerts, там запомнить количество акций (контрактов), цену ордера и перейти обратно в график чтобы визуально посмотреть где будет ордер. Но пока будете рассматривать график, уже забудете количество акций или цену, или и то и другое. В старом WealthLab было все продумано и ордера появлялись внизу графика, поэтому никуда переключаться не было нужды.

Поэтому, для удобства рекомендую создать новую панель и туда вынести описание ордера, например вот так:

Но, интересно, что стандартным способом получалось что ордера на открытие позиции отображались правильно, а на закрытие позиции цена всегда была равна нулю. Пришлось написать на форум WealthLab, где быстро получил ответ от Eugene (это их главный представитель) о том что напрямую это сделать не получится, так как что-то там у них не так, но можно все провернуть окольными путями. И привел пример кода.
http://www.wealth-lab.com/Forum/Posts/Alert-BasisPrice-is-zero-for-sell-orders-35546

Вроде бы все работает нормально. Только одна незначительная загвоздка теперь. Если тестировать фьючерсы, то, как и прежде, ордера на открытие позиции отображаются нормально, а вот на закрытие позиции получается что-то такое:

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);
            }
         }
      }
   }
}
Пролистать наверх