Новый способ работы с индикаторами - страница 3

 
ForexTools >>:

понятно. тогда это ради того самого "искусства программирования", а не ради заработка от торговли. интересное занятие, впереди у вас еще много фенечек. но мне уже перенравилось - хочется делом занятся ;)

Точнее говоря, для заработка от программирования. Я программист в сокращении. 

Но для дела наработки тоже есть.

 
jartmailru >>:

А вы думаете, что у меня такого скрипта нет? Есть. Называется "вентилятор" :-).

С таким скриптом плохо, когда приходится менять таймфрейм и открывать новые графики.

И вот меня спрашивали: а как избежать в субботу-воскресенье навешивания этих скриптов

с постоянными окошками типа "Остановить скрипт?", "Остановить скрипт?"...

Так что программа пригодится :-).

Немного изменил скрипт, теперь должен быть лишен названных вами недостатков.

#property show_inputs 

#import "user32.dll"
  int RegisterWindowMessageA(string lpstring);
  int PostMessageA(int hWnd,int Msg,int wParam,int lParam);
  int GetParent( int hWnd );
  int GetWindow(int hWnd,int uCmd);
  int GetDlgItem( int hDlg, int nIDDlgItem );
#import

#define GW_HWNDNEXT  2
#define GW_HWNDFIRST 0

extern double Frequency = 1; // частота обновления графика в секундах

// Возвращает хэндл следующего чарта за hwnd-чартом
int NextChart( int hwnd ) 
{
  int handle;
  
  hwnd = GetParent(hwnd);
  handle = GetWindow(hwnd, GW_HWNDNEXT);
  
  if (handle == 0)
    handle = GetWindow(hwnd, GW_HWNDFIRST);
    
  hwnd = GetDlgItem(handle, 0xE900); 
  
  return(hwnd);
}

void start()
{
  int hwndBase = WindowHandle(Symbol(), Period());
  int hwnd = hwndBase;
  int MT4InternalMsg = RegisterWindowMessageA("MetaTrader4_Internal_Message"); 
  
  Frequency *= 1000;
  
  while(!IsStopped())
  {
    PostMessageA(hwnd, MT4InternalMsg, 2, 1); 
    hwnd = NextChart(hwnd);

    while (hwnd != hwndBase)
    {
      PostMessageA(hwnd, MT4InternalMsg, 2, 1); 
      hwnd = NextChart(hwnd);
    }
    
    Sleep(Frequency);
  }
  
  return;
}
 
ForexTools >>:

Однако как показала дальнейшая практика, мучения вокруг поддержания связки с внешней прожкой и отладкой всей системы стали на порядок больше того результата, который хотелось получить. Овчинка выделки не стоит если нет действительно серьезной задачи, которую нельзя решить штатными средствами MQL + Win32API.


Ну чо, плюсадин, што ли. А вообще, история очень знакомая. Выводы - те же. Программировать нужно свой профит, или на заказ - всё остальное балавство и излишества.

 
getch >>:

Немного изменил скрипт, теперь должен быть лишен названных вами недостатков.

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

наверно "идеальное" решение - добавить еще один параметр: bool RefreshActiveChartOnly, по которому определять "вентилировать" все графики или только один, на который скрипт сбросили.

а еще лучше былобы иметь возможность задать имена тех индикаторов\экспертов которые нужно обновлять принудительно и рефрешить только те чарты на которых они есть.

 
Я ничего нового не добавил, лишь только NextChart. А функционала много не бывает, так что кому надо, тот сделает. На профит это не влияет...
 
getch >>:

Немного изменил скрипт, теперь должен быть лишен названных вами недостатков.

Допустим... открыли 10 окошек, повесили индикаторы- и вышли.

Вопрос: что будет при старте метатрейдера? Ответ: ничего хорошего.

И раз уж используется Dll / есть код на плюсах- то его тоже можно использовать.

ForexTools >>:

{...} Однако как показала дальнейшая практика, мучения вокруг поддержания связки с внешней прожкой и отладкой всей системы стали на порядок больше того результата, который хотелось получить. Овчинка выделки не стоит если нет действительно серьезной задачи, которую нельзя решить штатными средствами MQL + Win32API. {...}

На это я отвечал, что Dll с интерфейсным потоком- это отдельная от метатрейдера тема.

И мучаться с ней придется в любом приложении точно также.

И нет там каких-то мегасложных отладок. Передать данные- это тривиально.

Можно подумать, что то, что нужно отлаживать в С++, не нужно отлаживать в Mql.

... а придется, только не с брейкпойнтами/исключениями, а с логами,

и без автоматических тестов, тестовых серий, xml и прочая.

.

И, я думаю, со временем начнут возникать НЕстранные вопросы 

"а как мне засунуть в метатрейдер синтетический инструмент или акции".

.

P.S.: на Mql я тоже пишу- разницы на чем писать- нет ... если знать, зачем.

 
jartmailru >>:

Допустим... открыли 10 окошек, повесили индикаторы- и вышли.

Вопрос: что будет при старте метатрейдера? Ответ: ничего хорошего.

И раз уж используется Dll / есть код на плюсах- то его тоже можно использовать.

Будет работать также, как и до закрытия, если на одном из окошек будет запущен вышеприведенный код в виде советника. Возможно, я был неправильно понят, выложив код. На MQL4 мне увиделось это сделать чуть проще, чем на другом языке. Но это не обозначает, что решения на других языках ущербнее.

 
getch >>:

Будет работать также, как и до закрытия, если на одном из окошек будет запущен вышеприведенный код в виде советника. Возможно, я был неправильно понят, выложив код. На MQL4 мне увиделось это сделать чуть проще, чем на другом языке. Но это не обозначает, что решения на других языках ущербнее.

Да, Вы не говорили :-).

Я рассматривал Ваш код как скрипт. Если рассматривать этот код, как зацикленный советник,

то, возможно, всё будет хорошо :-).

 

уважаемые господа, а возможен ли скрипт снимающий все выделения объектов и запуск его и обсуждаемого скрипта из индикатора

что-то типа:
extern int StartScript = "";//по умолчанию скрипт не запускается, но если указать в кавычках название скрипта типа "Refresh_Unselect_All", то запустится скрипт выполняющий через заданный промежуток времени команду "Обновление" графика и через другой промежуток времени "Снять все выделения".
 

 
getch >>:

Будет работать также, как и до закрытия, если на одном из окошек будет запущен вышеприведенный код в виде советника. Возможно, я был неправильно понят, выложив код. На MQL4 мне увиделось это сделать чуть проще, чем на другом языке. Но это не обозначает, что решения на других языках ущербнее.

Шутка юмора! :-)

.

Оказывается, что если метатрейдер запущен в субботу-воскресенье,

т.е. время, когда котировки не приходят, функция start() у эксперта не запускается :-).

Т.е. запустив код

void init()
{
    Print("init: PING");
    //start();
}
int start()
{
    Print("start(): PING");
    for(;;)
    {
        if(IsStopped()) {
            Print("exiting: PING");
            return;
        }
        Sleep(1000);
        Print("cycle: PING");
    }
return;
}
Вы увидите print только из init()'а. 

А чтобы управление попало в start(), init() должен вызвать его напрямую.

Так что вариант с экспертом нехороший :-).

Причина обращения: