MT5 e trans2quik.dll - página 13 1...6789101112131415161718 Novo comentário prostotrader 2019.02.20 16:50 #121 BillionerClub: E o código C++ completo sem a LUA?Assim, no filme acima, sem LUA, apenas não C++ mas Pascal (Delphi XE4) Sergey Chalyshev 2019.02.20 20:52 #122 prostotrader: Assim, no filme acima, sem a LUA, apenas não C++ mas Pascal (Delphi XE4)Os freios não interferem? Fórum sobre comércio, sistemas automatizados de comércio e testes de estratégia comercial MT5 e trans2quik.dll prostotrader, 2019.02.15 18:42 Sobre a negociação via Quick, você pode simplesmente esquecê-la como um pesadelo. Ордер 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 мс) Como posso mudar a Por que não colocar Quaisquer perguntas de recém-chegados prostotrader 2019.02.20 20:55 #123 Sergey Chalyshev: Os freios estão no caminho? O vídeo é uma versão afinada. Eu otimizei um pouco o algoritmo. Para sincronizar o DDE e as colaborações da DLL, usei seções críticas. A colocação da ordem de "resposta" foi realizada dentro da seção crítica(a função de processamento de dadosfoi chamada e envio de um pedidoOnTrade()) e agora esta função é chamada pela PosMessage, o que reduziu muito os atrasos. 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 Mas muito longe em termos de velocidade do MT5 :( FORTES. Questões de aplicação Discussão do artigo "Operações Discussão do artigo "Biblioteca prostotrader 2019.03.14 18:53 #124 prostotrader: Mas longe de MT5 em termos de velocidade :(Eu ainda "parafusei" a ligação rápida ao MT5, mas não consigo ver a diferença entre a saída da ligação rápida e a saída da ligação rápida via DDE. Se alguém está interessado em como isso é feito, estou colando o código. O Conselheiro Especialista O que ele faz? Reúne todas as ciswalls (fetches) atuais que são especificadas na enumeração (Variables.mqh) e as acrescenta à estrutura da matriz. Procura um SPOT correspondente para estes símbolos e também os adiciona ao estrutura da matriz. São acrescentadas pilhas para todos os futuros encontrados. Quando uma pilha é acionada, ela pega os aski e bits dos futuros e spot e os envia para a 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 simplesmente envia os dados para o colarinho do conjunto 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. Um indicador muito útil Perguntas de Iniciantes MQL4 Substituição de funções dos Aleksey Vyazmikin 2019.03.14 20:03 #125 prostotrader: Mas eu ainda "aparafusei" o quickdraw para o MT5, mas não consigo ver nenhuma melhoria em comparação com a saída do quickdraw via DDE. Se alguém estiver interessado em como isso é feito, eu estou colando o código. O Conselheiro Especialista O que ele faz? Este projeto permite que você receba dados do Quickquote para o MT5 e dê ordens para o gerenciamento de posições do MT5 para o Quickquote? Interessado em trabalhar com opções apenas... prostotrader 2019.03.14 21:01 #126 Aleksey Vyazmikin:Este projeto permite que você receba dados do Quickquick para o MT5 e dê ordens de controle de posição do MT5 para o Quickquick? Interessado em trabalhar com opções apenas...Não, os dados são retirados do MT5 e enviados para seu programa (terminal), que Trans2quik.dll envia pedidos para Kwik (MT5 não tem opções) Aleksey Vyazmikin 2019.03.14 21:04 #127 prostotrader: Não, os dados são retirados do MT5 e transmitidos para seu programa (terminal), que envia pedidos para Kwik via trans2quik.dll (MT5 não tem opções)É uma pena. Pensei que era possível controlar as ordens do Kvik, que tem opções nele. prostotrader 2019.03.14 21:19 #128 Aleksey Vyazmikin: É uma pena. Pensei que era possível controlar as ordens de Quick, que têm opções nelas.Você conhece a Delphi? Aleksey Vyazmikin 2019.03.14 21:34 #129 prostotrader: Você conhece a Delphi?Infelizmente, não :( prostotrader 2019.03.14 21:48 #130 Aleksey Vyazmikin: Infelizmente, não :(Então espere que eu entre em opções... Neste momento eu as negocio somente com minhas mãos (esperando por notícias) 1...6789101112131415161718 Novo comentário
E o código C++ completo sem a LUA?
Assim, no filme acima, sem LUA, apenas não C++ mas Pascal (Delphi XE4)
Assim, no filme acima, sem a LUA, apenas não C++ mas Pascal (Delphi XE4)
Os freios não interferem?
Fórum sobre comércio, sistemas automatizados de comércio e testes de estratégia comercial
MT5 e trans2quik.dll
prostotrader, 2019.02.15 18:42
Sobre a negociação via Quick, você pode simplesmente esquecê-la como um pesadelo.
Os freios estão no caminho?
O vídeo é uma versão afinada.
Eu otimizei um pouco o algoritmo.
Para sincronizar o DDE e as colaborações da DLL, usei seções críticas.
A colocação da ordem de "resposta" foi realizada dentro da seção crítica(a função de processamento de dadosfoi chamada
e envio de um pedidoOnTrade()) e agora esta função é chamada pela PosMessage, o que reduziu muito os atrasos.
Mas muito longe em termos de velocidade do MT5 :(
Mas longe de MT5 em termos de velocidade :(
Eu ainda "parafusei" a ligação rápida ao MT5, mas não consigo ver a diferença entre a saída da ligação rápida e a saída da ligação rápida via DDE.
Se alguém está interessado em como isso é feito, estou colando o código.
O Conselheiro Especialista
O que ele faz?
Reúne todas as ciswalls (fetches) atuais que são especificadas na enumeração (Variables.mqh)
e as acrescenta à estrutura da matriz.
Procura um SPOT correspondente para estes símbolos e também os adiciona ao
estrutura da matriz.
São acrescentadas pilhas para todos os futuros encontrados.
Quando uma pilha é acionada, ela pega os aski e bits dos futuros e spot e os envia para a DLL (MT5Client.dll)
MT5Client.dll simplesmente envia os dados para o colarinho do conjunto
Mas eu ainda "aparafusei" o quickdraw para o MT5, mas não consigo ver nenhuma melhoria em comparação com a saída do quickdraw via DDE.
Se alguém estiver interessado em como isso é feito, eu estou colando o código.
O Conselheiro Especialista
O que ele faz?
Este projeto permite que você receba dados do Quickquote para o MT5 e dê ordens para o gerenciamento de posições do MT5 para o Quickquote?
Interessado em trabalhar com opções apenas...Este projeto permite que você receba dados do Quickquick para o MT5 e dê ordens de controle de posição do MT5 para o Quickquick?
Interessado em trabalhar com opções apenas...Não, os dados são retirados do MT5 e enviados para seu programa (terminal), que
Trans2quik.dll envia pedidos para Kwik (MT5 não tem opções)
Não, os dados são retirados do MT5 e transmitidos para seu programa (terminal), que
envia pedidos para Kwik via trans2quik.dll (MT5 não tem opções)
É uma pena. Pensei que era possível controlar as ordens do Kvik, que tem opções nele.
É uma pena. Pensei que era possível controlar as ordens de Quick, que têm opções nelas.
Você conhece a Delphi?
Você conhece a Delphi?
Infelizmente, não :(
Infelizmente, não :(
Então espere que eu entre em opções...
Neste momento eu as negocio somente com minhas mãos (esperando por notícias)