MT5 및 trans2quik.dll - 페이지 15

 
Konstantin Nikitin :

음, QUIK에서 옵션으로 파일을 통해 필요한 정보를 버릴 수 있습니다.

예, 모든 것이 Quick에서 오랫동안 저를 위해 작성되었지만 빨리 작동하지 않습니다.

빨리 하고 싶었는데...

 
prostotrader :

예, 모든 것이 Quick에서 오랫동안 저를 위해 작성되었지만 빨리 작동하지 않습니다.

빨리 하고 싶었는데...

따라서 빠른 시간에 다른 스크립트를 던져서 필요한 정보를 파일에 지속적으로 입력하도록 할 수 있습니다. 그리고 기록된 내용이 적합하다면 작동하도록 하십시오.

 
prostotrader :

예, 다른 설명할 것이 없습니다. 주문이 보류 중인 플러그 , MT5에는 콜백이 없습니다. 하지만

내 무기고에 보류 중인 주문을 갖고 싶습니다.

지역 고객 여러분께 인사드립니다. 프로그래밍 패턴( http://cpp-reference.ru/patterns/behavioral-patterns/observer/ )을 통해 우회를 시도할 수 있습니다.
나는 또한 여러 시장을 연결하는 주제에 관심이 있습니다. 귀하의 연결에 대해 묻고 싶습니다. 예제에서 알 수 있듯이 모든 정보는 MT5에서 가져오고 퀵은 Trans2Quick dll을 통해 주문을 여는 데만 사용됩니다. 그렇죠?

아니면 빠른 정보에서 더 많은 정보를 가져오시겠습니까? 내가 기억하는 한 빠른에서 데이터를 얻으려면 lua를 통해 작업하는 것이 좋지만 거기에서 터미널과의 도킹을 다시 늘려야합니다 ...

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

지역 고객 여러분께 인사드립니다. 프로그래밍 패턴( http://cpp-reference.ru/patterns/behavioral-patterns/observer/ )을 통해 우회를 시도할 수 있습니다.
나는 또한 여러 시장을 연결하는 주제에 관심이 있습니다. 귀하의 연결에 대해 묻고 싶습니다. 예제에서 알 수 있듯이 MT5에서 모든 정보를 얻을 수 있고 퀵은 Trans2Quick dll을 통해 주문을 여는 데만 사용되는 것 아닌가요?

아니면 빠른 정보에서 더 많은 정보를 가져오시겠습니까? 내가 기억하는 한 빠른에서 데이터를 얻으려면 루아를 통해 작업하는 것이 더 좋지만 거기에서 터미널과의 도킹을 다시 늘려야합니다 ...

나는 이미 모든 것이 DDE에 의해 작성되었다고 썼습니다 - 내 프로그램은 trans2quik.dll입니다.

그러나 이 조합은 충분히 빠르게 작동하지 않습니다.

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);
  }  
//+------------------------------------------------------------------+

애플리케이션 코드 (델파이 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 텍스트(영어로만 제공)만 전송할 수 있습니다.

추가됨

PostMessage를 보증금과 함께 보내기 위해 LUA를 통해 Quick에 남아 있습니다.

아무도 Quick(LUA)에서 PostMessage를 시도하지 않았습니까?

EBS 계정에 필요합니다.

 
prostotrader :

모든 것이 작동 중입니다.

그리고 더 자세하게, 그것을 사용하는 방법, 무엇을해야합니까?

 
Aleksey Vyazmikin :

그리고 더 자세하게, 그것을 사용하는 방법, 무엇을해야합니까?

이러한 모든 "트릭"은 Quick on EBS 계정을 통한 거래(또는 MT5 외부의 실시간 데이터 분석)에 필요합니다.

DDE를 통해 느린 QUIK에서 애플리케이션으로 데이터를 출력하는 것은 매우 느립니다 .

따라서 우리는 MT5에서 데이터를 가져와 API(trans2quik.dll)를 통해 Quick에 거래 주문 을 보냅니다.

메커니즘은

МТ5 --> 자체 애플리케이션 <--> trans2quik.dll <--> 빠른

다음은 주식에 대한 빠른 선물 거래의 예입니다.


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

이러한 모든 "트릭"은 Quick on EBS 계정을 통한 거래(또는 MT5 외부의 실시간 데이터 분석)에 필요합니다.

DDE를 통해 느린 QUIK에서 애플리케이션으로 데이터를 출력하는 것은 매우 느립니다.

따라서 우리는 MT5에서 데이터를 가져와 API(trans2quik.dll)를 통해 Quick에 거래 주문 을 보냅니다.

메커니즘은

МТ5 --> 자체 애플리케이션 <--> trans2quik.dll <--> 빠른

다음은 주식에 대한 빠른 선물 거래의 예입니다.


이 특정 작업을 위해 두 번째 MT5 단말기를 주식 시장에 올리고 PIPE 채널을 통해 두 단말기 간에 정보를 전송하는 것이 더 쉽지 않습니까?

나는 이 계획에 따라 정확히 올해 주식 시장을 할 것입니다.

 
Dmi3 :

이 특정 작업을 위해 두 번째 MT5 단말기를 주식 시장에 놓고 PIPE 채널을 통해 두 단말기 간에 정보를 전송하는 것이 더 쉽지 않습니까?

나는 이 계획에 따라 정확히 올해 주식 시장을 할 것입니다.

당신은 더 많은 "치질"을 제공하고, 돈이 섹션으로 분할되지 않기 때문에 EBS 계정이 좋습니다.

비디오에서 본 것 - 작동하지만 매우 느립니다 !

빠른 --> DDE --> 내 응용 프로그램 <--> trans2quik.dl <--> 빠른

나는 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;
사유: