//+------------------------------------------------------------------+ //| S6_Transmissao1_v0.mq5 | //| DESENVOLVIMENTO | //| OXFORD | //| HEDGING HORN CAPITAL | //| https://www.hhcapital.com.br | //+------------------------------------------------------------------+ #property copyright "Copyright 2022, HEDGING HORN CAPITAL" #property link "https://www.hhcapital.com.br" #property version "DEV_v0" #property description "HFT MARKET MAKING BASED ON OXFORD'S STUDIES. MINI INDICE." //INDICE //+===================================================================================================================================================================================+ //| 1 - SESSAO DE CABECALHO / ADMISSAO //+===================================================================================================================================================================================+ //+------------------------------------------------------------------+ //| 1.1 - IMPORTACOES | //+------------------------------------------------------------------+ #include #include //+===================================================================================================================================================================================+ //| 6 - SESSAO DE OPERACOES E EXECUCOES / ESCAPAMENTO //+===================================================================================================================================================================================+ //+------------------------------------------------------------------+ //| 6.1 - FUNCAO DE COMPRA LIMITADA | //+------------------------------------------------------------------+ void CompraLimite(double precoEnvio, double precoStop, double qtd, int magic, slot &Slots[], int i, CSymbolInfo &simbolo, MqlTradeRequest &request, MqlTradeResult &result, MqlTradeCheckResult &check_result) { //Limpar informacoes das estruturas ZeroMemory(request); ZeroMemory(result); ZeroMemory(check_result); request.magic = magic; request.symbol = _Symbol; request.action = TRADE_ACTION_PENDING; request.type = ORDER_TYPE_BUY_LIMIT; request.type_filling = ORDER_FILLING_RETURN; request.type_time = ORDER_TIME_DAY; request.volume = qtd; request.price = precoEnvio; // request.price = NormalizeDouble(precoEnvio,normalizeDoubleSize); request.deviation = 0; // request.sl = NormalizeDouble(precoStop,normalizeDoubleSize); request.sl = precoStop; // request.stoplimit = tickMin; request.tp = Slots[i].precoAlvo; request.comment = "Compra Limitada"; // request.expiration = TimeCurrent()+2; // Print(request.price, " ",request.tp, " ",request.sl); // Print("Tipo: Compra Limitada", "/ Preco: ", NormalizeDouble(precoEnvio,normalizeDoubleSize),"/ Preco Stop: ", NormalizeDouble(precoStop,normalizeDoubleSize), "/ QTD: ", qtd); ResetLastError(); if(!OrderCheck(request, check_result)) { PrintFormat("Erro em OrderCheck: %d", GetLastError()); PrintFormat("Codigo de retorno: %d", check_result.retcode); return; } else { if(!OrderSend(request, result)) { PrintFormat("Erro em OrderSend: %d", GetLastError()); PrintFormat("Codigo de retorno: %d", result.retcode); return; } else { // Print("Ordem enviada com sucesso"); } } } //+------------------------------------------------------------------+ //| 6.2 - FUNCAO DE VENDA LIMITADA | //+------------------------------------------------------------------+ void VendaLimite(double precoEnvio, double precoStop, double qtd, int magic, slot &Slots[], int i, CSymbolInfo &simbolo, MqlTradeRequest &request, MqlTradeResult &result, MqlTradeCheckResult &check_result) { //Limpar informacoes das estruturas ZeroMemory(request); ZeroMemory(result); ZeroMemory(check_result); request.magic = magic; request.symbol = _Symbol; request.action = TRADE_ACTION_PENDING; request.type = ORDER_TYPE_SELL_LIMIT; request.type_filling = ORDER_FILLING_RETURN; request.type_time = ORDER_TIME_DAY; request.volume = qtd; request.price = precoEnvio; // request.price = NormalizeDouble(precoEnvio,normalizeDoubleSize); request.deviation = 0; // request.sl = NormalizeDouble(precoStop,normalizeDoubleSize); request.sl = precoStop; // request.stoplimit = tickMin; request.tp = Slots[i].precoAlvo; request.comment = "Venda Limitada"; // request.expiration = TimeCurrent()+2; // Print("Tipo: Venda Limitada", "/ Preco: ", NormalizeDouble(precoEnvio,normalizeDoubleSize),"/ Preco Stop: ", NormalizeDouble(precoStop,normalizeDoubleSize), "/ QTD: ", qtd); ResetLastError(); if(!OrderCheck(request, check_result)) { PrintFormat("Erro em OrderCheck: %d", GetLastError()); PrintFormat("Codigo de retorno: %d", check_result.retcode); return; } else { if(!OrderSend(request, result)) { PrintFormat("Erro em OrderSend: %d", GetLastError()); PrintFormat("Codigo de retorno: %d", result.retcode); return; } else { // Print("Ordem enviada com sucesso"); } } } //+------------------------------------------------------------------+ //| 6.3 - FUNCAO DE COMPRA A MERCADO | //+------------------------------------------------------------------+ void CompraMercado(double precoStop, double qtd, int magic, CSymbolInfo &simbolo, MqlTradeRequest &request, MqlTradeResult &result, MqlTradeCheckResult &check_result) { //Limpar informacoes das estruturas ZeroMemory(request); ZeroMemory(result); ZeroMemory(check_result); request.magic = magic; request.symbol = _Symbol; request.action = TRADE_ACTION_DEAL; request.type = ORDER_TYPE_BUY; request.type_filling = ORDER_FILLING_RETURN; request.type_time = ORDER_TIME_DAY; request.volume = qtd; request.sl = NormalizaPreco(precoStop); // request.stoplimit = tickMin; // request.tp = NormalizeDouble(precoAlvo,2); request.comment = "Compra Mercado"; // Print("Tipo: Compra Mercado", "/ Preco Stop: ", NormalizeDouble(precoStop,normalizeDoubleSize), "/ QTD: ", qtd); ResetLastError(); if(!OrderCheck(request, check_result)) { PrintFormat("Erro em OrderCheck: %d", GetLastError()); PrintFormat("Codigo de retorno: %d", check_result.retcode); return; } else { if(!OrderSend(request, result)) { PrintFormat("Erro em OrderSend: %d", GetLastError()); PrintFormat("Codigo de retorno: %d", result.retcode); return; } else { // Print("Ordem enviada com sucesso"); } } } //+------------------------------------------------------------------+ //| 6.4 - FUNCAO DE VENDA A MERCADO | //+------------------------------------------------------------------+ void VendaMercado(double precoStop, double qtd, int magic, CSymbolInfo &simbolo, MqlTradeRequest &request, MqlTradeResult &result, MqlTradeCheckResult &check_result) { //Limpar informacoes das estruturas ZeroMemory(request); ZeroMemory(result); ZeroMemory(check_result); request.magic = magic; request.symbol = _Symbol; request.action = TRADE_ACTION_DEAL; request.type = ORDER_TYPE_SELL; request.type_filling = ORDER_FILLING_RETURN; request.type_time = ORDER_TIME_DAY; request.volume = qtd; request.sl = NormalizaPreco(precoStop); // request.stoplimit = tickMin; // request.tp = NormalizeDouble(precoAlvo,2); request.comment = "Venda Mercado"; // Print("Tipo: Venda Mercado", "/ Preco Stop: ",NormalizeDouble(precoStop,normalizeDoubleSize), "/ QTD: ", qtd); ResetLastError(); if(!OrderCheck(request, check_result)) { PrintFormat("Erro em OrderCheck: %d", GetLastError()); PrintFormat("Codigo de retorno: %d", check_result.retcode); return; } else { if(!OrderSend(request, result)) { PrintFormat("Erro em OrderSend: %d", GetLastError()); PrintFormat("Codigo de retorno: %d", result.retcode); return; } else { // Print("Ordem enviada com sucesso"); } } } //+------------------------------------------------------------------+ //| 6.5 - FUNCAO QUE MODIFICA ORDEM ENVIADA | //+------------------------------------------------------------------+ int ModificaOrdemEnviada(int idOrdem, double precoEnvio, double precoAlvo, double precoStop, int magic, CTrade &negocio, CSymbolInfo &simbolo, MqlTradeRequest &request, MqlTradeResult &result, MqlTradeCheckResult &check_result) { //Percorre todas as ordens for(int i=OrdersTotal()-1; i>=0; i--) { ulong ticket = OrderGetTicket(i); string symbol = OrderGetString(ORDER_SYMBOL); ulong magicEA = OrderGetInteger(ORDER_MAGIC); //Verifica para cada ordem, se eh do simbolo corrente e do mesmo robo if((symbol == _Symbol) && (magicEA == magic) && (ticket == idOrdem)) { negocio.OrderModify(ticket, NormalizaPreco(precoEnvio), NormalizaPreco(precoStop), NormalizaPreco(precoAlvo), ORDER_TIME_DAY, OrderGetInteger(ORDER_TIME_EXPIRATION)); Print("Atualiza preco ordem: ", ticket, " Novo preco: ", precoEnvio, " Novo stop: ", precoStop, " Novo alvo: ", precoAlvo); } } return 0; } //+------------------------------------------------------------------+ //| 6.6 - FUNCAO QUE MODIFICA ORDEM EXECUTADA | //+------------------------------------------------------------------+ int ModificaOrdemExecutada(double precoAlvo, double precoStop, CTrade &negocio) { if(negocio.PositionModify(_Symbol, precoStop, precoAlvo) == false) Print("Erro em position modify."); return 0; } //+------------------------------------------------------------------+ //| 6.7 - FUNCAO DE CANCELAMENTO DE ORDENS PENDENTES | //+------------------------------------------------------------------+ void CancelaOrdensAbertas(CTrade &negocio) { ulong ticket = 0; ; for(int i=OrdersTotal()-1;i>=0;i--) { ticket = OrderGetTicket(i); string symbol = PositionGetString(POSITION_SYMBOL); ulong magicEA = PositionGetInteger(POSITION_MAGIC); if((symbol == _Symbol) && (magicEA == Fluidos.magic)) { negocio.OrderDelete(ticket); Print("Cancelou ordem aberta"); } } return; } //+------------------------------------------------------------------+ //| 6.8 - FUNCAO DE FECHAMENTO DE ORDENS EXECUTADAS | //+------------------------------------------------------------------+ void FechaTrade(double loteEnvio, CTrade &negocio) { double qtd = loteEnvio; if(!PositionSelect(_Symbol)) return; long tipoPosicao = PositionGetInteger(POSITION_TYPE); if(tipoPosicao == POSITION_TYPE_BUY) { negocio.Sell(qtd, NULL, 0, 0, 0, "Saida por fechamento Trade"); } else if(tipoPosicao==POSITION_TYPE_SELL) { negocio.Buy(qtd, NULL, 0, 0, 0, "Saida por fechamento Trade"); } return; } //+------------------------------------------------------------------+ //| 6.9 - FUNCAO DE FECHAMENTO DE TODAS AS POSICOES | //+------------------------------------------------------------------+ bool FechaPosicao(CTrade &negocio) { int qtd = 0; qtd = PositionsTotal(); //Print("Posicoes totais: ", qtd); for(int i=0;i=0; i--) { ulong ticket = OrderGetTicket(i); string symbol = OrderGetString(ORDER_SYMBOL); ulong magicEA = OrderGetInteger(ORDER_MAGIC); //Verifica para cada ordem, se eh do simbolo corrente e do mesmo robo if((symbol == _Symbol) && (magicEA == magic)) { //Verifica se a ordem eh do tipo sell limit if(OrderGetInteger(ORDER_TYPE) == ORDER_TYPE_SELL_LIMIT) { negocio.OrderDelete(ticket); Print("Cancelou ordem aberta de venda"); break; } } } return; } //+------------------------------------------------------------------+ //| 6.12 - FUNCAO QUE NORMALIZA O PRECO PARA O TICK DO ATIVO | //+------------------------------------------------------------------+ double NormalizaPreco(double price) { double precoNormalizado; precoNormalizado = price - MathMod(price,5*_Point); return precoNormalizado; } //+===================================================================================================================================================================================+ //| FIM DO PROGRAMA //+===================================================================================================================================================================================+