Эмуляция тиков из советника/индикатора - страница 5

 
Zhunko:Игорь, такой способ отключения от инета не годится. В таком режиме много чего не работает. Не надо отключать доступ к инету.

нет, его  ког - на первой странице, прекрасно работает в винХР, ты не прав, а вот в вин7 почему-то не захотел у меня работать 

Meat:Есть предположение, что код не работает там, где стоит 64-битная винда. У меня просто 32, поэтому не могу проверить. 

нет, у меня вин7 максимальная 32бит

 
IgorM:

нет, его  ког - на первой странице, прекрасно работает в винХР, ты не прав, а вот в вин7 почему-то не захотел у меня работать 

Игорь, я не про код Алексея, а про отключение от инета.
 
Zhunko:

Как Вы торгуете из тикающего индикатора? В MQL4 не предусмотрено это.

Действительно! Зачем довесок из тикающего индикатора, который не может торговать, если можно всё сделать в зацикленном эксперте? Не нужны будут пляски с WinAPI, не будет тормозить интерфейс МТ4, работать будет в 3 раза быстрее. Зачем так усложнять?

Ладно, оставим этот спор, он всё-равно ни к какому конструктиву не приведёт, скорее наоборот. Вы уже вон начинаете искажать (не знаю, намеренно или нет) смысл написанного мной, я ведь русским языком написал что торгую не из индикатора, а из метатрэйдера, а вы опять про какую-то торговлю из индикатора.  Если вы что-то неверно истолковали из сказанного мной ранее, то объясняю: фраза "индикатор используется в торговле" вовсе не означает, что сделки совершает индикатор.

 
Meat:

Ладно, оставим этот спор, он всё-равно ни к какому конструктиву не приведёт, скорее наоборот. Вы уже вон начинаете искажать (не знаю, намеренно или нет) смысл написанного мной, я ведь русским языком написал что торгую не из индикатора, а из метатрэйдера, а вы опять про какую-то торговлю из индикатора.  Если вы что-то неверно истолковали из сказанного мной ранее, то объясняю: фраза "индикатор используется в торговле" вовсе не означает, что сделки совершает индикатор.

Стало быть, торгует эксперт, получающий сигналы из индикатора? И всё это, разумеется, делает МТ4? Правильно? Если так, то вопрос мой остаётся. Почему бы всё это не поручить эксперту? Это рационально.
 
Zhunko:Игорь, я не про код Алексея, а про отключение от инета.

да я понял, но ведь работает его код при отключенном инете в винхр

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

 
IgorM:

да я понял, но ведь работает его код при отключенном инете в винхр

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

Ну так, я ж выложил код, что работает везде. Одна строка. Без таймера. Во всех индикаторах работает и на любых ОС. Для эксперимента достаточно.

Для эксперта тоже выложил выше. Можно ту строку, что генерирует тик для эксперта подставить в код индикатора. Тогда он будет и эксперта дёргать.

Можно упростить и воспользоваться библиотекой. Там всё уже реализовано. 

 
Zhunko:
Стало быть, торгует эксперт, получающий сигналы из индикатора? И всё это, разумеется, делает МТ4? Правильно? Если так, то вопрос мой остаётся. Почему бы всё это не поручить эксперту? Это рационально.

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

 

Ксати вот ещё что. Строку

TimerCode[byte/4] += (value[i]>>(8*j)&0xFF) <<(byte%4*8);

следует заменить на

TimerCode[byte/4] |= (value[i]>>(8*j)&0xFF) <<(byte%4*8);

Иначе при повторном вызове SetMyTimer произойдёт ошибка.  Ну либо можно просто проинициализировать массив нулём перед началом цикла.

Что касается Win7, то мне так и не удалось воспроизвести проблему на ней, у меня всё работает нормально. А заниматься отладкой вслепую нереально. Интересно, есть тут ещё кто-нибудь, у кого этот код тоже работает на семёрке?  А то такое ощущение, что у меня винда стоит какая-то особенная.

 

Вроде нашёл в чём была ошибка. Вот исправленный вариант функции SetMyTimer.

int SetMyTimer(int interval)
{    
  int MT4InternMsg= RegisterWindowMessageA("MetaTrader4_Internal_Message");
  int hWnd= WindowHandle(Symbol(),Period());
  int PostMsgAddr= GetProcAddress(GetModuleHandleA("user32.dll"),"PostMessageA");
  if (PostMsgAddr==0) return(0);
  // push ebp; move ebp,esp; push 01; push 02; push MT4InternMsg; push hWnd; mov eax,PostMsgAddr; call eax; pop ebp; ret 0010;    
  int value[]={ 0x55, 0x8B,0xEC, 0x6A,01, 0x6A,02, 0x68,0000, 0x68,0000, 0xB8,0000, 0xFF,0xD0, 0x5D, 0xC2,0x10 };
  int len[]=  { 1,    1,   1,    1,   1,  1,   1,  1,   4,    1,   4,    1,   4,    1,   1,    1,    1,   2 };
  value[8]=MT4InternMsg;  value[10]=hWnd;  value[12]=PostMsgAddr; 
  int byte=0;  ArrayInitialize(TimerCode,0);
  for (int i=0;  i<ArraySize(value);  i++)
    for (int j=0;  j<len[i];  j++, byte++)
      TimerCode[byte/4] |= value[i]>>(8*j)&0xFF<<(byte%4*8);

  return ( SetTimer(hWnd, TimerId, interval, TimerCode) );
}

Теперь то должно работать нормально. 

 

неа..., не работает

ошибок в логе нет, даже инет в терминале, по совету Вадима, не отключал - выходной все равно тиков нет

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