SuperCharlie_Oxford/Desenvolvimento_v0/S6_Transmissao1_v0.mqh

395 lines
16 KiB
MQL5
Raw Permalink Normal View History

2025-05-30 16:27:23 +02:00
//+------------------------------------------------------------------+
//| 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 <Trade/Trade.mqh>
#include <Trade/SymbolInfo.mqh>
//+===================================================================================================================================================================================+
//| 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<qtd;i++)
{
if(!PositionSelect(_Symbol))
{
Print("Nao ha posicoes abertas no fechamento do dia.");
}
else
{
ulong ticket = PositionGetTicket(i);
string symbol = PositionGetString(POSITION_SYMBOL);
ulong magicEA = PositionGetInteger(POSITION_MAGIC);
int tipoPosicao = 0;
double volume = 0.0;
tipoPosicao = PositionGetInteger(POSITION_TYPE);
volume = PositionGetDouble(POSITION_VOLUME);
if((symbol == _Symbol) && (magicEA == Fluidos.magic))
{
if(tipoPosicao == POSITION_TYPE_BUY)
{
negocio.PositionClose(ticket, -1);
Print("Saida de posicao comprada por fechamento do dia.");
}
else if(tipoPosicao==POSITION_TYPE_SELL)
{
negocio.PositionClose(ticket, -1);
Print("Saida de posicao vendida por fechamento do dia.");
}
}
}
}
return false;
}
//+------------------------------------------------------------------+
//| 6.10 - FUNCAO DE CANCELAMENTO DE ORDEM PENDENTE DE COMPRA |
//+------------------------------------------------------------------+
void CancelaOrdemAberta(int idOrdem, CTrade &negocio)
{
OrderSelect(idOrdem);
negocio.OrderDelete(idOrdem);
Print("Ordem Cancelada por lifetime ========================================");
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
//+===================================================================================================================================================================================+