Автор Тема: EasyLanguage  (Прочитано 34241 раз)

0 Пользователей и 1 Гость просматривают эту тему.

Оффлайн ihaar

  • Давно не был на форуме
  • *
  • Сообщений: 1 067
    • Просмотр профиля
EasyLanguage
« : 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, будем автоматически иметь правильное отображение цены
можно оформить в функцию

Оффлайн Станислав

  • Участник клуба
  • *
  • Сообщений: 176
    • Просмотр профиля
EasyLanguage
« Ответ #1 : 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) будет округлено до ценовой доли.

Оффлайн ihaar

  • Давно не был на форуме
  • *
  • Сообщений: 1 067
    • Просмотр профиля
EasyLanguage
« Ответ #2 : 06 Августа 2012, 11:26:53 »
такой вопрос созрел

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

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

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

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

Павел

  • Гость
EasyLanguage
« Ответ #3 : 06 Августа 2012, 15:04:41 »
https://www.parusinvestora.ru/systems/omega/easylang/p1.shtm этот учебник по языку Easy Language - полезная вещь? Есть ли еще материалы на русском?

Оффлайн Gelium

  • Администратор
  • Сообщений: 9 297
    • Просмотр профиля
    • Gelium.net
EasyLanguage
« Ответ #4 : 07 Августа 2012, 11:42:02 »
такой вопрос созрел

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

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

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

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

Можно считывать текстовыю строку из файла с помощью функций Puls, разбирать далее текст и использовать.

Оффлайн Gelium

  • Администратор
  • Сообщений: 9 297
    • Просмотр профиля
    • Gelium.net
EasyLanguage
« Ответ #5 : 07 Августа 2012, 11:43:46 »
https://www.parusinvestora.ru/systems/omega/easylang/p1.shtm этот учебник по языку Easy Language - полезная вещь? Есть ли еще материалы на русском?

https://gelium.net/ru/component/docman/doc_download/147-easy

Оффлайн ihaar

  • Давно не был на форуме
  • *
  • Сообщений: 1 067
    • Просмотр профиля
EasyLanguage
« Ответ #6 : 07 Августа 2012, 13:06:42 »
Можно считывать текстовыю строку из файла с помощью функций Puls, разбирать далее текст и использовать.
а как указать какая именно строка нужна, или считывать все и находить с нужной датой и далее уже её разбирать?

Павел

  • Гость
EasyLanguage
« Ответ #7 : 07 Августа 2012, 15:30:53 »

Оффлайн Gelium

  • Администратор
  • Сообщений: 9 297
    • Просмотр профиля
    • Gelium.net
EasyLanguage
« Ответ #8 : 07 Августа 2012, 16:44:31 »
Можно считывать текстовыю строку из файла с помощью функций Puls, разбирать далее текст и использовать.
а как указать какая именно строка нужна, или считывать все и находить с нужной датой и далее уже её разбирать?

Считывать все.

Павел

  • Гость
EasyLanguage
« Ответ #9 : 16 Августа 2012, 14:58:01 »
вот первый опыт - попробовал сделать PaintBar
получилось вот это
вводится значение в пунктах - диапазон разницы между ценой открытия и закрытия, при котором бар остается черыным
а так бар вверх становиться синий  - бар вниз красный, ну или задайте свои цвета
:)
не знаю есть ли что-то такое по умолчанию ТС

Оффлайн Gelium

  • Администратор
  • Сообщений: 9 297
    • Просмотр профиля
    • Gelium.net
EasyLanguage
« Ответ #10 : 16 Августа 2012, 16:05:51 »
А что мешает просто задать цвета свечей в настройках графика?  ;)

Оффлайн ihaar

  • Давно не был на форуме
  • *
  • Сообщений: 1 067
    • Просмотр профиля
EasyLanguage
« Ответ #11 : 16 Августа 2012, 16:18:55 »
так это ж не для свечей, а для баров.. вроде это стандартно не настраивается

Павел

  • Гость
EasyLanguage
« Ответ #12 : 16 Августа 2012, 16:26:32 »
угу для баров, и чтобы было видно вверх или вниз
а вообще больше чтобы попробовать Easy Language что за зверь

Craft

  • Гость
EasyLanguage
« Ответ #13 : 27 Октября 2012, 04:21:02 »
Как организовать перебор баров от текущего в прошлое (чтобы можно было ссылаться/обращаться к барам истории)? Текущий бар = 0, последний = количеству загруженных на график баров.
Получается наоборот.

Оффлайн Gelium

  • Администратор
  • Сообщений: 9 297
    • Просмотр профиля
    • Gelium.net
EasyLanguage
« Ответ #14 : 27 Октября 2012, 06:07:25 »
Как организовать перебор баров от текущего в прошлое (чтобы можно было ссылаться/обращаться к барам истории)? Текущий бар = 0, последний = количеству загруженных на график баров.
Получается наоборот.

https://gelium.net/ru/trading-tools/prosuite-easylanguage/item/764-easylanguage

Оффлайн ihaar

  • Давно не был на форуме
  • *
  • Сообщений: 1 067
    • Просмотр профиля
EasyLanguage
« Ответ #15 : 27 Октября 2012, 07:15:32 »
Craft, думаю что всё зависит для чего вам это нужно и какую задачу вы хотите решить.
если смотреть слишком глубоко назад, то будут проблемы с maxbarsback

Craft

  • Гость
EasyLanguage
« Ответ #16 : 27 Октября 2012, 07:57:37 »
Необходимо для индикатора сентимента, чтобы обращаться к значениям предшествующих баров, своих знаний для организации необходимого цикла не хватает.
maxbarsback, как видно из вложения в моём предыдущем сообщении не проблема для получающегося обратного пересчёта.

Оффлайн ihaar

  • Давно не был на форуме
  • *
  • Сообщений: 1 067
    • Просмотр профиля
EasyLanguage
« Ответ #17 : 27 Октября 2012, 08:26:04 »
этого мало, конкретизируйте пожалуйста
что бы обращаться к значениям предыдущих баров не нужно что-то мутить, можно знать что творилось на любом баре [n баров назад]
другое дело, что при наступлении определённого события на каком-либо баре, вам нужно это зафиксировать что бы иметь возможность обратиться к этому значению позже
тут есть несколько способов навскидку:
1. запустить счётчик при наступлении события и потом обращаться к значению [счётчик баров назад]
2. записать значение в массив

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

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

Craft

  • Гость
EasyLanguage
« Ответ #18 : 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);//Находим начальный бар на нужном ТФ
на цикл кол-ва баров назад.
Видимо, для решения этой задачи необходим склад ума программиста.

Оффлайн ihaar

  • Давно не был на форуме
  • *
  • Сообщений: 1 067
    • Просмотр профиля
EasyLanguage
« Ответ #19 : 28 Октября 2012, 12:35:04 »
а что означает "исходный бар" в данном контексте? это просто первый бар на графике ли бар на котором исполнилось какое-то условие?

Craft

  • Гость
EasyLanguage
« Ответ #20 : 28 Октября 2012, 14:11:32 »
Да, начальный (в МТ перебор баров можно осуществлять, как слева направо, так и наоборот (в данном случае это и используется) - в ТС перебор слева направо).
Первоначально сдвиг (shift) = 0;
Определяется время начала этого бара;
По найденному времени находится первый бар младшего т/ф;
Определяется kolvo баров младшего т/ф входящих в бар старшего т/ф;
И начинается перебор - учёт всех младших баров в старшем т/ф: for (int i=a;i>=kolvo;i--),
Далее происходит сдвиг на следующий бар и всё по новой...

Оффлайн ihaar

  • Давно не был на форуме
  • *
  • Сообщений: 1 067
    • Просмотр профиля
EasyLanguage
« Ответ #21 : 28 Октября 2012, 14:39:41 »
ну тогда действительно не вижу особой проблемы использовать два таймфрейма, как советовал Павел сразу

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

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

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

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


Craft

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

Оффлайн ihaar

  • Давно не был на форуме
  • *
  • Сообщений: 1 067
    • Просмотр профиля
EasyLanguage
« Ответ #23 : 28 Октября 2012, 15:41:11 »
ну както так думаю

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

и обнулять kolvo при открытии нового бара 240

Craft

  • Гость
EasyLanguage
« Ответ #24 : 28 Октября 2012, 15:47:42 »
))) ihaar, ну конкретней с Plot1(kolvo,"kolvo"), что получается?

P. S. Ещё, наверное, логичнее сравнивать изменение последнего Close[0] с предыдущим Close[1].
[] - не наводит на мысль о необходимости автоподстановки индекса для углубления в историю?

Оффлайн ihaar

  • Давно не был на форуме
  • *
  • Сообщений: 1 067
    • Просмотр профиля
EasyLanguage
« Ответ #25 : 28 Октября 2012, 17:18:39 »
вот что вышло

ila_rendered

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

Craft

  • Гость
EasyLanguage
« Ответ #26 : 28 Октября 2012, 17:59:26 »
А если цены закрытия баров сравнивать, как будет?

Оффлайн ihaar

  • Давно не был на форуме
  • *
  • Сообщений: 1 067
    • Просмотр профиля
EasyLanguage
« Ответ #27 : 28 Октября 2012, 18:07:01 »
так как вы и писали:
If Close Data2 < Close[1] Data2

Craft

  • Гость
EasyLanguage
« Ответ #28 : 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");

Оффлайн ihaar

  • Давно не был на форуме
  • *
  • Сообщений: 1 067
    • Просмотр профиля
EasyLanguage
« Ответ #29 : 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)", иначе в рилтайме будет каша

Craft

  • Гость
EasyLanguage
« Ответ #30 : 10 Ноября 2012, 08:06:29 »
Всё-таки в МТ (справа на скрине) картина (син. - сентимент покпателей, кр. - продавцов) получается более реалистичная. Может быть качество минутных котировок в QuoteRoom похуже.

Оффлайн ihaar

  • Давно не был на форуме
  • *
  • Сообщений: 1 067
    • Просмотр профиля
EasyLanguage
« Ответ #31 : 10 Ноября 2012, 08:39:03 »
Думаю что врядли проблема в котировках.
Скорее формулы отрабатывают не идентично.
без кода и описания что вы хотите от него трудно что-то сказать

Craft

  • Гость
EasyLanguage
« Ответ #32 : 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);
  }
//+------------------------------------------------------------------+

Ниже скрин сравнения результатов расчёта - разница на лицо.

Оффлайн ihaar

  • Давно не был на форуме
  • *
  • Сообщений: 1 067
    • Просмотр профиля
EasyLanguage
« Ответ #33 : 10 Ноября 2012, 09:50:23 »
Я сейчас не у компа, но самый простой способ проверить в котировках ли дело, это выгрузить историю минуток из МТ в файл и построить индикатор по ним в ТС

Оффлайн ihaar

  • Давно не был на форуме
  • *
  • Сообщений: 1 067
    • Просмотр профиля
EasyLanguage
« Ответ #34 : 07 Сентября 2013, 19:43:28 »
что-то не могу уловить принцип использования новых классов в ТS
нужно передать значение из одного индикатора в другой (например время и значение, так как это делается в пульсе)
может ктото уже разбирался и есть кусочек кода для подобной задачки?
был бы очень признателен

Оффлайн Gelium

  • Администратор
  • Сообщений: 9 297
    • Просмотр профиля
    • Gelium.net
EasyLanguage
« Ответ #35 : 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);

Оффлайн Gelium

  • Администратор
  • Сообщений: 9 297
    • Просмотр профиля
    • Gelium.net
EasyLanguage
« Ответ #36 : 08 Сентября 2013, 04:32:20 »
Учтите, что при включении мультиядерности, глобальные переменные могут не работать. Это исправлено в новых билдах, но они пока не работают с QR. Поэтому работу при мультиядерности надо проверять отдельно.

Оффлайн ihaar

  • Давно не был на форуме
  • *
  • Сообщений: 1 067
    • Просмотр профиля
EasyLanguage
« Ответ #37 : 08 Сентября 2013, 05:46:17 »
ок. спасибо большое.
на всякий случай оставил в виртуалке одно ядро.
и кстати, я так понимаю, что пульс тоже по идее грузится на каждое ядро своя копия?

Оффлайн Gelium

  • Администратор
  • Сообщений: 9 297
    • Просмотр профиля
    • Gelium.net
EasyLanguage
« Ответ #38 : 08 Сентября 2013, 10:05:38 »
В виртуалке вы можете ставить сколько хотите ядер. Внутри TS не надо включать опцию размножения платформы на несколько ядер. TS, в отличии от MC, создает не потоки, а экземпляры платформы. Для каждого экземпляра отдельно грузится Puls. Он под это пока не заточен. Нет времени на такую заточку. Если нанимать программера, то все это конечно можно довести до хорошего уровня. Но пока я не ощущаю большой нужды тратить на это время.

Оффлайн ihaar

  • Давно не был на форуме
  • *
  • Сообщений: 1 067
    • Просмотр профиля
EasyLanguage
« Ответ #39 : 18 Сентября 2013, 16:31:36 »
Павел, если это не копирайт, поделитесь плиз секретом, как вы в Gelium_Trend добились задания стиля и цвета прямых линий в свойствах индикатора, так как будто это не линии а plot
да так что оно ещё и вершины подсвечивает
 ;)