#31493 - Mon Sep 26 2011 01:57 PM
Re: Скрипт не торгует
[Re: Ti_ru]
|
Carpal Tunnel
Registered: Thu Apr 01 2010
Записи: 2564
Loc: г. Дзержинский
|
_________________________
«Существует 3 типа лжи: ложь, наглая ложь и статистика» Дизраэли.
|
Наверх
|
|
|
|
#31495 - Mon Sep 26 2011 02:13 PM
Re: Скрипт не торгует
[Re: Ti_ru]
|
member
Registered: Fri Apr 22 2011
Записи: 137
|
Команды на покупку/продажу выдаете на СЛЕДУЮЩИЙ бар? Например: security.Positions.BuyAtMarket(i + 1, 1, "E");
|
Наверх
|
|
|
|
#31496 - Mon Sep 26 2011 02:21 PM
Re: Скрипт не торгует
[Re: Gji]
|
Carpal Tunnel
Registered: Thu Apr 01 2010
Записи: 2564
Loc: г. Дзержинский
|
не, tiru ж написал, нету прочего. Соответственно если проверять по порядку. 1.Будущего нет -ок! 2.Проверяем настройки, описанные Нектодроном, думаю то ж - ок!
3.остается: Сам индюк и его методики расчета.
_________________________
«Существует 3 типа лжи: ложь, наглая ложь и статистика» Дизраэли.
|
Наверх
|
|
|
|
#31498 - Mon Sep 26 2011 03:41 PM
Re: Скрипт не торгует
[Re: 777]
|
writer
Registered: Sun Oct 17 2010
Записи: 479
|
Индюк секретный ), но ничего сверхсложного. Я его написал в двух вариантах: в виде кубика и в составе целого скрипта, - скрипт с данным кубиком работает, а полный скрипт ни в какую.. В лабе в режиме онлайн обновления показывает сделки, а на реале ничего. Команды на покупку/продажу выдаете на СЛЕДУЮЩИЙ бар? Например: security.Positions.BuyAtMarket(i + 1, 1, "E"); Да не, tiru ж написал, нету прочего. Соответственно если проверять по порядку. 1.Будущего нет -ок! 2.Проверяем настройки, описанные Нектодроном, думаю то ж - ок!
3.остается: Сам индюк и его методики расчета. Насчет будущего еще раз проверю. Но дело в том, что если бы было будущее, то результаты были бы раз в 20 лучше (я специально это делал)
Отредактировано Ti_ru (Mon Sep 26 2011 03:44 PM)
|
Наверх
|
|
|
|
#31503 - Mon Sep 26 2011 04:13 PM
Re: Скрипт не торгует
[Re: Ti_ru]
|
member
Registered: Fri Apr 22 2011
Записи: 137
|
Да, это недоработка. У меня часто повторялась ситуация, когда в кубике "внешний скрипт" один cs файл меняешь на другой, а ТСЛаб на это не реагирует, использует старый код. Ни F5, ни добавление новых блоков, ни другие манипуляции с блоками не помогают. Я блок "внешний скрипт" удаляю и добавляю заново.
|
Наверх
|
|
|
|
#31504 - Mon Sep 26 2011 04:18 PM
Re: Скрипт не торгует
[Re: Gji]
|
writer
Registered: Sun Oct 17 2010
Записи: 479
|
Может поправят. Я сегодня пол дня голову ломал над этим, весь код перелопатил  А ТСЛаб перезагрузить не догадался
|
Наверх
|
|
|
|
#31524 - Mon Sep 26 2011 07:03 PM
Re: Скрипт не торгует
[Re: pasha]
|
writer
Registered: Sun Oct 17 2010
Записи: 479
|
При запущенном скрипте программа не проверяет изменения внешних файлов скриптов. Скрипт уже скомпилирован и выполняется. Для подхвата изменений достаточно остановить и вновь запустить скрипт. Программа поймет по дате изменения файла внешного скрипта, что необходимо перестроить скрипт. Дак в том-то и дело, что остановка/запуск скрипта никак не влияла. Только после перезагрузки программы код подхватился.
|
Наверх
|
|
|
|
#31620 - Wed Sep 28 2011 10:30 PM
Re: Скрипт не торгует
[Re: Ti_ru]
|
writer
Registered: Sun Nov 21 2010
Записи: 428
|
Ну, код, мягко говоря, не очень. Видимо получен из автоматически генерируемого TSLab`ом временного файла. Много лишнего. В коде используются переменные "Source" и "source". Не понятно: это опечатка или так и задумано. Размер, в данном случае, имеет значение  . Очень похожие имена лучше не использовать, можно легко ошибиться. Повторное: count--; это скорее всего ошибка. В строчках:
if ((source.IsLastBarUsed == false))
barsCount--;
for (int bar = ctx.TradeFromBar; bar < barsCount; bar++)
похоже ошибка. Если "IsLastBarUsed == false" то скрипт будет выставлять последнюю заявку на ПОСЛЕДНИЙ бар, а не на следующий за ним, что не правильно (в реале сделок не будет вообще, насколько я понимаю). Что еще? Обработка ошибок (try...catch) не нужна. TSLab сам все перехватит. Да, параллельно ведутся ДВЕ позиции, с именами: "LN" и "SN". Сигналов рассчитывается тоже 2 и они не связаны. Это означает, что не исключена ситуация когда будет два сигнала и две открытые позиции: лонг и шорт. Скорее всего сигналы взаимоисключающиеся, но из отрывка кода этого не ясно. Ну и раз уж я все равно это сделал, прикреплю свой вариант форматирования кода, вдруг да окажется полезным:
// Make 'log_long' item data
int count = nRange.Count;
var log_long = new bool[count];
if (Source.IsLastBarUsed == false)
count--;
for (int bar = 1; bar < count; bar++)
log_long[bar] = "условие";
// Make 'log_short' item data
var log_short = new bool[count];
if (source.IsLastBarUsed == false)
count--;
for (int bar = 1; bar < count; bar++)
log_short[bar] = "условие";
//.........................
//Декомпрессия индикаторов
//.........................
//Проход по барам
if (source.IsLastBarUsed == false)
barsCount--;
for (int bar = ctx.TradeFromBar; bar < barsCount; bar++) {
var LongPos = source.Positions.GetLastActiveForSignal("LN");
var ShortPos = source.Positions.GetLastActiveForSignal("SN");
// Торговля
if (LongPos == null) {
if (log_long[bar])
source.Positions.BuyAtMarket(bar + 1, 1, "LN");
} else {
if (LongPos.EntryBarNum <= bar)
if (log_short[bar])
LongPos.CloseAtMarket(bar + 1, "LX");
}
if (ShortPos == null) {
if (log_short[bar])
source.Positions.SellAtMarket(bar + 1, 1, "SN");
} else {
if (ShortPos.EntryBarNum <= bar)
if (log_long[bar])
ShortPos.CloseAtMarket(bar + 1, "SX");
}
}
}
Как там сестру таланта зовут? 
_________________________
Не пишите мне! Никому ничего делать не буду.
|
Наверх
|
|
|
|
#31621 - Wed Sep 28 2011 10:54 PM
Re: Скрипт не торгует
[Re: jhgjrht]
|
writer
Registered: Sun Oct 17 2010
Записи: 479
|
Спасибо, что ответили ) Начнем по порядку. Код корявый, согласен, я учусь с нуля. Документации и примеров мало, поэтому приходится делать некоторые вещи по аналогии с файлами, генерируемыми ТСЛабом. Что могу перерабатываю, если не понимаю, то, сами понимаете, оставляю как есть. В коде используются переменные "Source" и "source" В коде нормальные названия, я тут заменил просто Повторное: count--; это скорее всего ошибка. Так в ТСЛабовском файле было. В вашем примере вы тоже два раза упоминаете почему-то. Если "IsLastBarUsed == false" то скрипт будет выставлять последнюю заявку на ПОСЛЕДНИЙ бар, а не на следующий за ним, что не правильно (в реале сделок не будет вообще, насколько я понимаю). Тоже делал по аналогии. Ставил на демо=счет, сделки корректно открываются. параллельно ведутся ДВЕ позиции Так и задумано, скрипт переворотный Сейчас сижу и не могу понять, почему при пуске/остановке скрипта выдается сообщение о том что пересчет прошел с разницей. Если поставить 5-и минутный интервал (тот в который сжимается), то ошибок нет, если поставить минутки, то лезут ошибки. Пробовал ставить начальный бар, с которого начинается торговля больше, чем период индикатора, не помогло.
|
Наверх
|
|
|
|
#31622 - Wed Sep 28 2011 11:20 PM
Re: Скрипт не торгует
[Re: Ti_ru]
|
writer
Registered: Sun Nov 21 2010
Записи: 428
|
Повторное: count--; это скорее всего ошибка. Так в ТСЛабовском файле было. В вашем примере вы тоже два раза упоминаете почему-то. Я просто не стал удалять непонятные строчки. Если "IsLastBarUsed == false" то скрипт будет выставлять последнюю заявку на ПОСЛЕДНИЙ бар, а не на следующий за ним, что не правильно (в реале сделок не будет вообще, насколько я понимаю). Тоже делал по аналогии. Ставил на демо=счет, сделки корректно открываются. Если IsLastBarUsed == true, то все правильно, а вот если == false, тогда последний бар из переданных скрипту обработан не будет. Думаю, не будет и сделок в реальности. параллельно ведутся ДВЕ позиции Так и задумано, скрипт переворотный Я ничего против и не имею, лишь обратил Ваше внимание на потенциальную проблему. Сейчас сижу и не могу понять, почему при пуске/остановке скрипта выдается сообщение о том что пересчет прошел с разницей. Если поставить 5-и минутный интервал (тот в который сжимается), то ошибок нет, если поставить минутки, то лезут ошибки. Пробовал ставить начальный бар, с которого начинается торговля больше, чем период индикатора, не помогло. Тут я затрудняюсь, что-то сказать, мало информации. Мне очень не нравятся манипуляции с "count" и "barsCount". Я бы от них отказался.
_________________________
Не пишите мне! Никому ничего делать не буду.
|
Наверх
|
|
|
|
#31623 - Wed Sep 28 2011 11:27 PM
Re: Скрипт не торгует
[Re: jhgjrht]
|
writer
Registered: Sun Oct 17 2010
Записи: 479
|
Вот пример скрипта, сгенерированного ТСЛабом. Скрипт на пересечении двух скользящих средних со сжатием. Там тоже IsLastBarUsed == False Может здесь имеется в виду последний сжатый бар? Мы его не можем использовать, пока он не накопит нужное число свечек меньшего таймфрейма. using System;
using System.Collections.Generic;
using TSLab.Script;
using TSLab.Script.Handlers;
using TSLab.Script.Optimization;
using TSLab.Script.Helpers;
namespace TSLab.User
{
//using System;
//using TSLab.Script;
public class Script
{
private TSLab.Script.Handlers.Compress Compress_h = new TSLab.Script.Handlers.Compress();
private TSLab.Script.Handlers.Close Close_h = new TSLab.Script.Handlers.Close();
private TSLab.Script.Handlers.SMA Quick_h = new TSLab.Script.Handlers.SMA();
private TSLab.Script.Handlers.SMA Slow_h = new TSLab.Script.Handlers.SMA();
public TSLab.Script.Optimization.OptimProperty Quick_Period = new TSLab.Script.Optimization.OptimProperty(20, 10, 100, 5);
public TSLab.Script.Optimization.OptimProperty Compress_Shift = new TSLab.Script.Optimization.OptimProperty(0, 0, 60, 5);
public TSLab.Script.Optimization.OptimProperty Slow_Period = new TSLab.Script.Optimization.OptimProperty(20, 10, 100, 5);
public virtual void Execute(TSLab.Script.Handlers.IContext context, TSLab.Script.ISecurity Index, TSLab.Script.ISecurity Futures)
{
// Initialize 'Quick' item
this.Quick_h.Period = this.Quick_Period;
// Initialize 'Закрытие' item
this.Close_h.Context = context;
// Initialize 'Сжать' item
this.Compress_h.Interval = 10;
this.Compress_h.Shift = this.Compress_Shift;
// Make 'Сжать' item data
TSLab.Script.ISecurity IndexComp;
try
{
IndexComp = this.Compress_h.Execute(Index);
}
catch (System.ArgumentOutOfRangeException)
{
throw new TSLab.Script.ScriptException("Ошибка при вычислении блока \'Сжать\'. Индекс за пределам диапазона.");
}
// Make 'Закрытие' item data
System.Collections.Generic.IList<double> CloseComp = context.GetData("CloseComp", new string[] {
this.Compress_h.Interval.ToString(),
this.Compress_h.Shift.ToString()
}, delegate
{
try
{
return this.Close_h.Execute(IndexComp);
}
catch (System.ArgumentOutOfRangeException)
{
throw new TSLab.Script.ScriptException("Ошибка при вычислении блока \'Закрытие\'. Индекс за пределам диапазона.");
}
});
// Make 'Quick' item data
System.Collections.Generic.IList<double> Quick = context.GetData("Quick", new string[] {
this.Quick_h.Period.ToString(),
this.Compress_h.Interval.ToString(),
this.Compress_h.Shift.ToString()
}, delegate
{
try
{
return this.Quick_h.Execute(CloseComp);
}
catch (System.ArgumentOutOfRangeException)
{
throw new TSLab.Script.ScriptException("Ошибка при вычислении блока \'Quick\'. Индекс за пределам диапазона.");
}
});
// Initialize 'Slow' item
this.Slow_h.Period = this.Slow_Period;
// Make 'Slow' item data
System.Collections.Generic.IList<double> Slow = context.GetData("Slow", new string[] {
this.Slow_h.Period.ToString(),
this.Compress_h.Interval.ToString(),
this.Compress_h.Shift.ToString()
}, delegate
{
try
{
return this.Slow_h.Execute(CloseComp);
}
catch (System.ArgumentOutOfRangeException)
{
throw new TSLab.Script.ScriptException("Ошибка при вычислении блока \'Slow\'. Индекс за пределам диапазона.");
}
});
// Make 'log_long' item data
System.Collections.Generic.IList<bool> log_long;
try
{
int count = System.Math.Min(Slow.Count, Quick.Count);
bool[] list = new bool[count];
if ((Index.IsLastBarUsed == false))
{
count--;
}
for (int i = 1; (i < count); i++)
{
list[i] = Quick[i] >= Slow[i] & Quick[i - 1] < Slow[i - 1];
}
log_long = list;
}
catch (System.ArgumentOutOfRangeException)
{
throw new TSLab.Script.ScriptException("Ошибка при вычислении блока \'log_long\'. Индекс за пределам диапазона.");
}
// Make 'log_short' item data
System.Collections.Generic.IList<bool> log_short;
try
{
int count = System.Math.Min(Quick.Count, Slow.Count);
bool[] list = new bool[count];
if ((Index.IsLastBarUsed == false))
{
count--;
}
for (int i = 1; (i < count); i++)
{
list[i] = Quick[i] <= Slow[i] & Quick[i - 1] > Slow[i - 1];
}
log_short = list;
}
catch (System.ArgumentOutOfRangeException)
{
throw new TSLab.Script.ScriptException("Ошибка при вычислении блока \'log_short\'. Индекс за пределам диапазона.");
}
// =================================================
// Panels
// =================================================
// Make 'Главное' pane
TSLab.Script.IPane Главное_pane = context.CreatePane("Главное", 70, false);
Главное_pane.Visible = true;
// =================================================
// Handlers
// =================================================
TSLab.Script.IPosition L;
TSLab.Script.IPosition S;
log_long = IndexComp.Decompress(log_long, TSLab.DataSource.DecompressMethodWithDef.Default);
log_short = IndexComp.Decompress(log_short, TSLab.DataSource.DecompressMethodWithDef.Default);
// =================================================
// Trading
// =================================================
int barsCount = Index.Bars.Count;
if ((Index.IsLastBarUsed == false))
{
barsCount--;
}
for (int i = context.TradeFromBar; (i < barsCount); i++)
{
L = Futures.Positions.GetLastActiveForSignal("L");
S = Futures.Positions.GetLastActiveForSignal("S");
if ((L == null))
{
if (log_long[i])
{
Futures.Positions.BuyAtMarket(i + 1, 1, "L");
}
}
else
{
if ((L.EntryBarNum <= i))
{
if (log_short[i])
{
L.CloseAtMarket(i + 1, "Lx");
}
}
}
if ((S == null))
{
if (log_short[i])
{
Futures.Positions.SellAtMarket(i + 1, 1, "S");
}
}
else
{
if ((S.EntryBarNum <= i))
{
if (log_long[i])
{
S.CloseAtMarket(i + 1, "Sx");
}
}
}
}
// =================================================
// Charts
// =================================================
// Make 'Index' chart
TSLab.Script.IGraphList Главное_pane_Index_chart = Главное_pane.AddList(("Index"
+ (" ["
+ (Index.Symbol + "]"))), Index, TSLab.Script.CandleStyles.BAR_CANDLE, true, -16777216, TSLab.Script.PaneSides.RIGHT);
Index.ConnectSecurityList(Главное_pane_Index_chart);
Главное_pane.UpdatePrecision(TSLab.Script.PaneSides.RIGHT, Index.Decimals);
// Make 'Quick' chart
Quick = IndexComp.Decompress(Quick, TSLab.DataSource.DecompressMethodWithDef.Default);
TSLab.Script.IGraphList Главное_pane_Quick_chart = Главное_pane.AddList(((("Quick"
+ (" (" + this.Quick_h.Period))
+ ")")
+ (" ["
+ (IndexComp.Symbol + "]"))), Quick, TSLab.Script.ListStyles.LINE, -393216, TSLab.Script.LineStyles.SOLID, TSLab.Script.PaneSides.RIGHT);
Главное_pane.UpdatePrecision(TSLab.Script.PaneSides.RIGHT, IndexComp.Decimals);
// Make 'Slow' chart
Slow = IndexComp.Decompress(Slow, TSLab.DataSource.DecompressMethodWithDef.Default);
TSLab.Script.IGraphList Главное_pane_Slow_chart = Главное_pane.AddList(((("Slow"
+ (" (" + this.Slow_h.Period))
+ ")")
+ (" ["
+ (IndexComp.Symbol + "]"))), Slow, TSLab.Script.ListStyles.LINE, -15004712, TSLab.Script.LineStyles.SOLID, TSLab.Script.PaneSides.RIGHT);
Главное_pane.UpdatePrecision(TSLab.Script.PaneSides.RIGHT, IndexComp.Decimals);
// Make 'Futures' chart
TSLab.Script.IGraphList Главное_pane_Futures_chart = Главное_pane.AddList(("Futures"
+ (" ["
+ (Futures.Symbol + "]"))), Futures, TSLab.Script.CandleStyles.BAR_CANDLE, true, -4980736, TSLab.Script.PaneSides.LEFT);
Futures.ConnectSecurityList(Главное_pane_Futures_chart);
Главное_pane.UpdatePrecision(TSLab.Script.PaneSides.LEFT, Futures.Decimals);
}
}
} Мне очень не нравятся манипуляции с "count" и "barsCount". Я бы от них отказался. Что вы имеете в виду?
|
Наверх
|
|
|
|
#31624 - Wed Sep 28 2011 11:48 PM
Re: Скрипт не торгует
[Re: Ti_ru]
|
writer
Registered: Sun Nov 21 2010
Записи: 428
|
... Скрипт на пересечении двух скользящих средних со сжатием. Там тоже IsLastBarUsed == False Может здесь имеется в виду последний сжатый бар? Мы его не можем использовать, пока он не накопит нужное число свечек меньшего таймфрейма.
Не исключено. Генерируемые TSLab cs файлы давно не смотрел. Вот как раз подобный пример я когда-то делал: пример Мне очень не нравятся манипуляции с "count" и "barsCount". Я бы от них отказался. Что вы имеете в виду? Просто удалить декремент и условие. 
_________________________
Не пишите мне! Никому ничего делать не буду.
|
Наверх
|
|
|
|
|
|