#10251 - Tue Aug 17 2010 10:44 PM
Re: И опять ошибка CS0103
[Re: Nektodron]
|
addict
Registered: Thu Jan 14 2010
Записи: 594
|
Чтобы сослаться в формуле на свое значение можно воспользоваться зарезервированным именем list. Например: "list[i-1] + 1" Nektodron, я правильно понимаю, что это ссылка в выражении в визуальном редакторе в блоке формула на своё собственное значение 1 бар назад "list[i-1]"? И в какой сборке? Пишет ошибку error CS0103: Имя 'list' отсутствует в текущем контексте. Или это относится к API? ЗЫ. Нужно ссылаться на предыдущее значение формулы и прибавлять к нему текущее, и т.д.
Это работает уже давно, можно использовать в формулах, но не во всех, а только в тех, которые от списков считаются. Т.е. если в формулу идет обновляемое значение или чтото из позиции, то работать не будет. Nektodron, в том то и вопрос, что нужно работать с позицией: обращаться к балансу активной позиции на i-той свече, и проводить с ней расчёты, возможно ли в принципе сделать такой блок для визуала индикатора на API и какие использовать интерфейсы: 1. в IPosition2Double - который цепляется к блоку входа, я так понимаю что нельзя например обращаться к i-му значению pos.OpenProfit, или можно через BarNum, но как запоминать i-тое значение переменной, т.е. нужно pos.OpenProfit[i]=pos.OpenProfit[i-1]+pos.OpenProfit[i] и т.д. пока активна позиция? 2.Для расчёта такого выражения с помощью IBar2DoubleHandler можно создать список из источника, но как проверить наличие активной позиции, через source.Positions.GetLastActiveForSignal? а как обратиться к балансу позиции, в source.Positions не нашёл значения баланса или перехода не к IPositionList, а к IPosition, откуда можно взять и IsActive и OpenProfit? Или можно какие то другие использовать интерфейсы? Или такое можно сделать только во внешнем скрипте с помощью IExternalScript? Подскажите пож. чтобы зря время не терять с индикатором ----------------- P.S. Почему то тема топика меняется - писал в топик "Создание индикаторов на API", а высвечивается "И опять ошибка CS0103"
Отредактировано uprav (Tue Aug 17 2010 10:51 PM)
_________________________
|
|
Наверх
|
|
|
|
#10336 - Thu Aug 19 2010 11:05 AM
Создание индикаторов на API
[Re: Nektodron]
|
addict
Registered: Thu Jan 14 2010
Записи: 594
|
Nektodron, подскажите пож: вот в этом коде что возможно изменить, чтобы ошибку при компилировании устранить:
вот код:
public class Cumbalanse2 : IPosition2Double { public double Execute(IPosition pos, int barNum) { if (pos == null || !pos.IsActive) { return 0; } int count = pos.Security.Bars.Count; IList<double> n = new double[count]; for (int i = 1; i < count; i++) {n[i] = pos.OpenProfit(i);} return n; } }
Ошибка: Неявное преобразование типа 'System.Collections.Generic.IList<double>' в 'double' невозможно (CS0029)
_________________________
|
|
Наверх
|
|
|
|
#10373 - Thu Aug 19 2010 05:09 PM
Re: Создание индикаторов на API
[Re: Nektodron]
|
addict
Registered: Thu Jan 14 2010
Записи: 594
|
возвращаемое значение у вас заявлено double, а возвращаете список имеете ввиду этоу строчку? public double Execute(IPosition pos, int barNum) но исправление её на public IList<double> Execute(IPosition pos, int barNum) и такой код: public class Cumbalanse2 : IPosition2Double { public IList<double> Execute(IPosition pos, int barNum) { if (pos == null || !pos.IsActive) { return 0; } int count = pos.Security.Bars.Count; var n = new double[count]; for (int i = 1; i < count; i++) {n[i] = pos.OpenProfit(i);} return n; } } выдаёт ошибку: "balans.Cumbalanse2" не реализует член интерфейса "TSLab.Script.Handlers.IPosition2Double.Execute(TSLab.Script.IPosition, int)". "balans.Cumbalanse2.Execute(TSLab.Script.IPosition, int)" не удается реализовать "TSLab.Script.Handlers.IPosition2Double.Execute(TSLab.Script.IPosition, int)", поскольку он не содержит соответствующего типа возвращаемого значения "double". (CS0738) Подскажите пож какое нужно сделать исправление? И возможно ли в этом коде простое исправление, чтобы он выдавал доход позиции на i-м баре?
_________________________
|
|
Наверх
|
|
|
|
#10452 - Fri Aug 20 2010 02:15 PM
Re: Создание индикаторов на API
[Re: uprav]
|
Carpal Tunnel
Registered: Thu Oct 23 2008
Записи: 5492
|
а зачем вы изобретаете велосипед, когда уже есть стандартный кубик "Доход" и "Доход %"? И код его примитивный:
public class Profit : IPosition2Double
{
public double Execute(IPosition pos, int barNum)
{
if (pos == null)
{
return 0;
}
return pos.OpenProfit(barNum);
}
}
|
|
Наверх
|
|
|
|
#10581 - Tue Aug 24 2010 07:12 AM
Re: Создание индикаторов на API
[Re: Nektodron]
|
addict
Registered: Thu Jan 14 2010
Записи: 594
|
Nektodron, подскажите пож какой интерфейс можно использовать наподобие IBar2DoubleHandler для создания блока индикатора, но чтобы цеплялось 2 источника (ценных бумаги) и как в этом случае будет прописываться public IList<double> Execute(ISecurity source)?
_________________________
|
|
Наверх
|
|
|
|
#11866 - Sun Sep 05 2010 04:06 PM
Re: Создание индикаторов на API
[Re: Nektodron]
|
addict
Registered: Thu Jan 14 2010
Записи: 594
|
Nektodron, пытаюсь сделать индикатор в виде свечей от 2-х источников, этот код комиплируется в SharpDevelop, но в ТСЛабе при запуске скрипта выдаёт ошибку:
public class spread : ISecurityInputs, IDoubleReturns, ITwoSourcesHandler, IStreamHandler
{
public ISecurity Execute(ISecurity source1, ISecurity source2)
{
var bars = new List<Bar>(source1.Bars.Count);
for (int i = 0; i < source1.Bars.Count; i++)
{
var bar = source1.Bars[i];
var o1 = source2.OpenPrices[i];
var h1 = source2.HighPrices[i];
var l1 = source2.LowPrices[i];
var c1 = source2.ClosePrices[i];
var newBar = new Bar(bar.Color, bar.Date,bar.Open-o1,
bar.High-h1,
bar.Low-l1,
bar.Close-c1,
bar.Volume){ Ask = bar.Ask, Bid = bar.Bid, AskQty = bar.AskQty, BidQty = bar.BidQty };
bars.Add(newBar);
}
return source1.CloneAndReplaceBars(bars);
}
}
18:17:55.84 c:\Documents and Settings\...\Local Settings\Application Data\TSLab\TSLab\temp\code8.cs(27,24) : error CS0266: Неявное преобразование типа 'TSLab.Script.ISecurity' в 'System.Collections.Generic.IList<double>' невозможно. Существует явное преобразование (возможно, отсутствует приведение) 18:17:55.84 c:\Documents and Settings\...\Local Settings\Application Data\TSLab\TSLab\temp\code8.cs(27,17) : error CS1662: Не удается преобразовать "анонимный метод" в тип делегата "TSLab.DataSource.CacheObjectMaker<System.Collections.Generic.IList<double>>", так как некоторые типы возвращаемого значения в блоке не являются неявно преобразуемыми в тип возвращаемого значения делегата Что в этом коде нужно исправить?
Отредактировано uprav (Sun Sep 05 2010 04:21 PM)
_________________________
|
|
Наверх
|
|
|
|
#13992 - Thu Sep 23 2010 08:52 PM
Re: Создание индикаторов в API
[Re: Nektodron]
|
addict
Registered: Thu Jan 14 2010
Записи: 594
|
Nektodron, подскажите пож по коду блока-индикатора: возможно ли здесь чтобы вместо цены закрытия новой свечи на графике отражалось расчётное значение bid/ask 2-х источников в режиме реальных торгов, например: bid источника1 - ask источника 2, и что нужно использовать? И можно ли сделать это в этом коде используя эти интерфейсы?
namespace spr1
{
public class spreadkR : ISecurityInputs, ISecurityReturns, ITwoSourcesHandler, IStreamHandler
{
[HandlerParameter(true, "", NotOptimized = true)]
public double k1 { get; set; }
[HandlerParameter(true, "", NotOptimized = true)]
public double k2 { get; set; }
public ISecurity Execute(ISecurity source1, ISecurity source2)
{
var Bars = new List<Bar>(source1.Bars.Count);
var C1 = source1.ClosePrices;
var H1 = source1.HighPrices;
var L1 = source1.LowPrices;
var O1 = source1.OpenPrices;
var C2 = source2.ClosePrices;
var H2 = source2.HighPrices;
var L2 = source2.LowPrices;
var O2 = source2.OpenPrices;
IList<Bar> NC = new List<Bar>(Bars.Count);
IList<double> op = new List<double>(C1.Count);
IList<double> hi = new List<double>(C1.Count);
IList<double> lo = new List<double>(C1.Count);
IList<double> cl = new List<double>(C1.Count);
double Open,High,Low,Close,L,H;
for(int i=0; i<C1.Count; i++)
{
Open=k1*O1[i]-k2*O2[i];
Close=k1*C1[i]-k2*C2[i];
L = k1*L1[i]-k2*L2[i];
H = k1*H1[i]-k2*H2[i];
Low = Math.Min(Math.Min(L,H),Math.Min(Open,Close));
High= Math.Max(Math.Max(L,H),Math.Max(Open,Close));
op.Add(Open);
hi.Add(High);
lo.Add(Low);
cl.Add(Close);
}
int j=0;
foreach(var bar in source1.Bars)
{
var hav = new Bar(bar.Color, bar.Date,
op[j],
hi[j],
lo[j],
cl[j],
bar.Volume);
NC.Add(hav);
j++;
}
return source1.CloneAndReplaceBars(NC);
}
public IContext Context { get; set; }
}
}
Отредактировано uprav (Thu Sep 23 2010 08:53 PM)
_________________________
|
|
Наверх
|
|
|
|
#14097 - Sat Sep 25 2010 11:31 PM
Re: Создание индикаторов в API
[Re: Nektodron]
|
addict
Registered: Thu Jan 14 2010
Записи: 594
|
public class spreadkR : ISecurityInputs, IDoubleReturns, ITwoSourcesHandler, IStreamHandler { public IList<double> Execute(ISecurity source1, ISecurity source2) { var vv = new double[source1.Bars.Count]; for(int i=0; i< bars.Count; i++) { vv[i] = source1.Bars[i].Bid / source1.Bars[i].Ask; } return vv; } } Nektodron, по этому коду возникли такие вопросы: 1. source1.Bars[i].Bid (или source1.Bars[i].Ask) в реал-тайме почему то ничего не выдаёт, точнее выдаёт 0 . Транзак. ТСЛаб 1.1.11.1.(это не принципиально, т.к. я заменил на выр в п.2, ниже, хочу просто узнать выдают они что нибудь вообще и при каких условиях?) 2. Я правильно понимаю, что в выражении: source1.GetBuyQueue(i)[0].Price, [0] - обозначает первую строчку стакана, т.е. лучший bid? Если будет стоять [1] - то это сдвиг вниз на 1 шаг цены? 3. При использовании source.CloneAndReplaceBars() обновление новой индикаторной свечи происходит по мере пересчёта скрипта, возможно ли , чтобы индикатор с его использованием обновлялся по мере обновления входящих в него источников(как обычный график ценной бумаги в реал-тайме) и не зависимо от режима обновления скрипта? Или что нужно для этого использовать?
Отредактировано uprav (Sun Sep 26 2010 04:01 PM)
_________________________
|
|
Наверх
|
|
|
|
#14259 - Mon Sep 27 2010 09:10 PM
Re: Создание индикаторов в API
[Re: Nektodron]
|
addict
Registered: Thu Jan 14 2010
Записи: 594
|
Nektodron, спасибо за ответы! Ещё вопросы по API 1.В коде в посте выше (сообщение 13992), при использовании интерфейсов: ISecurityInputs, ISecurityReturns, ITwoSourcesHandler, IStreamHandler и далее: public ISecurity Execute(ISecurity source1, ISecurity source2) каким образом можно проверить на реал-тайм?
Я написал выражение: if(n[i]==C1.Count-1&&source1.Positions.IsRealtime), но оно почему то на реальных торгах игнорируется, и это выражение всегда false(в лабе и на реале), убираю вообще выражение source1.Positions.IsRealtime - и всё работает в реале (т.е. выражение без него всегда true). Можно ли этим выражением вообще проверять на реал-тайм с этими интерфейсами? И можно ли тут вообще это проверить? * Под реал-таймом здесь я понимаю наличие данных стакана. 2. А вот это выражение: if(n[i]==C1.Count-1&&source1.GetBuyQueue(i)[0].Price!=null) почему то всегда true, даже в лабе, когда нет данных стакана. Как тогда можно проверить на наличие данных стакана(и таким образом проверить на наличие реал-тайма)? Версия 1.1.11.1.
_________________________
|
|
Наверх
|
|
|
|
#17131 - Sat Nov 20 2010 10:17 AM
Re: Создание индикаторов в API
[Re: Nektodron]
|
enthusiast
Registered: Mon Jun 21 2010
Записи: 283
|
Подскажите пожалуйста, я только начинаю программировать.Хочу обьединить фрактал на покупку и на продажу в один блок. Как это лучше сделать? using System; using System.Collections.Generic; using TSLab.Script; using TSLab.Script.Handlers; using TSLab.DataSource; using TSLab.Script.Helpers;
namespace FractalSell_ { public class FractalSell : IBar2BoolsHandler, IContextUses { [HandlerParameter(true, "5", Min = "1", Max = "20", Step = "1")] public int Right { get; set; } [HandlerParameter(true, "5", Min = "1", Max = "20", Step = "5")] public int Left { get; set; } [HandlerParameter(true, "0", Min = "0", Max = "1", Step = "1")] public int CurrentBar { get; set; } [HandlerParameter(true, "0", Min = "0", Max = "1", Step = "1")] public int Fractal { get; set; } public IList<bool> Execute(ISecurity source) { var L = source.LowPrices; IList<bool> frsell1 = new List<bool>(L.Count); IList<bool> frsell2 = new List<bool>(L.Count); bool frsellv =false; bool frsellv1 =false; int StartIndex=Left+(Right+CurrentBar); int ResCheck=Left+Right; for (int i = 0; i < L.Count; i++) { if(i<StartIndex) frsellv=false; else { int Check = 0; int IndFr = i-(CurrentBar+Right); for(int j=(i-StartIndex);j<=(i-CurrentBar);j++) { if(j!=IndFr) { if(L[j]>L[IndFr]) Check++; else break; } } if(Check==ResCheck) frsellv=true; else frsellv=false; } frsell1.Add(frsellv); } //shift for (int i = (Right+CurrentBar); i < L.Count; i++) { if(frsell1[i]==true) frsellv1=true; else frsellv1=false; frsell2.Add(frsellv1); } for (int i = L.Count-(Right+CurrentBar); i < L.Count; i++) { frsellv1=false; frsell2.Add(frsellv1); } return Fractal==0?frsell1:frsell2; } public IContext Context { get; set; } } }
и using System; using System.Collections.Generic; using TSLab.Script; using TSLab.Script.Handlers; using TSLab.DataSource; using TSLab.Script.Helpers;
namespace FractalBuy_ { public class FractalBuy : IBar2BoolsHandler, IContextUses { [HandlerParameter(true, "5", Min = "1", Max = "20", Step = "1")] public int Right { get; set; } [HandlerParameter(true, "5", Min = "1", Max = "20", Step = "5")] public int Left { get; set; } [HandlerParameter(true, "0", Min = "0", Max = "1", Step = "1")] public int CurrentBar { get; set; }
[HandlerParameter(true, "0", Min = "0", Max = "1", Step = "1")] public int Fractal { get; set; } public IList<bool> Execute(ISecurity source) { var H = source.HighPrices; IList<bool> frbuy1 = new List<bool>(H.Count); IList<bool> frbuy2 = new List<bool>(H.Count); bool frbuyv =false; bool frbuyv1 =false; int StartIndex=Left+(Right+CurrentBar); int ResCheck=Left+Right; for (int i = 0; i < H.Count; i++) { if(i<StartIndex) frbuyv=false; else { int Check = 0; int IndFr = i-(CurrentBar+Right); for(int j=(i-StartIndex);j<=(i-CurrentBar);j++) { if(j!=IndFr) { if(H[j]<H[IndFr]) Check++; else break; } } if(Check==ResCheck) frbuyv=true; else frbuyv=false; } frbuy1.Add(frbuyv); } //shift for (int i = (Right+CurrentBar); i < H.Count; i++) { if(frbuy1[i]==true) frbuyv1=true; else frbuyv1=false; frbuy2.Add(frbuyv1); } for (int i = H.Count-(Right+CurrentBar); i < H.Count; i++) { frbuyv1=false; frbuy2.Add(frbuyv1); } return Fractal==0?frbuy1:frbuy2; } public IContext Context { get; set; } } }
|
|
Наверх
|
|
|
|
#17765 - Fri Dec 03 2010 08:14 PM
Re: Создание индикаторов в API
[Re: Stanley]
|
enthusiast
Registered: Mon Jun 21 2010
Записи: 283
|
Что значит ошибка - 'TSLab.Script.Handlers.CLK' не реализует член интерфейса 'TSLab.Script.Handlers.IDouble2DoubleHandler.Execute(System.Collections.Generic.IList<double>)' (CS0535)
|
|
Наверх
|
|
|
|
#19914 - Fri Jan 21 2011 09:47 AM
Re: Создание индикаторов на API
[Re: Nektodron]
|
stranger
Registered: Sat Sep 25 2010
Записи: 16
|
Здравствуйте! Нужна помощь в настройке (интеграции Visual Studio 10 )по подобию Sharp develop. С уважением, Василий.
|
|
Наверх
|
|
|
|
|
|