Форум Gelium.net

Публичный доступ => TradeStation => Тема начата: ihaar от 31 Января 2012, 08:03:48

Название: EasyLanguage
Отправлено: ihaar от 31 Января 2012, 08:03:48
может имеет смысл завести ветку по easylanguage?

что бы делиться полезностями типа такого:

при работе с текстами постоянно приходится иметь в уме количество десятых если необходимо вывести ценовое значение
а ежели использовать такой код
if PriceScale = 100000 then autodecimal = 5 else
if PriceScale = 10000  then autodecimal = 4 else
If PriceScale = 1000   then autodecimal = 3 else
If PriceScale = 100    then autodecimal = 2 else
If PriceScale = 10     then autodecimal = 1 else
If PriceScale = 1      then autodecimal = 0;
введя переменную autodecimal и подставляя её как второй параметр в NumToStr, будем автоматически иметь правильное отображение цены
можно оформить в функцию
Название: EasyLanguage
Отправлено: Станислав от 04 Февраля 2012, 11:24:56
может имеет смысл завести ветку по easylanguage?

что бы делиться полезностями типа такого:

при работе с текстами постоянно приходится иметь в уме количество десятых если необходимо вывести ценовое значение
а ежели использовать такой код
if PriceScale = 100000 then autodecimal = 5 else
if PriceScale = 10000  then autodecimal = 4 else
If PriceScale = 1000   then autodecimal = 3 else
If PriceScale = 100    then autodecimal = 2 else
If PriceScale = 10     then autodecimal = 1 else
If PriceScale = 1      then autodecimal = 0;
введя переменную autodecimal и подставляя её как второй параметр в NumToStr, будем автоматически иметь правильное отображение цены
можно оформить в функцию

Можно еще проще и универсальней: ;D

{***************************************************************************************************
Функция предназначена для определения ценовой доли актива (количества знаков дробной части)
***************************************************************************************************}

Vars: Val1(MinMove / PriceScale),
      Val2(Round(0.123456789 / Val1, 0)),
      Val3(IFF(Val2 = 0, 0, StrLen(NumToStr(Val2, 0))));

PFDigits = Val3;



{***************************************************************************************************
Функция предназначена для округления значения переменной до ценовой доли актива
***************************************************************************************************}

Inputs: Value(Numeric);

PFRound = Round(Value, PFDigits);



Например, значение Value0 = PFRound(Close / 3) будет округлено до ценовой доли.
Название: EasyLanguage
Отправлено: ihaar от 06 Августа 2012, 11:26:53
такой вопрос созрел

каким образом можно извлекать и использовать данные из текстового файла состоящего из строк вида:

date1; number11; number12;
date2; number21; number22;
date3; number31; number32;
и т.д.

никогда не было необходимости, и это пробел в моём знании EL, подскажите, пожалуйста для экономии времени, куда копать ?

заранее благодарен
Название: EasyLanguage
Отправлено: Павел от 06 Августа 2012, 15:04:41
https://www.parusinvestora.ru/systems/omega/easylang/p1.shtm (https://www.parusinvestora.ru/systems/omega/easylang/p1.shtm) этот учебник по языку Easy Language - полезная вещь? Есть ли еще материалы на русском?
Название: EasyLanguage
Отправлено: Gelium от 07 Августа 2012, 11:42:02
такой вопрос созрел

каким образом можно извлекать и использовать данные из текстового файла состоящего из строк вида:

date1; number11; number12;
date2; number21; number22;
date3; number31; number32;
и т.д.

никогда не было необходимости, и это пробел в моём знании EL, подскажите, пожалуйста для экономии времени, куда копать ?

заранее благодарен

Можно считывать текстовыю строку из файла с помощью функций Puls, разбирать далее текст и использовать.
Название: EasyLanguage
Отправлено: Gelium от 07 Августа 2012, 11:43:46
https://www.parusinvestora.ru/systems/omega/easylang/p1.shtm (https://www.parusinvestora.ru/systems/omega/easylang/p1.shtm) этот учебник по языку Easy Language - полезная вещь? Есть ли еще материалы на русском?

https://gelium.net/ru/component/docman/doc_download/147-easy
Название: EasyLanguage
Отправлено: ihaar от 07 Августа 2012, 13:06:42
Можно считывать текстовыю строку из файла с помощью функций Puls, разбирать далее текст и использовать.
а как указать какая именно строка нужна, или считывать все и находить с нужной датой и далее уже её разбирать?
Название: EasyLanguage
Отправлено: Павел от 07 Августа 2012, 15:30:53
https://gelium.net/ru/component/docman/doc_download/147-easy

большое спасибо :)
Название: EasyLanguage
Отправлено: Gelium от 07 Августа 2012, 16:44:31
Можно считывать текстовыю строку из файла с помощью функций Puls, разбирать далее текст и использовать.
а как указать какая именно строка нужна, или считывать все и находить с нужной датой и далее уже её разбирать?

Считывать все.
Название: EasyLanguage
Отправлено: Павел от 16 Августа 2012, 14:58:01
вот первый опыт - попробовал сделать PaintBar
получилось вот это
вводится значение в пунктах - диапазон разницы между ценой открытия и закрытия, при котором бар остается черыным
а так бар вверх становиться синий  - бар вниз красный, ну или задайте свои цвета
:)
не знаю есть ли что-то такое по умолчанию ТС
Название: EasyLanguage
Отправлено: Gelium от 16 Августа 2012, 16:05:51
А что мешает просто задать цвета свечей в настройках графика?  ;)
Название: EasyLanguage
Отправлено: ihaar от 16 Августа 2012, 16:18:55
так это ж не для свечей, а для баров.. вроде это стандартно не настраивается
Название: EasyLanguage
Отправлено: Павел от 16 Августа 2012, 16:26:32
угу для баров, и чтобы было видно вверх или вниз
а вообще больше чтобы попробовать Easy Language что за зверь
Название: EasyLanguage
Отправлено: Craft от 27 Октября 2012, 04:21:02
Как организовать перебор баров от текущего в прошлое (чтобы можно было ссылаться/обращаться к барам истории)? Текущий бар = 0, последний = количеству загруженных на график баров.
Получается наоборот.
Название: EasyLanguage
Отправлено: Gelium от 27 Октября 2012, 06:07:25
Как организовать перебор баров от текущего в прошлое (чтобы можно было ссылаться/обращаться к барам истории)? Текущий бар = 0, последний = количеству загруженных на график баров.
Получается наоборот.

https://gelium.net/ru/trading-tools/prosuite-easylanguage/item/764-easylanguage
Название: EasyLanguage
Отправлено: ihaar от 27 Октября 2012, 07:15:32
Craft, думаю что всё зависит для чего вам это нужно и какую задачу вы хотите решить.
если смотреть слишком глубоко назад, то будут проблемы с maxbarsback
Название: EasyLanguage
Отправлено: Craft от 27 Октября 2012, 07:57:37
Необходимо для индикатора сентимента, чтобы обращаться к значениям предшествующих баров, своих знаний для организации необходимого цикла не хватает.
maxbarsback, как видно из вложения в моём предыдущем сообщении не проблема для получающегося обратного пересчёта.
Название: EasyLanguage
Отправлено: ihaar от 27 Октября 2012, 08:26:04
этого мало, конкретизируйте пожалуйста
что бы обращаться к значениям предыдущих баров не нужно что-то мутить, можно знать что творилось на любом баре [n баров назад]
другое дело, что при наступлении определённого события на каком-либо баре, вам нужно это зафиксировать что бы иметь возможность обратиться к этому значению позже
тут есть несколько способов навскидку:
1. запустить счётчик при наступлении события и потом обращаться к значению [счётчик баров назад]
2. записать значение в массив

если я не прав, то кто-нибудь более опытный поправит  8)

а так, я вас  понимаю, хелп большой, а наиболее эффективный способ изучения - делать что-то конкретное.
если упёрлись в тупик и не выбраться даже с хелпом, то всегда можно спросить.
иначе зачем тогда форум?  ;)
Название: EasyLanguage
Отправлено: Craft от 28 Октября 2012, 08:43:13
))) Да, задача-то ясна, только, как запустить цикл наподобие:
int shift = 0; //Ваш исходный бар
datetime dt = iTime( Symbol(), NULL, shift); //Находим время исходного бара:
int a = iBarShift( Symbol(), PERIOD_M1, dt, false);//Находим начальный бар на нужном ТФ:
int kolvo = a-MathRound(Period()/PERIOD_M1);//Находим количество баров для проверки
if (kolvo < 0 ) {kolvo=0;}//Проверка на валидность
for (int i=a;i>=kolvo;i--) //Ну и понеслась...
{
условия для расчёта сентимента;
}
под EL? Моих базовых знаний почерпнутых в хелпах не хватает. Для упрощения пытаюсь заменить:
datetime dt = iTime( Symbol(), NULL, shift); //Находим время исходного бара:
int a = iBarShift( Symbol(), PERIOD_M1, dt, false);//Находим начальный бар на нужном ТФ
на цикл кол-ва баров назад.
Видимо, для решения этой задачи необходим склад ума программиста.
Название: EasyLanguage
Отправлено: ihaar от 28 Октября 2012, 12:35:04
а что означает "исходный бар" в данном контексте? это просто первый бар на графике ли бар на котором исполнилось какое-то условие?
Название: EasyLanguage
Отправлено: Craft от 28 Октября 2012, 14:11:32
Да, начальный (в МТ перебор баров можно осуществлять, как слева направо, так и наоборот (в данном случае это и используется) - в ТС перебор слева направо).
Первоначально сдвиг (shift) = 0;
Определяется время начала этого бара;
По найденному времени находится первый бар младшего т/ф;
Определяется kolvo баров младшего т/ф входящих в бар старшего т/ф;
И начинается перебор - учёт всех младших баров в старшем т/ф: for (int i=a;i>=kolvo;i--),
Далее происходит сдвиг на следующий бар и всё по новой...
Название: EasyLanguage
Отправлено: ihaar от 28 Октября 2012, 14:39:41
ну тогда действительно не вижу особой проблемы использовать два таймфрейма, как советовал Павел сразу

принцип такой

data1 - 240 мин
data2 - 1 мин

на каждом баре минуток вычисляется некоторый параметр и суммируется (накапливается), т.е. меняется раз минуту.
на data1 мы обращаемся к data2 при каждом изменении этого параметра и имеем накопленный результат на момент закрытия 4х часового бара или накопленные 240 изменений параметра.

не вижу причин что бы это не работало..
и не нужно никаких счётчиков

Название: EasyLanguage
Отправлено: Craft от 28 Октября 2012, 15:23:26
Ок, попробуйте посчитать, для начала, количество минуток закрывшихся с понижением data2 - 1 мин, внутри data1 - 240 мин.
Может я чего-нибудь не так понимаю (по этой причине не показываю свои попытки, чтобы не сбить с толку возможной ошибкой).
Название: EasyLanguage
Отправлено: ihaar от 28 Октября 2012, 15:41:11
ну както так думаю

if Close Data2 < Open Data2 then kolvo = kolvo + 1;

и обнулять kolvo при открытии нового бара 240
Название: EasyLanguage
Отправлено: Craft от 28 Октября 2012, 15:47:42
))) ihaar, ну конкретней с Plot1(kolvo,"kolvo"), что получается?

P. S. Ещё, наверное, логичнее сравнивать изменение последнего Close[0] с предыдущим Close[1].
[] - не наводит на мысль о необходимости автоподстановки индекса для углубления в историю?
Название: EasyLanguage
Отправлено: ihaar от 28 Октября 2012, 17:18:39
вот что вышло

[attach=1]

data1 - 240 мин
data2 - 1 мин
плот в виде гистограммы,
собраны все медвежьи минутные свечки внутри четырёхчасовика
на принтлоге справа виден момент как на предпоследнем пятничном баре в 20:00 накопилось 88 таких свечек и на новом баре в 20:01 значение обнулилось и пошло новое накопление

 ;)

Vars:
kolvo(0);

If Close Data2 < Open Data2 then kolvo = kolvo + 1;
If Time[1] Data2 = Time Data1 then kolvo = 0;

plot1(kolvo,"kolvo");
plot2(0,"0");

print( Time:4:0, " / ", kolvo);
Название: EasyLanguage
Отправлено: Craft от 28 Октября 2012, 17:59:26
А если цены закрытия баров сравнивать, как будет?
Название: EasyLanguage
Отправлено: ihaar от 28 Октября 2012, 18:07:01
так как вы и писали:
If Close Data2 < Close[1] Data2
Название: EasyLanguage
Отправлено: Craft от 05 Ноября 2012, 15:24:03
Пока не получилось получить достоверный результат. Для проверки попытался посчитать отрицательные и положительные бары внутри 5 мин. бара (Data1 - 5 мин., Data2 - 1 мин.).
По логике, внутри 5 мин. бара состоящего из 5 минуток не может быть больше 5 положительных либо 5 отрицательных баров, но мы видим превышение.
Необходимо усовершенствовать механизм обнуления на новом баре (если, конечно, я где-нибудь не ошибся).
Цитировать
Vars: barpl(0),barmin(0);

If Close Data2>Close[1] Data2 then begin
barpl = barpl + 1;
If Time[1] Data2 = Time Data1 then barpl = 0;
End;

If Close Data2<Close[1] Data2 then begin
barmin = barmin - 1;
If Time[1] Data2 = Time Data1 then barmin = 0;
End;

Plot1(barpl,"pl");
Plot2(barmin,"min");
Название: EasyLanguage
Отправлено: ihaar от 05 Ноября 2012, 16:41:35
при сравнении цен закрытий у разных баров обнуление и подсчёт должны быть сложнее.
примерно так

vars: barpl(0), barmin(0);

condition1 = Close Data2 > Close[1] Data2;
condition2 = Close Data2 < Close[1] Data2;
condition3 = Time[1] Data2 = Time Data1;

if condition3 then begin
If Condition1 then begin
barpl = 1; barmin = 0;
end else
if Condition2 then begin
barmin = 1; barpl = 0;
end else begin
barmin = 0; barpl = 0;
end;
end else begin
if Condition1 then barpl = barpl + 1;
if Condition2 then barmin = barmin + 1;
end;

plot1(barpl,"barpl");
plot2(-barmin,"barmin");

так же необходимо в свойствах индикатроа снять галку "update value intra-bar (tick-by-tick)", иначе в рилтайме будет каша
Название: EasyLanguage
Отправлено: Craft от 10 Ноября 2012, 08:06:29
Всё-таки в МТ (справа на скрине) картина (син. - сентимент покпателей, кр. - продавцов) получается более реалистичная. Может быть качество минутных котировок в QuoteRoom похуже.
Название: EasyLanguage
Отправлено: ihaar от 10 Ноября 2012, 08:39:03
Думаю что врядли проблема в котировках.
Скорее формулы отрабатывают не идентично.
без кода и описания что вы хотите от него трудно что-то сказать
Название: EasyLanguage
Отправлено: Craft от 10 Ноября 2012, 09:31:08
Да, описание же самого простого сентимента было не раз - учёт положительных и отрицательных изменений внутри старшего бара.
Ок, приведу формализацию в коде EL и МТ, давайте попробуем добиться идентичных результатов.

EL:
Цитировать
vars: barpl(0), barmin(0);

condition1 = Close Data2 > Close[1] Data2;
condition2 = Close Data2 < Close[1] Data2;
condition3 = Time[1] Data2 = Time Data1;

if condition3 then begin
   If Condition1 then begin
      barpl = Close Data2; barmin = 0;
   end else
   if Condition2 then begin
      barmin = Close Data2; barpl = 0;
   end else begin
      barmin = 0; barpl = 0;
   end;
end else begin
   if Condition1 then barpl = barpl + Close Data2;
   if Condition2 then barmin = barmin +Close Data2;
end;

If barpl<>0 and barmin<>0 then begin
plot1(barpl/barmin,"barpl");
plot2(barmin/barpl,"barmin");
plot3(0,"0");
end;

МТ:
Цитировать
//+------------------------------------------------------------------+
//|                                                           vl.mq4 |
//|                      Copyright © 2009, MetaQuotes Software Corp. |
//|                                        https://www.metaquotes.net |
//+------------------------------------------------------------------+
#property copyright "Copyright © 2009, MetaQuotes Software Corp."
#property link      "https://www.metaquotes.net"

#property indicator_separate_window
#property indicator_buffers 2
#property indicator_color1 Blue
#property indicator_color2 Red

//---- buffers
double ExtMapBuffer1[];
double ExtMapBuffer2[];
//+------------------------------------------------------------------+
//| Custom indicator initialization function                         |
//+------------------------------------------------------------------+
int init()
  {
//---- indicators
   SetIndexStyle(0,DRAW_LINE);
   SetIndexStyle(1,DRAW_LINE);
   SetIndexBuffer(0,ExtMapBuffer1);
   SetIndexBuffer(1,ExtMapBuffer2);
//----
   return(0);
  }
//+------------------------------------------------------------------+
//| Custom indicator deinitialization function                       |
//+------------------------------------------------------------------+
int deinit()
  {
//----
   
//----
   return(0);
  }
//+------------------------------------------------------------------+
//| Custom indicator iteration function                              |
//+------------------------------------------------------------------+
int start()
{
   int    counted_bars=IndicatorCounted();
   double barpl, barminus;
   int i=Bars-counted_bars;
   {
         int shift = 0; //Ваш исходный бар
         datetime dt = iTime( Symbol(), NULL, shift); //Находим время исходного бара:
         int a = iBarShift( Symbol(), PERIOD_M1, dt, false);//Находим начальный бар на нужном ТФ:
         int kolvo = a-MathRound(Period()/PERIOD_M1);//Находим количество баров для проверки
         if (kolvo < 0 ) {kolvo=0;}//Проверка на валидность
         for (i=a;i>=kolvo;i--) //Ну и понеслась...
         {

            if (iClose(NULL, PERIOD_M1,i)> iClose(NULL, PERIOD_M1,i+1))
            {
                  barpl = barpl + iClose(NULL, PERIOD_M1, i);
            }
            if (iClose(NULL, PERIOD_M1,i+1)>iClose(NULL, PERIOD_M1,i))
            {
                 barminus = barminus + iClose(NULL, PERIOD_M1, i);
            }               
         
         }           
      ExtMapBuffer1 = (barpl/barminus);
      ExtMapBuffer2 = (barminus/barpl);
   } 
   return(0);
  }
//+------------------------------------------------------------------+

Ниже скрин сравнения результатов расчёта - разница на лицо.
Название: EasyLanguage
Отправлено: ihaar от 10 Ноября 2012, 09:50:23
Я сейчас не у компа, но самый простой способ проверить в котировках ли дело, это выгрузить историю минуток из МТ в файл и построить индикатор по ним в ТС
Название: EasyLanguage
Отправлено: ihaar от 07 Сентября 2013, 19:43:28
что-то не могу уловить принцип использования новых классов в ТS
нужно передать значение из одного индикатора в другой (например время и значение, так как это делается в пульсе)
может ктото уже разбирался и есть кусочек кода для подобной задачки?
был бы очень признателен
Название: EasyLanguage
Отправлено: Gelium от 08 Сентября 2013, 04:30:29
Да, примерчик в статье я куций привел. :)

Using elsystem;

Vars:
GlobalValue GlobalValue1(null),

GlobalValue1 = GlobalValue.Create();
GlobalValue1.Name = "MyValue1";
GlobalValue1.Channel = "MyValue1";
GlobalValue1.Load = true;
if p_Debug = 1 then begin
GlobalValue1.DoubleValue = 123.45;
print(ldt, " Set ", GlobalValue1.DoubleValue);
end else
print(ldt, " Get ", GlobalValue1.DoubleValue);
Название: EasyLanguage
Отправлено: Gelium от 08 Сентября 2013, 04:32:20
Учтите, что при включении мультиядерности, глобальные переменные могут не работать. Это исправлено в новых билдах, но они пока не работают с QR. Поэтому работу при мультиядерности надо проверять отдельно.
Название: EasyLanguage
Отправлено: ihaar от 08 Сентября 2013, 05:46:17
ок. спасибо большое.
на всякий случай оставил в виртуалке одно ядро.
и кстати, я так понимаю, что пульс тоже по идее грузится на каждое ядро своя копия?
Название: EasyLanguage
Отправлено: Gelium от 08 Сентября 2013, 10:05:38
В виртуалке вы можете ставить сколько хотите ядер. Внутри TS не надо включать опцию размножения платформы на несколько ядер. TS, в отличии от MC, создает не потоки, а экземпляры платформы. Для каждого экземпляра отдельно грузится Puls. Он под это пока не заточен. Нет времени на такую заточку. Если нанимать программера, то все это конечно можно довести до хорошего уровня. Но пока я не ощущаю большой нужды тратить на это время.
Название: EasyLanguage
Отправлено: ihaar от 18 Сентября 2013, 16:31:36
Павел, если это не копирайт, поделитесь плиз секретом, как вы в Gelium_Trend добились задания стиля и цвета прямых линий в свойствах индикатора, так как будто это не линии а plot
да так что оно ещё и вершины подсвечивает
 ;)
Название: EasyLanguage
Отправлено: ihaar от 19 Сентября 2013, 04:29:58
Ясно, копирайт  ;)
но подскажите хоть в какую сторону копать? Это хитрое использование plot или хитрая конструкция из линий TL_?
Название: EasyLanguage
Отправлено: Gelium от 19 Сентября 2013, 08:00:35
Возможности Easy не копирайт, но я не понял про что вы спрашиваете. Что вы хотите сделать и что у вас не получается?
Название: EasyLanguage
Отправлено: ihaar от 19 Сентября 2013, 08:26:08
У вас в тренде цвет, стиль, толщина линий индикатора задаётся в свойствах индикатора. Вы используете Plot или TL_New для отрисовки линий?
Название: EasyLanguage
Отправлено: Gelium от 19 Сентября 2013, 09:50:36
У вас в тренде цвет, стиль, толщина линий индикатора задаётся в свойствах индикатора. Вы используете Plot или TL_New для отрисовки линий?

Для последних линий tl_new, для предыдущих - plot по вершинам. Параметры цвета и прочие берутся с помощью GetPlotXXX.
Название: EasyLanguage
Отправлено: ihaar от 10 Апреля 2014, 01:46:31
Есть ли какой-нибудь более менее простой способ передать параметры вертикальной линии в индикатор?
Например, я рисую вертикальную линию на графике и её дата и время передаются в код. Если я её подвину, то её измененные параметры тоже передадутся (обновятся).
Заранее благодарен за ответ
Название: EasyLanguage
Отправлено: Gelium от 10 Апреля 2014, 02:48:01
Есть ли какой-нибудь более менее простой способ передать параметры вертикальной линии в индикатор?
Например, я рисую вертикальную линию на графике и её дата и время передаются в код. Если я её подвину, то её измененные параметры тоже передадутся (обновятся).
Заранее благодарен за ответ

Не знаю, что считать простым. В последней TS 9.1 есть возможность просмотреть все объекты рисования, которые есть на графике и определить, менялась ли координата. По описанию, для этого все есть. На практике не пробовал, хотя тоже все собираюсь с этим разобраться. Смотрите как пример ChartTrading. Там можно двигать ордера за счет тягания линий на графике.
Название: EasyLanguage
Отправлено: Gelium от 11 Апреля 2014, 12:22:44
Есть ли какой-нибудь более менее простой способ передать параметры вертикальной линии в индикатор?
Например, я рисую вертикальную линию на графике и её дата и время передаются в код. Если я её подвину, то её измененные параметры тоже передадутся (обновятся).
Заранее благодарен за ответ

Есть успехи? Вот тоже подумываю позаниматься перетягиванием на графике, для удобства использования.
Название: EasyLanguage
Отправлено: ihaar от 11 Апреля 2014, 12:50:10
пока не смотрел. как раз планировал в эти выходные заняться. отпишусь попозже
Название: EasyLanguage
Отправлено: ihaar от 12 Апреля 2014, 02:20:45
elsystem никогда не разбирался. идёт трудно  ;)

вертикальную линию нарисовал
например на последнем баре

using elsystem.drawingobjects;

vars:
DTPoint myDTPoint(Null),
VerticalLine myVLine(Null);

If (LastBarOnChart = True) then Begin   
    myDTPoint = DTPoint.create(BarDateTime, 0);
    myVLine = VerticalLine.create(myDTPoint);
    DrawingObjects.Add(myVLine);

    myVLine.Color = elsystem.drawing.Color.Red;
    myVLine.Style = StyleType.solid;
End;

она двигается руками, но её координатная точка не меняется ( естественно, с чего бы это) )
может подскажете направление куда копать в следующие классы что бы взять её координату?

подозреваю, что если её сдвинуть, то изменится свойство линии Position
Цитировать
Position    double    Gets or sets the position of the vertical line as drawing object point.
значит теоретически можно задать переменную, которая всегда будет равна значению Position указанной линии
но как задать эту переменную?
что-то вроде myDT = myVLine.Position.? и дальше что-то связанное с get этой самой position линии с идентификатором myVLine

буду благодарен за подсказку
Название: EasyLanguage
Отправлено: Gelium от 12 Апреля 2014, 04:11:16
Опишите в общих понятиях что вы хотите реализовать.
Название: EasyLanguage
Отправлено: ihaar от 12 Апреля 2014, 04:20:02
хочу ограничить расчёт своего индикатора только областью заключённой между двумя вертикальными линиями (startLine и endLine), с возможностью эти линии двигать руками интерактивно.

линию я уже нарисовал, её координата это дата и время, вот теперь хочу найти как эту координату получить в виде переменной
Название: EasyLanguage
Отправлено: Gelium от 12 Апреля 2014, 05:23:16
хочу ограничить расчёт своего индикатора только областью заключённой между двумя вертикальными линиями (startLine и endLine), с возможностью эти линии двигать руками интерактивно.

линию я уже нарисовал, её координата это дата и время, вот теперь хочу найти как эту координату получить в виде переменной

Странно, но свойства для получения именно даты напрямую нет. Недоработка разработчиков.
Надо делать через обработку событий ChartingHost.
Название: EasyLanguage
Отправлено: ihaar от 12 Апреля 2014, 05:31:22
в описании класса вертикальной линии
https://help.tradestation.com/09_01/tsdevhelp/Subsystems/elobject/class/verticalline_class.htm#
есть среди свойств линии такой параметр
Цитировать
Position    double    Gets or sets the position of the vertical line as drawing object point.
я так понимаю он позволяет получить (gets) позицию данной линии на графике как точку (DTpoint например)
разве это не оно?
просто не понятно как это сделать
Название: EasyLanguage
Отправлено: Gelium от 12 Апреля 2014, 05:56:50
я так понимаю он позволяет получить (gets) позицию данной линии на графике как точку (DTpoint например)
разве это не оно?
просто не понятно как это сделать

А никак. Смотрим под отладчиком:

[attach=1]

Свойство Price сделано доступным для чтения, а свойство с временем сделано недоступным. Баг разработчиков. Причем передаваемый в ChartingHost объект Args.Element тоже имеет кастрированные свойства. Нет ни доступа к исходному объекту, ни доступа к свойству Tag. Возможно в TS 9.5 они это пофиксили.
Название: EasyLanguage
Отправлено: Gelium от 12 Апреля 2014, 06:19:33
У TrendLine эти удоты тоже заблокировали доступ ко времени начала линии. Можно обратиться к MTL.StartPoint.Price, MTL.EndPoint.Price, но нет доступа к данным по времени. Хотя нужные свойства под отладчиком просматриваются.
Название: EasyLanguage
Отправлено: ihaar от 12 Апреля 2014, 06:34:15
получается, что пока что это просто дополнительные возможности по добавлению графических элементов на чарты.
из-за отсутствия важной координаты по времени интерактива никакого не получится
Название: EasyLanguage
Отправлено: Gelium от 12 Апреля 2014, 07:05:47
получается, что пока что это просто дополнительные возможности по добавлению графических элементов на чарты.
из-за отсутствия важной координаты по времени интерактива никакого не получится

Может я что-то не догоняю. У них ChartTrading сделан на Easy. Значит все должно быть предусмотрено. Пробую разобраться. Свой код прилагаю.
Если через ChartingHost можно получать как-то ссылку на исходный объект рисования, то любая интерактивность возможна.  А если нет, то нет.
Название: EasyLanguage
Отправлено: ihaar от 12 Апреля 2014, 07:23:14
в ChartTrading код большой, но я проверил поиском, там не используются классы линий и точек.
возможно там для интерактивного двигания линий ордеров созданы специальные классы именно для этих задач. а всё остальное интерактивным быть не может.
интеркативная работа с ордерами может интересовать только клиентов их брокерской части.
и возможно это причина по которой интерактив для обычных индикаторов может быть заблокирован - им более выгоден функционал который привлекает новых клиентов, а не работает на независимость платформы.
если такое положение вещей сохранится и в 9.5, то думаю так и есть.

Название: EasyLanguage
Отправлено: Gelium от 12 Апреля 2014, 07:28:21
Пока я не понял как определить какой из созданных в коде объектов рисования был выбран пользователем. ChartingHost не дает нужных свойств.

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

Не думаю, что они специально блокируют интерактивность. Просто забыли сделать видимыми свойства некоторых объектов. Мы же можем просто использовать таймер и проверять свойства объектов периодически. Так ведь нет всех нужных свойств. Плюс есть глюки с изменением свойств. Например, если менять свойства подписи, объект вообще исчезает с графика. Поэтому сначала надо удалить старый объект, потом создавать новый. В наличии глюки и плохо продуманная структура классов. Нет свойств для задания прозрачности. Возможно в TS 9.5 они поправили эти недоработки.
Название: EasyLanguage
Отправлено: ihaar от 12 Апреля 2014, 07:36:07
кстати, горизонтальная линия не имеет координаты время, а только цену, это свойство доступно.
Цитировать
Price    double    Gets or sets a double representing the Price value of the line.
но что-то я не могу заставить индикатор брать этот параметр у линии которую я передвинул руками
myHLine.Price.ToString() упрямо выдаёт цену на которой линия изначально была создана, а не цену на которую я её передвинул
Название: EasyLanguage
Отправлено: Gelium от 12 Апреля 2014, 08:00:53
кстати, горизонтальная линия не имеет координаты время, а только цену, это свойство доступно.
Цитировать
Price    double    Gets or sets a double representing the Price value of the line.
но что-то я не могу заставить индикатор брать этот параметр у линии которую я передвинул руками
myHLine.Price.ToString() упрямо выдаёт цену на которой линия изначально была создана, а не цену на которую я её передвинул

print(ldt, " MyHLine ", MyHLine.Price);

Выдает измененное значение цены после перетягивания.
Название: EasyLanguage
Отправлено: ihaar от 12 Апреля 2014, 08:06:35
принт выдаёт. а вот как в коде его заставить видеть..
может через GlobalVariables? я когда-то эксперемнтировал (до того как решил что пульс удобнее) и обращал внимание что он хранит свои значения както независимо от чарта.
Название: EasyLanguage
Отправлено: Gelium от 12 Апреля 2014, 08:26:15
принт выдаёт. а вот как в коде его заставить видеть..
может через GlobalVariables? я когда-то эксперемнтировал (до того как решил что пульс удобнее) и обращал внимание что он хранит свои значения както независимо от чарта.

Print выдет то, что вы в коде и имеете.  ;)

DP = mText.PointValue astype DTPoint;
print(ldt, " mText ", mText.PointValue.Price, " DP ", DP.DateTimeOfBar.ToString());

Вот так можно получить все координаты текстовой метки.
Название: EasyLanguage
Отправлено: Gelium от 12 Апреля 2014, 08:34:04
А вот так можно получать координаты обычной линии:

mtl = TrendLine.create(DTPoint.Create(BarDateTime[20], c[20]), DTPoint.Create(BarDateTime, c));
...

print(ldt, " MTL ",
  (MTL.StartPoint astype DTPoint).DateTimeOfBar.ToString(), " ", MTL.StartPoint.Price, " - ",
  (MTL.EndPoint astype DTPoint).DateTimeOfBar.ToString(), " ", MTL.EndPoint.Price);
Название: EasyLanguage
Отправлено: Gelium от 12 Апреля 2014, 08:36:49
Если создать обычную линию с координатами, выходящими за границы цен графика, получится вертикальная линия. Эту линию можно таскать. На событие ChartingHost1_ChartElementClick вешаете проверку изменения координат своей линии. Изменились координаты, делаете то, что вам нужно. Не очень изящный код конечно, но линии и текст можно тягать и делать нужную интерактивность.
Название: EasyLanguage
Отправлено: Gelium от 12 Апреля 2014, 08:45:05
Еще координаты отдают Rectangle и Ellipse. Так что можно поинтерактивничать. Координаты не отдает только вертикальная линия. У горизонтальной линии цена отдается. Надо просто отдельно хранить старые координаты объекта и проверять самому, есть ли изменение. А методы ChartingHost добавляют дополнительную информацию:

Цитировать
11.04.2014 22:00  Args.Type drawingobject
11.04.2014 22:00  Args.DataStreamValue 1316.70
11.04.2014 22:00  Args.StudyValue 1316.70
11.04.2014 22:00  Args.Element charting.DrawingObjectVisualElement
11.04.2014 22:00  Args.Time 11.04.2014 20:55:00
11.04.2014 22:00  Args.Element.Type drawingobject
11.04.2014 22:00  args.IsKeyDown[Key.control]  FALSE
11.04.2014 22:00  args.IsKeyDown[Key.alt]  FALSE
11.04.2014 22:00  args.Button left
11.04.2014 22:00  args.X 2494.00
11.04.2014 22:00  args.Y  573.00

Можно конечно пытаться сравнивать координаты от ChartingHost с координатами изменившихся объектов, чтобы точно узнать что тянулось. Но думаю и без этого можно обойтись.
Название: EasyLanguage
Отправлено: Gelium от 12 Апреля 2014, 08:50:37
Попробую на этой неделе сделать в TS интерактивность по типу Gelium_Model в MT4. Чтобы можно было потягать модель на графике. За одно стоит добавить модели уровень руками задаваемого стопа.
Название: EasyLanguage
Отправлено: ihaar от 12 Апреля 2014, 08:59:57
спасибо за информацию, похоже, то что нужно.

единственный момент который пока не укладывается в голове, как пересчитать индикатор, скажем 20 баров назад с учётом новых изменившихся данных полученных сейчас? линию ведь я двигаю сейчас..
или все расчёты производить на последнем баре и просто рисовать значения нужное количество баров назад?
но тогда понятно что перерасчёт будет автоматический при приходе нового тика, а если график статичный, на основе текстовика? как заставить индикатор перерисовать значения в таком случае?
в принте координаты меняются мгновенно, но индикатор считается либо поступательно побарно, либо с приходом тика.
этот момент не ясен..
Название: EasyLanguage
Отправлено: Gelium от 12 Апреля 2014, 10:18:58
единственный момент который пока не укладывается в голове, как пересчитать индикатор, скажем 20 баров назад с учётом новых изменившихся данных полученных сейчас? линию ведь я двигаю сейчас..

Только через вызов комментария эксперта можно заставить TS пересчитать весь график, как это сделано в Gelium_Expert.
Название: EasyLanguage
Отправлено: Gelium от 16 Апреля 2014, 09:13:02
Глюки Easy в TS 9.1:

1. Компонент ListView не отдает индекс элемента, по которому пользователь кликнул. Хотя в справке написано, что должен отдавать.
2. Компонент DataGridView сохраняет значения ячеек, но на форме они не отображаются. Может что-то не понял, но победить не удалось.
3. Свойства Dock компонент формы лучше не использовать.
4. Не ясно из-за чего, но после опытов форма, которая нормально стыковалась с графиком, перестала стыковаться.

В общем глюков хватает. :(
Название: EasyLanguage
Отправлено: Gelium от 16 Апреля 2014, 09:51:17
Если ComboBox использовать в режиме Simple, форма перестает нормально цепляться в окно с графиком.
Название: EasyLanguage
Отправлено: Gelium от 18 Апреля 2014, 10:04:56
Вот так можно получить индекс активного элемента ListView:

print("lv ", lv.SelectedIndices.Items[0].ToString());
Название: EasyLanguage
Отправлено: Gelium от 23 Апреля 2014, 06:53:01
Если ничто не помогает, почитайте мануал. Почитал. Ларчик с кликом по линии открывался просто:

Цитировать
method void LineClick( Object sender, DrawingObjectEventArgs args)
vars:
    TrendLine tl,
   Int i1;
begin
   // Отображение на графике параметров сделки
   tl = Sender astype TrendLine;
   If p_Debug > 0 then
      print("Line.Tag ", tl.Tag.ToString());

У каждого объекта рисования есть событие на клик мышкой.
Название: EasyLanguage
Отправлено: val от 03 Июня 2014, 12:53:58
Павел, вопрос.
1. Можно ли добавить не существующий в TS новый символ ( например в Radar) и накапливать его историю ?
Из МТ передаю котировки O,H,L,C (через permvar.dll), в TS их принимаю.
2. Как постороить бар или свечку из принимаемых O,H,L,C .
Спасибо.
Название: EasyLanguage
Отправлено: Gelium от 04 Июня 2014, 04:24:29
Павел, вопрос.
1. Можно ли добавить не существующий в TS новый символ ( например в Radar) и накапливать его историю ?
Из МТ передаю котировки O,H,L,C (через permvar.dll), в TS их принимаю.
2. Как постороить бар или свечку из принимаемых O,H,L,C .
Спасибо.

В режиме offline просто пишете данные в файл и открываете график на базе файла или периодически делает Ctrl+R для обновления данных. В режиме real time эти данные должны поступать в программу фидер, которая будет их передавать в TS. Возможно https://traderssoft.com/ts8/ods (https://traderssoft.com/ts8/ods) может принимать данные через DDE и отправлять их дальше в TS.
Название: EasyLanguage
Отправлено: val от 04 Июня 2014, 05:00:43
Спасибо, а как из поступающих  O,H,L,C построить бар или свечку, это что создавать обьект надо ?
Название: EasyLanguage
Отправлено: Gelium от 04 Июня 2014, 05:22:20
Спасибо, а как из поступающих  O,H,L,C построить бар или свечку, это что создавать обьект надо ?

Поступивших откуда и куда?
Название: EasyLanguage
Отправлено: val от 04 Июня 2014, 05:47:30
Из МТ передаю котировки O,H,L,C (через permvar.dll), в TS их принимаю как индикатор, рисует линии O,H,L,C, хочется отобразить ввиде бара.
Название: EasyLanguage
Отправлено: Gelium от 04 Июня 2014, 05:53:26
Из МТ передаю котировки O,H,L,C (через permvar.dll), в TS их принимаю как индикатор, рисует линии O,H,L,C, хочется отобразить ввиде бара.

Индикатор PaintBar сделайте и рисуйте себе бары.
Название: EasyLanguage
Отправлено: Gelium от 04 Июня 2014, 13:00:50
Из МТ передаю котировки O,H,L,C (через permvar.dll), в TS их принимаю как индикатор, рисует линии O,H,L,C, хочется отобразить ввиде бара.

Может пригодится. В QR есть генератор случайных чисел, частоту которого можно менять. Если вам не нужны валюты, то на график со случайными котировками можно вешать индикаторы, которые будут использовать внешние данные, с обновлением внутри бара. А сами случайные графики сделать невидимыми.
Название: EasyLanguage
Отправлено: val от 04 Июня 2014, 16:57:10
Спасибо, буду экспериментировать.
В принципе, если открыть любой форексный символ стилем Dot on Close и брать данные, например DAX, то этих Дотов и видно не будет.
Название: EasyLanguage
Отправлено: Gelium от 05 Июня 2014, 00:41:19
Спасибо, буду экспериментировать.
В принципе, если открыть любой форексный символ стилем Dot on Close и брать данные, например DAX, то этих Дотов и видно не будет.

Видно не будет "Dot on Close", но по точкам можно вслепую попадать мышкой. Правильнее делать серию данных невидимой.

Символ Форекса может обновляться не часто. Поэтому если к его котировкам добавить котировки генератора случайных чисел, частоту обновления можно увеличить.
Название: EasyLanguage
Отправлено: Gelium от 21 Июня 2014, 04:52:24
Может кому пригодится. Можно заставить обновлять графики на базе текстового файла в TS через вызов макроса из кода Easy, если текстовый файл изменил размер.
Название: EasyLanguage
Отправлено: zonpex от 22 Июня 2014, 01:35:03
Пример, если можно.
Название: EasyLanguage
Отправлено: Gelium от 22 Июня 2014, 05:01:41
Пример, если можно.

RunCommand(s);
Название: EasyLanguage
Отправлено: zonpex от 22 Июня 2014, 07:21:34
Если честно, то не совсем понял. Это макрос или часть кода индюка или стратегии?
Название: EasyLanguage
Отправлено: Gelium от 22 Июня 2014, 13:28:10
Если честно, то не совсем понял. Это макрос или часть кода индюка или стратегии?

Это вызов любого макроса. В справке написано подробнее. Макрос может менять символ, период графика и т.д. Все есть в справке.
Название: EasyLanguage
Отправлено: zonpex от 22 Июня 2014, 21:59:08
Спасибо, понял.
Название: EasyLanguage
Отправлено: Gelium от 08 Июля 2014, 04:10:30
Уточнение по поводу исполнения и перерасчета ордеров внутри бара.

Для  исполнения  ордера  внутри  бара, он должен выполняться  по  рынку или без обращения к open next bar. Вставьте на график  стратегию mov  avg.  crossover и увидите, что у вас доступны для включения опции исполнения ордера внутри бара.

[attachimg=1]

А для Gelium_Trader эти опции  доступны  не  будут,  так  как  внутри  стратегии  для  точного исполнения ордера используется open next bar.
Название: EasyLanguage
Отправлено: Dmsum от 09 Июля 2014, 17:59:36
Подскажите, пожалуйста, на примере, как правильно использовать MarketIfTouchOrder и LimitIfTouchOrder для входа в позицию  и выхода внутри бара
Название: EasyLanguage
Отправлено: Gelium от 10 Июля 2014, 03:41:33
Подскажите, пожалуйста, на примере, как правильно использовать MarketIfTouchOrder и LimitIfTouchOrder для входа в позицию  и выхода внутри бара

А где вы в Easy нашли такие операторы?
Название: EasyLanguage
Отправлено: Dmsum от 10 Июля 2014, 11:05:12
Насколько я понял, это функции, которые, при использовании в некоторой комбинации дают возможность купить или продать внутри бара. Выписку из описания прилагаю :
LimitIfTouchedOrder (Function)
image\trumpet2.gif Disclaimer

The LimitIfTouchedOrder function is used to configure and send a limit if touched order using the order entry macro .PlaceOrder.  You can call this function directly from your own EasyLanguage code to simplify the formatting and generation of macro orders.

   Care should be exercised when calling this function as it is intended to send live orders.  Confirmations for macro-generated orders can be configured by using the File -> Preferences -> TradeStation Order Entry menu sequence.

Syntax
LimitOrder(Frequency,Account,Action,SymbolCategory,Symbol,Quantity,Duration,GTDDate,IfTouched,LimitPrice)

Returns (Integer)
LimitIfTouchedOrder returns 1 if called on a "real-time" tick and if a trade is allowed based on the user input "Frequency".  The function returns -1 (negative one) in other cases; for example, if the function is called on an historical bar.  If there are errors in the order parameters a runtime error message will be generated and the order will not be placed.

Как правильно пользоваться - до конца не понял, поэтому решил спросить... Заранее спасибо!
Название: EasyLanguage
Отправлено: Gelium от 10 Июля 2014, 14:32:05
Понятно. LimitIfTouchedOrder  - это функция Easy с исходным кодом. Можете посмотреть. Актуально, если вы будете торговать через TradeStation.
Название: EasyLanguage
Отправлено: Dmsum от 18 Июля 2014, 09:25:13
Использую TS, но так и не смог разобраться, как открыть позицию внутри бара в стратегии на EasyLanguage. Напишите, по-подробнее, если возможно, с примером. Заранее спасибо!
Название: EasyLanguage
Отправлено: Gelium от 18 Июля 2014, 11:04:10
Использую TS, но так и не смог разобраться, как открыть позицию внутри бара в стратегии на EasyLanguage. Напишите, по-подробнее, если возможно, с примером. Заранее спасибо!

Смотрите готовые стратегии, типа мувинга и т.п.
Название: EasyLanguage
Отправлено: Dmsum от 18 Июля 2014, 11:23:48
Не нахожу как обойти "this bar close" или "next bar open"...
Название: EasyLanguage
Отправлено: Gelium от 18 Июля 2014, 14:48:10
inputs: Price( Close ), FastLength( 9 ), SlowLength( 18 ) ;
variables: FastAvg( 0 ), SlowAvg( 0 ) ;

FastAvg = AverageFC( Price, FastLength ) ;
SlowAvg = AverageFC( Price, SlowLength ) ;

if CurrentBar > 1 and FastAvg crosses over SlowAvg then
{ CB > 1 check used to avoid spurious cross confirmation at CB = 1 }
Buy ( "MA2CrossLE" ) next bar at market ;

if CurrentBar > 1 and FastAvg crosses under SlowAvg then
{ CB > 1 check used to avoid spurious cross confirmation at CB = 1 }
Sell Short ( "MA2CrossSE" ) next bar at market ;

Не нахожу как обойти "this bar close" или "next bar open"...

Потрудитесь объяснять суть своих проблем более подробно. Для детективного расследования пока нет свободных сыщиков. Лето. Отпуска. :)
Название: EasyLanguage
Отправлено: emyemy от 01 Декабря 2014, 16:22:40
Как расширить функцию FindBar(), нахождение номера бара по входным данным Дата/Date и Время/Time?
Дело в том, что по умолчанию эта встроенная функция находит бар только(?) в числе первых 50-ти.

Вопрос снимаю. Решено.
Название: EasyLanguage
Отправлено: Григорий от 02 Февраля 2015, 21:45:43
Здравствуйте. Нужна помощь прописать сигнал.  Например, имеются 4 линии: Line 1(9), Line2(18), Line3 (50), Line4 (100), нужно  чтобы сигнал на покупку поступал  при пересечении линий с низу вверх Line3>Line 4 при условии поиска в прошлом, на протяжении 30  баров, условия, когда Line1<Line2 и Line 3<Line4
Как правильно этот код прописать ? :     
If  Line3>Line4  and  Line 1[1-30]<Line2[1-30] and Line 3[1-30]<Line4 [1-30] Then buy ("UT") This Bar on Close;
Т.е. я хочу  в примере сказать, чтобы на одном из прошлых баров, на протяжении 30 анализируемых прошлых баров, система бы нашла  резонанс  линий (Line1<Line2 и Line 3<Line4).
Благодарен за ответ. :o
Название: EasyLanguage
Отправлено: val от 03 Февраля 2015, 15:20:14
Попробуйте так :

мониторим постоянно выполнение условия, если выполняется, запоминаем номер бара.

Inputs:Barr(30);
vars:BarNum(0);

If Line1 < Line2 and Line3 < Line4 then begin
   BarNum = BarNumber;
end;

If ( BarNumber - BarNum ) <= Barr Then buy ("UT") This Bar on Close ;
Название: EasyLanguage
Отправлено: Григорий от 03 Февраля 2015, 15:48:04
Спасибо, буду разбираться.
Название: EasyLanguage
Отправлено: Григорий от 04 Февраля 2015, 04:42:41
Думается  вот так :   If  (Line3>Line4  and  Line 1[1]<Line2[1] and Line 3[1]<Line4 [1]) or  (Line3>Line4  and  Line 1[2]<Line2[2] and Line 3[2]<Line4 [2]) or  (Line3>Line4  and  Line 1[3]<Line2[3] and Line 3[3]<Line4 [3])...........{так до [30]} Then buy ("UT") This Bar on Close     :D
Название: EasyLanguage
Отправлено: Станислав от 03 Марта 2015, 16:37:24
Возможно куму-то пригодиться эта качественная инструкция...
Название: EasyLanguage
Отправлено: znt от 29 Марта 2015, 12:51:59
Доброго всем времени суток.
Есть пара вопросов:

1. Если инструмент и индикатор находятся в одной суб-графе, а шаг цены инструмента меньше 1  (1/10, 1/100 и т.д.), не получается привязать инструмент и индикатор к одной шкале (right axis или left axis).
Манипуляции со значениями индикатора (приведение к разным типам данных, округление знаков после запятой) не помогают.
Если шаг цены инструмента "as is” или выше (10, 100 и т.д.) такой проблемы нет.

Использование “same axis as underlying data” не всегда приводит к желаемому результату.
Например, если тип графика bar high, bar low и значение индикатора за пределами диапазона бара, получаем вертикальную черту размером - значения индикатора + размер бара + промежуток между индикатором и баром, с толщиной не соответствующей значению индикатора (также как, если тип индикатора – PaintBar).
В этом случае логика разработчиков абсолютно непонятна, но здесь хотя бы все однообразно.

Может, кто знает, как это исправить?

2. В меню TDE отсутствует Debugger и недоступна панель Resource Editor.
В хэлпе написано -  This feature has been provided as a developer preview and is not yet ready for production use.
Вопрос – как активировать (установить)?
Название: EasyLanguage
Отправлено: Gelium от 29 Марта 2015, 13:39:51
1. Если инструмент и индикатор находятся в одной суб-графе, а шаг цены инструмента меньше 1  (1/10, 1/100 и т.д.), не получается привязать инструмент и индикатор к одной шкале (right axis или left axis).

Не понятно, почему индикатор и данные символа с разными шкалами должны уживаться на одной шкале.

2. В меню TDE отсутствует Debugger и недоступна панель Resource Editor.
В хэлпе написано -  This feature has been provided as a developer preview and is not yet ready for production use.
Вопрос – как активировать (установить)?

https://gelium.net/soft-ts/tradestation-main/ts-review/item/1310-ts-tradestation-91-update-13-24#8
Название: EasyLanguage
Отправлено: znt от 29 Марта 2015, 14:46:28
Разобрался с “same axis as underlying data” – на вкладке style, есть опция:
when plotting on a candlestick – надо выставить: paint as a vertical line.
Тоже самое и для PaintBar.
Так что первый вопрос можно считать решенным.
Название: EasyLanguage
Отправлено: znt от 29 Марта 2015, 14:58:00
Не понятно, почему индикатор и данные символа с разными шкалами должны уживаться на одной шкале.

Но если шаг цены инструмента "as is” уживаются же.

https://gelium.net/soft-ts/tradestation-main/ts-review/item/1310-ts-tradestation-91-update-13-24#8

Спасибо, проглядел.
Название: EasyLanguage
Отправлено: Gelium от 31 Марта 2015, 07:06:46
Не понятно, почему индикатор и данные символа с разными шкалами должны уживаться на одной шкале.

Но если шаг цены инструмента "as is” уживаются же.

Приложите скриншот. Так и не понял что с чем уживается.  ;)
Название: EasyLanguage
Отправлено: znt от 04 Апреля 2015, 12:35:02
Приложите скриншот

Простейший индикатор (например, plot1(c, “C”)):
- без проблем привязывается (уживается) к одной шкале (оси) с инструментом, если шаг цены инструмента кратен 1 (например, фьючерс на индекс РТС, price scale – as is, scale on - right axis или left axis);
- и никак не хочет этого делать, если шаг цены инструмента меньше 1 (например, фьючерс на смесь Brent, price scale – 1/100, scale on - right axis или left axis).

Так, думаю понятней, чем на картинка скриншоте.
Вопрос уже не актуален (решен через: same axis as underlying data - when plotting on a candlestick – paint as a vertical line).

Обнаружилась следующая проблемка:
AlertEnabled возвращает True только на последнем баре, хотя в хелпе написано:
«The difference between this reserved word and the CheckAlert reserved word is that AlertEnabled returns a value of True for all bars when the alert is enabled whereas CheckAlert returns a value of True only for the last bar on the chart.»

Непонятно почему так происходит – в TS 8.x все работало, как написано в хелпе.
Название: EasyLanguage
Отправлено: val от 05 Апреля 2015, 03:40:20
Для самообразования : https://markplex.com/free-tutorials/
Название: EasyLanguage
Отправлено: val от 06 Апреля 2015, 11:57:10
В инете встречаю возможность анализировать Эллиот волны с помощью ElWaveCount (ShowMe) как в Омеге так и в TS.
Кто-нить имеет оную ShowMe или что-то в этом роде ?
Название: EasyLanguage
Отправлено: zonpex от 06 Апреля 2015, 23:40:20
Есть похожее, но в SEFачном формате (для МС). Могу выложить. Если хотите , то подождите, будет время, сделаю TXT.
Название: EasyLanguage
Отправлено: val от 07 Апреля 2015, 02:18:38
Спасибо, txt тоже можно.
Название: EasyLanguage
Отправлено: fx.dsolop от 07 Апреля 2015, 18:01:40
Здравствуйте, Форумяне
Подскажите, пожалуйста, возможно ли в EL сделать торгового робота, чтоб он сам автоматически торговал 24/5. Например, на дневном графике открывал позиции в начале суток в зависимости от анализа Exponential Moving Average. Как такой робот называется в терминологии EL, чтоб знать что искать и о чем читать.

Заранее спасибо за ответ :)
Название: EasyLanguage
Отправлено: zonpex от 07 Апреля 2015, 22:00:47
Код в txt wave.sef
Название: EasyLanguage
Отправлено: val от 08 Апреля 2015, 03:20:21
Спасибо    zonpex, в TS 91 ShowMe (из txt) рисует волны. Только это не Elliott  а что-то не понятное, пока.
Хотелось бы иметь какой-нить инструментарий для ручной разметки волн по своим расчетам.
Название: EasyLanguage
Отправлено: zonpex от 09 Апреля 2015, 01:18:06
Один из индикаторов для ап тренда, другой даун. В настройках индикатора есть параметры для расчета по Эллиоту.
Название: EasyLanguage
Отправлено: Igor от 14 Апреля 2015, 17:37:48
может имеет смысл завести ветку по easylanguage?

что бы делиться полезностями типа такого:

при работе с текстами постоянно приходится иметь в уме количество десятых если необходимо вывести ценовое значение
а ежели использовать такой код
if PriceScale = 100000 then autodecimal = 5 else
if PriceScale = 10000  then autodecimal = 4 else
If PriceScale = 1000   then autodecimal = 3 else
If PriceScale = 100    then autodecimal = 2 else
If PriceScale = 10     then autodecimal = 1 else
If PriceScale = 1      then autodecimal = 0;
введя переменную autodecimal и подставляя её как второй параметр в NumToStr, будем автоматически иметь правильное отображение цены
можно оформить в функцию

Можно еще проще и универсальней: ;D

{***************************************************************************************************
Функция предназначена для определения ценовой доли актива (количества знаков дробной части)
***************************************************************************************************}

Vars: Val1(MinMove / PriceScale),
      Val2(Round(0.123456789 / Val1, 0)),
      Val3(IFF(Val2 = 0, 0, StrLen(NumToStr(Val2, 0))));

PFDigits = Val3;



{***************************************************************************************************
Функция предназначена для округления значения переменной до ценовой доли актива
***************************************************************************************************}

Inputs: Value(Numeric);

PFRound = Round(Value, PFDigits);



Например, значение Value0 = PFRound(Close / 3) будет округлено до ценовой доли.





не пойму, как тут вообще темы задавать?
Название: EasyLanguage
Отправлено: Станислав от 19 Января 2016, 19:10:27
Возможно кому-нибудь пригодится :)
Название: EasyLanguage
Отправлено: Станислав от 19 Января 2016, 19:13:41
Возможно кому-нибудь пригодится  :)
Название: EasyLanguage
Отправлено: Gelium от 23 Января 2016, 16:43:08
Возможно кому-нибудь пригодится  :)

Спасибо! Пригодится.
Название: EasyLanguage
Отправлено: Gennadiy от 11 Марта 2016, 15:07:16
В качестве альтернативы прямого экспорта в эксель из TS, использую экспорт в текстовый файл (работоспособность этого метода проверена временем - безотказная ;)), а потом макросом в экселе обрабатываю текстовый файл, на мой взгляд так удобнее и универсально, т.к. макросы экселя позволяют выполнить практически любой отчет в нужном виде, ну и конечно же выводим на панель уравления в экселе управляющие кнопки :) Эт как идея..
А можно по поводу скрипта поподробнее ?
Название: EasyLanguage
Отправлено: Станислав от 12 Марта 2016, 17:26:36
Считываем файл и сохраняем поля файла в массив, который в последствии будем обрабатывать. Если обработка не нужна, можно сразу заполнять информацию в ячейки экселя...
Запускаем эксель, нажимаем Alt+F11, вставляем в соответствующие Sub():

         Open(File_wrk) For Input As #1
         Do Until EOF(1)
            Line Input #1, Value
            FileText = FileText & Value           ‘здесь можно сразу сохранять в двумерный массив добавив счетчик прочитанных строк
         Loop
         Close #1

Для удобства обработки создаем меню и назначаем горячие клавиши...
СОЗДАНИЕ МЕНЮ:

Option Explicit                                                                                    'Обязательное объявление переменных
Option Compare Text                                                                                'Обработка текстовых значений без учёта регистра

Sub s_ГРМеню()
   Call f_ГРМеню(CBCReset:=False)
End Sub
Function f_ГРМеню(Optional ByVal CBCReset As Boolean)
   Dim i   As Byte
   Dim CBC As Variant
   Dim Msg As Variant

   'Удалить главное меню
   If CBCReset = True Then
      If CommandBars(1).Controls.Count > 0 Then CommandBars(1).Reset
      If CommandBars("Cell").Controls.Count > 0 Then CommandBars("Cell").Reset
      Exit Function
   End If

   'Создать главное меню
   For i = 1 To 2 Step 1: DoEvents
      Select Case i
         Case 1: Msg = 1
         Case 2: Msg = "Cell"
      End Select

      'CommandBars(Msg).Reset

      CBC = False
      For Each CBC In CommandBars(Msg).Controls: DoEvents
         If InStr(CBC.Caption, "ГрафикРабот") > 0 Then
            CBC = True
            Exit For
         End If
      Next CBC

      If CBC = False Then
         With CommandBars(Msg).Controls.Add(Type:=msoControlPopup, Temporary:=True)
            .Caption = "ГрафикРабот"
            .Visible = True
            With .Controls
               'Директории и файлы
               With .Add(Type:=msoControlPopup, Temporary:=True)
                  .Caption = "Директории и файлы"
                  With .Controls
                     With .Add(Type:=msoControlButton): .FaceId = 303: .BeginGroup = False: .Caption = "Текущая структура директорий": .OnAction = "s_ГРСтруктураДиректорийСкан":    End With
                     With .Add(Type:=msoControlButton): .FaceId = 464: .BeginGroup = False: .Caption = "Удалить структуру директорий": .OnAction = "s_ГРСтруктураДиректорийУдалить": End With
                     With .Add(Type:=msoControlButton): .FaceId = 462: .BeginGroup = False: .Caption = "Создать структуру директорий": .OnAction = "s_ГРСтруктураДиректорийСоздать": End With
                     With .Add(Type:=msoControlButton): .FaceId = 313: .BeginGroup = False: .Caption = "Менеджер файлов":              .OnAction = "s_ГРМенеджерФайлов":             End With
                     With .Add(Type:=msoControlButton): .FaceId = 790: .BeginGroup = False: .Caption = "Менеджер гиперссылок":         .OnAction = "s_ГРМенеджерГиперссылок":        End With
                  End With
               End With
            End With
         End With
      End If
   Next i
End Function



Sub s_ГРГорячиеКлавиши()
   Call f_ГРГорячиеКлавиши(CBCReset:=False)
End Sub
Function f_ГРГорячиеКлавиши(Optional ByVal CBCReset As Boolean)
   Dim i   As Double
   Dim CBC As Variant
   Dim Msg As Variant

   CBC = ""
   Call f_Администрирование
   For Each CBC In CommandBars("Cell").Controls("ГрафикРабот").Controls: DoEvents
      If InStr(CBC.Caption, "горячие клавиши") > 0 Then
         CBC = CBC.Caption
         Exit For
      End If
   Next CBC
   If CBC = "" Then Exit Function

   If InStr(CBC, "Отключить горячие клавиши") > 0 Then
      For i = 1 To 2 Step 1: DoEvents
         If i = 1 Then Msg = 1 Else _
         If i = 2 Then Msg = "Cell"

         If InStr(CBC, "Отключить горячие клавиши") = 0 Then Exit For
         With CommandBars(Msg).Controls("ГрафикРабот").Controls("Отключить горячие клавиши")
            .FaceId = 1087
            .Caption = "Включить горячие клавиши"
            .OnAction = "s_ГРГорячиеКлавиши"
         End With
      Next i

      'Создать
      Application.OnKey Key:="^%{l}", Procedure:=""                                                'Лист:               Ctrl+Alt  +l"
      Application.OnKey Key:="^%{t}", Procedure:=""                                                'Шаблон:             Ctrl+Alt  +t"
      Application.OnKey Key:="^%{y}", Procedure:=""                                                'Копия:              Ctrl+Alt  +y"
      Application.OnKey Key:="^%{p}", Procedure:=""                                                'Параметры:          Ctrl+Alt  +p"
      Application.OnKey Key:="^%{d}", Procedure:=""                                                'Диаграмма:          Ctrl+Alt  +d"
      Application.OnKey Key:="^%{s}", Procedure:=""                                                'Горизонт:           Ctrl+Alt  +s"
   Else

   If InStr(CBC, "Включить горячие клавиши") > 0 Then
      For i = 1 To 2 Step 1: DoEvents
         If i = 1 Then Msg = 1 Else _
         If i = 2 Then Msg = "Cell"

         If InStr(CBC, "Включить горячие клавиши") = 0 Then Exit For
         With CommandBars(Msg).Controls("ГрафикРабот").Controls("Включить горячие клавиши")
            .FaceId = 1088
            .Caption = "Отключить горячие клавиши"
            .OnAction = "s_ГРГорячиеКлавиши"
         End With
      Next i

      'Создать
      Application.OnKey Key:="^%{l}", Procedure:="s_ГРЛист"                                        'Лист:               Ctrl+Alt  +l"
      Application.OnKey Key:="^%{t}", Procedure:="s_ГРШаблон"                                      'Шаблон:             Ctrl+Alt  +t"
      Application.OnKey Key:="^%{y}", Procedure:="s_ГРКопия"                                       'Копия:              Ctrl+Alt  +y"
      Application.OnKey Key:="^%{p}", Procedure:="s_ГРСоздатьПараметры"                            'Параметры:          Ctrl+Alt  +p"
      Application.OnKey Key:="^%{d}", Procedure:="s_ГРСоздатьДиаграмма"                            'Диаграмма:          Ctrl+Alt  +d"
      Application.OnKey Key:="^%{s}", Procedure:="s_ГРСоздатьСводка"                               'Горизонт:           Ctrl+Alt  +s"
   End If
   End If
End Function



Function f_CreateMenuFaceID()                                                                      'Создание меню ЗНАЧКИ с образцами кнопок панели инструментов
   Dim CBC         As CommandBarControl
   Dim NewMenu     As CommandBarPopup
   Dim MenuItem1   As CommandBarControl
   Dim MenuItem2   As CommandBarControl
   Dim SubMenuItem As CommandBarButton
   Dim MaxCount    As Long
   Dim MaxGroup    As Long
   Dim i           As Long
   Dim j           As Long
   Dim k           As Long
   Dim n           As Long

   For Each CBC In CommandBars(1).Controls: DoEvents
      If CBC.Caption = "Значки" Then CBC.Delete
   Next CBC

   Set NewMenu = CommandBars(1).Controls.Add(Type:=msoControlPopup, Temporary:=True)
   NewMenu.Caption = "Значки"
   MaxCount = 40
   MaxGroup = 8
   n = MaxGroup * MaxCount
   For j = 0 To 20 Step 1: DoEvents
      Set MenuItem1 = NewMenu.Controls.Add(Type:=msoControlPopup)
      With MenuItem1
         .Caption = j * n + 1 & " - " & (j + 1) * n
         .BeginGroup = True
      End With
      For i = 0 To MaxGroup - 1 Step 1: DoEvents
         Set MenuItem2 = MenuItem1.Controls.Add(Type:=msoControlPopup)
         MenuItem2.Caption = 1 + j * n + MaxCount * i & " - " & j * n + MaxCount * (i + 1)
         For k = j * n + 1 + MaxCount * i To j * n + MaxCount * (i + 1) Step 1: DoEvents
            Set SubMenuItem = MenuItem2.Controls.Add(Type:=msoControlButton)
            With SubMenuItem
               .Caption = "FaceId = " & k
               .FaceId = k
            End With
            DoEvents
         Next k
         DoEvents
      Next i
   Next j
   Set NewMenu = Nothing
   Set MenuItem1 = Nothing
   Set MenuItem2 = Nothing
   Set SubMenuItem = Nothing
End Function



Название: EasyLanguage
Отправлено: Gelium от 20 Мая 2016, 13:52:21
Может еще кому-нибудь понадобится:

Цитировать
DefineDLLfunc:"kernel32.dll",INT,"WinExec", LPSTR, INT;

...

WinExec("notepad.exe",1);
Название: EasyLanguage
Отправлено: Станислав от 14 Сентября 2016, 11:38:16
Может кто-нибудь сталкивался с подобным (TS9.1)...
Создаю TextLabel TLabel, потом хочу изменить цену положения этого объекта, но увы, не работает:

If LastBarOnChart AND TLabel <> Null Then TLabel.PointValue.Price = GetAppInfo(aiHighestDispValue);

Через PrintLog проверил, не обновляется ценовой уровень положения текста.
Неужели глюк или недоработка разработчиков на таком простейшем месте?
Название: EasyLanguage
Отправлено: Gelium от 14 Сентября 2016, 11:55:35
Проверять глюк/не глюк нет времени. Судя по коду, нужно текст привязать к границам видимой области. Для этого проще сразу метку делать относительно координат окна, а не относительно цены.
Название: EasyLanguage
Отправлено: Станислав от 14 Сентября 2016, 19:37:01
Текст привязывается к назначенному бару, а при перемещении диаграммы меняется масштаб и он пропадает за экраном, поэтому решил сделать простенькое обновление, но оно не работает, пробовал привязать к цене, всё равно конструкция TLabel.PointValue.Price не работает, хотя в словаре { write; read; } Придется попробовать через координаты экрана.
Название: EasyLanguage
Отправлено: Gelium от 14 Сентября 2016, 20:01:04
Баг обходится так: mText.PointValue = DTPoint.Create(BarDateTime, c);
Название: EasyLanguage
Отправлено: Станислав от 14 Сентября 2016, 20:52:02
Баг обходится так: mText.PointValue = DTPoint.Create(BarDateTime, c);

Спасибо! :)
Название: EasyLanguage
Отправлено: Станислав от 16 Сентября 2016, 12:12:53
Может кто-нибудь сталкивался, существует ли возможность штатной установки трендовой линии на одной компрессии данных с автоматической отрисовкой её на другой компрессии данных этого же актива в разных окнах? или это опция возможна только посредством программирования? Начал программировать, и задумался, может это уже есть, но я пока не нашел где..
Название: EasyLanguage
Отправлено: Станислав от 20 Сентября 2016, 16:50:27
Похоже еще один баг...
Создаю ListView, добавляю в него события в 4 колонки, всего получилось 280 строк, потом проверяю через Print(), получаю RowsCount = ColumnsCount, т.е. неправильно определяет количество колонок

elsystem.windows.forms.ListView.RowsCount
elsystem.windows.forms.ListView.ColumnsCount

Решение: использовать для определения количества колонок (LView.Items[Value1] AsType ListViewItem).SubItems.Count
Название: EasyLanguage
Отправлено: ZhV от 17 Ноября 2016, 22:31:40
Хотел создать новую тему под названием "Различие языков Easy Language в Omega Research ProSuite (2000) и TradeStation 9.1.? но не получилось, видимо прав у меня для этого не достаточно.
К примеру, ранее используя в Omega Research я использовал ордера на вход в рынок Buy Stop, Sell Stop, да они работают! - в TradeStation 9.1.
Для выхода из позиции, к примеру, в старой версии программы использовал ордера ExitLong Value1 Stop; ExitShort Value2 Stop; и ExitLong Value1 Limit; ExitShort Value2 Limit;
Так вот теперь в TradeStation 9.1 этих зарезервированных слов вообще не существует!
Читал справку, но ничего особо не нашёл. Зарезервированных слов для выхода из рынка куча. Но для себя ничего подходящего не нашёл.
Подскажите пожалуйста аналог слов для команд: ExitLong Value2 Limit и ExitLong Value2 Limit; ExitLong Value3 Stop и ExitLong Value3 Stop.
Название: EasyLanguage
Отправлено: Gelium от 18 Ноября 2016, 04:30:33
Buy, Buy to Cover, Sell, Sell Short.
Название: EasyLanguage
Отправлено: Станислав от 18 Ноября 2016, 09:52:44
Может еще кому-нибудь понадобится:

Цитировать
DefineDLLfunc:"kernel32.dll",INT,"WinExec", LPSTR, INT;

...

WinExec("notepad.exe",1);

Подскажите, есть ли ещё подобные функции и где про них можно почитать? Например, чтение и сохранение данных из(в) реестра. Или это уже выполняется посредством сторонних dll?
Название: EasyLanguage
Отправлено: ZhV от 22 Ноября 2016, 20:11:53
Спасибо, вроде малость разобрался. Но остались ещё непонятки, буду думать.
Название: EasyLanguage
Отправлено: ZhV от 23 Ноября 2016, 06:04:56
Gelium, спасибо Вам огромное, здорово помогли. Всё стало на свои места.
Вот по поводу многоядерности процессора возник вопрос. Извините, если не в той ветке пишу.
На странице https://gelium.net/soft-ts/tradestation-main/ts-review/item/1310-ts-tradestation-91-update-13-24#3
говорится, что с помощью галочки "Enable use of CPU cores" можно ускорить процесс (как я понял) работу с графиками.
А на скорость оптимизации это никак не влияет?
Просто что раньше я оптимизировал в ProSuite, что сейчас в TradeStation всё равно видимо только одно ядро процессора используется (при наличии 6-и ядер).
Ждать результата капецкий как долго ))
Я понимаю, что всё зависит от количества исторических данных и от кода в EL, но тем не менее, одна и та же стратегия что в ProSuite, что в TradeStation по времени вроде одинаково оптимизируются.
Gelium, подскажите, может ещё где-то в программе имеются настройки для ускорения оптимизации?
Вообще, в Диспетчере задач все 6 ядер в работе, но они заняты на 15-25%. Может так и должно быть...
Название: EasyLanguage
Отправлено: Gelium от 07 Декабря 2016, 17:58:46
Вот по поводу многоядерности процессора возник вопрос. Извините, если не в той ветке пишу.
На странице https://gelium.net/soft-ts/tradestation-main/ts-review/item/1310-ts-tradestation-91-update-13-24#3
говорится, что с помощью галочки "Enable use of CPU cores" можно ускорить процесс (как я понял) работу с графиками.
А на скорость оптимизации это никак не влияет?

Многоядерная оптимизация есть только в TS 9.5. Читайте обзор на сайте.
Название: EasyLanguage
Отправлено: Gelium от 07 Декабря 2016, 18:00:30
Подскажите, есть ли ещё подобные функции и где про них можно почитать? Например, чтение и сохранение данных из(в) реестра. Или это уже выполняется посредством сторонних dll?

Любые функции Widows API можно импортировать из DLL и использовать. Для этого не надо писать еще одну DLL. Все уже написано для самой Windows.
Название: EasyLanguage
Отправлено: Станислав от 11 Января 2017, 10:29:22
Подскажите решение такой проблемы, может кто сталкивался или кому известно...
Создаю трендовую линию, как потом узнать BarDateTime начальной точки трендовой линии?

Using elsystem;
Using charting;
Using platform;
Using elsystem.io;
Using elsystem.drawing;
Using elsystem.collections;
Using elsystem.drawingobjects;
Using elsystem.windows.forms;
Using tsdata.common;



Vars: DTPoint   sDTPoint(Null),
      DTPoint   eDTPoint(Null),
      TrendLine TLine   (Null);


Once Begin
   sDTPoint       = DTPoint.Create(DateTime.Parse(BarDateTime.ToString()),      Open);
   eDTPoint       = DTPoint.Create(DateTime.Parse(LastCalcDateTime.ToString()), Open);

   TLine          = TrendLine.Create(sDTPoint, eDTPoint);
   TLine.ExtLeft  = False;
   TLine.ExtRight = True;
   TLine.Style    = StyleType.solid;
   TLine.Weight   = elsystem.drawingobjects.Weight.weight1;
   TLine.Color    = Color.White;
   TLine.Persist  = True;
   DrawingObjects.Add(TLine);

   Print(TLine.StartPoint.Price);                  // Определяем цену начальной точки трендовой линии
   Print(TLine.Points[0].PointType.ToString());    // Как определить BarDateTime начальной точки трендовой линии ???
End;
Название: EasyLanguage
Отправлено: Gelium от 11 Января 2017, 16:20:07
Подскажите решение такой проблемы, может кто сталкивался или кому известно...
Создаю трендовую линию, как потом узнать BarDateTime начальной точки трендовой линии?

Чтобы в будущем не было таких проблем, используйте отладчик:

1. Ставите брякпоинт и начинаете отладку.
2. Дошли до брякпоинта, откройте вкладку Autos:

[attach=1]

Теперь смотрите все свойства объектов и видите все их внутренности. В TS 9.5 добавили watch для фильтрации нужных переменных. Но только ради этого ставить TS 9.5 смысла нет.
Название: EasyLanguage
Отправлено: Станислав от 11 Января 2017, 17:23:26
Спасибо БОЛЬШОЕ!!! :)
Я как-то забыл про него :-[

Подскажите решение такой проблемы, может кто сталкивался или кому известно...
Создаю трендовую линию, как потом узнать BarDateTime начальной точки трендовой линии?

Чтобы в будущем не было таких проблем, используйте отладчик:

1. Ставите брякпоинт и начинаете отладку.
2. Дошли до брякпоинта, откройте вкладку Autos:

(Ссылка на вложение)

Теперь смотрите все свойства объектов и видите все их внутренности. В TS 9.5 добавили watch для фильтрации нужных переменных. Но только ради этого ставить TS 9.5 смысла нет.
Название: EasyLanguage
Отправлено: Станислав от 11 Января 2017, 17:32:45
Задача решена, выкладываю решение в копилку ;)
Название: EasyLanguage
Отправлено: Станислав от 30 Марта 2017, 18:05:43
любопытно, кто-нибудь пробовал реализовать идею Ларри Вильямса, описанную в первой главе "Долгосрочные секреты краткосрочной торговли"? Сейчас перечитываю этот шедевр, любопытная идея - натуральный зиг-заг, причём рыночный, полностью на рыночном контексте. Плюсы этого метода - отсутствие главного параметра - диапазона трендового движения, что упрощает оптимизацию стратегии в разы! Остаётся оптимизировать только параметры стратегии (стоп, размеры движений и т.п.) Накидал слегка, любопытная штука получается...
Название: EasyLanguage
Отправлено: Gelium от 31 Марта 2017, 05:17:21
А в чём заключается идея "натуральности" зигзага?
Название: EasyLanguage
Отправлено: Станислав от 31 Марта 2017, 06:25:22
А в чём заключается идея "натуральности" зигзага?

в отсутствии диапазона (TrendSize у вашего Gelium_Trend), расчёт производится по барам:
High[2] < High[1] AND High[1] > High[0] - верхний экстремум
Low[2] > Low[1] AND Low[1] < Low[0] - нижний экстремум
Название: EasyLanguage
Отправлено: Gelium от 31 Марта 2017, 06:59:54
И как без введения параметра убрать ненужные зигзаги? Для этого нужен параметр. А если ввели параметр, то этот зигазг ничем не отличается от других.
Название: EasyLanguage
Отправлено: Станислав от 31 Марта 2017, 07:47:03
И как без введения параметра убрать ненужные зигзаги? Для этого нужен параметр. А если ввели параметр, то этот зигазг ничем не отличается от других.

Сейчас экспериментирую, ненужные зигзаги присутствуют, и в немалом количестве...
Название: EasyLanguage
Отправлено: Станислав от 13 Мая 2017, 08:54:13
Для информации разработчикам, возможно пригодится:
https://markplex.com/free-tutorials/
Название: EasyLanguage
Отправлено: Станислав от 06 Июня 2017, 14:56:18
В обзоре TradeStation 9.1 build 12880 [Update 13-29] описвается новый компонент DateTimePicker и упоминается про индикатор BrowserControlTest, в индюках я его не нашёл, это у меня такое нечто или это так и есть? Если у кого он есть поделитесь, плз ;)
Название: EasyLanguage
Отправлено: Gelium от 06 Июня 2017, 16:06:32
В обзоре TradeStation 9.1 build 12880 [Update 13-29] описвается новый компонент DateTimePicker и упоминается про индикатор BrowserControlTest, в индюках я его не нашёл, это у меня такое нечто или это так и есть? Если у кого он есть поделитесь, плз ;)

Примитивные примеры. Справка и Autos дают больше информации.
Название: EasyLanguage
Отправлено: Станислав от 06 Июня 2017, 17:50:16
В обзоре TradeStation 9.1 build 12880 [Update 13-29] описвается новый компонент DateTimePicker и упоминается про индикатор BrowserControlTest, в индюках я его не нашёл, это у меня такое нечто или это так и есть? Если у кого он есть поделитесь, плз ;)

Примитивные примеры. Справка и Autos дают больше информации.

Хотел посмотреть как этот компонент устроен на демо-коде, вроде такой имеется в описании в статье и на официальном сайте, но ссылки на него не работают, в стандартном пакете его я тоже не обнаружил, но у меня и индикатора ChartTrading в стандартном пакете не было, не устанавливался, подумал, может аналогичная ситуация...
Хотел сделать сделать функцию получения данных с интернет ресурсов средствами самой TS.
Название: EasyLanguage
Отправлено: Gelium от 06 Июня 2017, 18:11:25
Хотел посмотреть как этот компонент устроен на демо-коде, вроде такой имеется в описании в статье и на официальном сайте, но ссылки на него не работают, в стандартном пакете его я тоже не обнаружил, но у меня и индикатора ChartTrading в стандартном пакете не было, не устанавливался, подумал, может аналогичная ситуация...
Хотел сделать сделать функцию получения данных с интернет ресурсов средствами самой TS.

С выкачкой данных из инета через встроенный браузер нет проблем. Читайте справку. DateTimePicker есть в TS 9.1. Берите и используйте. Примеры TS у меня были, поудалял. Они примитивны и бесполезны. Autos на все события вытряхивает на порядок больше информации.
Название: EasyLanguage
Отправлено: Станислав от 06 Июня 2017, 18:21:39
Хотел посмотреть как этот компонент устроен на демо-коде, вроде такой имеется в описании в статье и на официальном сайте, но ссылки на него не работают, в стандартном пакете его я тоже не обнаружил, но у меня и индикатора ChartTrading в стандартном пакете не было, не устанавливался, подумал, может аналогичная ситуация...
Хотел сделать сделать функцию получения данных с интернет ресурсов средствами самой TS.

С выкачкой данных из инета через встроенный браузер нет проблем. Читайте справку. DateTimePicker есть в TS 9.1. Берите и используйте. Примеры TS у меня были, поудалял. Они примитивны и бесполезны. Autos на все события вытряхивает на порядок больше информации.

Спасибо! Попробую посредством Autos.
Название: EasyLanguage
Отправлено: Станислав от 20 Июля 2017, 07:42:27
TS9.1. Заметки:
1. Если LastCalcDateTime = ComputerDateTime, то:
  * при обновлении диаграммы посредством TradeStation Development Enviroment.Verify последний бар
    на диаграмме обрабатывается один раз при BarStatus(1) = 2,
  * при обновлении диаграммы посредством TradeStation.ChartAnalysis.Refresh-Reload последний бар
    на диаграмме обрабатывается дважды: при BarStatus(1) = 1 и при BarStatus(1) = 2.
    Актуально при обновлении диаграмм посредством изменения времени компьютера.

2. Особенности работы и особенности использования параметров форм и параметров элементов форм:
  * CheckBox       - реагирует только на манипуляции пользователя, игнорируя программные манипуляции,
  * ComboBox       - реагирует на любые манипуляции, как пользователя, так и программные,
  * DateTimePicker - реагирует на любые манипуляции, как пользователя, так и программные,
  * RadioButton    - реагирует только на манипуляции пользователя, игнорируя программные манипуляции,
  * 121 pixel      - оптимальная длинна DateTimePicker.Width при FontSize = 8 и FontName = Arial.

3. Inputs: String  PNNam(StringRef),
               Double PNVal(NumericRef);

  * использование в теле функции PNNam[1] не работает, т.к. PNNam(StringRef) не хранит историю, а
  * использование в теле функции PNVal[1] работает, т.к. PNVal(NumericRef) хранит историю
Название: EasyLanguage
Отправлено: val от 15 Февраля 2018, 11:02:19
Поделитесь пож материалами  по global variable for tradestation 91.
Спасибо.
Название: EasyLanguage
Отправлено: Gelium от 15 Февраля 2018, 11:06:22
Поделитесь пож материалами  по global variable for tradestation 91.
Спасибо.

В справке всё подробно описано. Пример: https://gelium.net/tradestation-main/ts-easylanguage-9/item/1293-tsx-globaldictionary
Название: EasyLanguage
Отправлено: Станислав от 17 Февраля 2018, 12:59:49
Поделитесь пож материалами  по global variable for tradestation 91.
Спасибо.


{***************************************************************************************************
Description:  Функция предназначена для экспорта переменной в индикатор и её последующего отображения
              на диаграмме
***************************************************************************************************}

Using elsystem;
Using elsystem.collections;

Inputs: String           Prefix(StringSimple),
        Double           Value (NumericSimple);

Vars:   GlobalDictionary WDic  (Null),
        GlobalValue      GVal  (Null);

If WDic             = Null
Then Begin
   WDic             = GlobalDictionary.Create();
   GVal             = GlobalValue.Create();
   GVal.Channel     = AnalysisTechnique.Name + "Prefix";
   GVal.Load        = True;
   GVal.StringValue = Prefix;
End;

If   WDic.Contains(Prefix + BarDateTime.ToString()) = False
Then WDic.Add     (Prefix + BarDateTime.ToString(),   Value AsType Double)
Else WDic.Items   [Prefix + BarDateTime.ToString()] = Value AsType Double;

$_WDicValueToChart = Value;



{***************************************************************************************************
Description:  Индикатор предназначен для импорта переменной из функции и её последующего отображения
              на диаграмме
***************************************************************************************************}

Using elsystem;
Using elsystem.collections;

Vars: GlobalDictionary WDic  (Null),
      GlobalValue      GVal  (Null),
      String           Prefix("");

If WDic         = Null
Then Begin
   WDic         = GlobalDictionary.Create();
   GVal         = GlobalValue.Create();
   GVal.Channel = AnalysisTechnique.Name + "Prefix";
   GVal.Load    = True;
   Prefix       = GVal.StringValue;
End;

If            WDic.Contains(Prefix + BarDateTime.ToString()) = True
Then Value0 = WDic.Items   [Prefix + BarDateTime.ToString()] AsType Double;

Plot1(Value0, "ValueToChart", DarkGray, Default, 0);

If Plot1 > 0 Then SetPlotColor(1, DarkGreen) Else
If Plot1 = 0 Then SetPlotColor(1, DarkGray)  Else
If Plot1 < 0 Then SetPlotColor(1, DarkRed);
Название: EasyLanguage
Отправлено: Gelium от 18 Февраля 2018, 04:54:58
{***************************************************************************************************
Description:  Функция предназначена для экспорта переменной в индикатор и её последующего отображения
              на диаграмме
***************************************************************************************************}

Спасибо за готовые примеры. Можно сразу eld к сообщению цеплять, чтобы не надо было руками создавать индикаторы.
Название: EasyLanguage
Отправлено: val от 18 Февраля 2018, 11:36:08
Вот еще надыбал.
Название: EasyLanguage
Отправлено: Gelium от 18 Февраля 2018, 15:03:53
Вот еще надыбал.

При наличии встроенных функций внешняя DLL как бы уже и не нужна. :-)
Название: EasyLanguage
Отправлено: Станислав от 18 Февраля 2018, 17:02:11
Для общего образования))
Название: EasyLanguage
Отправлено: Станислав от 24 Июля 2018, 11:57:11
Кто-нибудь знает как можно узнать дескриптор окна диаграммы в функции??
Название: EasyLanguage
Отправлено: Gelium от 24 Июля 2018, 16:19:22
Кто-нибудь знает как можно узнать дескриптор окна диаграммы в функции??

Если легко, то никак. Если сложно, то через WinAutomation можно попробовать вытянуть или подобный софт.
Название: EasyLanguage
Отправлено: Станислав от 24 Июля 2018, 17:49:38
Кто-нибудь знает как можно узнать дескриптор окна диаграммы в функции??

Если легко, то никак. Если сложно, то через WinAutomation можно попробовать вытянуть или подобный софт.
Есть способ достаточно простой, можно в самой TS перебрать окна, определить их дескрипторы и классы, но это посредством цикла, хотелось бы без цикла, напрямую по дескриптору, ну чтож придётся циклом перебирать до нужного окна и останавливать цикл. Сторонний софт стараюсь обходить по возможности.
Название: EasyLanguage
Отправлено: Gelium от 24 Июля 2018, 18:59:52
Есть способ достаточно простой, можно в самой TS перебрать окна, определить их дескрипторы и классы, но это посредством цикла, хотелось бы без цикла, напрямую по дескриптору, ну чтож придётся циклом перебирать до нужного окна и останавливать цикл. Сторонний софт стараюсь обходить по возможности.

А для чего нужно найти дескриптор окна? И как определить, что из всех окон найдено именно нужное?
Название: EasyLanguage
Отправлено: Станислав от 24 Июля 2018, 19:11:38
Есть способ достаточно простой, можно в самой TS перебрать окна, определить их дескрипторы и классы, но это посредством цикла, хотелось бы без цикла, напрямую по дескриптору, ну чтож придётся циклом перебирать до нужного окна и останавливать цикл. Сторонний софт стараюсь обходить по возможности.

А для чего нужно найти дескриптор окна? И как определить, что из всех окон найдено именно нужное?
Хочу попробовать сделать QuoteUpdater в самой TS.По дескриптору окна можно направлять команды управления окном, сообщения окну, комбинации клавиш, всё посредством API.
Есть дискриптор и заголовок, по ним можно определить в каком именно окне используется исследование.
Название: EasyLanguage
Отправлено: Станислав от 25 Июля 2018, 05:07:22
Не знаю по какой причине, но работа с файлами в AutoMate VBS модулях выполняется намного быстрее, чем в TS!Сделал загрузчик котировок, скорость работы которого в TS более чем в 2 раза медленнее в сравнении с VBS! API функции работают очень быстро, а чтение и запись в файл посредством TS очень медленная! Думаю попробовать и её сделать через API. И сравнить результат...
Название: EasyLanguage
Отправлено: Станислав от 30 Июля 2018, 06:17:48
На выходных переустановил Win7. Впервые, появилась проблема запуска TradingApp, кто-нибудь сталкивался с подобными фокусами?
Название: EasyLanguage
Отправлено: Станислав от 10 Августа 2018, 09:02:03
На выходных переустановил Win7. Впервые, появилась проблема запуска TradingApp, кто-нибудь сталкивался с подобными фокусами?
Проблема решилась повторной переустановкой системы, но:
1. первоначально, после установки Win 7 не дожидаясь установки её обновлений, была установлена TS9.1, как следствие возникли проблемные моменты с TradingApp
2. впоследствии, после установки Win 7 были установлены её обновления до текущей даты, а после установлена TS9.1, проблемные моменты с TradingApp исчезли.
Название: EasyLanguage
Отправлено: serjante77 от 03 Сентября 2018, 12:32:18
Подскажите как в Индикаторе прописать чтобы места входа на графике прорисовывались стрелками, как это делает Стратегия, мне это нужно для построение своей тактики, а затем на их место при создании Стратегии просто прописать Сигналы Входа и Выхода. Простым поиском в Гугле ничего подобного найти не могу. Если уже есть какой либо Индикатор где в коде прописано пожалуйста скиньте а я уже с него просто скопирую эту фишку. В МетаТрейдере  это уже давно есть а в ТрейдСтейшене я это ищу еще со времен Омеги. Спасибо заранее кто откликнется!
Название: EasyLanguage
Отправлено: Gelium от 03 Сентября 2018, 16:26:06
В индикаторе вместо стрелочек можно просто отрисовывать в отдельной серии красные и синие кружки.
Название: EasyLanguage
Отправлено: serjante77 от 04 Сентября 2018, 06:13:18
В индикаторе вместо стрелочек можно просто отрисовывать в отдельной серии красные и синие кружки.
Так я хочу командой Plot (ArrowUp) прописать в своём Индикаторе.  Ну например пусть хотя бы пересечение двух скользящих мне на графике покажет стрелку, это надо что бы визуально при проверки своей тактики можно было бы легко проверить , потом добавлять просто дополнительные условия чтобы не забивать график множеством визуальных объектов. Также это полезно при торговле в реале.
Название: EasyLanguage
Отправлено: Gelium от 04 Сентября 2018, 06:47:09
Так я хочу командой Plot (ArrowUp) прописать в своём Индикаторе.

Прописывайте. В чём проблема?
Название: EasyLanguage
Отправлено: serjante77 от 06 Сентября 2018, 19:57:14
Прописывайте. В чём проблема?
[/quote]
Проблема в том что я никак не могу разобраться как это в коде прописать.  Если пишу : Plot3( ArrowUp, "XAverage2",White ) ; выдает ошибку    unknown identifier   Не пойму где и как его надо Объявить выше в Input   иле в Var  ?
Название: EasyLanguage
Отправлено: Gelium от 06 Сентября 2018, 20:27:49
plot3(Value1);

Вид plot3 задаётся в параметрах индикатора, а не в коде.
Название: EasyLanguage
Отправлено: serjante77 от 07 Сентября 2018, 12:47:13
plot3(Value1);

Вид plot3 задаётся в параметрах индикатора, а не в коде.

Насколько я понял Вы отсылаете меня на вкладку Стиль в свойствах индикатора но там есть только стиль отображения например линий Точкой Линией Гистограмма Правый тик или Левый тик даже если бы там была Стрелка то мне бы всю линию показало бы стрелками      Пересечение двух линий почти везде где я видел отображается точкой которую можно только увеличить а я ищу чтобы Индикатор на конкретном Баре мне показал Стрелку вверх или вниз как это прорисовывает Стратегия . То есть я думаю надо в коде прописать команду нарисовать Стрелку . Если вам не трудно можете мне скинуть тачкскрин окна где это можно сделать  а если все таки можно написать в коде то как это прописать, я изучаю на примерах других индикаторах поэтому Прошу прощения если отнимаю у Вас время.
Название: EasyLanguage
Отправлено: Gelium от 07 Сентября 2018, 19:17:43
В индикаторе нельзя рисовать стрелки. В TS нет такой возможности. Если хотите над барами рисовать стрелки, то вам нужно создавать текстовые объекты и использовать символы для изображения стрелочек. В плане рисования TS намного уступает возможностям MQL5. Правда без этих возможностей можно прекрасно обходиться.
Название: EasyLanguage
Отправлено: serjante77 от 08 Сентября 2018, 22:10:23
В индикаторе нельзя рисовать стрелки. В TS нет такой возможности. Если хотите над барами рисовать стрелки, то вам нужно создавать текстовые объекты и использовать символы для изображения стрелочек. В плане рисования TS намного уступает возможностям MQL5. Правда без этих возможностей можно прекрасно обходиться.

Вот здесь показан пример как это можно сделать   https://markplex.com/free-tutorials/tutorial-89-how-to-draw-symbols-on-a-chart/

Это работает как ШовМи так и в Индикаторе вот мой пример, может кому пригодиться :


{ RISOVANIE STRELOK  }

inputs:
   int FastLength( 20 ) , { the shorter of the two exponential moving average lengths used to calculate the MACD value, in bars }
   int SlowLength( 50 ) ; { the longer  of the two exponential moving average lengths used to calculate the MACD value, in bars }

Var: Lookback1(FastLength), Lookback2(SlowLength);

Value1 = XAverage (Close,Lookback1) ;
Plot1( Value1, "XAverage1",Cyan ) ;
Value2 = XAverage (Close,Lookback2) ;
Plot2( Value2, "XAverage2",White ) ;

If Value1 Crosses Above Value2 then Value3 = Text_New ( D, T, L,"#");
If Text_Exist ( Value3 ) then Text_setcolor ( Value3, Cyan  );
If Value1 Crosses Under Value2 then Value4 = Text_New ( D, T, H,"$");
If Text_Exist ( Value4 ) then Text_setcolor ( Value4, Red );





Название: EasyLanguage
Отправлено: Gelium от 09 Сентября 2018, 04:31:23
Вот здесь показан пример как это можно сделать   https://markplex.com/free-tutorials/tutorial-89-how-to-draw-symbols-on-a-chart/

Это работает как ШовМи так и в Индикаторе вот мой пример, может кому пригодиться :

Спасибо. Век живи, век учись. :)
Название: EasyLanguage
Отправлено: serjante77 от 09 Сентября 2018, 07:31:47
Теперь осталось найти как их отформатировать, чтобы они рисовались выше или ниже Мувингов или хотя бы на каком то расстоянии от баров.
Название: EasyLanguage
Отправлено: Станислав от 19 Сентября 2018, 17:52:18
Кто-нибудь интересовался новейшим чудом TradeStation 10?
Название: EasyLanguage
Отправлено: Станислав от 06 Декабря 2018, 11:57:44
 // Как получить параметры окна стороннего приложения посредством WinAPI, например "Калькулятор". Неделю бъюсь, всё безтолку...ХЕЛП!
// {***Obj} Указатель на структуру, которая принимает экранные координаты левого верхнего и нижнего правого углов окна.
// Как его описать, чтобы можно было получить параметры окна в TDE?
// Предполагаю, должно быть как-то так: Obj.left, Obj.right
// Думаю, разработчики не могли упустить возможность получения данных посредством структуры, но как это сделать? примеров не нашёл...
Using elsystem;
DefineDLLfunc: "user32.dll",                                                                       // https://www.vsokovikov.narod.ru/New_MSDN_API/Window/fn_findwindow.htm
Long,                                                                               // https://docs.microsoft.com/en-us/windows/desktop/api/winuser/nf-winuser-findwindowa
"FindWindowA",                                                                      // Retrieves a handle to the top-level window whose class name and window name match the specified strings.

Long,                                                                               // * [in] lpClassName:  If lpClassName points to a string, it specifies the window class name.

String;                                                                             // * [in] lpWindowName: The window name (the window's title). If this parameter is NULL, all window names match.
DefineDLLfunc: "user32.dll",                                                                       // https://www.vsokovikov.narod.ru/New_MSDN_API/Window/fn_getwindowrect.htm
Long,                                                                               // https://docs.microsoft.com/en-us/windows/desktop/api/winuser/nf-winuser-getwindowrect
"GetWindowRect",                                                                    // Retrieves the dimensions of the bounding rectangle of the specified window. The dimensions are given in screen coordinates that are relative to the upper-left corner of the screen.
Long,                                                                               // * [in]  hWnd:   A handle to the window.
Long;  {***Obj}                                                                     // * [out] lpRect: A pointer to a RECT structure that receives the screen coordinates of the upper-left and lower-right corners of the window.
Vars:
String WindowName  ("Калькулятор"), // Предварительно необходимо запустить "Калькулятор"
Int    WindowHandle(0),
Int    Obj(0);        // ***Obj
Once Begin
Clearprintlog;
WindowHandle = FindWindowA(0, WindowName);
If WindowHandle > 0
Then Begin
GetWindowRect(WindowHandle, Obj {***Obj});
{
Print(Obj.left:0:0, Obj.right:0:0);
}
Print(WindowHandle:0:0);
End;
End;
 
Название: EasyLanguage
Отправлено: Gelium от 07 Декабря 2018, 05:53:11
Пост не понятен. У вас получилось или нет? Какова цель получения хэндла окна?
Название: EasyLanguage
Отправлено: Станислав от 07 Декабря 2018, 06:41:18
Пост не понятен. У вас получилось или нет? Какова цель получения хэндла окна?
Цель: сделать функцию скриншота окна диаграммы,которая будет работать следующим образом:
- с 1 по последний бар сохраняются даты событий в массив- на последнем баре выполняются скриншоты этих событий прокручивая экран посредством charting.ChartingHost.Create().ScrollTo(BarDateTime из массива) - (некоторое число баров для центровки события на скришоте)
- привязка гиперссылкой соответствующего скриншота к реестру сделок (блокнот рейдера) в экселе
В WinAPI есть функции, которые возвращают несколько свойств через один параметр, доступ к свойствам осуществляется через ".".А у меня пока не получается придумать как эти параметры получать в TDE, один из примеров это функция GetWindowRect.Вообще, поняв как это можно делать, открываются несметные возможности в TS с помощью WinAPI без всяких дополнительных программ.Можно взять весь процесс трейдинга под контроль самой TS! Это удобно!У меня пока это не получается...
С обычными WinAPI функциями проблем нет, всё работает, а вот с теми у которых через один параметр можно получать несколько свойств, увы...
Название: EasyLanguage
Отправлено: Gelium от 07 Декабря 2018, 09:45:27
Цель: сделать функцию скриншота окна диаграммы,которая будет работать следующим образом:
- с 1 по последний бар сохраняются даты событий в массив- на последнем баре выполняются скриншоты этих событий прокручивая экран посредством charting.ChartingHost.Create().ScrollTo(BarDateTime из массива) - (некоторое число баров для центровки события на скришоте)
- привязка гиперссылкой соответствующего скриншота к реестру сделок (блокнот рейдера) в экселе

Зачем же это делать так сложно и с большими времязатратами, когда всё это делается элементарно в WinAutomation с получением в итоге рабочего экзешника? Вы вообще своё время ни во что не цените?
Название: EasyLanguage
Отправлено: Станислав от 07 Декабря 2018, 09:58:35
Цель: сделать функцию скриншота окна диаграммы,которая будет работать следующим образом:
- с 1 по последний бар сохраняются даты событий в массив- на последнем баре выполняются скриншоты этих событий прокручивая экран посредством charting.ChartingHost.Create().ScrollTo(BarDateTime из массива) - (некоторое число баров для центровки события на скришоте)
- привязка гиперссылкой соответствующего скриншота к реестру сделок (блокнот рейдера) в экселе

Зачем же это делать так сложно и с большими времязатратами, когда всё это делается элементарно в WinAutomation с получением в итоге рабочего экзешника? Вы вообще своё время ни во что не цените?
Так это делается элементарно и как я описал, если есть соответствующие знания, в частности как организовать работу функции WinAPI. Это ж не долго, может чуть более написания скрипта в WinAutomation, хотя я более предпочитаю AutoMate! Всего один раз написать, а потом пользоваться.
Название: EasyLanguage
Отправлено: Gelium от 07 Декабря 2018, 11:04:39
Так это делается элементарно и как я описал, если есть соответствующие знания, в частности как организовать работу функции WinAPI. Это ж не долго, может чуть более написания скрипта в WinAutomation, хотя я более предпочитаю AutoMate! Всего один раз написать, а потом пользоваться.

Вы уверены, что всё так просто? Вот так примерно устроено окно чартинга:

[attachimg=1]

Вы хотите писать свою собственную утилиту для разбора структуры TradeStation, вместо того, чтобы использовать готовое?

Automate в определённом плане полный отстой в сравнении с WinAutomation, так как части фишек в нём просто нет, а сам WinAutomation генерит машинный код, который работает в сотни раз быстрее интерпретатора Automate. Для одних задач может хватить Automate, для других без WinAutomation - большие времязатраты, которые стоят денег.
Название: EasyLanguage
Отправлено: Станислав от 09 Декабря 2018, 06:53:30
Так это делается элементарно и как я описал, если есть соответствующие знания, в частности как организовать работу функции WinAPI. Это ж не долго, может чуть более написания скрипта в WinAutomation, хотя я более предпочитаю AutoMate! Всего один раз написать, а потом пользоваться.

Вы уверены, что всё так просто? Вот так примерно устроено окно чартинга:

(Ссылка на вложение)

Вы хотите писать свою собственную утилиту для разбора структуры TradeStation, вместо того, чтобы использовать готовое?

Automate в определённом плане полный отстой в сравнении с WinAutomation, так как части фишек в нём просто нет, а сам WinAutomation генерит машинный код, который работает в сотни раз быстрее интерпретатора Automate. Для одних задач может хватить Automate, для других без WinAutomation - большие времязатраты, которые стоят денег.
поиск любого окна:

   WindowHandlePrt = FindWindowA(0, 0);
   While WindowHandlePrt > 0 Begin
      GetClassNameA(WindowHandlePrt, WindowClassNam, WindowClassLen);
      If InStr(WindowClassNam, "ORPLAT.EXE TRADESTATION") > 0
      Then Begin
         WindowHandleChd = FindWindowExA(WindowHandlePrt, 0, 0, 0);
         WindowHandleChd = GetWindow(WindowHandleChd, GW_CHILD);
         While WindowHandleChd > 0 Begin
            GetClassNameA(WindowHandleChd, WindowClassNam, WindowClassLen);
            If InStr(WindowClassNam, "ORContainerMDIChildFrame") > 0
            Then Begin
               WindowTitleLen = GetWindowTextLengthA(WindowHandleChd) + 1;
               WindowTitleNam = Spaces(WindowTitleLen);
               GetWindowTextA(WindowHandleChd, WindowTitleNam, WindowTitleLen);

               If WindowHandle = 0
               Then Begin
                  If InStr(WindowTitleNam, WindowName) > 0
                  Then Begin
                     WindowHandle = WindowHandleChd;
                     If WindowUniq = 0 Then Return WindowHandle;
                  End;
               End;
            End;
            WindowHandleChd = GetWindow(WindowHandleChd, GW_HWNDNEXT);
         End;
      End;
      WindowHandlePrt = GetWindow(WindowHandlePrt, GW_HWNDNEXT);
   End;
чуть больше код для скрина окна.Проблема в том, что я не знаю как в EL описывается структура параметров функции, например функция GetWindowRect(WindowHandle, Struc).
Объявляю:
DefineDLLfunc: "user32.dll", Long, "GetWindowRect",
               Long,                                                                               // * [in]  hWnd:   Дескриптор окна.
               Long{IEasyLanguageObject};                                        // что тут надо установить, чтобы получать значения??    * [out] lpRect: Указатель на структуру, которая принимает экранные координаты левого верхнего и нижнего правого углов окна.
как получить lpRect?в нём содержатся параметры окна: lpRect.Weight...
Название: EasyLanguage
Отправлено: serjante77 от 09 Декабря 2018, 08:25:41
 (некоторое число баров для центровки события на скришоте)
- привязка гиперссылкой соответствующего скриншота к реестру сделок (блокнот рейдера) в экселе
[/quote]

Если  сделаете своё творение, Вы поделитесь им здесь с нами ? Хотелось бы тоже такой дневник трейдера, с скриншотами дабы видеть в будущем на чём основывалось принятие решения и его осуществление или нет.
Название: EasyLanguage
Отправлено: Gelium от 09 Декабря 2018, 09:26:35
чуть больше код для скрина окна.Проблема в том, что я не знаю как в EL описывается структура параметров функции, например функция GetWindowRect(WindowHandle, Struc).
Объявляю:
DefineDLLfunc: "user32.dll", Long, "GetWindowRect",
               Long,                                                                               // * [in]  hWnd:   Дескриптор окна.
               Long{IEasyLanguageObject};                                        // что тут надо установить, чтобы получать значения??    * [out] lpRect: Указатель на структуру, которая принимает экранные координаты левого верхнего и нижнего правого углов окна.
как получить lpRect?в нём содержатся параметры окна: lpRect.Weight...

Когда вы хотите просто передать значение, объявляете к примеру Float. Если хотите получить, то объявляете LPFloat. Далее при вызове функции, для параметра с объявлением LPFloat, надо указать переменную с &, чтобы она приняла значение. Например, &Value1.

В вашем случае, по идее, должно быть так:

DefineDLLfunc: "user32.dll", Long, "GetWindowRect", Long, LPLong;

И вызов с переменными типа Long:

L1 = GetWindowRect(L2, &L3);

Вы получите указатель на структуру в L3, но вот что дальше с ним делать? Ведь Easy по-моему не даёт возможности определять структуры в коде. Не проще ли написать нужные функции в DLL и прицепить уже в подходящем для Easy виде?
Название: EasyLanguage
Отправлено: Станислав от 09 Декабря 2018, 15:09:03
чуть больше код для скрина окна.Проблема в том, что я не знаю как в EL описывается структура параметров функции, например функция GetWindowRect(WindowHandle, Struc).
Объявляю:
DefineDLLfunc: "user32.dll", Long, "GetWindowRect",
               Long,                                                                               // * [in]  hWnd:   Дескриптор окна.
               Long{IEasyLanguageObject};                                        // что тут надо установить, чтобы получать значения??    * [out] lpRect: Указатель на структуру, которая принимает экранные координаты левого верхнего и нижнего правого углов окна.
как получить lpRect?в нём содержатся параметры окна: lpRect.Weight...

Когда вы хотите просто передать значение, объявляете к примеру Float. Если хотите получить, то объявляете LPFloat. Далее при вызове функции, для параметра с объявлением LPFloat, надо указать переменную с &, чтобы она приняла значение. Например, &Value1.

В вашем случае, по идее, должно быть так:

DefineDLLfunc: "user32.dll", Long, "GetWindowRect", Long, LPLong;

И вызов с переменными типа Long:

L1 = GetWindowRect(L2, &L3);

Вы получите указатель на структуру в L3, но вот что дальше с ним делать? Ведь Easy по-моему не даёт возможности определять структуры в коде. Не проще ли написать нужные функции в DLL и прицепить уже в подходящем для Easy виде?
Наверное, стены на то и существуют, чтоб иногда было с кем по бодаться :) Да, в Easy нет возможности работать со структурами, теперь я это знаю, исследовал на практике...хотя был уверен, что этот момент разработчиками продуман, так как есть возможность объявлять DLL, а многие из них используют структуру, а так получается неполноценная реализация работы с DLL, которая долгое время вызывала у меня интерес!
Но выход найден, думаю сделать так:- в WinAutomation  в VBA написать "фотоаппарат" на активное окно и сгенерировать File.exe- TS отображает событие на экране, активирует окно диаграммы посредством SetForegroundWindow(), запускает фотоаппарат посредством WinExec(), который фоткает активное окно диаграммы и сохраняет его.
Всё достаточно просто получается ;)
 
Название: EasyLanguage
Отправлено: Gelium от 09 Декабря 2018, 19:52:26
Опишите чуть подробнее, что вы хотите делать в TS. Я подскажу какие функции WinAutomation оптимально использовать. Достаточно давно его использую для автоматизации с TS и в других проектах.
Название: EasyLanguage
Отправлено: Станислав от 10 Декабря 2018, 05:51:15
Опишите чуть подробнее, что вы хотите делать в TS. Я подскажу какие функции WinAutomation оптимально использовать. Достаточно давно его использую для автоматизации с TS и в других проектах.


Спасибо! Задача такова, создаю функцию скриншота экрана. Посредством TS выполняется определение и центровка события на экране, а сторонним модулем сделать скриншот, т.к. посредством самой TS это сделать нереально, всвязи с тем, что TS не поддерживает работу со структурами dll. Была идея сделать метод скриншота на vba, а потом с помощью WinAutomation сгенерировать exe и в TS его запускать, но вспомнил про одну утилиту, в моём случае идеально подходящая...MiniCapPortable - программа для захвата изображения экрана с поддержкой командной строки, включая возможность запускать (а затем прерывать) приложения, фиксировать окна. Особенностью является возможность обходится без пользовательского интерфейса и делать всё из командной строки. Таким образом осталось всё только скомпановать в TS, весь вспомогательный материал имеется. Запуск командной строки в TS Easy:



DefineDLLfunc: "kernel32.dll",                                                                     // https://docs.microsoft.com/en-us/windows/desktop/api/winbase/nf-winbase-winexec
               Long,                                                                               // https://www.vsokovikov.narod.ru/New_MSDN_API/Process_thread/fn_winexec.htm
               "WinExec",                                                                          // Запуск процесса: > 31 - процесс запущен, <= 31 - процесс не запущен
                                                                                                   //                   * 0                    -  0: Оперативной системе не хватает памяти или ресурсов.
                                                                                                   //                   * ERROR_BAD_FORMAT     - 11: .EXE файл не рабочий (не Win32 .EXE или ошибка в .EXE образе).
                                                                                                   //                   * ERROR_FILE_NOT_FOUND -  2: Указаный файл не найден.
                                                                                                   //                   * ERROR_PATH_NOT_FOUND -  3: Указаный путь не найден.
               String,                                                                             // * [in] lpCmdLine: Адрес процесса
               Int;                                                                                // * [in] nCmdShow:  Стиль отображения окна




WinExec("CMD /C "                                                                                                                                 +
                            "(Ping -n 1 www.google.com || "                                                                                                   +     // Интернет соединение отсутствует
                            "(Ping -n 1 www.yandex.ru  || "                                                                                                   +     // Интернет соединение отсутствует
                            "(Netsh Interface Set Interface Name=" + DoubleQuote + "Подключение по локальной сети" + DoubleQuote + " Admin=Disabled" + " & "  +     // Расключение сетевого интерфейса
                             "Netsh Interface Set Interface Name=" + DoubleQuote + "Подключение по локальной сети" + DoubleQuote + " Admin=Enabled"  + " && " +     // Включение   сетевого интерфейса
                             "For /L %i In (1,1,5) Do (W32Tm /Resync /Rediscover && Exit & TimeOut /T %i)"                                                    +     // Синхронизировать текущее время с сервером времени сети
                            ")))", 0)



Название: EasyLanguage
Отправлено: Gelium от 10 Декабря 2018, 06:48:35
Вызов приложений из Easy:

DefineDLLfunc:"kernel32.dll",INT, "WinExec", LPSTR, INT;
DefineDLLfunc:"shell32.dll",INT, "ShellExecuteA", INT, LPSTR, LPSTR, LPSTR, LPSTR, INT;

Пример:

WinExec(s + "\Signal.bat " + p_TradeFile + ".Signal", 1);
ShellExecuteA(0, "open", s + "\Signal.bat", p_TradeFile + ".Signal", s, 0{1 - Show});

Если у вас всего одно окно в TS и один рабочий лист, то скриншот делается одной командой WinAutomattion. Если рабочих листов много, то сначала надо запустить рабочий лист. Он активируется или откроется в TS. Потом развернуть TS до нужного размера или на весь окран. И далее делать скриншот чем хотите.
Название: EasyLanguage
Отправлено: MaksimZZ от 25 Марта 2019, 14:22:57
Прошу помощи по такому коду:

frequency1=countIF((tickvolume>=tickvolumeStatL and tickvolume<value1), LeN);

код работает как нужно если заменить tickvolumeStatL и value1 на конкретные числа. Однако в представленном виде код дает не правильный результат. Видимо внутри функции countIF идет перебор от [ноля] до [LeN], не только переменой tickvolume, но также и границ (tickvolumeStatL, value1)  при попадании в которые срабатывает счетчик, что для моих целей неприемлемо.

Подскажите пожалуйста, как можно решить эту проблему.
Название: EasyLanguage
Отправлено: Станислав от 25 Марта 2019, 15:45:11
Прошу помощи по такому коду:

frequency1=countIF((tickvolume>=tickvolumeStatL and tickvolume<value1), LeN);

код работает как нужно если заменить tickvolumeStatL и value1 на конкретные числа. Однако в представленном виде код дает не правильный результат. Видимо внутри функции countIF идет перебор от [ноля] до [LeN], не только переменой tickvolume, но также и границ (tickvolumeStatL, value1)  при попадании в которые срабатывает счетчик, что для моих целей неприемлемо.

Подскажите пожалуйста, как можно решить эту проблему.

Так будет верно работать! Condition0 - название переменной должно быть уникально с целью получения исторических значений переменной, например Condition0[1]:


Condition0=tickvolume>=tickvolumeStatL and tickvolume<value1;
frequency1=countIF(Condition0, LeN);
Название: EasyLanguage
Отправлено: MaksimZZ от 25 Марта 2019, 16:20:36
спасибо большое за ответ, но результат тот же.

опишу смысл словами:

формула должна просматривать 30 объемов (volume) назад и считать число их попаданий в границы, которые рассчитаны на текущем баре.

№бара в скользящем окне  volume  границы нижн  границы верхн
...                                       ...         ...                     ...
25                                      10         20                    50
26                                      51         31                    35
27                                      15         40                    41
28                                      20         25                    30
29                                      21         12                    20
30                                      22         9                      15

цель чтобы функция countif при проверке условия на последних тридцати барах использовала границы, рассчитанные на тридцатом баре скользящего окна (т.е. в данном случае 9 - 15).

Спасибо.
Название: EasyLanguage
Отправлено: Станислав от 25 Марта 2019, 16:27:40
спасибо большое за ответ, но результат тот же.

опишу смысл словами:

формула должна просматривать 30 объемов (volume) назад и считать число их попаданий в границы, которые рассчитаны на текущем баре.

№бара  volume  границы нижн  границы верхн
...         ...         ...                     ...
25        10         20                    50
26        51         31                    35
27        15         40                    41
28        20         25                    30
29        21         12                    20
30        22         9                      15

мне нужно чтобы функция countif при проверке условия на последних тридцати барах использовала границы рассчитанные на тридцатом баре скользящего окна (т.е. в данном случае 9 - 15).

Спасибо.
для такой задачи countIF не подойдёт, её надо доработать...


LevelUp = значение верхней границы;
LevelDn = значение нижней границы;
Length = 30;
Sum = 0;
for Value1 = 0 to Length - 1 begin
   if tickvolume[Value1] <= LevelUp AND
      tickvolume[Value1] >= LevelDn
   then Sum = Sum + 1;
end;

Название: EasyLanguage
Отправлено: MaksimZZ от 25 Марта 2019, 16:46:13
спасибо огромное!!! работает как часы.
Название: EasyLanguage
Отправлено: MaksimZZ от 12 Апреля 2019, 09:52:41
Подскажите пожалуйста, как бороться с этой ошибкой при добавлении индикатора, можно ли как-то увеличить допустимое число трендовых линий, T.S. 8.2 не ругалась на добавляемый индикатор, а T.S. 9.1 выдает ошибку.

Error: Exceeded the maximum number of Trendlines allowed on this chart. Excessive use of Trendlines causes decreased performance. Please adjust analysis technique to dispose of unneeded Trendlines. Call Stack

Название: EasyLanguage
Отправлено: Станислав от 12 Апреля 2019, 14:18:21
Скриншот экрана покажите! Скорее всего с кодом проблемы...а лучше сделайте в коде подсчёт количества создаваемых трендовых линий!

Подскажите пожалуйста, как бороться с этой ошибкой при добавлении индикатора, можно ли как-то увеличить допустимое число трендовых линий, T.S. 8.2 не ругалась на добавляемый индикатор, а T.S. 9.1 выдает ошибку.

Error: Exceeded the maximum number of Trendlines allowed on this chart. Excessive use of Trendlines causes decreased performance. Please adjust analysis technique to dispose of unneeded Trendlines. Call Stack
Название: EasyLanguage
Отправлено: MaksimZZ от 12 Апреля 2019, 18:18:17
К сожалению код залочен. Но на 8.2 он работал.

Скрин:

[attach=1]

Думал может где-то в интерфейсе есть ограничитель типа максбарсбэк.

Кстати, для старых версий выкладывали утилиту для просмотра залоченного кода. Вам не попадалась случайно для 9.1
Название: EasyLanguage
Отправлено: Станислав от 14 Апреля 2019, 08:09:40
не встречал подобных утилит по снятию блокировок! хотя они не особо и нужны, если представляешь механизм, как он должен работать, то его проще написать самому, и понятней будет и для развития полезно :)


К сожалению код залочен. Но на 8.2 он работал.

Скрин:

(Ссылка на вложение)

Думал может где-то в интерфейсе есть ограничитель типа максбарсбэк.

Кстати, для старых версий выкладывали утилиту для просмотра залоченного кода. Вам не попадалась случайно для 9.1
Название: EasyLanguage
Отправлено: MaksimZZ от 16 Апреля 2019, 14:40:30
Этим и занят ;)
Название: EasyLanguage
Отправлено: MaksimZZ от 16 Апреля 2019, 15:09:55
Как может быть такая фигня?

Пишу в первой строчке кода такую команду:

if barnumber=1 then Print(date,";",time);

A Print Log выдает такой результат:

980102.00; 130.00
980102.00; 200.00
980102.00;1630.00
980102.00;1700.00
980102.00;1730.00
980102.00;1800.00
Название: EasyLanguage
Отправлено: MaksimZZ от 25 Апреля 2019, 16:48:54
Такая проблема:

Написал индикатор работает корректно, MaxBarsBack детектируется автоматом в разумных пределах.

Решил превратить индикатор в стратегию добавил всего две строки и сохранил в strategies:

If LH4=0.05 and LH4[1]>0.05 then Buy ( "long1" ) 1 shares next bar at market;

If HL4=0.05 and HL4[1]>0.05 then Sell from entry ( "long1" ) next bar at market;

При попытке запустить стратегию для расчета сделок в TS 8.2 вылетает ошибка MaxBarsBack, TS 9.1 просто мечется между waiting data... и attributes..., горит черный экран.

В TS 8.2 стратегия запустилась при параметре MaxBarsBack 40.000, TS 9.1 с таким значением висит.

Пробую в стратегии вообще отключить фигурными скобками две строчки приведенные выше, все равно ошибка MaxBarsBack в TS 8.2 и темный экран в TS 9.1.

Т.е. после отключения торговых строчек код стратегии это копия кода индикатора, который прекрасно работает с MaxBarsBack до 300. Почему же тогда TS не считает этот же код сохраненный и запущенный как стратегия.

Помогите пожалуйста, бьюсь не могу понять!
Название: EasyLanguage
Отправлено: MaksimZZ от 25 Апреля 2019, 19:13:17
Такая проблема:

Написал индикатор работает корректно, MaxBarsBack детектируется автоматом в разумных пределах.

Решил превратить индикатор в стратегию добавил всего две строки и сохранил в strategies:

If LH4=0.05 and LH4[1]>0.05 then Buy ( "long1" ) 1 shares next bar at market;

If HL4=0.05 and HL4[1]>0.05 then Sell from entry ( "long1" ) next bar at market;

При попытке запустить стратегию для расчета сделок в TS 8.2 вылетает ошибка MaxBarsBack, TS 9.1 просто мечется между waiting data... и attributes..., горит черный экран.

В TS 8.2 стратегия запустилась при параметре MaxBarsBack 40.000, TS 9.1 с таким значением висит.

Пробую в стратегии вообще отключить фигурными скобками две строчки приведенные выше, все равно ошибка MaxBarsBack в TS 8.2 и темный экран в TS 9.1.

Т.е. после отключения торговых строчек код стратегии это копия кода индикатора, который прекрасно работает с MaxBarsBack до 300. Почему же тогда TS не считает этот же код сохраненный и запущенный как стратегия.

Помогите пожалуйста, бьюсь не могу понять!

Отбой. Решил проблему с MaxBarsBack. Теперь правда странная ситуация. TS 8.2 бэктестит стратегию, TS 9.1 нет.
Причем TS 9.1 не бэктестит даже стратегии, которые идут с ней в комплекте. Какая-то настройка видимо блокирующая включена. Вот какая?
Название: EasyLanguage
Отправлено: Gelium от 26 Апреля 2019, 03:21:02
У TS есть help, в котором есть ответы на многие вопросы.
Название: EasyLanguage
Отправлено: MaksimZZ от 26 Апреля 2019, 04:12:51
У TS есть help, в котором есть ответы на многие вопросы.
Хелп отличная штука. 99% моих проблем по EL и TS решаются через него. Но не всегда получается найти ответ за приемлемое время. Мне казалось, что вопросы интересные.

Ответы на них найдены:

Описанная проблема с Maxbarsback решилась так. Нашел опытным путем часть кода, которая не генерит ошибку. Дальше стал к ней поэтапно добавлять следующие порции кода, пока не высветилась ошибка Maxbarsback. Дело оказалось в такой конструкции:

If value4<low[barnumber-HL4] and HL4>0.05 then begin

[barnumber-HL4] - при значениях HL4<=0.05 принимает значения близкие к порядковому номеру бара т.е. на пятиминутках за год более 60.000, что покрывает все доступные данные. Как видно выше, чтобы этого не происходило в If мной было встроено условие HL4>0.05. Оказалось что порядок кода имеет значение не только между функциями, но и внутри них. Т.е. в таком виде TS сначала видит неприемлемые [barnumber-HL4], а только потом фильтрует их HL4>0.05.

Т.е. верный код
If HL4>0.05 and value4<low[barnumber-HL4] then begin

P.S.1 -- Невыясненным осталось, почему в виде индикатора неправильный код не выдавал ошибки Maxbarsback.
P.S.2 -- T.S 9.1 не считала стратегию не из-за ошибки Maxbarsback, а из-за того что я пытался ее применить к 3rdparty data, на онлайн данных правильный код работает.
P.S.3 -- T.S 9.1 показывает себя плохо по сравнению с 8.2, она не высвечивает ряд ошибок, а просто подвисает на черном экране.
Если бы не 8.2, я думаю, я до сих пор искал бы ошибку.
Название: EasyLanguage
Отправлено: Gelium от 26 Апреля 2019, 04:40:35
TS 9.2 нет в природе. С TS 9.5 пока лично у меня проблем не было, хоть она и работает с текстовиками. TS 9.1 работает real time.
Название: EasyLanguage
Отправлено: MaksimZZ от 26 Апреля 2019, 07:01:52
TS 9.2 нет в природе. С TS 9.5 пока лично у меня проблем не было, хоть она и работает с текстовиками. TS 9.1 работает real time.
Ошибся, прошу прощения исправил в тексте выше на TS 9.1. Cпасибо за историю для QR.
Название: EasyLanguage
Отправлено: Алексей от 17 Июня 2019, 04:59:44
Прошу совета.
Не могу найти функцию/способ как получить значение какой нибудь функции в определённое, но не текущее время.
Например в 2346 надо узнать какое было значение какого то индикатора в 1246.
Знал бы количество баров, сделал бы ind[nbars] и всё.
Но nbars=(Time-1246)/BarInterval - не даст нужное значение баров, т.к. надо делать поправку на то что в часе 60 минут, а не 100.
Может есть какая то функция, которая позволяет посчитать количество баров, закрытых с заданного времени ?
Не смог найти самостоятельно.

PS:
нашёл решение
необходимая функция - FindBar(TargetDate, TargetTime)
возвращает количество баров с текущего до бара, заданного переменными TargetDate, TargetTime   -то что надо.
Название: EasyLanguage
Отправлено: Алексей от 23 Сентября 2019, 09:43:02
Подс4кажите, плз, где можно взять индикатор горизонтального объёма для Tradestation ?
Странно что его не могу найти в самом TS
Название: EasyLanguage
Отправлено: Gelium от 23 Сентября 2019, 14:00:47
Подс4кажите, плз, где можно взять индикатор горизонтального объёма для Tradestation ?
Странно что его не могу найти в самом TS

https://www.google.com/search?q=horizontal+volume+indicator+for+Tradestation&ie=utf-8&oe=utf-8
Название: EasyLanguage
Отправлено: Gelium от 07 Января 2020, 14:04:20
В Vector есть ошибка в TS 9.1/9.5. При вставке элемента в начало коллекции элемент может оказаться в итоге в случайном месте коллекции.

Например:

MyVector.insert(0, MyValue);

Так вставка элемента в начало коллекции предполагает её упорядоченность. Но элементы могут быть иногда перепутаны случайным образом. Баг проявляется на графиках с разным объёмом истории. Так что еще и не всегда проявляется.
Название: EasyLanguage
Отправлено: Станислав от 08 Января 2020, 12:57:50
В Vector есть ошибка в TS 9.1/9.5. При вставке элемента в начало коллекции элемент может оказаться в итоге в случайном месте коллекции.

Например:

MyVector.insert(0, MyValue);

Так вставка элемента в начало коллекции предполагает её упорядоченность. Но элементы могут быть иногда перепутаны случайным образом. Баг проявляется на графиках с разным объёмом истории. Так что еще и не всегда проявляется.

Попробовал такой код для проверки, работает верно. Интересно, от чего зависит сбой в работе вектора?

If CurrentBar = 1
Then Begin
   VVector = Vector.Create();
   For Value1 = 1 To 5 Begin
      Value3 = Power(10, Value1);
      For Value2 = 0 To Value3 Begin
         VVector.insert(0, Value2 AsType Int);
      End;
      Print(Value1, "   ", Value3, "   ", VVector.Items[0] AsType Int);
   End;
End;


Название: EasyLanguage
Отправлено: Gelium от 08 Января 2020, 15:58:07
Попробовал такой код для проверки, работает верно. Интересно, от чего зависит сбой в работе вектора?

От объема истории на графике. Скорее всего, этот баг как-то связан с памятью.
Название: EasyLanguage
Отправлено: Станислав от 09 Января 2020, 06:31:07
Попробовал такой код для проверки, работает верно. Интересно, от чего зависит сбой в работе вектора?

От объема истории на графике. Скорее всего, этот баг как-то связан с памятью.
Работает верно, попробовал проверку таким кодом:

VVector.insert(0, BarDateTime[0].Value AsType String);

If Date > Date[1]
Then Begin
   If BarDateTime[0].Value <> VVector.Items[0] AsType String
   Then Begin
      Print(BarDateTime[0].Value, "   ", VVector.Items[0] AsType String);
      Value1 = Value1 + 1;
   End;
End;

If BarDateTime = LastCalcDateTime
Then Begin
   Print("DateTimeStart", Spaces(3), BarDateTime[CurrentBar].Value);
   Print("DateTimeLast ", Spaces(3), BarDateTime[0]         .Value);
   Print("BarInterval  ", Spaces(3), BarInterval:0:0, " Minutes");
   Print("BarsOnChart  ", Spaces(3), CurrentBar:0:0);
   Print("ErrorsCount  ", Spaces(3), Value1:0:0);
End;


Название: EasyLanguage
Отправлено: Станислав от 09 Января 2020, 06:36:33
Попробовал такой код для проверки, работает верно. Интересно, от чего зависит сбой в работе вектора?

От объема истории на графике. Скорее всего, этот баг как-то связан с памятью.
Да, скорее всего зависимость от памяти есть. После долгой работы в TS91, при запуске кода на диаграмме с большой историей (5 лет 1 минутной компрессии), у меня даже команда Print() не срабатывала, после закрытия TS91 и запуска вновь, всё работает в рабочем режиме.
Название: EasyLanguage
Отправлено: Gelium от 09 Января 2020, 10:43:29
Работает верно, попробовал проверку таким кодом:

99% времени работает верно, но в 1% случаев порядок элементов меняется случайным образом, что лишает доверия к сортировке таким способом. Сами по себе данные не теряются, нарушается порядок сортировки.
Название: EasyLanguage
Отправлено: Gelium от 21 Декабря 2020, 06:02:42
Есть куча определений q_XXX для быстрого получения разного рода данных по последним котировкам. Полезно использовать без создания объектов для доступа к информации по символу.
Название: EasyLanguage
Отправлено: Gelium от 21 Декабря 2020, 13:41:55
Простой код получения котировок от QuotesProvider:

using tsdata.marketdata ;
using tsdata.common ;
using elsystem ;

Inputs:
p1_Field("BID");

Vars:
IntrabarPersist v1(0);

method void QP_Updated( elsystem.Object sender, tsdata.marketdata.QuoteUpdatedEventArgs args )
begin
  if QP.State = DataState.Loaded then begin
  v1 = QP[p1_Field].DoubleValue;
  If V1 <> 0 then begin
  print(v1:1:4);
  end;
end;
end;

once begin
QP.Symbol = Symbol;
QP.Fields += p1_Field;
Qp.Realtime = true;
QP.Load = true;
end;

if LastBarOnChart then begin
  if QP.State = DataState.Loaded then begin
  v1 = QP[p1_Field].DoubleValue;
  If V1 <> 0 then begin
print(v1:1:4);
Plot1(v1);
end;
end;
end;
Название: EasyLanguage
Отправлено: Chaika84 от 17 Января 2021, 11:43:05
нашёл решение
необходимая функция - FindBar(TargetDate, TargetTime)
возвращает количество баров с текущего до бара, заданного переменными TargetDate, TargetTime   -то что надо.

Спасибо, что дописали ответ!
Название: EasyLanguage
Отправлено: Gelium от 13 Апреля 2021, 08:19:19
Основы EasyLanguage: https://uploads.tradestation.com/uploads/EasyLanguage-Essentials.pdf
Название: EasyLanguage
Отправлено: Станислав от 25 Августа 2021, 04:05:25
ВНИМАНИЕ! TS9.1:
If XmlNode.Attributes.Contains("*") - не работает, всегда возвращает True!
Название: EasyLanguage
Отправлено: Станислав от 31 Июля 2023, 06:12:29
Добрый день! Кто-нибудь знает, как отключить появление ошибки "method arguments cannot be used as inputs due to their life time" ?? Она возникает, если в методе используется функция и Инпут метода передаётся в инпут функции. Может можно как-нибудь отключить этот контроль синтаксиса? через реестр возможно...?
Название: EasyLanguage
Отправлено: Gelium от 31 Июля 2023, 16:43:11
Добрый день! Кто-нибудь знает, как отключить появление ошибки "method arguments cannot be used as inputs due to their life time" ?? Она возникает, если в методе используется функция и Инпут метода передаётся в инпут функции. Может можно как-нибудь отключить этот контроль синтаксиса? через реестр возможно...?

А разве оно должно так работать? Разработчики ошибку не зря генерируют, так как видимо такую возможность они не закладывали в свой код.
Название: EasyLanguage
Отправлено: Станислав от 31 Июля 2023, 16:59:15
Добрый день! Кто-нибудь знает, как отключить появление ошибки "method arguments cannot be used as inputs due to their life time" ?? Она возникает, если в методе используется функция и Инпут метода передаётся в инпут функции. Может можно как-нибудь отключить этот контроль синтаксиса? через реестр возможно...?

А разве оно должно так работать? Разработчики ошибку не зря генерируют, так как видимо такую возможность они не закладывали в свой код.
Не могу однозначно сказать, как оно должно работать, но можно было бы сделать этот контроль опционально! Например, сделал функцию ExtractFileName(PathFile) - получения имени файла из его полного имени, которую использую в нескольких других функциях, в которых есть методы, которые используют ExtractFileName, а в инпуты этих методов уже не установить PathFile, возникает ошибка. Неудобно! Хотя я понимаю, что Методы ниже Функции, и логика такого контроля имеет смысл, но можно бы было эту логику опционально использовать!
Название: EasyLanguage
Отправлено: csk от 02 Августа 2023, 03:23:57
Цитировать
"method arguments cannot be used as inputs due to their life time"

Sounds like a variable going out of scope. If this is the case then ...
Цитировать
It occurs if a function is used in a method and the input of the method is passed to the input of the function.
... this is where the out of scope happen.

Цитировать
For example, I made the ExtractFileName(PathFile) function - getting the file name from its full name, which I use in several other functions that have methods that use ExtractFileName, and PathFile cannot be set to the inputs of these methods, an error occurs.
Will defining another variable to be assigned with the value of PathFile before the calls, will it help?
Название: EasyLanguage
Отправлено: Станислав от 02 Августа 2023, 06:07:59
Цитировать
"method arguments cannot be used as inputs due to their life time"

Sounds like a variable going out of scope. If this is the case then ...
Цитировать
It occurs if a function is used in a method and the input of the method is passed to the input of the function.
... this is where the out of scope happen.

Цитировать
For example, I made the ExtractFileName(PathFile) function - getting the file name from its full name, which I use in several other functions that have methods that use ExtractFileName, and PathFile cannot be set to the inputs of these methods, an error occurs.
Will defining another variable to be assigned with the value of PathFile before the calls, will it help?
Да, приходится назначать переменную на входное значение, тогда всё работает хорошо! Думал, есть ли варианты обойти это переназначение, но как оказывается вариантов нет! Спасибо!
Yes, you have to assign a variable to the input value, then everything works fine! I thought if there were options to get around this reassignment, but as it turns out, there are no options! Thank you!