MQLArticles/RM/OcoOrder.mqh

222 lines
17 KiB
MQL5

2025-09-22 09:09:20 -05:00
<EFBFBD><EFBFBD>//+------------------------------------------------------------------+
//| OcoOrder.mqh |
//| Copyright 2025, Niquel Mendoza. |
//| https://www.mql5.com/es/users/nique_372/news |
//+------------------------------------------------------------------+
2025-11-10 09:33:30 -05:00
#property copyright "Copyright 2025, Niquel Mendoza."
2025-09-22 09:09:20 -05:00
2025-11-23 10:36:16 -05:00
#property link "https://www.mql5.com/es/users/nique_372/news"
#property strict
2025-09-22 09:09:20 -05:00
2025-11-23 10:36:16 -05:00
#ifndef MQLARTICLES_RM_OCOORDER_MQH
2025-09-22 09:09:20 -05:00
#define MQLARTICLES_RM_OCOORDER_MQH
2025-11-23 10:36:16 -05:00
2025-09-22 09:09:20 -05:00
//+------------------------------------------------------------------+
//| |
//+------------------------------------------------------------------+
#include "RM_Functions.mqh"
//+------------------------------------------------------------------+
2025-11-23 08:04:37 -05:00
//| |
2025-09-22 09:09:20 -05:00
//+------------------------------------------------------------------+
#define IsOrder(type) EsUnaOrderPendiente[type]
// #define CACCOUNT_STATUS_ACTIVE_ON_ORDER_DELETE
//+------------------------------------------------------------------+
//| Clase COcoOrder optimizada |
//+------------------------------------------------------------------+
class COcoOrder : public CAccountGestor
{
private:
CHashMap<ulong, ulong> mapa_1_key;
CHashMap<ulong, ulong> mapa_2_key;
CTrade trade;
public:
//---
bool AddOrders(ulong ticket1, ulong ticket2);
void OnOrderDelete(const ROrder& order) override;
};
//+------------------------------------------------------------------+
//| |
//+------------------------------------------------------------------+
bool COcoOrder::AddOrders(ulong ticket1, ulong ticket2)
{
//--- verificar si lso tickets son invalidos
if(ticket1 == INVALID_TICKET || ticket2 == INVALID_TICKET)
{
LogError(StringFormat("Tickets inv<00>lidos: ticket1 = %I64u, ticket2 = %I64u", ticket1, ticket2), FUNCION_ACTUAL);
return false;
}
//--- si son iguales
2025-11-23 08:04:37 -05:00
2025-09-22 09:09:20 -05:00
if(mapa_1_key.ContainsKey(ticket1) || mapa_2_key.ContainsKey(ticket2))
{
LogWarning(StringFormat("OCO duplicado: tickets %I64u y %I64u ya existen", ticket1, ticket2), FUNCION_ACTUAL);
return false;
}
//--- Validar ticket1
ResetLastError();
if(OrderSelect(ticket1) == false)
{
int error = GetLastError();
if(error == ERR_TRADE_ORDER_NOT_FOUND) // ORDER_NOT_FOUND
LogWarning(StringFormat("Ticket1 %I64u no encontrado, posiblemente ya ejecutado", ticket1), FUNCION_ACTUAL);
else
LogError(StringFormat("No se puede seleccionar ticket1 %I64u, error: %d", ticket1, error), FUNCION_ACTUAL);
return false;
}
ENUM_ORDER_TYPE type1 = (ENUM_ORDER_TYPE)OrderGetInteger(ORDER_TYPE);
if(IsOrder(type1) == false)
{
LogError(StringFormat("Tipo de orden inv<00>lido para ticket1 %I64u: %s", ticket1, EnumToString(type1)), FUNCION_ACTUAL);
return false;
}
//--- Validar ticket2
ResetLastError();
if(OrderSelect(ticket2) == false)
2025-11-10 09:33:30 -05:00
2025-09-22 09:09:20 -05:00
{
int error = GetLastError();
if(error == ERR_TRADE_ORDER_NOT_FOUND) // ORDER_NOT_FOUND
LogWarning(StringFormat("Ticket2 %I64u no encontrado, posiblemente ya ejecutado", ticket2), FUNCION_ACTUAL);
else
LogError(StringFormat("No se puede seleccionar ticket2 %I64u, error: %d", ticket2, error), FUNCION_ACTUAL);
return false;
}
ENUM_ORDER_TYPE type2 = (ENUM_ORDER_TYPE)OrderGetInteger(ORDER_TYPE);
if(IsOrder(type2) == false)
{
LogError(StringFormat("Tipo de orden inv<00>lido para ticket2 %I64u: %s", ticket2, EnumToString(type2)), FUNCION_ACTUAL);
return false;
}
//---
bool res = mapa_1_key.Add(ticket1, ticket2) && mapa_2_key.Add(ticket2, ticket1);
return res;
}
#define OCO_ORDER_MORE_FAST
//+------------------------------------------------------------------+
void COcoOrder::OnOrderDelete(const ROrder &order)
{
ulong ticket_extra; //ticke objetivo
2025-11-10 09:33:30 -05:00
2025-09-22 09:09:20 -05:00
const ulong ticket_i = order.order_ticket;
2025-11-10 09:33:30 -05:00
2025-09-22 09:09:20 -05:00
//---