【发布时间】:2017-09-29 00:56:12
【问题描述】:
我正在尝试用 MQL4 语言创建智能交易系统 (EA)。
如何编写一个函数来返回最大亏损交易(而不是总亏损交易)?
【问题讨论】:
-
请提供一个最小的工作示例以及您需要的更多详细信息。我想你想循环你的未平仓交易,直到你找到利润损失最大的票,然后退还那张票?
标签: trading algorithmic-trading mql4 metatrader4 forex
我正在尝试用 MQL4 语言创建智能交易系统 (EA)。
如何编写一个函数来返回最大亏损交易(而不是总亏损交易)?
【问题讨论】:
标签: trading algorithmic-trading mql4 metatrader4 forex
以下函数将返回最大亏损交易的票。
默认为loss = DBL_MAX,这仍然可以返回利润最低的盈利交易。
使用loss = 0,它只会返回最大负利润的交易或零。
如果未找到交易,将退回此类交易的票证和 EMPTY。
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;
}
【讨论】:
EMPTY 而不是 0,是一种更安全的做法,因为盲人 OrderSelect( aTicketNUM, ... ) 将保持安全和稳健,以对抗任何天真的盲人和未处理的 -产生异常的产品。
为了公平比较,应该将所有 [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 )
}
【讨论】: