395 lines
No EOL
16 KiB
MQL5
395 lines
No EOL
16 KiB
MQL5
//+------------------------------------------------------------------+
|
|
//| 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
|
|
//+===================================================================================================================================================================================+ |