MT5 및 trans2quik.dll - 페이지 13

 
BillionerClub :

LUA가 없는 완전한 C++ 코드는 어떻습니까?

따라서 위의 영화관에서 LUA 없이 C++가 아니라 Pascal(Delphi XE4)

 
prostotrader :

따라서 위의 영화관에서 LUA 없이 C++가 아니라 Pascal(Delphi XE4)

브레이크가 방해가 되나요?

거래, 자동 거래 시스템 및 거래 전략 테스트에 관한 포럼

MT5 및 trans2quik.dll

2019.02.15 18:42

당신은 나쁜 꿈으로 Quick을 통한 거래를 단순히 잊을 수 있습니다.

Ордер SRH9 отправлен: 15.02 . 19 20 : 30 : 12
Ордер SRH9 исполнился: 15.02 . 19 20 : 30 : 12 ( 62 мс)
Ордер SBER отправлен: 15.02 . 19 20 : 30 : 12
Ордер SBER исполнился: 15.02 . 19 20 : 30 : 13 ( 562 мс)

Ордер SRH9 отправлен: 15.02 . 19 20 : 30 : 13
Ордер SRH9 исполнился: 15.02 . 19 20 : 30 : 13 ( 250 мс)
Ордер SBER отправлен: 15.02 . 19 20 : 30 : 13
Ордер SBER исполнился: 15.02 . 19 20 : 30 : 14 ( 561 мс)

Ордер SRH9 отправлен: 15.02 . 19 20 : 30 : 14
Ордер SRH9 исполнился: 15.02 . 19 20 : 30 : 14 ( 125 мс)
Ордер SBER отправлен: 15.02 . 19 20 : 30 : 14
Ордер SBER исполнился: 15.02 . 19 20 : 30 : 15 ( 749 мс)

Ордер SRH9 отправлен: 15.02 . 19 20 : 30 : 16
Ордер SRH9 исполнился: 15.02 . 19 20 : 30 : 16 ( 124 мс)
Ордер SBER отправлен: 15.02 . 19 20 : 30 : 16
Ордер SBER исполнился: 15.02 . 19 20 : 30 : 17 ( 999 мс)

Ордер SRH9 отправлен: 15.02 . 19 20 : 31 : 23
Ордер SRH9 исполнился: 15.02 . 19 20 : 31 : 23 ( 125 мс)
Ордер SBER отправлен: 15.02 . 19 20 : 31 : 23
Ордер SBER исполнился: 15.02 . 19 20 : 31 : 24 ( 1560 мс)

Ордер SRH9 отправлен: 15.02 . 19 20 : 31 : 27
Ордер SRH9 исполнился: 15.02 . 19 20 : 31 : 27 ( 109 мс)
Ордер SBER отправлен: 15.02 . 19 20 : 31 : 27
Ордер SBER исполнился: 15.02 . 19 20 : 31 : 28 ( 1014 мс)

Ордер SRH9 отправлен: 15.02 . 19 20 : 31 : 29
Ордер SRH9 исполнился: 15.02 . 19 20 : 31 : 29 ( 187 мс)
Ордер SBER отправлен: 15.02 . 19 20 : 31 : 29
Ордер SBER исполнился: 15.02 . 19 20 : 31 : 30 ( 1202 мс)

Ордер SRH9 отправлен: 15.02 . 19 20 : 31 : 31
Ордер SRH9 исполнился: 15.02 . 19 20 : 31 : 31 ( 202 мс)
Ордер SBER отправлен: 15.02 . 19 20 : 31 : 31
Ордер SBER исполнился: 15.02 . 19 20 : 31 : 32 ( 796 мс)

Ордер SRH9 отправлен: 15.02 . 19 20 : 31 : 32
Ордер SRH9 исполнился: 15.02 . 19 20 : 31 : 33 ( 109 мс)
Ордер SBER отправлен: 15.02 . 19 20 : 31 : 33
Ордер SBER исполнился: 15.02 . 19 20 : 31 : 34 ( 1435 мс)

Ордер SRH9 отправлен: 15.02 . 19 20 : 31 : 36
Ордер SRH9 исполнился: 15.02 . 19 20 : 31 : 36 ( 203 мс)
Ордер SBER отправлен: 15.02 . 19 20 : 31 : 36
Ордер SBER исполнился: 15.02 . 19 20 : 31 : 37 ( 437 мс)

Ордер SRH9 отправлен: 15.02 . 19 20 : 31 : 41
Ордер SRH9 исполнился: 15.02 . 19 20 : 31 : 41 ( 125 мс)
Ордер SBER отправлен: 15.02 . 19 20 : 31 : 41
Ордер SBER исполнился: 15.02 . 19 20 : 31 : 42 ( 873 мс)

Ордер SRH9 отправлен: 15.02 . 19 20 : 31 : 42
Ордер SRH9 исполнился: 15.02 . 19 20 : 31 : 42 ( 109 мс)
Ордер SBER отправлен: 15.02 . 19 20 : 31 : 42
Ордер SBER исполнился: 15.02 . 19 20 : 31 : 43 ( 687 мс)

Ордер SRH9 отправлен: 15.02 . 19 20 : 31 : 51
Ордер SRH9 исполнился: 15.02 . 19 20 : 31 : 51 ( 140 мс)
Ордер SBER отправлен: 15.02 . 19 20 : 31 : 51
Ордер SBER исполнился: 15.02 . 19 20 : 31 : 51 ( 312 мс)

Ордер SRH9 отправлен: 15.02 . 19 20 : 31 : 56
Ордер SRH9 исполнился: 15.02 . 19 20 : 31 : 56 ( 109 мс)
Ордер SBER отправлен: 15.02 . 19 20 : 31 : 56
Ордер SBER исполнился: 15.02 . 19 20 : 31 : 57 ( 1186 мс)

 
Sergey Chalyshev :

브레이크가 방해가 되나요?


영상 편집 버전입니다.

알고리즘을 약간 최적화했습니다.

DDE 및 DLL 콜백을 동기화하기 위해 중요한 섹션을 사용합니다.

"응답" 순서는 임계 영역 내에 배치되었습니다(데이터 처리 기능이 호출되었습니다 .

OnTrade() 주문을 보내고 이제 이 함수가 PosMessage에 의해 호출되어 지연이 크게 줄어듭니다.

 if ( string (SecCode) = Child.Expert.ExpData.FutData.SecCode) then //future
              begin
                 case nStatus of
                   1 : {active};
                   2 : begin
                       if (StartQty = nBalance) then                   //Canceled
                       begin
                         Child.Expert.FOrder:= 0 ;
                         Child.Expert.FTransID:= 0 ;
                         Child.Expert.FTransBusy:= false ;
                       end else
                       begin
                         case nIsSell of
                           0 : Child.Expert.FFutVol:= Child.Expert.FFutVol + (StartQty - nBalance);
                           else Child.Expert.FFutVol:= Child.Expert.FFutVol - (StartQty - nBalance);
                         end;
                           Child.Expert.FVolume:= StartQty - nBalance;
                           Child.Expert.FaSell:= nIsSell;
                           Child.Expert.FOrder:= 0 ;
                           PostMessage(Child.Expert.Handle, WM_ON_TRADE,
                                            NativeUint(Child.Expert.Handle), 0 );
                         // Child.Expert.OnTrade(); //TODO DEBUG
                       end;
                     end;
                   else begin                                 //Future order Done
                     case nIsSell of
                       0 : Child.Expert.FFutVol:= Child.Expert.FFutVol + (StartQty - nBalance);
                       else Child.Expert.FFutVol:= Child.Expert.FFutVol - (StartQty - nBalance);
                    end;
                      Child.Expert.FVolume:= StartQty - nBalance;
                      Child.Expert.FaSell:= nIsSell;
                      Child.Expert.FOrder:= 0 ;
                      PostMessage(Child.Expert.Handle, WM_ON_TRADE,
                                            NativeUint(Child.Expert.Handle), 0 );
                   // Child.Expert.OnTrade(); //TODO DEBUG
                  end;
                end;
                 break ;
              end else
               if ( string (SecCode) = Child.Expert.ExpData.SpotData.SecCode) then   //spot

그러나 속도면에서 MT5와는 거리가 멀습니다.

 
prostotrader :

그러나 속도면에서 MT5와는 거리가 멀습니다.

그럼에도 불구하고 나는 퀵을 MT5에 "고정"했지만 "눈"은 DDE를 통해 퀵에서 철수하면서 설정의 이득을 눈치채지 못했습니다.

누군가가 이것이 어떻게 수행되는지 관심이 있다면 코드를 게시합니다.

조언자

뭐하는거야?

열거형(Variables.mqh)에 지정된 모든 현재 기호(미래)를 수집합니다.

배열 구조에 추가합니다.

이 문자에 해당하는 SPOT을 찾아 추가합니다.

배열 구조.

발견된 모든 선물에 대해 주문서가 추가됩니다.

오더북이 실행되면 선물 및 현물 매도 및 입찰가가 취해져서 DLL(MT5Client.dll)로 전송됩니다.

 //+------------------------------------------------------------------+
//|                                                    Variables.mqh |
//|                                      Copyright 2019 prostotrader |
//|                                             https://www.mql5.com |
//+------------------------------------------------------------------+
#property copyright "Copyright 2019 prostotrader"
#property link        "https://www.mql5.com"
//---
enum TIKERS
{
  AFLT, 
  ALRS,
  CHMF,
  FEES, 
  GAZR,
  GMKR,
  HYDR,
  LKOH,
  MAGN,
  MGNT,
  MOEX,
  MTSI,
  NLMK,
  NOTK,
  PLZL,
  ROSN,
  RTKM,
  SBPR,
  SBRF,
  SNGP,
  SNGR,
  TATN,
  TRNF,
  VTBR   
};
//
struct QFS_DATA
{
   string base_tiker;
   string tiker;
   double fut_sell_price;
   double fut_buy_price;
   double spot_sell_price;
   double spot_buy_price;
   bool book_add;
};
const TIKERS enum_tikers[] = {AFLT, 
  ALRS,
  CHMF,
  FEES, 
  GAZR,
  GMKR,
  HYDR,
  LKOH,
  MAGN,
  MGNT,
  MOEX,
  MTSI,
  NLMK,
  NOTK,
  PLZL,
  ROSN,
  RTKM,
  SBPR,
  SBRF,
  SNGP,
  SNGR,
  TATN,
  TRNF,
  VTBR};

QFS_DATA qfs_data[];


//+------------------------------------------------------------------+
//|                                                    Functions.mqh |
//|                                      Copyright 2019 prostotrader |
//|                                             https://www.mql5.com |
//+------------------------------------------------------------------+
#property copyright "Copyright 2019 prostotrader"
#property link        "https://www.mql5.com"
//---
#include   "Variables.mqh"

//+------------------------------------------------------------------+
//| Check terminal  function                                         |
//+------------------------------------------------------------------+
bool CheckTerminal()
{
   return ( true );
}
//+------------------------------------------------------------------+
//| Get Expiration  function                                         |
//+------------------------------------------------------------------+
ulong GetExpiration( const string a_symb)
{
   return ( ulong ( SymbolInfoInteger (a_symb, SYMBOL_EXPIRATION_TIME )));
}
//+------------------------------------------------------------------+
//| Get SPOT function                                                |
//+------------------------------------------------------------------+
string GetSpot( const string a_name)
{
   if (a_name == "GAZR" ) { return ( "GAZP" );} else
   if (a_name == "SBRF" ) { return ( "SBER" );} else
   if (a_name == "SBPR" ) { return ( "SBERP" );} else
   if (a_name == "TRNF" ) { return ( "TRNFP" );} else
   if (a_name == "NOTK" ) { return ( "NVTK" );} else
   if (a_name == "MTSI" ) { return ( "MTSS" );} else
   if (a_name == "GMKR" ) { return ( "GMKN" );} else
   if (a_name == "SNGR" ) { return ( "SNGS" );} else
   if (a_name == "SNGP" ) { return ( "SNGSP" );} else
   return (a_name);

}
//+------------------------------------------------------------------+
//| Set Tickers  function                                            |
//+------------------------------------------------------------------+
bool SetTickers()
{
   int s_total = SymbolsTotal ( false );
   if (s_total > 0 )
  {
     int s_cnt = 0 ;
     ulong fut_exp;
     string fut_name = "" ;
     string t_name = "" ;
     string spot_name;
     ulong cur_time = ulong ( TimeTradeServer ());
     for ( int i = 0 ; i < s_total;i++)
    {
      fut_name = SymbolName (i, false );
       for ( int j = 0 ; j < ArraySize (enum_tikers);j++)
      {
        t_name = EnumToString (enum_tikers[j]);
         if (t_name != "" )
        {
          fut_exp = GetExpiration(fut_name);
           if (fut_exp > ulong (cur_time))
          {
             if ( StringFind (fut_name, t_name) > - 1 )
            {
              spot_name = GetSpot(t_name);
               if (spot_name != "" )
              {
                s_cnt++;
                 ArrayResize (qfs_data, s_cnt);
                qfs_data[s_cnt - 1 ].tiker = fut_name;
                qfs_data[s_cnt - 1 ].base_tiker = spot_name;
                 if ( SymbolSelect (fut_name, true ) != true ) return ( false );
                 if ( SymbolSelect (spot_name, true ) != true ) return ( false );
                 break ;
              }  
            }
          }
        }
      }
    }
     if (s_cnt > 0 ) return ( true );
  }
   return ( false );
}


//+------------------------------------------------------------------+
//|                                                     Quik_out.mq5 |
//|                                      Copyright 2019 prostotrader |
//|                                             https://www.mql5.com |
//+------------------------------------------------------------------+
#property copyright "Copyright 2019 prostotrader"
#property link        "https://www.mql5.com"
#property version    "1.00"
//---
#include   "Quik\Functions.mqh"
//
int a_size = 0 ;
//+------------------------------------------------------------------+
//| DLL imports                                                      |
//+------------------------------------------------------------------+
#import "MT5Client.dll"
   void SendData(QFS_DATA &a_data);
#import
//---
//+------------------------------------------------------------------+
//| Expert initialization function                                   |
//+------------------------------------------------------------------+
int OnInit ()
{
   if (CheckTerminal() == false ) return ( INIT_FAILED );
   if (SetTickers() == true )
  {
    a_size = ArraySize (qfs_data);
     if (a_size > 0 )
    {
       for ( int i = 0 ; i < a_size;i++)
      {
        qfs_data[i].book_add = MarketBookAdd (qfs_data[i].tiker);
      }
    }  
  }
   else return ( INIT_FAILED );
   return ( INIT_SUCCEEDED );
}
//+------------------------------------------------------------------+
//| Expert deinitialization function                                 |
//+------------------------------------------------------------------+
void OnDeinit ( const int reason)
{
   if (a_size > 0 )
  {
     for ( int i = 0 ; i < a_size;i++)
    {
       if (qfs_data[i].book_add == true ) MarketBookRelease (qfs_data[i].tiker);
    }
  }
}

//+------------------------------------------------------------------+
//| BookEvent function                                               |
//+------------------------------------------------------------------+
void OnBookEvent ( const string &symbol)
{
   for ( int i = 0 ; i< a_size;i++)
  {
     if (symbol == qfs_data[i].tiker)
    {
      qfs_data[i].fut_sell_price = SymbolInfoDouble (qfs_data[i].tiker, SYMBOL_ASK );
      qfs_data[i].fut_buy_price = SymbolInfoDouble (qfs_data[i].tiker, SYMBOL_BID );
      qfs_data[i].spot_sell_price = SymbolInfoDouble (qfs_data[i].base_tiker, SYMBOL_ASK );
      qfs_data[i].spot_buy_price = SymbolInfoDouble (qfs_data[i].base_tiker, SYMBOL_BID );
      SendData(qfs_data[i]);
       break ;
    }
  }   
}
//+------------------------------------------------------------------+

MT5Client.dll은 단순히 설정된 콜백에 대한 데이터를 보냅니다.

unit MT5Types;

interface

type
  PData = ^TData;
  TData = packed record
    base_tiker: string ;
    tiker: string ;
    fut_sell_price: double ;
    fut_buy_price: double ;
    spot_sell_price: double ;
    spot_buy_price: double ;
    book_add: boolean;
  end;

  TCallBack = function(Data: PData): boolean;
var
  OutData: TCallBack;

implementation


end.


library MT5Client;

uses
  System.Sharemem,
  WinApi.Windows,
  MT5Types in 'MT5Types.pas' ;

//--- Exports ---
procedure SetCallBack(CallBack: TCallBack); stdcall;
begin
  OutData:= CallBack;
end;

procedure SendData(aData: PData); stdcall;
begin
   if (Assigned(OutData)) then OutData(aData);
end;

{$R *.res}

exports
  SetCallBack,
  SendData;

begin
   //
end.
 
prostotrader :

그럼에도 불구하고 나는 퀵을 MT5에 "고정"했지만 "눈"은 DDE를 통해 퀵에서 철수하면서 설정의 이득을 눈치채지 못했습니다.

누군가 이것이 어떻게 수행되는지 관심이 있다면 코드를 게시합니다.

조언자

뭐하는거야?


이 구성을 통해 MT5의 Quick에서 데이터를 수신하고 MT5에서 Quick으로의 위치를 관리하도록 명령을 내릴 수 있습니다.

옵션 작업에 관심이...
 
Aleksey Vyazmikin :

이 구성을 통해 MT5의 Quick에서 데이터를 수신하고 MT5에서 Quick으로의 위치를 관리하도록 명령을 내릴 수 있습니다.

옵션 작업에 관심이...

아니요, 데이터는 MT5에서 가져와 프로그램(터미널)으로 전송됩니다.

trans2quik.dll을 통해 Quick으로 주문을 보냅니다 (MT5에는 옵션이 없습니다).

 
prostotrader :

아니요, 데이터는 MT5에서 가져와 프로그램(터미널)으로 전송됩니다.

trans2quik.dll을 통해 Quick으로 주문을 보냅니다(MT5에는 옵션이 없습니다).

불쌍해. 옵션이 있는 퀵 오더를 제어할 수 있다고 생각했습니다.

 
Aleksey Vyazmikin :

불쌍해. 옵션이 있는 퀵 오더를 제어할 수 있다고 생각했습니다.

델파이를 아시나요?

 
prostotrader :

델파이를 아시나요?

불행하게도 :(

 
Aleksey Vyazmikin :

불행하게도 :(

그런 다음 옵션을 할 때까지 기다리십시오 ...

이제는 내 손으로만 거래(소식 기다리며)