//+------------------------------------------------------------------+ //| SuperCharlie_Aldridge_Dev_v0.mq5| //| HEDGING HORN CAPITAL | //| https://www.hhcapital.com.br | //+------------------------------------------------------------------+ #property copyright "HEDGING HORN CAPITAL" #property link "https://www.hhcapítal.com.br" #property version "DEV_v0" #property description "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, 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 = NormalizaPreco(precoEnvio); // request.price = NormalizeDouble(precoEnvio,normalizeDoubleSize); request.deviation = 0; // request.sl = NormalizeDouble(precoStop,normalizeDoubleSize); request.sl = NormalizaPreco(precoStop); // request.stoplimit = tickMin; // request.tp = NormalizaPreco(precoAlvo); request.comment = "Compra Limitada"; // 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, 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 = NormalizaPreco(precoEnvio); // request.price = NormalizeDouble(precoEnvio,normalizeDoubleSize); request.deviation = 0; // request.sl = NormalizeDouble(precoStop,normalizeDoubleSize); request.sl = NormalizaPreco(precoStop); // request.stoplimit = tickMin; // request.tp = NormalizaPreco(precoAlvo); request.comment = "Venda Limitada"; // 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)); } } 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); 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 | //+------------------------------------------------------------------+ void FechaPosicao(CTrade &negocio) { double qtd = PositionGetDouble(POSITION_VOLUME); if(!PositionSelect(_Symbol)) return; long tipoPosicao = PositionGetInteger(POSITION_TYPE); if(tipoPosicao == POSITION_TYPE_BUY) { negocio.Sell(qtd, NULL, 0, 0, 0, "Saida por fechamento do dia"); } else if(tipoPosicao==POSITION_TYPE_SELL) { negocio.Buy(qtd, NULL, 0, 0, 0, "Saida por fechamento do dia"); } return; } //+------------------------------------------------------------------+ //| 6.10 - FUNCAO DE CANCELAMENTO DE ORDEM PENDENTE DE COMPRA | //+------------------------------------------------------------------+ void CancelaOrdemAbertaCompra(int magic, CTrade &negocio) { //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)) { //Verifica se a ordem eh do tipo buy limit if(OrderGetInteger(ORDER_TYPE) == ORDER_TYPE_BUY_LIMIT) { negocio.OrderDelete(ticket); Print("Cancelou ordem aberta de compra"); break; } } } return; } //+------------------------------------------------------------------+ //| 6.11 - FUNCAO DE CANCELAMENTO DE ORDEM PENDENTE DE VENDA | //+------------------------------------------------------------------+ void CancelaOrdemAbertaVenda(double magic, CTrade &negocio) { //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)) { //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 //+===================================================================================================================================================================================+