如何在 Metatrader 4 / MQL4 中过滤交易品种
How to filter traded symbols in Metatrader 4 / MQL4
我正在寻找 的解决方案 在我的循环中只考虑真实的外汇对。我不希望包括差价合约、商品、白银、黄金等,因为它们在计算点数等方面具有完全不同的逻辑(我想将数据用于外汇仪表板)。
如何在不为每个现有 FX 对构建 if-statements
的情况下实现过滤器?
如果可能,解决方案应独立于所使用的经纪商(因为提供的 FX 对可能因经纪商而异,因此常见的方法是全包解决方案)。
这是我当前的代码,不区分 fx 和非 fx:
/*
2.) Create a string format for each pending and running trade
*/
int live_orders = OrdersTotal();
string live_trades = "";
for(int i=live_orders; i >= 0; i--)
{
if(OrderSelect(i,SELECT_BY_POS)==false) continue;
live_trades = live_trades +
"live_trades|" +
version + "|" +
DID + "|" +
AccountNumber() + "|" +
IntegerToString(OrderTicket()) + "|" +
TimeToString(OrderOpenTime(), TIME_DATE|TIME_SECONDS) + "|" +
TimeToString(OrderCloseTime(), TIME_DATE|TIME_SECONDS) + "|" +
IntegerToString(OrderType()) + "|" +
DoubleToString(OrderLots(),2) + "|" +
OrderSymbol() + "|" +
DoubleToString(OrderOpenPrice(),5) + "|" +
DoubleToString(OrderClosePrice(),5) + "|" +
DoubleToString(OrderStopLoss(),5) + "|" +
DoubleToString(OrderTakeProfit(),5) + "|" +
DoubleToString(OrderCommission(),2) + "|" +
DoubleToString(OrderSwap(),2) + "|" +
DoubleToString(OrderProfit(),2) + "|" +
"<" + OrderComment() + ">|";
}
这可能是最简单的方法。前缀符号可能是个问题(例如 mEURUSD),但通过按前缀大小移动 StringSubstr 值很容易解决。后缀不是问题,因为我们采用符号字符串的前 6 个字符。
const string FX_CURRENCIES[]={"EUR","GBP","USD","NZD","AUD","CHF","CAD","JPY"};//add other currencies if needed
bool isFxPair(const string symbol){
return StringLen(symbol)>=6 && getCurrencyIdx(StringSubStr(symbol,0,3))>=0 &&
getCurrencyIdx(StringSubStr(symbol,3,3))>=0;
}
int getCurrencyIdx(const string smb){
for(int i=ArraySize(FX_CURRENCIES)-1;i>=0;i--){
if(FX_CURRENCIES[i]==smb)
return i;
}
return -1;
}
使用 CStringArray 和缓存 FX 符号可能是另一个可能工作得更快的好主意,但它似乎使用与上述类似的逻辑(但每次添加内容时都必须对缓存进行排序让 CStringArray 集合快速工作)。
没有直接的方法来询问交易品种是 FX、CFD、Stock、Crypto 还是其他任何东西。
我正在寻找 的解决方案 在我的循环中只考虑真实的外汇对。我不希望包括差价合约、商品、白银、黄金等,因为它们在计算点数等方面具有完全不同的逻辑(我想将数据用于外汇仪表板)。
如何在不为每个现有 FX 对构建 if-statements
的情况下实现过滤器?
如果可能,解决方案应独立于所使用的经纪商(因为提供的 FX 对可能因经纪商而异,因此常见的方法是全包解决方案)。
这是我当前的代码,不区分 fx 和非 fx:
/*
2.) Create a string format for each pending and running trade
*/
int live_orders = OrdersTotal();
string live_trades = "";
for(int i=live_orders; i >= 0; i--)
{
if(OrderSelect(i,SELECT_BY_POS)==false) continue;
live_trades = live_trades +
"live_trades|" +
version + "|" +
DID + "|" +
AccountNumber() + "|" +
IntegerToString(OrderTicket()) + "|" +
TimeToString(OrderOpenTime(), TIME_DATE|TIME_SECONDS) + "|" +
TimeToString(OrderCloseTime(), TIME_DATE|TIME_SECONDS) + "|" +
IntegerToString(OrderType()) + "|" +
DoubleToString(OrderLots(),2) + "|" +
OrderSymbol() + "|" +
DoubleToString(OrderOpenPrice(),5) + "|" +
DoubleToString(OrderClosePrice(),5) + "|" +
DoubleToString(OrderStopLoss(),5) + "|" +
DoubleToString(OrderTakeProfit(),5) + "|" +
DoubleToString(OrderCommission(),2) + "|" +
DoubleToString(OrderSwap(),2) + "|" +
DoubleToString(OrderProfit(),2) + "|" +
"<" + OrderComment() + ">|";
}
这可能是最简单的方法。前缀符号可能是个问题(例如 mEURUSD),但通过按前缀大小移动 StringSubstr 值很容易解决。后缀不是问题,因为我们采用符号字符串的前 6 个字符。
const string FX_CURRENCIES[]={"EUR","GBP","USD","NZD","AUD","CHF","CAD","JPY"};//add other currencies if needed
bool isFxPair(const string symbol){
return StringLen(symbol)>=6 && getCurrencyIdx(StringSubStr(symbol,0,3))>=0 &&
getCurrencyIdx(StringSubStr(symbol,3,3))>=0;
}
int getCurrencyIdx(const string smb){
for(int i=ArraySize(FX_CURRENCIES)-1;i>=0;i--){
if(FX_CURRENCIES[i]==smb)
return i;
}
return -1;
}
使用 CStringArray 和缓存 FX 符号可能是另一个可能工作得更快的好主意,但它似乎使用与上述类似的逻辑(但每次添加内容时都必须对缓存进行排序让 CStringArray 集合快速工作)。
没有直接的方法来询问交易品种是 FX、CFD、Stock、Crypto 还是其他任何东西。