//+------------------------------------------------------------------+ //| SimplySpecification.mq4 | //| Copyright © 2007, MetaQuotes Software Corp. | //| http://www.metaquotes.net/ | //+------------------------------------------------------------------+ string SymbolsArray[13] = {"","USDCHF","GBPUSD","EURUSD","USDJPY", "AUDUSD","USDCAD","EURGBP","EURAUD","EURCHF","EURJPY","GBPJPY","GBPCHF"}; //+------------------------------------------------------------------+ //| string SymbolByNumber | //+------------------------------------------------------------------+ string GetSymbolString(int Number) { //---- string res = ""; res = SymbolsArray[Number]; //---- return(res); } //+------------------------------------------------------------------+ //| Очень простая функция расчета маржи для форексных символов. | //| Расчет автоматически идет в базовой валюте счета и не работает | //| для сложных видов курсов, которые не имеют прямого пересчета | //| в базовую валюту торгового счета. | //+------------------------------------------------------------------+ double MarginCalculate(string symbol, double volume) { string first = StringSubstr(symbol,0,3); // первый символ, например EUR string second = StringSubstr(symbol,3,3); // второй символ, например USD string currency = AccountCurrency(); // валюта депозита, например USD double leverage = AccountLeverage(); // кредитное плечо, например 100 // размер контракта, например 100000 double contract = MarketInfo(symbol, MODE_LOTSIZE); double bid = MarketInfo(symbol, MODE_BID); // цена бид //---- допускаем только стандартные форексные символы XXXYYY if(StringLen(symbol) != 6) { Print("MarginCalculate: '",symbol,"' must be standard forex symbol XXXYYY"); return(0.0); } //---- проверка наличия данных if(bid <= 0 || contract <= 0) { Print("MarginCalculate: no market information for '",symbol,"'"); return(0.0); } //---- проверяем самые простые варианты - без кроссов if(first == currency) return(contract*volume / leverage); // USDxxx if(second == currency) return(contract*bid*volume / leverage); // xxxUSD //---- проверяем обычные кроссы, ищем прямое преобразование через валюту депозита string base = currency + first; // USDxxx if(MarketInfo(base, MODE_BID) > 0) return(contract / MarketInfo(base, MODE_BID)*volume / leverage); //---- попробуем наоборот base = first + currency; // xxxUSD if(MarketInfo(base, MODE_BID) > 0) return(contract*MarketInfo(base, MODE_BID)*volume / leverage); //---- нет возможности прямого перерасчета Print("MarginCalculate: can not convert '",symbol,"'"); return(0.0); } //+------------------------------------------------------------------+ //| script program start function | //+------------------------------------------------------------------+ int start() { //---- for(int i = 1; i < 13; i++) { Print("Symbol=",GetSymbolString(i)," spread=",MarketInfo(GetSymbolString(i), MODE_SPREAD)," margin at 1 lot=",MarginCalculate(GetSymbolString(i),1), " MODE_TICKVALUE=",MarketInfo(GetSymbolString(i),MODE_TICKVALUE), ", MODE_TICKSIZE=",MarketInfo(GetSymbolString(i),MODE_TICKSIZE), " MODE_MARGINREQUIRED=",MarketInfo(GetSymbolString(i),MODE_MARGINREQUIRED)); } //---- return(0); } //+------------------------------------------------------------------+