Ошибки, баги, вопросы - страница 3470

 
fxsaber #:

Пожалуйста, используйте правильную сигнатуру функции.

с верной сигнатурой индикаторы отдавшие INIT_FAILED остаются висеть в списке окна индикаторов.

может быть всего-то ошибка при построении списков индикаторов, кто-же знает :-) нехорошо это..

по идее, отчасти проверить : скрипт/советник/другой_индикатор получающий (и пытающийся использовать) из чарта хендл индикатора, который заведомо ранее выдал INIT_FAILED.

но такие тесты должны были делать MQ и со своей внутренней кухней. У нас только косвенные признаки большого бага

 
Maxim Kuznetsov #:

с верной сигнатурой индикаторы отдавшие INIT_FAILED остаются висеть в списке окна индикаторов.

Код?
 

Форум по трейдингу, автоматическим торговым системам и тестированию торговых стратегий

Ошибки, баги, вопросы

fxsaber, 2024.01.26 23:38

Прошу помощи по WinAPI.
#include <WinAPI\WinAPI.mqh>

#define GA_ROOT          0x0002
#define LVM_GETITEMCOUNT 0x1004

void OnStart()
{  
  HANDLE Handle = user32::GetAncestor(::ChartGetInteger(0, CHART_WINDOW_HANDLE), GA_ROOT);
  Handle = user32::GetDlgItem(Handle, 0xE81E);
  Handle = user32::GetDlgItem(Handle, 0x804E);
  Handle = user32::GetDlgItem(Handle, 0x28ED);

  long PrevCount = 0;
  
  while (!IsStopped())
  {
    const long Count = user32::SendMessageW(Handle, LVM_GETITEMCOUNT, 0, 0); // Количество элементов во вкладке Journal.
    
    if (Count != PrevCount)     // Если количество записей во вкладке Journal изменилось,   
      Alert(PrevCount = Count); // алертим.
      
    Sleep(100);
  }
}

Этот скрипт алертит, когда во вкладке Journal Тестера меняется количество записей.


Если нажимать на кнопку Start при активной Journal-вкладке, то скрипт правильно алертит.

Если же выбрана другая вкладка, то алерта нет, пока не переключишься на Journal.

Как заставить обновляться Journal, когда он не выбран (или выбрать его, чтобы он обновился)?


Просьба поделиться скринами панельки Тестера.

Хочется понять, зависят ли ее размеры от конфигурации ОС. Спасибо.

 
Не получается подписаться на бесплатные сигналы. В мт4 отсутствует вкладка "Сигналы".
 
fxsaber #:

Просьба поделиться скринами панельки Тестера.

Хочется понять, зависят ли ее размеры от конфигурации ОС. Спасибо.

Вот три варианта возможных вкладок


Очень даже зависят.

Зависят не от конфигурации, а от разрешения экрана и от языка терминала, точнее от количества букв в названиях вкладок.

Столкнулся с проблемой определения координат вкладок тестера, когда запустил прогу (которая правильно работала на компе) на сервере (на сервере работать не захотела).

Там совсем другое разрешение экрана оказалось.

Я тогда всё сделал через *опу, но оно работало.

   long handleMenu, handleID, handleDlg;
   int ControlID[] = {0xE81E, 0x804E}; // Spy++ ControlID, (0xE81E это инструменты)(0x804E это тестер стратегий), (0x2712 это строка - обзор, настройки, параметры,агенты..)
   handleID = GetHandle(Handle, ControlID);// нашли хэндл тестер стратегий

   RECT rtTul;
   user32::GetClientRect(Handle,  rtTul);//размер всего тулбара 1900/21

   int ControlID3[] = {0xE81E, 0x804E, 0x2712, 0x58D};
   long z = GetHandle(Handle, ControlID3);
   RECT rtButon;
   user32::GetClientRect(z,  rtButon);//размер тулбара с кнопками 206/23

   int ControlID4[] = {0xE81E, 0x804E, 0x2712, 0xFFFF};
   long b = GetHandle(Handle, ControlID4);
   RECT rtNull;
   user32::GetClientRect(b,  rtNull);//размер тулбара пустого 1340/20

   long c = 0;
   if(rtTul.right - rtNull.right > 0)
      c = (long)((rtTul.right - rtNull.right) / 9 * 3); //(весь туллбар-пустойтуллбар)/2,23 коэфф координаты кнопки бэктест.  560/2,23=251
   else
      c = (long)(rtTul.right / 9 * 4);

   handleID =  user32::GetDlgItem(handleID, 0x2712); // нашли хэндл строки с "обзор, настройки, параметры,агенты.."

   long handleTemp = user32::GetLastActivePopup(Handle);
   Error = 0;
   while(!IsStopped() && user32::GetLastActivePopup(Handle) == handleTemp)
     {
      user32::SendMessageW(handleID, WM_LBUTTONDOWN, 1, c);//выбрали вкладку  0xB0100 - "Бэктест", 0x600D8 - "Backtest",  ControlID 0xA00AD кнопки "Параметры",  0x7005C - "Настройки"
      user32::PostMessageW(Handle, WM_COMMAND, 33420, 0); // открыли форму сохранения файла, 33420 команда "Сохранить" отчёт HTML,  33419 Open XML
      Sleep(1000);
      c += 50;// если не угадали положение кнопки бэктест, сдвинемся на 50 пикселей и попробуем ещё раз
      Error++;
      if(Error >= 100)
        {
         WritingFile("Не удалось найти дескриптор строки, в которую вставляем имя файла" + "; LINE " + (string)__LINE__);
         return false;
        }
     }
   handleTemp = user32::GetLastActivePopup(Handle);
Сейчас бы просто сдвигал координаты, пока на открытой вкладке не появятся какие нибудь слова или кнопки, по которым можно понять, что открыта нужная мне вкладка.
 
fxsaber #:
Код?
#property indicator_chart_window
#property indicator_buffers 1
#property indicator_plots 1

#property strict

int OnInit()
{
    PrintFormat("OnInit() returning: INIT_FAILED: %d", INIT_FAILED);
    return INIT_FAILED;
}
void OnDeinit(const int reason) {
   PrintFormat("OnDeinit() with reason: %d", reason);
}
int OnCalculate(const int rates_total,
                const int prev_calculated,
                const datetime &time[],
                const double &open[],
                const double &high[],
                const double &low[],
                const double &close[],
                const long &tick_volume[],
                const long &volume[],
                const int &spread[]) 
{
   return(rates_total);
}

 
fxsaber #:


Так тоже не работает.


В архитектуре индикаторов вы разбираетесь хорошо, с этим не спорю.

А вот понять о чём пишут пользователи форума у вас получается не очень.

Другой причины ваших не рабочих советов я не вижу.

 
Aleksandr Slavskii #:

А вот понять о чём пишут пользователи форума у вас получается не очень.

Напишите, что нужно получить.

 
Aleksandr Slavskii #:

Вот три варианта возможных вкладок

Дополню.


Зависят не от конфигурации, а от разрешения экрана

С этим на сталкивался.

Я тогда всё сделал через *опу, но оно работало.

Спасибо за код.

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

Сложно идентифицировать, что открыта вкладка Journal.

 
Aleksandr Slavskii #:

Так ответили ведь уже, что так было задумано изначально.

а теперь фанфары !

#property copyright "Maxim A.Kuznetsov"
#property link      "https://www.luxtrade.tk"
#property version   "1.00"
//+------------------------------------------------------------------+
//| Script program start function                                    |
//+------------------------------------------------------------------+
void OnStart()
{
   int total=ChartIndicatorsTotal(0,0);
   for(int i=0;i<total;i++) {
      string name=ChartIndicatorName(0,0,i);
      if (name==NULL || name=="") continue;
      PrintFormat("Indicator %d %s",i,name);
      int handle=ChartIndicatorGet(0,0,name);
      if (handle!=INVALID_HANDLE) {
         PrintFormat("ChartIndicatorGet OK!");
         IndicatorRelease(handle);
      } else {
         PrintFormat("ChartIndicatorGet failed with error %d",GetLastError());
      }
   }
}

Хендл нормально получается. Без ошибок. Для индикатора который вернул INIT_FAILED в OnInit и не вызывал SetIndexBuffer

Эффективный менеджмент - исправлять то что за 20 лет работало