MT5和trans2quik.dll - 页 15

 
Konstantin Nikitin:

那么,你可以通过文件从QUIK发送必要的信息,作为一种选择。

是的,TSU我在很久以前就写好了所有的快报,但它的效果并不快。

我想让它变得更快...

 
prostotrader:

是的,TSU我在很久以前就写好了所有的快报,但它的效果并不快。

我想让它变得更快...

你可以在Quicksilver中再扔一个脚本,让它不断地把你需要的信息输入文件。而所写的东西,如果适合你,就让它按原样运作。

 
prostotrader:

现在还没有什么可以解释的,挂单 有问题,MT5中没有回调。

我想在我的阿森纳中拥有待定的订单。

问候当地的常客们。你可以试试编程模板(http://cpp-reference.ru/patterns/behavioral-patterns/observer/)
我也对几个市场的联系感兴趣,我想问问你们的联系。根据我对例子的理解,所有的信息都是从MT5获得的,快速视图只用于通过Trans2Quick dll开立订单,对吗?

或者你会尝试使用另一种方式来接收来自经纪商的数据?我记得用lua从Quicksilver获取数据更好,但你必须增加与终端的连接......。

Паттерн (шаблон) проектирования Observer (наблюдатель)
Паттерн (шаблон) проектирования Observer (наблюдатель)
  • cpp-reference.ru
Паттерн Observer определяет зависимость "один-ко-многим" между объектами так, что при изменении состояния одного объекта все зависящие от него объекты уведомляются и обновляются автоматически. Паттерн Observer инкапсулирует главный (независимый) компонент в абстракцию Subject и изменяемые (зависимые) компоненты в иерархию Observer. Паттерн...
 
Andrey Azatskiy:

来自当地常客的问候。你可以尝试使用编程模板(http://cpp-reference.ru/patterns/behavioral-patterns/observer/)
我对连接几个市场的问题也很感兴趣,我想问问你的连接情况。根据我对例子的理解,所有的信息都是从MT5获得的,快速视图只用于通过Trans2Quick dll开立订单,对吗?

或者你会尝试使用另一种方式从经纪人那里接收数据?我记得用lua来接收Quicksilver的数据比较好,但你必须增加与终端的连接......。

我已经写过了,我通过DDE写了一切 - 我的程序 - trans2quik.dll

但这种组合的工作速度不够快(通过眼睛你可以看到quik在堆栈中落后于MT5)。

我想通过MT5接收市场数据,通过trans2quik.dll发送订单。

但我忘记了库房的事,它只能从快速查看中获得。

我不想再往下说了。

 

建设中出现了一个 "窗口",我决定继续从MT5实时导出数据。

我已经实现了postMessageW导出,它的工作速度足够快,但有时数据会被 "卡住"。

专家顾问代码

//+------------------------------------------------------------------+
//|                                                     PostMess.mq5 |
//|                                      Copyright 2021 prostotrader |
//|                                             https://www.mql5.com |
//+------------------------------------------------------------------+
#property copyright "Copyright 2021 prostotrader"
#property link      "https://www.mql5.com"
#property version   "1.00"

#define  HANDLE  long
#define  PVOID   long
#define  WM_USER 0x400
#define  WM_PR_ASK WM_USER + 10
#define  WM_PR_BID WM_USER + 20

#import "User32.dll"
bool PostMessageW(HANDLE hWnd, uint Msg, PVOID wParam, PVOID lParam);
#import

input long HWND = 111111111; //Hahdle window

PVOID wPar, lPar;
HANDLE Wnd;

//+------------------------------------------------------------------+
//| Expert initialization function                                   |
//+------------------------------------------------------------------+
int OnInit()
  {
   Wnd = HWND;
   wPar = Digits();
   return(INIT_SUCCEEDED);
  }
//+------------------------------------------------------------------+
//| OnTick function                                                  |
//+------------------------------------------------------------------+
void OnTick()
  {
   lPar = 0;
   double s_ask = SymbolInfoDouble(Symbol(), SYMBOL_ASK);
   if(wPar > 0)
     {
      double a_val = MathPow(10, double(wPar));
      lPar = long(s_ask * a_val);
     }
   else
      lPar = long(s_ask);
   bool result = PostMessageW(Wnd, WM_PR_ASK, wPar, lPar);
//---
   lPar = 0;
   s_ask = SymbolInfoDouble(Symbol(), SYMBOL_BID);
   if(wPar > 0)
     {
      double a_val = MathPow(10, double(wPar));
      lPar = long(s_ask * a_val);
     }
   else
      lPar = long(s_ask);
   result = PostMessageW(Wnd, WM_PR_BID, wPar, lPar);
  }  
//+------------------------------------------------------------------+

应用程序代码 (Delphi XE4)。

unit Main;

interface

uses
  Winapi.Windows, Winapi.Messages, System.SysUtils, System.Variants, System.Classes, Vcl.Graphics,
  Vcl.Controls, Vcl.Forms, Vcl.Dialogs, Vcl.StdCtrls, System.Math;

const
  WM_PR_ASK = WM_USER + 10;
  WM_PR_BID = WM_USER + 20;

type
  TForm1 = class(TForm)
    Label1: TLabel;
    Label2: TLabel;
    Label3: TLabel;
    procedure FormCreate(Sender: TObject);
  private
    procedure ResiveMessPrAsk(var Msg: TMessage); message WM_PR_ASK;
    procedure ResiveMessPrBid(var Msg: TMessage); message WM_PR_BID;
  public

    { Public declarations }
  end;

var
  Form1: TForm1;

implementation

{$R *.dfm}

procedure TForm1.FormCreate(Sender: TObject);
begin
  Label1.Caption:= 'Handle: ' + intToStr(integer(Form1.Handle));
end;

procedure TForm1.ResiveMessPrAsk;
var
  a_ask: double;
begin
  if(Msg.WParam > 0) then
  begin
    a_ask:= IntPower(10, Msg.WParam);
    a_ask:= Msg.lParam/a_ask;
  end else
  begin
    a_ask:= Msg.lParam;
  end;
  Label2.Caption:= 'Ask: ' + FloatToStr(a_ask);
  Label2.Update();
end;

procedure TForm1.ResiveMessPrBid;
var
  a_bid: double;
begin
  if(Msg.WParam > 0) then
  begin
    a_bid:= IntPower(10, Msg.WParam);
    a_bid:= Msg.lParam/a_bid;
  end else
  begin
    a_bid:= Msg.lParam;
  end;
  Label3.Caption:= 'Bid: ' + FloatToStr(a_bid);
  Label3.Update();
end;

end.

起初我以为这是一个除法错误,要得到DOUBLE,但MT5将数字乘以10的n次方。

而在应用程序中,所得数字被10除以n的幂。

不应该有错误。

也许我做错了什么?

(附汇编附录)

由以下人员添加

是因为这个原因吗?


附加的文件:
Mess_test.zip  997 kb
 

一切顺利



的优势

1 出口工作非常快不会加载 终端或系统

2.最小的代码。

3.不需要DLL。

劣势

1.你只能传输LONG、ULONG、DOUBLE(有数值限制)和最多127位的ANSI文本(仅限英文)。

添加

剩下的就是通过LUA向Quickie发送带有存款的PostMessage。

有人试过从Quick (LUA)的PostMessage吗?

这对于EBS账户来说是需要的。

 
prostotrader:

一切正常。

你能告诉我更多关于如何使用它,该怎么做吗?

 
Aleksey Vyazmikin:

你能告诉我更多关于如何使用和如何做吗?

所有这些 "小工具 "都是在EBS账户上通过Quick进行交易所需要的(或在MT5之外进行实时数据分析)。

通过DDE从慢速KVIK输出到我的应用程序的数据非常慢

所以数据来自MT5,交易订单 通过他们的API(trans2quik.dll)发送到Kvik。

机制是

MT5 --> 自己的应用程序 <-> trans2quik.dll <-> Quick

下面是一个快速期货与股票交易的例子


Документация по MQL5: Константы, перечисления и структуры / Торговые константы / Типы торговых операций
Документация по MQL5: Константы, перечисления и структуры / Торговые константы / Типы торговых операций
  • www.mql5.com
Типы торговых операций - Торговые константы - Константы, перечисления и структуры - Справочник MQL5 - Справочник по языку алгоритмического/автоматического трейдинга для MetaTrader 5
 
prostotrader:

所有这些 "小工具 "都是在EBS账户上通过QuickBooks进行交易所需要的(或者用于MT5以外的实时数据分析)。

通过DDE从慢速Quik输出到你的应用程序的数据是非常慢的。

所以数据来自MT5,交易订单 通过他们的API(trans2quik.dll)发送到Kvik。

机制是

MT5 --> 自己的应用程序 <-> trans2quik.dll <-> Quick

下面是一个在Kvik中进行期货与股票交易的例子


把第二个MT5终端放到股市上,通过PIPE通道在两个终端之间传递信息,不是更容易完成这个具体任务吗?

我今年要按照这个计划做股票市场。

 
Dmi3:

把第二个MT5终端放在股市上,通过PIPE通道在两个终端之间传输信息来完成这一特定任务不是更容易吗?

我准备按照这个计划做今年的股市。

你提出的是一个更大的 "烂摊子",EBS账户是好的,因为钱没有被分成几部分。

你在视频中看到的东西是有效的,但非常慢!你可以在视频中看到。

Quick --> DDE --> My pad <->trans2quik.dl<-> Quick

我把Quick --> DDE -->改为 MT5 --> PostMessage -->。

它变得更快。

也就是说,2行代码,对终端和系统没有任何负担。

信息发送

//+------------------------------------------------------------------+
//| OnBookvent function                                              |
//+------------------------------------------------------------------+
void OnBookEvent(const string &symbol)
{
  if(symbol == Symbol())
  {
    GetBook(Symbol(), book_data);
    if((book_data.ask_vol > 0) && (book_data.bid_vol > 0))
    {
      lPar = 0;
      wPar = 0;
      long a_vol = book_data.ask_vol;
      wPar += a_vol<<=8;
      long a_val = long(MathPow(10, double(s_digits)));
      lPar = long(NormalizeDouble((book_data.ask * a_val), 0));
      wPar += ulong(s_digits);
      bool result = PostMessageW(Wnd, WM_PR_ASK, wPar, lPar);
      lPar = 0;
      wPar = 0;
      a_vol = book_data.bid_vol;
      wPar += a_vol<<=8;
      a_val = long(MathPow(10, double(s_digits)));
      lPar = long(NormalizeDouble((book_data.bid * a_val), 0));
      wPar += ulong(s_digits);
      result = PostMessageW(Wnd, WM_PR_BID, wPar, lPar);
      lPar = 0;
      wPar = 0;
      double last = NormalizeDouble(SymbolInfoDouble(Symbol(), SYMBOL_LAST), s_digits);
      a_val = long(MathPow(10, double(s_digits)));
      lPar = long(NormalizeDouble(last * a_val, 0));
      wPar += ulong(s_digits);
      result = PostMessageW(Wnd, WM_LAST, wPar, lPar);
      lPar = 0;
      wPar = 0;
      double f_money = NormalizeDouble(AccountInfoDouble(ACCOUNT_MARGIN_FREE), 2);
      a_val = long(MathPow(10, double(2)));
      lPar = long(NormalizeDouble(f_money * a_val, 0));
      wPar += 2;
      result = PostMessageW(Wnd, WM_FREE_MONEY, wPar, lPar);
    }
  }  
} 

信息接收

procedure TForm1.AppMessages;
var
  a_value: double;
  s: string;
  i: Integer;
  val, m_val, a_vol: int64;
  is_comma: boolean;
begin
  if(Msg.message = WM_EBS_MONEY) then
  begin
    //beep;
  end else
  begin
    if(Msg.hwnd = Handle) then      //Check message handle
    case Msg.message of
      WM_NAME:
        begin
          is_comma:= false;
          s:= '';
          for i := 0 to 7 do
          begin
            val:= Msg.wParam;
            val:= (val shr (56 - i*8) and 255);
            if(val = 46) then is_comma:= true;
            if((val >= 45) and (val <= 122)) then
              s:= s + string(AnsiChar(val)) else
              if((val > 0) and (is_comma = false)) then s:= s + IntToStr(val) else
                if(is_comma = true) then s:= s + IntToStr(val);
          end;
          Label1.Caption:= 'Name: ' + s;
          Label1.Update();
        end;
        WM_SPOT_NAME:
        begin
          s:= '';
          if(Msg.wParam > 0) then
          for i := 0 to 7 do
          begin
            val:= Msg.wParam;
            val:= (val shr (56 - i*8) and 255);
            if((val >= 45) and (val <= 122)) then
              s:= s + string(AnsiChar(val));
          end;
          if(Msg.lParam > 0) then
          for i := 0 to 7 do
          begin
            val:= Msg.lParam;
            val:= (val shr (56 - i*8) and 255);
            if((val >= 45) and (val <= 122)) then
              s:= s + string(AnsiChar(val));
          end;
          Label4.Caption:= 'SPOT Name: ' + s;
          Label4.Update();
        end;
      WM_PR_ASK:
        begin
          m_val:= Msg.WParam;
          m_val:= m_val and 255;
          a_vol:= Msg.WParam;
          a_vol:= (a_vol shr 8) and $FFFF;
          if(m_val > 0) then
          begin
            a_value:= IntPower(10, integer(m_val));
            a_value:= Msg.lParam/a_value;
          end else a_value:= Msg.lParam;
          Label2.Caption:= 'Ask: ' + FloatToStr(a_value) + ' Volume: ' + IntToStr(a_vol);
          Label2.Update();
        end;
      WM_PR_BID:
        begin
          m_val:= Msg.WParam;
          m_val:= m_val and 255;
          a_vol:= Msg.WParam;
          a_vol:= (a_vol shr 8) and $FFFF;
          if(m_val > 0) then
          begin
            a_value:= IntPower(10, integer(m_val));
            a_value:= Msg.lParam/a_value;
          end else a_value:= Msg.lParam;
          Label3.Caption:= 'Bid: ' + FloatToStr(a_value) + ' Volume: ' + IntToStr(a_vol);
          Label3.Update();
        end;
      WM_LAST:
        begin
          m_val:= Msg.WParam;
          m_val:= m_val and 255;
          if(m_val > 0) then
          begin
            a_value:= IntPower(10, integer(m_val));
            a_value:= Msg.lParam/a_value;
          end else a_value:= Msg.lParam;
          Label5.Caption:= 'Last: ' + FloatToStr(a_value);
          Label5.Update();
        end;
      WM_FREE_MONEY:
        begin
          m_val:= Msg.WParam;
          m_val:= m_val and 255;
          if(m_val > 0) then
          begin
            a_value:= IntPower(10, integer(m_val));
            a_value:= Msg.lParam/a_value;
          end else a_value:= Msg.lParam;
          Label6.Caption:= 'Free money: ' + FloatToStr(a_value);
          Label6.Update();
        end;
    end;
  end;
end;