[英]How to filter traded symbols in Metatrader 4 / MQL4
我正在尋找一種解決方案,僅在我的循環中考慮真正的外匯對。 我不希望包含差價合約、商品、白銀、黃金等,因為它們在計算點等時具有完全不同的邏輯(我想將數據用於外匯儀表板)。
如何在不為現有的每個 FX 對構建if-statements
情況下實現過濾器? 如果可能,該解決方案應獨立於所使用的經紀商(因為提供的外匯對可能因經紀商而異,因此常見的方法是全包解決方案)。
這是我當前的代碼,它不會在 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 集合添加到工作快)。
沒有直接的方法可以詢問一個符號是外匯、差價合約、股票、加密貨幣還是其他任何東西。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.