//+------------------------------------------------------------------+
//| Events.mq4 |
//| Copyright © 2006, komposter |
//| mailto:komposterius@mail.ru |
//+------------------------------------------------------------------+
#property copyright "Copyright © 2006, komposter"
#property link "mailto:komposterius@mail.ru"
// ìàññèâ îòêðûòûõ ïîçèöèé ñîñòîÿíèåì íà ïðåäûäóùèé òèê
int pre_OrdersArray[][2]; // [êîëè÷åñòâî ïîçèöèé][¹ òèêåòà, òèï ïîçèöèè]
// ïåðåìåííûå ñîáûòèé
int eventBuyClosed_SL = 0, eventBuyClosed_TP = 0;
int eventSellClosed_SL = 0, eventSellClosed_TP = 0;
int eventBuyLimitDeleted_Exp = 0, eventBuyStopDeleted_Exp = 0;
int eventSellLimitDeleted_Exp = 0, eventSellStopDeleted_Exp = 0;
int eventBuyLimitOpened = 0, eventBuyStopOpened = 0;
int eventSellLimitOpened = 0, eventSellStopOpened = 0;
void CheckEvents( int magic = 0 )
{
// ôëàã ïåðâîãî çàïóñêà
static bool first = true;
// êîä ïîñëåäíåé îøèáêè
int _GetLastError = 0;
// îáùåå êîëè÷åñòâî ïîçèöèé
int _OrdersTotal = OrdersTotal();
// êîë-âî ïîçèöèé, ñîîòâåòñòâóþùèõ êðèòåðèÿì (òåêóùèé èíñòðóìåíò è çàäàííûé MagicNumber),
// ñîñòîÿíèåì íà òåêóùèé òèê
int now_OrdersTotal = 0;
// êîë-âî ïîçèöèé, ñîîòâåòñòâóþùèõ êðèòåðèÿì, ñîñòîÿíèåì íà ïðåäûäóùèé òèê
static int pre_OrdersTotal = 0;
// ìàññèâ îòêðûòûõ ïîçèöèé ñîñòîÿíèåì íà òåêóùèé òèê
int now_OrdersArray[][2]; // [¹ â ñïèñêå][¹ òèêåòà, òèï ïîçèöèè]
// òåêóùèé íîìåð ïîçèöèè â ìàññèâå now_OrdersArray (äëÿ ïåðåáîðà)
int now_CurOrder = 0;
// òåêóùèé íîìåð ïîçèöèè â ìàññèâå pre_OrdersArray (äëÿ ïåðåáîðà)
int pre_CurOrder = 0;
// ìàññèâ äëÿ õðàíåíèÿ êîëè÷åñòâà çàêðûòûõ ïîçèöèé êàæäîãî òèïà
int now_ClosedOrdersArray[6][3]; // [òèï îðäåðà][òèï çàêðûòèÿ]
// ìàññèâ äëÿ õðàíåíèÿ êîëè÷åñòâà ñðàáîòàâøèõ îòëîæåííûõ îðäåðîâ
int now_OpenedPendingOrders[4]; // [òèï îðäåðà]
// âðåìåííûå ôëàãè
bool OrderClosed = true, PendingOrderOpened = false;
// âðåìåííûå ïåðåìåííûå
int ticket = 0, type = -1, close_type = -1;
//îáíóëÿåì ïåðåìåííûå ñîáûòèé
eventBuyClosed_SL = 0; eventBuyClosed_TP = 0;
eventSellClosed_SL = 0; eventSellClosed_TP = 0;
eventBuyLimitDeleted_Exp = 0; eventBuyStopDeleted_Exp = 0;
eventSellLimitDeleted_Exp = 0; eventSellStopDeleted_Exp = 0;
eventBuyLimitOpened = 0; eventBuyStopOpened = 0;
eventSellLimitOpened = 0; eventSellStopOpened = 0;
// èçìåíÿåì ðàçìåð ìàññèâà îòêðûòûõ ïîçèöèé ïîä òåêóùåå êîë-âî
ArrayResize( now_OrdersArray, MathMax( _OrdersTotal, 1 ) );
// îáíóëÿåì ìàññèâ
ArrayInitialize( now_OrdersArray, 0.0 );
// îáíóëÿåì ìàññèâû çàêðûòûõ ïîçèöèé è ñðàáîòàâøèõ îðäåðîâ
ArrayInitialize( now_ClosedOrdersArray, 0.0 );
ArrayInitialize( now_OpenedPendingOrders, 0.0 );
//+------------------------------------------------------------------+
//| Ïåðåáèðàåì âñå ïîçèöèè è çàïèñûâàåì â ìàññèâ òîëüêî òå, êîòîðûå
//| ñîîòâåòñòâóþò êðèòåðèÿì
//+------------------------------------------------------------------+
for ( int z = _OrdersTotal - 1; z >= 0; z -- )
{
if ( !OrderSelect( z, SELECT_BY_POS ) )
{
_GetLastError = GetLastError();
Print( "OrderSelect( ", z, ", SELECT_BY_POS ) - Error #", _GetLastError );
continue;
}
// Ñ÷èòàåì êîëè÷åñòâî îðäåðîâ ïî òåêóùåìó ñèìâîëó è ñ çàäàííûì MagicNumber
if ( OrderMagicNumber() == magic && OrderSymbol() == Symbol() )
{
now_OrdersArray[now_OrdersTotal][0] = OrderTicket();
now_OrdersArray[now_OrdersTotal][1] = OrderType();
now_OrdersTotal ++;
}
}
// èçìåíÿåì ðàçìåð ìàññèâà îòêðûòûõ ïîçèöèé ïîä êîë-âî ïîçèöèé, ñîîòâåòñòâóþùèõ êðèòåðèÿì
ArrayResize( now_OrdersArray, MathMax( now_OrdersTotal, 1 ) );
//+------------------------------------------------------------------+
//| Ïåðåáèðàåì ñïèñîê ïîçèöèé ïðåäûäóùåãî òèêà, è ñ÷èòàåì ñêîëüêî çàêðûëîñü ïîçèöèé è
//| ñðàáîòàëî îòëîæåííûõ îðäåðîâ
//+------------------------------------------------------------------+
for ( pre_CurOrder = 0; pre_CurOrder < pre_OrdersTotal; pre_CurOrder ++ )
{
// çàïîìèíàåì òèêåò è òèï îðäåðà
ticket = pre_OrdersArray[pre_CurOrder][0];
type = pre_OrdersArray[pre_CurOrder][1];
// ïðåäïîëîãàåì, ÷òî åñëè ýòî ïîçèöèÿ, òî îíà çàêðûëàñü
OrderClosed = true;
// ïðåäïîëàãàåì, ÷òî åñëè ýòî áûë îòëîæåííûé îðäåð, òî îí íå ñðàáîòàë
PendingOrderOpened = false;
// ïåðåáèðàåì âñå ïîçèöèè èç òåêóùåãî ñïèñêà îòêðûòûõ ïîçèöèé
for ( now_CurOrder = 0; now_CurOrder < now_OrdersTotal; now_CurOrder ++ )
{
// åñëè ïîçèöèÿ ñ òàêèì òèêåòîì åñòü â ñïèñêå,
if ( ticket == now_OrdersArray[now_CurOrder][0] )
{
// çíà÷èò ïîçèöèÿ íå áûëà çàêðûòà (îðäåð íå áûë óäàë¸í)
OrderClosed = false;
// åñëè å¸ òèï ïîìåíÿëñÿ,
if ( type != now_OrdersArray[now_CurOrder][1] )
{
// çíà÷èò ýòî áûë îòëîæåííûé îðäåð, è îí ñðàáîòàë
PendingOrderOpened = true;
}
break;
}
}
// åñëè áûëà çàêðûòà ïîçèöèÿ (óäàë¸í îðäåð),
if ( OrderClosed )
{
// âûáèðàåì å¸
if ( !OrderSelect( ticket, SELECT_BY_TICKET ) )
{
_GetLastError = GetLastError();
Print( "OrderSelect( ", ticket, ", SELECT_BY_TICKET ) - Error #", _GetLastError );
continue;
}
// è îïðåäåëÿåì, ÊÀÊ çàêðûëàñü ïîçèöèÿ (óäàëèëñÿ îðäåð):
if ( type < 2 )
{
// Áàé è Ñåëë: 0 - âðó÷íóþ, 1 - ÑË, 2 - ÒÏ
close_type = 0;
if ( StringFind( OrderComment(), "[sl]" ) >= 0 ) close_type = 1;
if ( StringFind( OrderComment(), "[tp]" ) >= 0 ) close_type = 2;
}
else
{
// Îòëîæåííûå îðäåðà: 0 - âðó÷íóþ, 1 - âðåìÿ èñòå÷åíèÿ
close_type = 0;
if ( StringFind( OrderComment(), "expiration" ) >= 0 ) close_type = 1;
}
// è çàïèñûâàåì â ìàññèâ çàêðûòûõ îðäåðîâ, ÷òî îðäåð ñ òèïîì type
// çàêðûëñÿ ïðè îáñòîÿòåëüñòâàõ close_type
now_ClosedOrdersArray[type][close_type] ++;
continue;
}
// åñëè ñðàáîòàë îòëîæåííûé îðäåð,
if ( PendingOrderOpened )
{
// çàïèñûâàåì â ìàññèâ ñðàáîòàâøèõ îðäåðîâ, ÷òî îðäåð ñ òèïîì type ñðàáîòàë
now_OpenedPendingOrders[type-2] ++;
continue;
}
}
//+------------------------------------------------------------------+
//| Âñþ íåîáõîäèìóþ èíôîðìàöèþ ñîáðàëè - íàçíà÷àåì ïåðåìåííûì ñîáûòèé íóæíûå çíà÷åíèÿ
//+------------------------------------------------------------------+
// åñëè ýòî íå ïåðâûé çàïóñê ýêñïåðòà
if ( !first )
{
// ïåðåáèðàåì âñå ýëåìåíòû ìàññèâà ñðàáàòûâàíèÿ îòëîæåííûõ îðäåðîâ
for ( type = 2; type < 6; type ++ )
{
// è åñëè ýëåìåíò íå ïóñòîé (îðäåð òàêîãî òèïà ñðàáîòàë), ìåíÿåì çíà÷åíèå ïåðåìåííîé
if ( now_OpenedPendingOrders[type-2] > 0 )
SetOpenEvent( type );
}
// ïåðåáèðàåì âñå ýëåìåíòû ìàññèâà çàêðûòûõ ïîçèöèé
for ( type = 0; type < 6; type ++ )
{
for ( close_type = 0; close_type < 3; close_type ++ )
{
// è åñëè ýëåìåíò íå ïóñòîé (áûëà çàêðûòà ïîçèöèÿ), ìåíÿåì çíà÷åíèå ïåðåìåííîé
if ( now_ClosedOrdersArray[type][close_type] > 0 )
SetCloseEvent( type, close_type );
}
}
}
else
{
first = false;
}
//---- ñîõðàíÿåì ìàññèâ òåêóùèõ ïîçèöèé â ìàññèâ ïðåäûäóùèõ ïîçèöèé
ArrayResize( pre_OrdersArray, MathMax( now_OrdersTotal, 1 ) );
for ( now_CurOrder = 0; now_CurOrder < now_OrdersTotal; now_CurOrder ++ )
{
pre_OrdersArray[now_CurOrder][0] = now_OrdersArray[now_CurOrder][0];
pre_OrdersArray[now_CurOrder][1] = now_OrdersArray[now_CurOrder][1];
}
pre_OrdersTotal = now_OrdersTotal;
}
void SetOpenEvent( int SetOpenEvent_type )
{
switch ( SetOpenEvent_type )
{
case OP_BUYLIMIT: eventBuyLimitOpened ++; return(0);
case OP_BUYSTOP: eventBuyStopOpened ++; return(0);
case OP_SELLLIMIT: eventSellLimitOpened ++; return(0);
case OP_SELLSTOP: eventSellStopOpened ++; return(0);
}
}
void SetCloseEvent( int SetCloseEvent_type, int SetCloseEvent_close_type )
{
switch ( SetCloseEvent_type )
{
case OP_BUY:
{
if ( SetCloseEvent_close_type == 1 ) eventBuyClosed_SL ++;
if ( SetCloseEvent_close_type == 2 ) eventBuyClosed_TP ++;
return(0);
}
case OP_SELL:
{
if ( SetCloseEvent_close_type == 1 ) eventSellClosed_SL ++;
if ( SetCloseEvent_close_type == 2 ) eventSellClosed_TP ++;
return(0);
}
case OP_BUYLIMIT:
{
if ( SetCloseEvent_close_type == 1 ) eventBuyLimitDeleted_Exp ++;
return(0);
}
case OP_BUYSTOP:
{
if ( SetCloseEvent_close_type == 1 ) eventBuyStopDeleted_Exp ++;
return(0);
}
case OP_SELLLIMIT:
{
if ( SetCloseEvent_close_type == 1 ) eventSellLimitDeleted_Exp ++;
return(0);
}
case OP_SELLSTOP:
{
if ( SetCloseEvent_close_type == 1 ) eventSellStopDeleted_Exp ++;
return(0);
}
}
}
Comments