If you want to store to a custom array then rather use Matrices as they are independent from 1-dim array of length BarCount.
m = MA( Close, 20 );
Buy = Cross( Close, m );
Sell = Cross( m, Close );
Short = Cover = 0;
/// @link https://forum.amibroker.com/t/using-custom-backtest-to-find-min-max-mae-mfe-per-loosing-winning-trades/15376/2
/// Storing separate winning/losing MAE/MFE of closed trades to 2-dim array
/// And getting separate winning/losing min/max MAE/MFE of closed trades
/// by fxshrat@gmail.com
SetCustomBacktestProc("");
if (Status("action") == actionPortfolio) {
bo = GetBacktesterObject();
bo.Backtest();
wi = li = 0;
for (trade=bo.GetFirstTrade(); trade; trade=bo.GetNextTrade()) {
if (trade.GetPercentProfit() > 0)
wi++;
else
li++;
}
mat1 = Matrix(Max(1,wi), 2);// winning
mat2 = Matrix(Max(1,li), 2);// losing
wi = li = 0;
for (trade=bo.GetFirstTrade(); trade; trade=bo.GetNextTrade()) {
if (trade.GetPercentProfit() > 0) {
mat1[wi][0] = trade.GetMAE();
mat1[wi][1] = trade.GetMFE();
wi++;
} else {
mat2[li][0] = trade.GetMAE();
mat2[li][1] = trade.GetMFE();
li++;
}
}
sort1 = MxSort(mat1, 1);
sort2 = MxSort(mat2, 1);
//_TRACE(MxToString(sort1));
//_TRACE(MxToString(sort2));
last_wi = MxGetSize(sort1, 0)-1;
last_li = MxGetSize(sort2, 0)-1;
// Winning ones
Min_MAE_wi = sort1[0][0];
Max_MAE_wi = sort1[last_wi][0];
Min_MFE_wi = sort1[0][1];
Max_MFE_wi = sort1[last_wi][1];
// Losing ones
Min_MAE_li = sort2[0][0];
Max_MAE_li = sort2[last_li][0];
Min_MFE_li = sort2[0][1];
Max_MFE_li = sort2[last_li][1];
bo.AddCustomMetric("#Winning", wi);
bo.AddCustomMetric("#Losing", li);
// Winning ones
bo.AddCustomMetric("Min Winning MAE", Min_MAE_wi);
bo.AddCustomMetric("Max Winning MAE", Max_MAE_wi);
bo.AddCustomMetric("Min Winning MFE", Min_MFE_wi);
bo.AddCustomMetric("Max Winning MFE", Max_MFE_wi);
// Losing ones
bo.AddCustomMetric("Min Loosing MAE", Min_MAE_li);
bo.AddCustomMetric("Max Loosing MAE", Max_MAE_li);
bo.AddCustomMetric("Min Loosing MFE", Min_MFE_li);
bo.AddCustomMetric("Max Loosing MFE", Max_MFE_li);
}

Stored (sorted) winning trades array

stored (sorted) losing trades array

If you do not want to store results to array then you do not need Matrix usage at all to get min/max MAE/MFE. You would just need Min/Max functions.
/// @link https://forum.amibroker.com/t/using-custom-backtest-to-find-min-max-mae-mfe-per-loosing-winning-trades/15376/2
/// Getting separate winning/losing min/max MAE/MFE of closed trades
/// by fxshrat@gmail.com
SetCustomBacktestProc("");
if (Status("action") == actionPortfolio) {
bo = GetBacktesterObject();
bo.Backtest();
wi = li = 0;
Min_MAE_wi = Min_MFE_wi = Min_MAE_li = Min_MFE_li = 1e9;
Max_MAE_wi = Max_MFE_wi = Max_MAE_li = Max_MFE_li = -1e9;
for (trade=bo.GetFirstTrade(); trade; trade=bo.GetNextTrade()) {
if (trade.GetPercentProfit() > 0) {
Min_MAE_wi = Min(Min_MAE_wi, trade.GetMAE());
Min_MFE_wi = Min(Min_MFE_wi, trade.GetMFE());
Max_MAE_wi = Max(Max_MAE_wi, trade.GetMAE());
Max_MFE_wi = Max(Max_MFE_wi, trade.GetMFE());
wi++;
} else {
Min_MAE_li = Min(Min_MAE_li, trade.GetMAE());
Min_MFE_li = Min(Min_MFE_li, trade.GetMFE());
Max_MAE_li = Max(Max_MAE_li, trade.GetMAE());
Max_MFE_li = Max(Max_MFE_li, trade.GetMFE());
li++;
}
}
bo.AddCustomMetric("#Winning", wi);
bo.AddCustomMetric("#Losing", li);
// Winning ones
bo.AddCustomMetric("Min Winning MAE", Min_MAE_wi);
bo.AddCustomMetric("Max Winning MAE", Max_MAE_wi);
bo.AddCustomMetric("Min Winning MFE", Min_MFE_wi);
bo.AddCustomMetric("Max Winning MFE", Max_MFE_wi);
// Losing ones
bo.AddCustomMetric("Min Loosing MAE", Min_MAE_li);
bo.AddCustomMetric("Max Loosing MAE", Max_MAE_li);
bo.AddCustomMetric("Min Loosing MFE", Min_MFE_li);
bo.AddCustomMetric("Max Loosing MFE", Max_MFE_li);
}

To get mean of MAE/MFE just sum up within loop and then divide by wi/li.