MT5とtrans2quik.dll。 - ページ 13 1...6789101112131415161718 新しいコメント prostotrader 2019.02.20 16:50 #121 BillionerClub:LUAを使わない完全なC++のコードはどうでしょうか?そこで、上の動画では、LUAを使わずに、C++ではなく、Pascal(Delphi XE4)だけで Sergey Chalyshev 2019.02.20 20:52 #122 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 мс) prostotrader 2019.02.20 20:55 #123 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 2019.03.14 18:53 #124 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. Aleksey Vyazmikin 2019.03.14 20:03 #125 prostotrader:それでもクイックドローをMT5に「ねじ込んだ」のですが、クイックドローからDDE経由で出力されたものと比べて、改善が見られません。 どのように行うか興味のある方がいらっしゃれば、コードを貼り付けます。 エキスパートアドバイザー 何をするのか? このデザインは、QuickquoteからMT5へデータを受け取り、MT5からQuickquoteへポジション管理のための注文を出すことができるのでしょうか? オプションを使った仕事に興味がある人だけ prostotrader 2019.03.14 21:01 #126 Aleksey Vyazmikin:QuickquickからMT5へデータを受信し、MT5からQuickquickへポジションコントロールの注文を出すことができる設計になっていますか? オプションを使った仕事に興味がある人だけいいえ、データはMT5から取得され、あなたのプログラム(ターミナル)に転送されます。 Trans2quik.dllはKwikに注文を送る(MT5にはオプションがない) Aleksey Vyazmikin 2019.03.14 21:04 #127 prostotrader:いいえ、データはMT5から取得され、そのプログラム(ターミナル)に送信され、それが trans2quik.dll経由でKwikに注文を送信(MT5にはオプションなし)可哀想に。オプションが入っているKvikの注文をコントロールすることが可能だと思いました。 prostotrader 2019.03.14 21:19 #128 Aleksey Vyazmikin:可哀想に。オプションが入っているQuickのオーダーを制御することが可能だと思いました。Delphiをご存じですか? Aleksey Vyazmikin 2019.03.14 21:34 #129 prostotrader:Delphiをご存じですか?残念ですが、ありません :( prostotrader 2019.03.14 21:48 #130 Aleksey Vyazmikin:残念ですが、ありません :(じゃあ、オプションに入るから待っててね...。 今は手だけでトレードしています(ニュース待ち)。 1...6789101112131415161718 新しいコメント 取引の機会を逃しています。 無料取引アプリ 8千を超えるシグナルをコピー 金融ニュースで金融マーケットを探索 新規登録 ログイン スペースを含まないラテン文字 このメールにパスワードが送信されます エラーが発生しました Googleでログイン WebサイトポリシーおよびMQL5.COM利用規約に同意します。 新規登録 MQL5.com WebサイトへのログインにCookieの使用を許可します。 ログインするには、ブラウザで必要な設定を有効にしてください。 ログイン/パスワードをお忘れですか? Googleでログイン
LUAを使わない完全なC++のコードはどうでしょうか?
そこで、上の動画では、LUAを使わずに、C++ではなく、Pascal(Delphi XE4)だけで
そこで、上の動画では、LUAを使わずに、C++ではなく、Pascal(Delphi XE4)だけで
ブレーキが干渉しないか?
トレーディング、自動売買システム、トレーディング戦略のテストに関するフォーラム
MT5とtrans2quik.dll。
プロストトレーダー さん 2019.02.15 18:42
Quick経由の取引についてですが、悪い夢のように忘れてしまうことがあります。
ブレーキが邪魔なのか?
動画はツッコミどころ満載です。
アルゴリズムを少し最適化しました。
DDEとDLLからのコラボを同期させるために、クリティカルセクションを使用しました。
クリティカルセクションの内部で「返信」注文が行われた( データ処理関数が呼び出された
と注文を出すOnTrade())がありますが、この関数をPosMessageで呼び出すようにしたことで、遅延が大幅に減りました。
しかし、スピードの点ではMT5には遠く及ばない :(
しかし、スピードの点ではMT5には遠く及ばない :(
やはりMT5にクイックリンクを「ねじ込んだ」のですが、クイックリンクからの出力とDDE経由の出力の違いが分かりません。
どのように行うか興味のある方がいらっしゃれば、コードを貼り付けます。
エキスパートアドバイザー
何をするものなのか?
列挙(Variables.mqh)で指定された現在のシスウォール(フェッチ)をすべて収集する。
を作成し、配列構造体に追加します。
これらのシンボルにマッチするSPOTを探し、また、これらのシンボルを
配列構造を持つ。
発見されたすべての先物についてスタックが追加されます。
スタックが起動すると、先物とスポットのアスキーとビットを取り込み、DLL(MT5Client.dll)に送信します。
MT5Client.dllは、単にデータをセットカラーに送るだけです。
それでもクイックドローをMT5に「ねじ込んだ」のですが、クイックドローからDDE経由で出力されたものと比べて、改善が見られません。
どのように行うか興味のある方がいらっしゃれば、コードを貼り付けます。
エキスパートアドバイザー
何をするのか?
このデザインは、QuickquoteからMT5へデータを受け取り、MT5からQuickquoteへポジション管理のための注文を出すことができるのでしょうか?
オプションを使った仕事に興味がある人だけQuickquickからMT5へデータを受信し、MT5からQuickquickへポジションコントロールの注文を出すことができる設計になっていますか?
オプションを使った仕事に興味がある人だけいいえ、データはMT5から取得され、あなたのプログラム(ターミナル)に転送されます。
Trans2quik.dllはKwikに注文を送る(MT5にはオプションがない)
いいえ、データはMT5から取得され、そのプログラム(ターミナル)に送信され、それが
trans2quik.dll経由でKwikに注文を送信(MT5にはオプションなし)
可哀想に。オプションが入っているKvikの注文をコントロールすることが可能だと思いました。
可哀想に。オプションが入っているQuickのオーダーを制御することが可能だと思いました。
Delphiをご存じですか?
Delphiをご存じですか?
残念ですが、ありません :(
残念ですが、ありません :(
じゃあ、オプションに入るから待っててね...。
今は手だけでトレードしています(ニュース待ち)。