jc_trader


JC-TRADER. Биржевые игры. Системные Спекуляции.


Previous Entry Поделиться Next Entry
Для удобства WL
jc_trader
Все знают как порой бывает неудобен интерфейс нового 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);
            }
         }
      }
   }
}


Метки:

  • 1
Заплатку к коду с них "трясите", для округления с заданным шагом.
Странно, что в стандартном пакете поставки нет "Numbers of Decimal Places".

Нет, так то все есть на вкладке Alerts и в других вкладках все правильно отображается, с правильным шагом. Но это все надо открывать и тем самым закрывать график.

А вот чтобы эту информацию отобразить прямо на графике, для этого, как сказал Eugene, надо идти "окольными путями" -- то есть просто так из алертов можно перенести только открытие позиций, а вот с закрытиями сложнее :)

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

Надо в Symbol Info Manager указать сведения по используемому фьючерсу - шаг цены, количество знаков после занятой и margin (ГО). Я попробовал ваш скрипт - все без проблем, без всяких окольных путей.

Edited at 2015-03-05 19:42 (UTC)

Re: Округление

Это понятно. Для ордера на открытие позиции выдается правильная цена, взятая из алерта, который взаимодействует с "Symbol Info Manager".

А вот для ордера на закрытие у них там что-то не так, поэтому и почему-то нельзя взять цену из алерта.

Re: Округление

Это просто в этом примере цены на открытие и закрытие будут совпадать с шагом цены, поэтому кажется что все нормально. А вот если стоп будет расчетный, например, по какому-нибудь индикатору, то и неправильно будет цена отображаться.

Или просто измените код
double exitPrice = Lowest.Value(bar, Low, 2);
на
double exitPrice = 0,995 * Lowest.Value(bar, Low, 2);

И все изменится :)

Re: Округление

Все без проблем. Я ничего не менял в вашем исходном коде. При формировании alert цена на закрытие позиции должна округляться по параметрам, указанным в Symbol Info Manager. Хотел вам скрин направить, но не разобрался как его прикрепить.

Edited at 2015-03-05 20:15 (UTC)

Re: Округление

Вставьте этот код и поменяйте последнюю дату на РТС на 03.03.2015 чтобы появился ордер на закрытие позиции:

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 = 0.995 * 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);
}
}
}
}
}

Re: Округление

"При формировании alert цена на закрытие позиции должна округляться по параметрам, указанным в Symbol Info Manager"

Так это в алертах. Там все нормально.
Мы же применяем декоративные функции для красивого оформления графика. Вот тут проблема.

Re: Округление

Вот РТС с последней свечкой 03.03.2015 ордер на закрытие позиции

1

Это когда поменяем на
double exitPrice = 0,995 * Lowest.Value(bar, Low, 2);

Re: Округление

Скриншот 2015-03-05 23.03.24.png

Edited at 2015-03-05 20:21 (UTC)

Re: Округление

Да, вы правы во втором скрипте не происходит округления.

Edited at 2015-03-05 20:26 (UTC)

Re: Округление

Ну вот о чем я и говорю :)

Re: Округление

Для первого скрипта прогнал все инструменты, которые торгую - работает все корректно. Жаль не смог скрин прикрепить.

Re: Округление

Ну там же закрытие позиции по двухдневному лоу. Лоу это всегда реальная цена с правильным шагом инструмента. Поэтому иначе и быть не могло. Там просто не может работать некорректно. Если лоу по РТС 9500, то и стоп будет 9500.

Но вот если стоп рассчитывается по МА, например. И МА = 9496,85574. Вот тут и не будет округления до шага цены.



Re: Округление

Да, вы правы. Спасибо за скрипт.

У меня глобальный вопрос, зачем они дробят цену на четверти?
Типа так ликвидности на каждом шаге больше?

Это у них древние традиции, типа национальных мер измерений. До 2000 года даже на акциях шаг цены был 1/8.

  • 1
?

Log in

No account? Create an account