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

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

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

  • Участник клуба
  • *
  • Сообщений: 176
    • Просмотр профиля
EasyLanguage
« Ответ #160 : 18 Февраля 2018, 17:02:11 »
Для общего образования))

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

  • Участник клуба
  • *
  • Сообщений: 176
    • Просмотр профиля
EasyLanguage
« Ответ #161 : 24 Июля 2018, 11:57:11 »
Кто-нибудь знает как можно узнать дескриптор окна диаграммы в функции??

Оффлайн Gelium

  • Администратор
  • Сообщений: 9 297
    • Просмотр профиля
    • Gelium.net
EasyLanguage
« Ответ #162 : 24 Июля 2018, 16:19:22 »
Кто-нибудь знает как можно узнать дескриптор окна диаграммы в функции??

Если легко, то никак. Если сложно, то через WinAutomation можно попробовать вытянуть или подобный софт.

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

  • Участник клуба
  • *
  • Сообщений: 176
    • Просмотр профиля
EasyLanguage
« Ответ #163 : 24 Июля 2018, 17:49:38 »
Кто-нибудь знает как можно узнать дескриптор окна диаграммы в функции??

Если легко, то никак. Если сложно, то через WinAutomation можно попробовать вытянуть или подобный софт.
Есть способ достаточно простой, можно в самой TS перебрать окна, определить их дескрипторы и классы, но это посредством цикла, хотелось бы без цикла, напрямую по дескриптору, ну чтож придётся циклом перебирать до нужного окна и останавливать цикл. Сторонний софт стараюсь обходить по возможности.

Оффлайн Gelium

  • Администратор
  • Сообщений: 9 297
    • Просмотр профиля
    • Gelium.net
EasyLanguage
« Ответ #164 : 24 Июля 2018, 18:59:52 »
Есть способ достаточно простой, можно в самой TS перебрать окна, определить их дескрипторы и классы, но это посредством цикла, хотелось бы без цикла, напрямую по дескриптору, ну чтож придётся циклом перебирать до нужного окна и останавливать цикл. Сторонний софт стараюсь обходить по возможности.

А для чего нужно найти дескриптор окна? И как определить, что из всех окон найдено именно нужное?

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

  • Участник клуба
  • *
  • Сообщений: 176
    • Просмотр профиля
EasyLanguage
« Ответ #165 : 24 Июля 2018, 19:11:38 »
Есть способ достаточно простой, можно в самой TS перебрать окна, определить их дескрипторы и классы, но это посредством цикла, хотелось бы без цикла, напрямую по дескриптору, ну чтож придётся циклом перебирать до нужного окна и останавливать цикл. Сторонний софт стараюсь обходить по возможности.

А для чего нужно найти дескриптор окна? И как определить, что из всех окон найдено именно нужное?
Хочу попробовать сделать QuoteUpdater в самой TS.По дескриптору окна можно направлять команды управления окном, сообщения окну, комбинации клавиш, всё посредством API.
Есть дискриптор и заголовок, по ним можно определить в каком именно окне используется исследование.

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

  • Участник клуба
  • *
  • Сообщений: 176
    • Просмотр профиля
EasyLanguage
« Ответ #166 : 25 Июля 2018, 05:07:22 »
Не знаю по какой причине, но работа с файлами в AutoMate VBS модулях выполняется намного быстрее, чем в TS!Сделал загрузчик котировок, скорость работы которого в TS более чем в 2 раза медленнее в сравнении с VBS! API функции работают очень быстро, а чтение и запись в файл посредством TS очень медленная! Думаю попробовать и её сделать через API. И сравнить результат...

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

  • Участник клуба
  • *
  • Сообщений: 176
    • Просмотр профиля
EasyLanguage
« Ответ #167 : 30 Июля 2018, 06:17:48 »
На выходных переустановил Win7. Впервые, появилась проблема запуска TradingApp, кто-нибудь сталкивался с подобными фокусами?

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

  • Участник клуба
  • *
  • Сообщений: 176
    • Просмотр профиля
EasyLanguage
« Ответ #168 : 10 Августа 2018, 09:02:03 »
На выходных переустановил Win7. Впервые, появилась проблема запуска TradingApp, кто-нибудь сталкивался с подобными фокусами?
Проблема решилась повторной переустановкой системы, но:
1. первоначально, после установки Win 7 не дожидаясь установки её обновлений, была установлена TS9.1, как следствие возникли проблемные моменты с TradingApp
2. впоследствии, после установки Win 7 были установлены её обновления до текущей даты, а после установлена TS9.1, проблемные моменты с TradingApp исчезли.

serjante77

  • Гость
EasyLanguage
« Ответ #169 : 03 Сентября 2018, 12:32:18 »
Подскажите как в Индикаторе прописать чтобы места входа на графике прорисовывались стрелками, как это делает Стратегия, мне это нужно для построение своей тактики, а затем на их место при создании Стратегии просто прописать Сигналы Входа и Выхода. Простым поиском в Гугле ничего подобного найти не могу. Если уже есть какой либо Индикатор где в коде прописано пожалуйста скиньте а я уже с него просто скопирую эту фишку. В МетаТрейдере  это уже давно есть а в ТрейдСтейшене я это ищу еще со времен Омеги. Спасибо заранее кто откликнется!

Оффлайн Gelium

  • Администратор
  • Сообщений: 9 297
    • Просмотр профиля
    • Gelium.net
EasyLanguage
« Ответ #170 : 03 Сентября 2018, 16:26:06 »
В индикаторе вместо стрелочек можно просто отрисовывать в отдельной серии красные и синие кружки.

serjante77

  • Гость
EasyLanguage
« Ответ #171 : 04 Сентября 2018, 06:13:18 »
В индикаторе вместо стрелочек можно просто отрисовывать в отдельной серии красные и синие кружки.
Так я хочу командой Plot (ArrowUp) прописать в своём Индикаторе.  Ну например пусть хотя бы пересечение двух скользящих мне на графике покажет стрелку, это надо что бы визуально при проверки своей тактики можно было бы легко проверить , потом добавлять просто дополнительные условия чтобы не забивать график множеством визуальных объектов. Также это полезно при торговле в реале.

Оффлайн Gelium

  • Администратор
  • Сообщений: 9 297
    • Просмотр профиля
    • Gelium.net
EasyLanguage
« Ответ #172 : 04 Сентября 2018, 06:47:09 »
Так я хочу командой Plot (ArrowUp) прописать в своём Индикаторе.

Прописывайте. В чём проблема?

serjante77

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

Оффлайн Gelium

  • Администратор
  • Сообщений: 9 297
    • Просмотр профиля
    • Gelium.net
EasyLanguage
« Ответ #174 : 06 Сентября 2018, 20:27:49 »
plot3(Value1);

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

serjante77

  • Гость
EasyLanguage
« Ответ #175 : 07 Сентября 2018, 12:47:13 »
plot3(Value1);

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

Насколько я понял Вы отсылаете меня на вкладку Стиль в свойствах индикатора но там есть только стиль отображения например линий Точкой Линией Гистограмма Правый тик или Левый тик даже если бы там была Стрелка то мне бы всю линию показало бы стрелками      Пересечение двух линий почти везде где я видел отображается точкой которую можно только увеличить а я ищу чтобы Индикатор на конкретном Баре мне показал Стрелку вверх или вниз как это прорисовывает Стратегия . То есть я думаю надо в коде прописать команду нарисовать Стрелку . Если вам не трудно можете мне скинуть тачкскрин окна где это можно сделать  а если все таки можно написать в коде то как это прописать, я изучаю на примерах других индикаторах поэтому Прошу прощения если отнимаю у Вас время.

Оффлайн Gelium

  • Администратор
  • Сообщений: 9 297
    • Просмотр профиля
    • Gelium.net
EasyLanguage
« Ответ #176 : 07 Сентября 2018, 19:17:43 »
В индикаторе нельзя рисовать стрелки. В TS нет такой возможности. Если хотите над барами рисовать стрелки, то вам нужно создавать текстовые объекты и использовать символы для изображения стрелочек. В плане рисования TS намного уступает возможностям MQL5. Правда без этих возможностей можно прекрасно обходиться.

serjante77

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






Оффлайн Gelium

  • Администратор
  • Сообщений: 9 297
    • Просмотр профиля
    • Gelium.net
EasyLanguage
« Ответ #178 : 09 Сентября 2018, 04:31:23 »
Вот здесь показан пример как это можно сделать   https://markplex.com/free-tutorials/tutorial-89-how-to-draw-symbols-on-a-chart/

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

Спасибо. Век живи, век учись. :)

serjante77

  • Гость
EasyLanguage
« Ответ #179 : 09 Сентября 2018, 07:31:47 »
Теперь осталось найти как их отформатировать, чтобы они рисовались выше или ниже Мувингов или хотя бы на каком то расстоянии от баров.

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

  • Участник клуба
  • *
  • Сообщений: 176
    • Просмотр профиля
EasyLanguage
« Ответ #180 : 19 Сентября 2018, 17:52:18 »
Кто-нибудь интересовался новейшим чудом TradeStation 10?

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

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

Оффлайн Gelium

  • Администратор
  • Сообщений: 9 297
    • Просмотр профиля
    • Gelium.net
EasyLanguage
« Ответ #182 : 07 Декабря 2018, 05:53:11 »
Пост не понятен. У вас получилось или нет? Какова цель получения хэндла окна?

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

  • Участник клуба
  • *
  • Сообщений: 176
    • Просмотр профиля
EasyLanguage
« Ответ #183 : 07 Декабря 2018, 06:41:18 »
Пост не понятен. У вас получилось или нет? Какова цель получения хэндла окна?
Цель: сделать функцию скриншота окна диаграммы,которая будет работать следующим образом:
- с 1 по последний бар сохраняются даты событий в массив- на последнем баре выполняются скриншоты этих событий прокручивая экран посредством charting.ChartingHost.Create().ScrollTo(BarDateTime из массива) - (некоторое число баров для центровки события на скришоте)
- привязка гиперссылкой соответствующего скриншота к реестру сделок (блокнот рейдера) в экселе
В WinAPI есть функции, которые возвращают несколько свойств через один параметр, доступ к свойствам осуществляется через ".".А у меня пока не получается придумать как эти параметры получать в TDE, один из примеров это функция GetWindowRect.Вообще, поняв как это можно делать, открываются несметные возможности в TS с помощью WinAPI без всяких дополнительных программ.Можно взять весь процесс трейдинга под контроль самой TS! Это удобно!У меня пока это не получается...
С обычными WinAPI функциями проблем нет, всё работает, а вот с теми у которых через один параметр можно получать несколько свойств, увы...

Оффлайн Gelium

  • Администратор
  • Сообщений: 9 297
    • Просмотр профиля
    • Gelium.net
EasyLanguage
« Ответ #184 : 07 Декабря 2018, 09:45:27 »
Цель: сделать функцию скриншота окна диаграммы,которая будет работать следующим образом:
- с 1 по последний бар сохраняются даты событий в массив- на последнем баре выполняются скриншоты этих событий прокручивая экран посредством charting.ChartingHost.Create().ScrollTo(BarDateTime из массива) - (некоторое число баров для центровки события на скришоте)
- привязка гиперссылкой соответствующего скриншота к реестру сделок (блокнот рейдера) в экселе

Зачем же это делать так сложно и с большими времязатратами, когда всё это делается элементарно в WinAutomation с получением в итоге рабочего экзешника? Вы вообще своё время ни во что не цените?

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

  • Участник клуба
  • *
  • Сообщений: 176
    • Просмотр профиля
EasyLanguage
« Ответ #185 : 07 Декабря 2018, 09:58:35 »
Цель: сделать функцию скриншота окна диаграммы,которая будет работать следующим образом:
- с 1 по последний бар сохраняются даты событий в массив- на последнем баре выполняются скриншоты этих событий прокручивая экран посредством charting.ChartingHost.Create().ScrollTo(BarDateTime из массива) - (некоторое число баров для центровки события на скришоте)
- привязка гиперссылкой соответствующего скриншота к реестру сделок (блокнот рейдера) в экселе

Зачем же это делать так сложно и с большими времязатратами, когда всё это делается элементарно в WinAutomation с получением в итоге рабочего экзешника? Вы вообще своё время ни во что не цените?
Так это делается элементарно и как я описал, если есть соответствующие знания, в частности как организовать работу функции WinAPI. Это ж не долго, может чуть более написания скрипта в WinAutomation, хотя я более предпочитаю AutoMate! Всего один раз написать, а потом пользоваться.

Оффлайн Gelium

  • Администратор
  • Сообщений: 9 297
    • Просмотр профиля
    • Gelium.net
EasyLanguage
« Ответ #186 : 07 Декабря 2018, 11:04:39 »
Так это делается элементарно и как я описал, если есть соответствующие знания, в частности как организовать работу функции WinAPI. Это ж не долго, может чуть более написания скрипта в WinAutomation, хотя я более предпочитаю AutoMate! Всего один раз написать, а потом пользоваться.

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



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

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

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

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

serjante77

  • Гость
EasyLanguage
« Ответ #188 : 09 Декабря 2018, 08:25:41 »
 (некоторое число баров для центровки события на скришоте)
- привязка гиперссылкой соответствующего скриншота к реестру сделок (блокнот рейдера) в экселе
[/quote]

Если  сделаете своё творение, Вы поделитесь им здесь с нами ? Хотелось бы тоже такой дневник трейдера, с скриншотами дабы видеть в будущем на чём основывалось принятие решения и его осуществление или нет.

Оффлайн Gelium

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

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

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

Оффлайн Gelium

  • Администратор
  • Сообщений: 9 297
    • Просмотр профиля
    • Gelium.net
EasyLanguage
« Ответ #191 : 09 Декабря 2018, 19:52:26 »
Опишите чуть подробнее, что вы хотите делать в TS. Я подскажу какие функции WinAutomation оптимально использовать. Достаточно давно его использую для автоматизации с TS и в других проектах.

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

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




Оффлайн Gelium

  • Администратор
  • Сообщений: 9 297
    • Просмотр профиля
    • Gelium.net
EasyLanguage
« Ответ #193 : 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 до нужного размера или на весь окран. И далее делать скриншот чем хотите.

MaksimZZ

  • Гость
EasyLanguage
« Ответ #194 : 25 Марта 2019, 14:22:57 »
Прошу помощи по такому коду:

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

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

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

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

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

MaksimZZ

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

Спасибо.

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

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


MaksimZZ

  • Гость
EasyLanguage
« Ответ #198 : 25 Марта 2019, 16:46:13 »
спасибо огромное!!! работает как часы.

MaksimZZ

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