У вас не стоит Flash Player
Page 3 of 4 < 1 2 3 4 >
Настройки
#10251 - Tue Aug 17 2010 10:44 PM Re: И опять ошибка CS0103 [Re: Nektodron]
uprav Offline
addict

Registered: Thu Jan 14 2010
Записи: 594
Originally Posted By: Nektodron
Чтобы сослаться в формуле на свое значение можно воспользоваться зарезервированным именем list.
Например:
"list[i-1] + 1"

Originally Posted By: uprav

Nektodron, я правильно понимаю, что это ссылка в выражении в визуальном редакторе в блоке формула на своё собственное значение 1 бар назад "list[i-1]"? И в какой сборке? Пишет ошибку error CS0103: Имя 'list' отсутствует в текущем контексте. Или это относится к API?
ЗЫ. Нужно ссылаться на предыдущее значение формулы и прибавлять к нему текущее, и т.д.

Originally Posted By: Nektodron
Это работает уже давно, можно использовать в формулах, но не во всех, а только в тех, которые от списков считаются.
Т.е. если в формулу идет обновляемое значение или чтото из позиции, то работать не будет.

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)
_________________________


Наверх
#10253 - Tue Aug 17 2010 11:32 PM Re: И опять ошибка CS0103 [Re: uprav]
Nektodron Offline

Carpal Tunnel

Registered: Thu Oct 23 2008
Записи: 5492
Для простоты, для сохранения значений переменных, которые высчитываются в главном используйте TSLab.Script.Helpers.ChartHelper класс, как это делает генератор скриптов.

Можете взять скрипт с обновляемым значением, вывести обновляемое значение на график, а потом посмотреть какой c# код сгенерил TSLab для этого.

Наверх
#10336 - Thu Aug 19 2010 11:05 AM Создание индикаторов на API [Re: Nektodron]
uprav Offline
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)
_________________________


Наверх
#10347 - Thu Aug 19 2010 12:38 PM Re: Создание индикаторов на API [Re: uprav]
Nektodron Offline

Carpal Tunnel

Registered: Thu Oct 23 2008
Записи: 5492
возвращаемое значение у вас заявлено double, а возвращаете список

Наверх
#10373 - Thu Aug 19 2010 05:09 PM Re: Создание индикаторов на API [Re: Nektodron]
uprav Offline
addict

Registered: Thu Jan 14 2010
Записи: 594
Originally Posted By: Nektodron
возвращаемое значение у вас заявлено 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]
Nektodron Offline

Carpal Tunnel

Registered: Thu Oct 23 2008
Записи: 5492
а зачем вы изобретаете велосипед, когда уже есть стандартный кубик "Доход" и "Доход %"?
И код его примитивный:
Code:

    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]
uprav Offline
addict

Registered: Thu Jan 14 2010
Записи: 594
Nektodron, подскажите пож какой интерфейс можно использовать наподобие IBar2DoubleHandler для создания блока индикатора, но чтобы цеплялось 2 источника (ценных бумаги) и как в этом случае будет прописываться public IList<double> Execute(ISecurity source)?
_________________________


Наверх
#10590 - Tue Aug 24 2010 10:31 AM Re: Создание индикаторов на API [Re: uprav]
Nektodron Offline

Carpal Tunnel

Registered: Thu Oct 23 2008
Записи: 5492
В принципе все прозрачно:
Code:
class MyClass : ISecurityInputs, IDoubleReturns, ITwoSourcesHandler, IStreamHandler
{
 public IList<double> Execute(ISecurity source1, ISecurity source2)
 {
 }
}

Наверх
#11866 - Sun Sep 05 2010 04:06 PM Re: Создание индикаторов на API [Re: Nektodron]
uprav Offline
addict

Registered: Thu Jan 14 2010
Записи: 594
Nektodron, пытаюсь сделать индикатор в виде свечей от 2-х источников, этот код комиплируется в SharpDevelop, но в ТСЛабе при запуске скрипта выдаёт ошибку:

Code:
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)
_________________________


Наверх
#11942 - Mon Sep 06 2010 01:52 PM Re: Создание индикаторов на API [Re: uprav]
Nektodron Offline

Carpal Tunnel

Registered: Thu Oct 23 2008
Записи: 5492
IDoubleReturns стоит, а возвращаете бумагу.
Компилироваться будет, а скрипт в визуальном редакторе собирается не верно.

Наверх
#12084 - Tue Sep 07 2010 02:38 PM Re: Создание индикаторов на API [Re: Nektodron]
uprav Offline
addict

Registered: Thu Jan 14 2010
Записи: 594
Originally Posted By: Nektodron
IDoubleReturns стоит, а возвращаете бумагу.
Компилироваться будет, а скрипт в визуальном редакторе собирается не верно.
Спасибо, заработало. Nektodron посмотрите пож пост http://www.tslab.ru/ubb/ubbthreads.php?ubb=showflat&Main=734&Number=11855#Post11855
_________________________


Наверх
#13992 - Thu Sep 23 2010 08:52 PM Re: Создание индикаторов в API [Re: Nektodron]
uprav Offline
addict

Registered: Thu Jan 14 2010
Записи: 594
Nektodron, подскажите пож по коду блока-индикатора: возможно ли здесь чтобы вместо цены закрытия новой свечи на графике отражалось расчётное значение bid/ask 2-х источников в режиме реальных торгов, например: bid источника1 - ask источника 2, и что нужно использовать? И можно ли сделать это в этом коде используя эти интерфейсы?

Code:
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)
_________________________


Наверх
#13999 - Thu Sep 23 2010 11:21 PM Re: Создание индикаторов в API [Re: uprav]
Nektodron Offline

Carpal Tunnel

Registered: Thu Oct 23 2008
Записи: 5492
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;
}
}

Наверх
#14097 - Sat Sep 25 2010 11:31 PM Re: Создание индикаторов в API [Re: Nektodron]
uprav Offline
addict

Registered: Thu Jan 14 2010
Записи: 594
Originally Posted By: Nektodron
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)
_________________________


Наверх
#14131 - Mon Sep 27 2010 11:05 AM Re: Создание индикаторов в API [Re: uprav]
Nektodron Offline

Carpal Tunnel

Registered: Thu Oct 23 2008
Записи: 5492
1. Возьмите чуть более свежую версию, будет выдавать.
2. Да, правильно понимаете.
3. Нет, сейчас такое не возможно, нужно модернизировать API.

Наверх
#14259 - Mon Sep 27 2010 09:10 PM Re: Создание индикаторов в API [Re: Nektodron]
uprav Offline
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.
_________________________


Наверх
#14288 - Tue Sep 28 2010 10:14 AM Re: Создание индикаторов в API [Re: uprav]
Nektodron Offline

Carpal Tunnel

Registered: Thu Oct 23 2008
Записи: 5492
1. что именно проверить на реалтайм? бумагу? сделать привение к ISecurityRt, если результат не null то реалтайм.
Для какой бумаги проверяете, если после CloneAndReplaceBars, то там всегда false будет.
2. Проверяйте, либо приведение оригинального секурити к ISecurityRt или Positions.IsRealtime тоже у оригинального секурити.

Наверх
#17131 - Sat Nov 20 2010 10:17 AM Re: Создание индикаторов в API [Re: Nektodron]
Stanley Offline
enthusiast

Registered: Mon Jun 21 2010
Записи: 283
Подскажите пожалуйста, я только начинаю программировать.Хочу обьединить фрактал на покупку и на продажу в один блок. Как это лучше сделать?
Quote:
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; }
}
}

и
Quote:
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]
Stanley Offline
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]
ivergoo Offline
stranger

Registered: Sat Sep 25 2010
Записи: 16
Здравствуйте!
Нужна помощь в настройке (интеграции Visual Studio 10 )по подобию Sharp develop.
С уважением, Василий.

Наверх
Page 3 of 4 < 1 2 3 4 >


Moderator:  ViL, sar