Номер расчета при "Optimize signal" для MC.NET

Questions about QUIK trading plugin for Russian brokers and general MultiCharts questions can be asked here in Russian; they will be answered in Russian by our staff. No registration necessary.
zysmn
Posts: 68
Joined: 27 Feb 2014
Has thanked: 7 times
Been thanked: 4 times

Номер расчета при "Optimize signal" для MC.NET

Postby zysmn » 28 Aug 2018

Приветствую.
Можно ли из кода стратегии получить текущее значения номера шага расчета при оптимизации? Т.е. предположим нужно сделать оптимизацию для некой переменой от 3 до 10. Для значения переменной=5 будет шаг №3. Как из кода стратегии получить, что сейчас считаем 3-ий шаг?
На текущий момент решением служит только осуществлять оптимизации в одном потоке, и уже в коде стратегии вставить счетчик который просто с каждым расчетом увеличивается на 1, так получаем номер шага. Но на одном потоке при большом диапазоне как-то медленновато.
В общем нужно при одинаковом диапазоне оптимизации для разных инструментов для одного и того же значения переменной получить из кода один и тот же ID.
Спасибо.

User avatar
Henry MultiСharts
Posts: 9165
Joined: 25 Aug 2011
Has thanked: 1264 times
Been thanked: 2957 times

Re: Номер расчета при "Optimize signal" для MC.NET

Postby Henry MultiСharts » 11 Sep 2018

Здравствуйте, zysmn.

На данный момент подобного функционала нет. Вы можете создать globalvariable и инкрементировать её значение:

Code: Select all

value1 = GVGetNamedInt("OptCount", -1);
if getappinfo(aioptimizing)=0 then
GVSetNamedInt("OptCount", -1);
if getappinfo(aioptimizing)=1 and value1<0 then
GVSetNamedInt("OptCount", 0);
if getappinfo(aioptimizing)=1 and value1>=0 then
GVSetNamedInt("OptCount", value1+1);

zysmn
Posts: 68
Joined: 27 Feb 2014
Has thanked: 7 times
Been thanked: 4 times

Re: Номер расчета при "Optimize signal" для MC.NET

Postby zysmn » 15 Sep 2018

Здравствуйте Henry.
Можно, пожалуйста, простейщий пример поподробней? А то я общую мысль уловил, но с реализацией возникли проблемы.
Спасибо.

User avatar
Henry MultiСharts
Posts: 9165
Joined: 25 Aug 2011
Has thanked: 1264 times
Been thanked: 2957 times

Re: Номер расчета при "Optimize signal" для MC.NET

Postby Henry MultiСharts » 27 Sep 2018

zysmn,

Чтобы счетчик заработал в многопоточной среде надо сделать один класс - синглтон, в котором и вести этот счетчик, а также добавить в нём критическую секцию. Счетчик необходимо увеличивать на первом баре серии. Больше про синглтоны: http://csharpindepth.com/Articles/Gener ... leton.aspx

zysmn
Posts: 68
Joined: 27 Feb 2014
Has thanked: 7 times
Been thanked: 4 times

Re: Номер расчета при "Optimize signal" для MC.NET

Postby zysmn » 12 Nov 2018

Здравствуйте Henry.
Попробовал через синглтон. Написал отдельное простенькое многопоточное приложение, все вроде работает. Написал простенький сигнал, получается какая-то хрень, значение оптимизируемого параметра все равно не равно счетчику через синглтон.
Image
Вот код.

Code: Select all


namespace PowerLanguage.Strategy
{
public class _zzzEx_singleton : SignalObject
{
public _zzzEx_singleton(object _ctx)
: base(_ctx)
{
testCounter = 1;
singl01 = SingletonCounter.Source;
}
private IOrderMarket buy_order;
SingletonCounter singl01;
[Input]
public int testCounter { get; set; }
string valueText = "";
protected override void Create()
{
buy_order = OrderCreator.MarketNextBar(new SOrderParameters(Contracts.Default, EOrderAction.Buy));
singl01.ResetCounter();
Output.Clear();
}
protected override void StartCalc()
{
// assign inputs
if (Environment.Optimizing)
{
singl01.SetCounter();
Output.WriteLine("testCounter: {0}, singlCount: {1}", testCounter.ToString(), singl01.GetCounter());
}
}
protected override void CalcBar()
{
//if (Environment.Optimizing && Bars.CurrentBar == 1)
//{
// singl01.SetCounter();
// Output.WriteLine("testCounter: {0}, singlCount: {1}", testCounter.ToString(), singl01.GetCounter());
//}
// strategy logic
buy_order.Send();
}
}

public sealed class SingletonCounter
{
private SingletonCounter() { }

private static readonly Lazy<SingletonCounter> lazy = new Lazy<SingletonCounter>(() => new SingletonCounter());

public int counter { get; private set; }
public string id { get; private set; }

public static SingletonCounter Source { get { return lazy.Value; } }
public void ResetCounter()
{
counter = 0; //id = System.Guid.NewGuid().ToString();
}
public void SetCounter() { counter++; }
public string GetCounter() { return counter.ToString(); }
public string GetId() { return id; }
}
}
singletonExample.pln
(2.21 KiB) Downloaded 327 times


Return to “MultiCharts QUIK”