我正在尝试用 MQL4 语言创建专家顾问 (EA)。
如何编写一个返回最大亏损交易(而不是总亏损交易)的函数?
我正在尝试用 MQL4 语言创建专家顾问 (EA)。
如何编写一个返回最大亏损交易(而不是总亏损交易)的函数?
以下函数将返回最大亏损交易的票据。
在默认情况下loss = DBL_MAX
,这仍然可以以最低的利润返回有利可图的交易。
使用 a loss = 0
,它只会返回利润最大或为零的交易。
如果未找到交易,将退回此类交易的票证并清空。
int LargestLoss( int magic, double loss = DBL_MAX )
{
int ticket=EMPTY;
for(int i=0; i < Orderstotal(); i++)
{
if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES))
{
if(OrderSymbol()==Symbol() && OrderMagicNumber()==magic && OrderProfit()+OrderSwap()+OrderCommision()<loss)
{
loss=OrderProfit()+OrderSwap()+OrderCommision();
ticket=OrderTicket();
}
}
}
return ticket;
}
为了公平比较,应该将所有 [A] + [B] + [C] 相加以将一个与其他进行比较:
double aNetLOSS = OrderProfit() // [A]
+ OrderCommission() // [B]
+ OrderSwap(); // [C]
一个健壮的调用接口应该提供
对于一个严肃的 MQL4 自动化,返回值应该总是避免任何不需要的副作用:
bool GetTheTicketWithLargestLOSS( int &aTicket2SEARCH,
double &aValueOfLOSS,
const string aSymbol2SEARCH, // <= _Symbol
const int aMagNUM = 0,
const int aSearchMODE = MODE_TRADES // | MODE_HISTORY
)
{
double aLocalMaxLOSS = 0.;
aTicket2SEARCH = EMPTY; // BLOCK ANY BLIND OrderSelent() USE
for ( int i = 0; i < OrdersTotal(); i++ )
{ // TRY:
if ( OrderSelect( i, SELECT_BY_POS, aSearchMODE ) )
{
if ( OrderSymbol() == aSymbol2SEARCH // MATCH?
&& OrderMagicNumber() == aMagNUM // MATCH?
)
{ double aNetLOSS = OrderProfit() // [A]
+ OrderCommission() // [B]
+ OrderSwap(); // [C]
if ( aNetLOSS < aLocalMaxLOSS )
{
aLocalMaxLOSS = aNetLOSS; // UPDATE
aLocalTkt2FIND = OrderTicket();
}
continue; // ----------------------------^ LOOP NEXT
}
continue; // ----------------------------------^ LOOP NEXT
}
else
{ // ON EXC:
// LOG:
// REPORT:
// HANDLE:
// RET/SIG:
return( False ); // SIG TERM EXIT
}
}
aTicket2SEARCH = aLocalTkt2FIND; // ON FAIR EXIT: FINAL ASSIGNMENTS
aValueOfLOSS = aLocalMaxLOSS;
return( True ); // SIG FAIR EXIT ( &DATA SET )
}