From 93dbf7983b2820c5cc5b9e4b3816557bc5fa51db Mon Sep 17 00:00:00 2001 From: Toh4iem9 Date: Mon, 1 Sep 2025 12:52:20 +0200 Subject: [PATCH] new files added --- Scripts/MyScripts/CalculateMarginSwap.mq5 | 159 ++++++++++++++++++++++ 1 file changed, 159 insertions(+) create mode 100644 Scripts/MyScripts/CalculateMarginSwap.mq5 diff --git a/Scripts/MyScripts/CalculateMarginSwap.mq5 b/Scripts/MyScripts/CalculateMarginSwap.mq5 new file mode 100644 index 0000000..b2a9d77 --- /dev/null +++ b/Scripts/MyScripts/CalculateMarginSwap.mq5 @@ -0,0 +1,159 @@ +//+------------------------------------------------------------------+ +//| CalculateMarginSwap.mq5| +//| Copyright 2025, xxxxxxxx | +//| | +//+------------------------------------------------------------------+ +#property copyright "Copyright 2025, xxxxxxxx" +#property link "" +#property version "1.08" // Fixed case scope syntax error. +#property description "Calculates margin and shows swap cost with its calculation method." + +//--- show the inputs window when the script is launched +#property script_show_inputs + +//--- Input for the user to specify the position size +input double InpLotSize = 0.1; + +//--- Forward declarations +string DayOfWeekToString(ENUM_DAY_OF_WEEK day); +string SwapModeToString(ENUM_SYMBOL_SWAP_MODE mode, string base_curr, string profit_curr, string margin_curr); + +//+------------------------------------------------------------------+ +//| Script program start function | +//+------------------------------------------------------------------+ +void OnStart() + { +//--- Get the current symbol from the chart + string symbol = _Symbol; + + if(!SymbolSelect(symbol, true)) + { + Print("Error: Could not select the symbol '", symbol, "'. Please add it to the Market Watch."); + return; + } + +//--- 1. Gather Symbol Information --- + string description = SymbolInfoString(symbol, SYMBOL_DESCRIPTION); + string base_currency = SymbolInfoString(symbol, SYMBOL_CURRENCY_BASE); + string profit_currency = SymbolInfoString(symbol, SYMBOL_CURRENCY_PROFIT); + string account_currency = AccountInfoString(ACCOUNT_CURRENCY); + ENUM_DAY_OF_WEEK triple_swap_day = (ENUM_DAY_OF_WEEK)SymbolInfoInteger(symbol, SYMBOL_SWAP_ROLLOVER3DAYS); + ENUM_SYMBOL_SWAP_MODE swap_mode = (ENUM_SYMBOL_SWAP_MODE)SymbolInfoInteger(symbol, SYMBOL_SWAP_MODE); + +//--- 2. Calculate Required Margin (Always in Account Currency) --- + double margin_buy = 0, margin_sell = 0; + if(!OrderCalcMargin(ORDER_TYPE_BUY, symbol, InpLotSize, SymbolInfoDouble(symbol, SYMBOL_ASK), margin_buy) || + !OrderCalcMargin(ORDER_TYPE_SELL, symbol, InpLotSize, SymbolInfoDouble(symbol, SYMBOL_BID), margin_sell)) + { + Print("Error calculating margin. Error code: ", GetLastError()); + return; + } + +//--- 3. Calculate Raw Swap Costs --- + double swap_long_cost = 0, swap_short_cost = 0; + double swap_long_raw = SymbolInfoDouble(symbol, SYMBOL_SWAP_LONG); + double swap_short_raw = SymbolInfoDouble(symbol, SYMBOL_SWAP_SHORT); + +//--- The raw value is calculated without conversion + switch(swap_mode) + { + case SYMBOL_SWAP_MODE_POINTS: + { + swap_long_cost = swap_long_raw; // The value is in points + swap_short_cost = swap_short_raw; + break; + } + case SYMBOL_SWAP_MODE_CURRENCY_SYMBOL: + case SYMBOL_SWAP_MODE_CURRENCY_MARGIN: + case SYMBOL_SWAP_MODE_CURRENCY_DEPOSIT: + { + swap_long_cost = InpLotSize * swap_long_raw; + swap_short_cost = InpLotSize * swap_short_raw; + break; + } + case SYMBOL_SWAP_MODE_INTEREST_CURRENT: + { + double contract_size = SymbolInfoDouble(symbol, SYMBOL_TRADE_CONTRACT_SIZE); + double price = SymbolInfoDouble(symbol, SYMBOL_BID); + swap_long_cost = (InpLotSize * contract_size * price * (swap_long_raw / 100.0)) / 360.0; + swap_short_cost = (InpLotSize * contract_size * price * (swap_short_raw / 100.0)) / 360.0; + break; + } + default: + { + swap_long_cost = swap_long_raw; + swap_short_cost = swap_short_raw; + break; + } + } + +//--- 4. Display the Results in the Experts Tab --- + string swap_unit = SwapModeToString(swap_mode, base_currency, profit_currency, account_currency); + + Print("--- Margin & Swap Calculation ---"); + PrintFormat("Symbol: %s (%s)", symbol, description); + PrintFormat("Position Size: %.2f lots", InpLotSize); + + Print("\n--- Required Margin ---"); + PrintFormat("BUY Order: %.2f %s", margin_buy, account_currency); + PrintFormat("SELL Order: %.2f %s", margin_sell, account_currency); + + Print("\n--- Daily Swap Cost ---"); + PrintFormat("Calculation Mode: %s", swap_unit); + PrintFormat("Long (BUY): %.5f", swap_long_cost); + PrintFormat("Short (SELL): %.5f", swap_short_cost); + PrintFormat("Triple Swap Day: %s", DayOfWeekToString(triple_swap_day)); + Print("--- Calculation Complete ---"); + } + +//+------------------------------------------------------------------+ +//| Converts a swap mode enum to a readable string description. | +//+------------------------------------------------------------------+ +string SwapModeToString(ENUM_SYMBOL_SWAP_MODE mode, string base_curr, string profit_curr, string margin_curr) + { + switch(mode) + { + case SYMBOL_SWAP_MODE_DISABLED: + return "Disabled"; + case SYMBOL_SWAP_MODE_POINTS: + return "In Points"; + case SYMBOL_SWAP_MODE_CURRENCY_SYMBOL: + return "In " + base_curr + " (Base Currency)"; + case SYMBOL_SWAP_MODE_CURRENCY_MARGIN: + return "In " + margin_curr + " (Account Currency)"; + case SYMBOL_SWAP_MODE_CURRENCY_DEPOSIT: + return "In " + profit_curr + " (Quote/Profit Currency)"; // Based on terminal behavior + case SYMBOL_SWAP_MODE_INTEREST_CURRENT: + return "Daily cost calculated from annual % in " + profit_curr; + default: + return "Unknown Mode (" + (string)mode + ")"; + } + } + +//+------------------------------------------------------------------+ +//| Converts a day-of-the-week enum to a readable string | +//+------------------------------------------------------------------+ +string DayOfWeekToString(ENUM_DAY_OF_WEEK day) + { + switch(day) + { + case SUNDAY: + return "Sunday"; + case MONDAY: + return "Monday"; + case TUESDAY: + return "Tuesday"; + case WEDNESDAY: + return "Wednesday"; + case THURSDAY: + return "Thursday"; + case FRIDAY: + return "Friday"; + case SATURDAY: + return "Saturday"; + default: + return "Unknown"; + } + } +//+------------------------------------------------------------------+ +//+------------------------------------------------------------------+