Эмуляция тика для запуска советника на offline графике - как реализовать?

 

Здравствуйте

Подскажите, пожалуйста, как сэмулировать тик на offline графике, который запустить функцию start() в советнике на этом графике?

Этот код у меня НЕ работает:

SendMessageA(hwndChart, WM_COMMAND, 0x822C, NULL);

 

Добавьте в функцию init() запуск функции start:

int init()

{

...

start();

...

}

Тогда после установки советника на график  он сэмулирует первый тик.

 

Спасибо, но мне не совсем это нужно

Мне нужно сэмулировать тики на offline графике, на котором уже стоит советник, чтобы вызвать функцию Start() именно СОВЕТНИКА, т.к. есть способ вызова функции start() для индикатора, который не подходит для советника

 
Init(){


...
 while (!IsConnected()) {
   start();
   Sleep(1000);
 }                                                      
}

А так подойдет?Правда есть еще другой способ..- Тестер или скрипт который эмулирует тики на заданный ТФ

 
forte928:

А так подойдет?Правда есть еще другой способ..- Тестер или скрипт который эмулирует тики на заданный ТФ


Нет, не подойдет. Мне нужен не цикл, а единоразовый вызов, т.к. тик я буду эмулировать при совпадении определенных условий.


Т.е. нужен единоразовый вызов, типа кода ниже, но рабочий

SendMessageA(hwndChart, WM_COMMAND, 0x822C, NULL);
 
chief1973:

Т.е. нужен единоразовый вызов, типа кода ниже, но рабочий


int MT4InternalMsg;

int init()
{
...
   MT4InternalMsg = RegisterWindowMessageA("MetaTrader4_Internal_Message"); 
...   
}


int start()
{
...

   RefreshWindow(Symbol(),Period());
...
}

void RefreshWindow(string symbol,int period)
{
   int hwnd = WindowHandle(symbol,period);
   if (hwnd>0) 
   { 
      PostMessageA(hwnd, WM_COMMAND, 33324, 0 );
      PostMessageA(hwnd,MT4InternalMsg,2,1); 
   }
}
Естественно, #include <WinUser32.mqh> в начале.
 
Roger:

Добавьте в функцию init() запуск функции start:

int init()

{

...

start();

...

}

Тогда после установки советника на график  он сэмулирует первый тик.

Так делать нельзя. В справке написано.

forte928:

Init(){


...
 while (!IsConnected()) {
   start();
   Sleep(1000);
 }                                                      
}

 А так подойдет?Правда есть еще другой способ..- Тестер или скрипт который эмулирует тики на заданный ТФ

Так тоже нельзя. В справке написано. 

alsu:
int MT4InternalMsg;

int init()
{
...
   MT4InternalMsg = RegisterWindowMessageA("MetaTrader4_Internal_Message"); 
...   
}


int start()
{
...

   RefreshWindow(Symbol(),Period());
...
}

void RefreshWindow(string symbol,int period)
{
   int hwnd = WindowHandle(symbol,period);
   if (hwnd>0) 
   { 
      PostMessageA(hwnd, WM_COMMAND, 33324, 0 );
      PostMessageA(hwnd,MT4InternalMsg,2,1); 
   }
}

Естественно, #include <WinUser32.mqh> в начале.
Это работать не будет. Эммуляция тика для эксперта в ините или старте заканчивается раньше, чем запустится старт.

Есть вариант с  PostMessage() в цикле в ините накидать большое количество (200-500) сообщений в очередь. Пока они будут исполняться, запустится старт. Это у меня работало, но очень ненадёжно.

===============

Лучше использовать в ините из этой библиотеки функцию ServiceRefreshChart() из раздела 4.7. После запуска старта завершить обновление функцией ServiceStopRefreshChart().

void init()
 {
  ServiceRefreshChart(WindowHandle(Symbol(), 0), 100);  
 }
void start()
 {
  ServiceStopRefreshChart(WindowHandle(Symbol(), 0));
  while(!IsStopped())
   {
    ...
    Sleep(1000);
   }
 }

 Такая конструкция всегда будет запускать эксперт без тиков.

 
Вадим. выйдите, пожалуйста, в Skype
 
Zhunko:

Это работать не будет. Эммуляция тика для эксперта в ините или старте заканчивается раньше, чем запустится старт

 


Писал навскидку, воткнул Symbol и Period не подумав.

На самом деле Это (заменив символ и период на нужные для данного оффлайн графика) кладется в отдельный скрипт/советник, который вешается на отдельный чарт. Тогда работает (проверил).

 
chief1973:

Здравствуйте

Подскажите, пожалуйста, как сэмулировать тик на offline графике, который запустить функцию start() в советнике на этом графике?

Этот код у меня НЕ работает:


Гоняйте в тестере на "Все тики" и на минутках, используя генетический алгоритм
 
alsu:

Писал навскидку, воткнул Symbol и Period не подумав.

На самом деле Это (заменив символ и период на нужные для данного оффлайн графика) кладется в отдельный скрипт/советник, который вешается на отдельный чарт. Тогда работает (проверил).

Да. Скрипт так будет работать и обновлять чужой график. Отказался от этого года 4 назад. Лишний костыль.
Причина обращения: