MT5 ve trans2quik.dll - sayfa 15

 
Konstantin Nikitin :

Peki, QUIK'ten, bir seçenek olarak gerekli bilgileri dosyadan atabilirsiniz.

Evet, Quick altında uzun zamandır her şey benim için yazılmış, ancak hızlı çalışmıyor,

Daha hızlı yapmak istedim...

 
prostotrader :

Evet, Quick altında uzun zamandır her şey benim için yazılmış, ancak hızlı çalışmıyor,

Daha hızlı yapmak istedim...

Böylece hızlıca, başka bir komut dosyası atabilir ve ihtiyacınız olan bilgiyi sürekli olarak dosyaya yönlendirmesine izin verebilirsiniz. Ve yazılanlar, uygunsa çalışmasına izin verin.

 
prostotrader :

Evet, açıklanacak başka bir şey yok, bekleyen siparişleri olan bir fiş, MT5'te geri arama yok, ancak

Cephanemde bekleyen emirlerin olmasını istiyorum.

Selamlar yerel patronlar. Programlama kalıplarını atlamayı deneyebilirsiniz ( http://cpp-reference.ru/patterns/behavioral-patterns/observer/ )
Ayrıca birkaç pazarı birbirine bağlama konusuyla da ilgileniyorum, size bağlantınızı sormak istedim. Örnekten anladığım kadarıyla tüm bilgileri MT5'ten alıyorsunuz ve hızlı olan sadece Trans2Quick dll üzerinden emir açmak için değil mi?

Yoksa hızlı bir şekilde biraz daha bilgi almaya mı çalışacaksın? Hatırladığım kadarıyla, hızlıdan veri almak için lua ile çalışmak daha iyidir, ancak orada terminal ile yerleştirmeyi tekrar artırmanız gerekecek ...

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

Selamlar yerel patronlar. Programlama kalıplarını atlamayı deneyebilirsiniz ( http://cpp-reference.ru/patterns/behavioral-patterns/observer/ )
Ayrıca birkaç pazarı birbirine bağlama konusuyla da ilgileniyorum, size bağlantınızı sormak istedim. Örnekten anladığım kadarıyla tüm bilgileri MT5'ten alıyorsunuz ve hızlı olan sadece Trans2Quick dll üzerinden siparişleri açmak için değil mi?

Yoksa hızlı bir şekilde biraz daha bilgi almaya mı çalışacaksın? Hatırladığım kadarıyla, hızlıdan veri almak için lua ile çalışmak daha iyidir, ancak orada terminal ile yerleştirmeyi tekrar artırmanız gerekecek ...

Her şeyin DDE tarafından yazıldığını zaten yazdım - Programım trans2quik.dll

Ancak bu kombinasyon yeterince hızlı çalışmıyor (hızlılığın MT5'in gerisinde nasıl kaldığını sipariş defterinde gözle görebilirsiniz).

MT5 üzerinden piyasa verilerini almak, trans2quik.dll üzerinden emir göndermek istedim,

ama depoyu unuttum, sadece çabucak alınabilir.

Ayrıca "bir mutfak bahçesini çitle çevirmek" - isteksizlik.

 

İnşaatta bir "pencere" vardı ve verileri MT5'ten gerçek zamanlı olarak dışa aktarmaya devam etmeye karar verdi.

PostMessageW aracılığıyla dışa aktarma uygulandı, yeterince hızlı çalışıyor, ancak bazen veriler "yapışıyor".

danışman kodu

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

Uygulama Kodu (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.

İlk başta DOUBLE almanın bir bölme hatası olduğunu düşündüm, ancak MT5'te sayı 10 ile n'nin kuvveti ile çarpılır,

ve uygulamada, elde edilen sayı 10'a n'nin kuvvetine bölünebilir.

Herhangi bir hata olmamalıdır.

Belki yanlış bir şey yapıyorum?

(derlenmiş uygulama ekte)

Katma

Bu yüzden mi?


Dosyalar:
Mess_test.zip  997 kb
 

her şey çalışıyor



Avantajlar

1. Dışa aktarma çok hızlı çalışır ve terminali veya sistemi yüklemez

2. Minimum kod.

3. Özel DLL gerekmez

Dezavantajları

1. Yalnızca LONG, ULONG, DOUBLE (sayı değeriyle sınırlıdır) ve 127 bit'e kadar ANSI metni (yalnızca İngilizce) iletilebilir

Katma

Depozito ile PostMessage göndermek için LUA aracılığıyla Hızlı'da kalır.

PostMessage from Quick'i (LUA) kimse denemedi mi?

Bu, EBS hesapları için gereklidir.

 
prostotrader :

her şey çalışıyor

Ve daha ayrıntılı olarak, nasıl kullanılır, ne yapılır?

 
Aleksey Vyazmikin :

Ve daha ayrıntılı olarak, nasıl kullanılır, ne yapılır?

Tüm bu "hileler", Quick on EBS hesapları üzerinden alım satım yapmak için (veya MT5 dışında gerçek zamanlı veri analizi için) gereklidir.

Yavaş bir QUIK'ten DDE aracılığıyla uygulamanıza veri çıkışı yapmak çok yavaştır ,

bu nedenle, verileri MT5'ten alıyoruz ve API'leri (trans2quik.dll) aracılığıyla Quick'a ticaret emirleri gönderiyoruz.

mekanizma

МТ5 --> Kendi uygulamanız <--> trans2quik.dll <--> Hızlı

İşte hisse senetlerine karşı Hızlı vadeli işlemlere bir örnek


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

Tüm bu "hileler", Quick on EBS hesapları üzerinden alım satım yapmak için (veya MT5 dışında gerçek zamanlı veri analizi için) gereklidir.

Yavaş bir QUIK'ten DDE aracılığıyla uygulamanıza veri çıkışı yapmak çok yavaştır,

bu nedenle, verileri MT5'ten alıyoruz ve API'leri (trans2quik.dll) aracılığıyla Quick'a ticaret emirleri gönderiyoruz.

mekanizma

МТ5 --> Kendi uygulamanız <--> trans2quik.dll <--> Hızlı

İşte hisse senetlerine karşı Hızlı vadeli işlemlere bir örnek


Bu özel görev için borsaya ikinci bir MT5 terminali koymak ve PIPE kanalı aracılığıyla iki terminal arasında bilgi aktarmak daha kolay değil mi?

Bu sene borsayı tam olarak bu şemaya göre yapacağım.

 
Dmi3 :

Bu özel görev için borsaya ikinci bir MT5 terminali koymak ve PIPE kanalı aracılığıyla iki terminal arasında bilgi aktarmak daha kolay değil mi?

Bu sene borsayı tam olarak bu şemaya göre yapacağım.

Daha da fazla "basur" sunuyorsunuz, EBS hesabı iyi çünkü para bölümlere ayrılmamış.

Videoda gördükleriniz - işe yarıyor ama çok yavaş !

Hızlı --> DDE --> Uygulamam <--> trans2quik.dl <--> Hızlı

Quick --> DDE --> ' yi MT5 --> PostMessage --> ile değiştirdim

Çok daha hızlı oldu.

Aynı zamanda 2 satır kod ve terminale ve sisteme yük olmaz.

İleti geçişi

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

mesaj alma

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;
Neden: