如何创建 returns 最大亏损交易的 MQL4 函数?
How to create a MQL4 function that returns the largest losing trade?
我正在尝试用 MQL4 语言创建智能交易系统 (EA)。
如何编写 returns 最大亏损交易(而不是总亏损交易)的函数?
以下函数将return最大亏损交易的单号。
在默认 loss = DBL_MAX
的情况下,这仍然可以 return 盈利最低的交易。
在 loss = 0
, 它只会 return 一个利润最大或为零的交易。
将 return 此类交易的票据,如果未找到交易,则清空。
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;
}
任何订单的实际净利润都需要添加 3 个组成部分:
为了公平比较,应该将所有 [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 )
}
我正在尝试用 MQL4 语言创建智能交易系统 (EA)。
如何编写 returns 最大亏损交易(而不是总亏损交易)的函数?
以下函数将return最大亏损交易的单号。
在默认 loss = DBL_MAX
的情况下,这仍然可以 return 盈利最低的交易。
在 loss = 0
, 它只会 return 一个利润最大或为零的交易。
将 return 此类交易的票据,如果未找到交易,则清空。
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;
}
任何订单的实际净利润都需要添加 3 个组成部分:
为了公平比较,应该将所有 [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 )
}