Разработка советника для опционов с управляющей DLL на DELPHI6

 

Как то искал советники по опционам, так и не нашел даже принципа работы, либо сигнал на email, либо сторожить Алерты, цель такая - пусть комп работает, он умный. С обновлением MQL4 появились возможности взаимодействия с другими программами (там нет запуска и механизма - только через dll, а Delphi (СИ для меня сложно) представляет возможность в DLL открыть окно (Form) и управлять переменными ( я так думаю), правда я не понимаю зачем тут классы (пока не могу понять). при работе с опционами мы(может только я) работаем на экране через личный кабинет. Пытаясь запросить дескриптор окна(в приложениях WINSIGHT32 и UISpy-разные значения(а также прямым запросом через API), родительское окно  и то не сходится , не говоря уже о дочерних. А если нет обработчика сообщений?) , а тем более кнопки на окне для меня оказалось сложной задачей, нашел в API функцию виртуальной мыши. Все самые сложные решения оказываются настолько простыми(как аксиомы наверно). Суть идеи такова: из MQL советника по его сигналу обращаемся к функции DLL, которая по алгоритму нажмет нужные кнопки.

Задачи:

По тестировании советник не все определяет- при спреде не все однозначно, цены(на Альпари пробовал) идут по ASKу и наполовину с BIDом и то не всегда, пляшут

самопроизвольный переход в окне  опционов с одной валюты на другую(на 60сек-10мин)(может быть проблемой и как контролировать сей баг?,загрузка занимает некоторое время) (решить надо за некоторое время до прихода ожидаемого сигнала , в принципе вопрос снят)

советник 5 минутный (работаем по 10 мин, на минутку надо свечи по тику и делать тестер (для одного это год ума))  с месячным доходом не менее 60%(60% - на одном месте стоять)

Итог:

Возможность работать с DLL у  MQL есть.

 Идея взаимодействия и управления - есть.

Просьба  -помочь в некоторых нюансах кода (прописаны в комментариях) и все.

код для будущей DLL:

 

unit Unit1;
// программный блок для разработки кода библиотеки для взаимодействия с MQL
// программой  для работы с опционами
// с вызовом из  советника с внешним воздействием на
// торговую программу при помощи виртуальной мыши (функции API mouse_event)
// с предварительным определением и тестирования координат управляемых кнопок,
// тестирования последовательности выбора функций управления без вмешательства
// ползователя ,без определения дескрипторов окон
interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls, Types;

type
  TForm1 = class(TForm)
    Button1: TButton;
    Button2: TButton;
    Label1: TLabel;
    Label2: TLabel;
    Label3: TLabel;
    Label4: TLabel;
    Label5: TLabel;
    Button3: TButton;
    Button4: TButton;
    Button5: TButton;
    Button6: TButton;
    Button7: TButton;
    Button8: TButton;
    Button9: TButton;
    Button10: TButton;

    procedure Button1Click(Sender: TObject);
    procedure Button2Click(Sender: TObject);
    procedure Button10Click(Sender: TObject);

  private
    { Private declarations }
  public
    { Public declarations }

  end;
 var
  Form1: TForm1;
implementation
 var
   pos:PPoint; // тип находится в Types
   pMsg:TMsg;

 {$R *.dfm}
// определяем координаты точки взаимодействия для передачи фокусу выбранному окну
// выбираем верхнюю планку подконтрольного окна, подконтрольное окно не загораживать
// на двух мониторах функция работает,
// для фиксации значений нажать левую кнопку мыши на область Rect исполнения
procedure TForm1.Button1Click(Sender: TObject);
var
 x,y:integer;
 x1,y1:integer;

begin
  New(pos);
  GetCursorPos(pos^); // запоминаем положение курсора
  x1:=pos.X;
  y1:=pos.Y;

  while (true)   do // цикл определений позиций- выход левая кнопка мыши
  begin
  GetCursorPos(pos^);

  Label4.Caption:=IntTostr(pos.x);  //для информации и визуального наблюдения и последущей обработки
  Label5.Caption:=IntTostr(pos.y);  //при выходе за пределы окна значения останавливаются- не  решено
  if GetMessage(pMsg, 0, 0, 0) then
           begin
           if pMsg.wParam= MK_LBUTTON then break;  // при наведение на желаемую точку,
                                                   // фиксируем значение левой кнопкой мыши и выходим
           TranslateMessage(pMsg);                // где-то подвох, по второму заходу не проходит
           DispatchMessage(pMsg);                 // видимо нет обработки, API - немного сложно
           end;
  end;
  SetCursorPos(x1,y1); // возвращаем курсор на кнопку
  Form1.SetFocus;   // на немодальном если окно полузакрыто другим окном, рабочее окно никак не сверху
  Dispose(pos);
end;

procedure TForm1.Button2Click(Sender: TObject);

begin

end;

//   тест фокуса окна с исполнением нажатия левой кнопки мыши и возвратом курсора
procedure TForm1.Button10Click(Sender: TObject);
var
 x,y:integer;
 x1,y1:integer;
begin
  New(pos);
  GetCursorPos(pos^); //запоминаем
  x1:=pos.X;
  y1:=pos.Y;
  x:=StrToInt(Label4.Caption);
  y:=StrToInt(Label5.Caption);
  Sleep(500);
  SetCursorPos(x,y); //устанавливаем на позицию (работает на двух экранах)
  Sleep(500);        // если быстро не понять
  mouse_event( MOUSEEVENTF_LEFTDOWN, 0,0,0,0);//нажимаем
  Sleep(500);
  mouse_event( MOUSEEVENTF_LEFTUP, 0,0,0,0); //отпускаем
  Sleep(500);
  SetCursorPos(x1,y1);  // возвращаем на место
  Form1.SetFocus; //фокус передается , если окно полузакрыто,
                 //оно так и остается пока мышкой не нажмешь,надо решить проблему, не пойму
  Dispose(pos);
end;

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