//+------------------------------------------------------------------+ //| Sekanas_Cost_Real_Analysis.mq4 | //| Telif Hakkı 2025, AYDIN SARIHAN | //| https://www.mql5.com/en/users/aydinsarihan| //+------------------------------------------------------------------+ #property copyright "Copyright © 2025, AYDIN SARIHAN" #property link "https://www.mql5.com/en/users/aydinsarihan" #property version "4.02" // DÜZELTME: Fonksiyonlar yeniden sıralanarak derleyici hataları giderildi. #property description "Belirli bir risk ve stop mesafesine göre işlem maliyetlerini hesaplar." //--- Şablona Özgü Özellikler #property indicator_chart_window #property indicator_buffers 0 #property indicator_plots 0 //================================================================== // BÖLÜM 1: DAHİL EDİLENLER & KÜTÜPHANELER //================================================================== // Bu gösterge için harici kütüphane gerekli değildir. //================================================================== // BÖLÜM 2: GİRİŞ PARAMETRELERİ (INPUTS) //================================================================== //--- Trade Risk Settings extern double InpRiskAmountUSD = 100.0; // Risk Tutarı ($) extern double InpStopLossSekanas = 10.0; // Sekanas Cinsinden Stop Loss (Sk) //--- Broker Settings extern double InpCommissionPerLot = 6.0; // Lot Başına Komisyon ($) (Varsayılan) //--- Panel Visual Settings extern int InpPanelXOffset = 10; // Panel X Koordinatı extern int InpPanelYOffset = 15; // Panel Y Koordinatı extern color InpPanelBGColor = C'40,40,40'; // Panel Arkaplan Rengi extern color InpTitleColor = C'30,144,255';// Başlık Rengi (DodgerBlue) extern color InpLabelColor = C'255,255,255';// Etiket Rengi (White) extern color InpValueColor = C'255,215,0'; // Değer Rengi (Gold) extern color InpDescColor = C'180,180,180';// Açıklama Rengi //================================================================== // BÖLÜM 3: GLOBAL DEĞİŞKENLER & SABİTLER //================================================================== #define PANEL_PREFIX "Panel_CostAnalyzer_" #define OBJ_PANEL_BG PANEL_PREFIX + "BG" //================================================================== // BÖLÜM 5 & 8: YARDIMCI VE HESAPLAMA FONKSİYONLARI // Not: Bu fonksiyonlar, derleyici hatalarını önlemek için // ana olay yöneticilerinden (init, start, deinit) önce tanımlanmıştır. //================================================================== //------------------------------------------------------------------ // Grafik üzerine metin etiketi oluşturur. void CreateLabel(string name, int x, int y, string text, color clr, int font_size, string font_name = "Arial", int anchor = 0) { string obj_name = PANEL_PREFIX + name; if(ObjectFind(obj_name) < 0) { ObjectCreate(obj_name, OBJ_LABEL, 0, 0, 0); ObjectSet(obj_name, OBJPROP_XDISTANCE, InpPanelXOffset + x); ObjectSet(obj_name, OBJPROP_YDISTANCE, InpPanelYOffset + y); ObjectSetString(0, obj_name, OBJPROP_FONT, font_name); ObjectSet(obj_name, OBJPROP_FONTSIZE, font_size); ObjectSet(obj_name, OBJPROP_CORNER, 0); // Sol üst köşe } ObjectSet(obj_name, OBJPROP_COLOR, clr); ObjectSetString(0, obj_name, OBJPROP_TEXT, text); } //------------------------------------------------------------------ // Paneli oluşturan tüm nesneleri ekrana çizer. void CreatePanel() { ObjectCreate(OBJ_PANEL_BG, OBJ_RECTANGLE, 0, 0, 0); ObjectSet(OBJ_PANEL_BG, OBJPROP_XDISTANCE, InpPanelXOffset); ObjectSet(OBJ_PANEL_BG, OBJPROP_YDISTANCE, InpPanelYOffset); ObjectSet(OBJ_PANEL_BG, OBJPROP_XSIZE, 260); ObjectSet(OBJ_PANEL_BG, OBJPROP_YSIZE, 200); ObjectSet(OBJ_PANEL_BG, OBJPROP_COLOR, InpPanelBGColor); ObjectSet(OBJ_PANEL_BG, OBJPROP_BACK, true); int x_left = 15; int x_center = 130; int y = 15; CreateLabel("Title", x_center-70, y, "Sekanas Risk & Cost Planner", InpTitleColor, 10, "Arial Black"); y += 25; CreateLabel("Lbl_SekanasValue", x_left, y, "Sekanas Value ($):", InpLabelColor, 9); CreateLabel("Desc_SekanasValue", x_left + 5, y + 12, "$ value of 1 Sk move for 1 Lot", InpDescColor, 7); y += 30; CreateLabel("Lbl_Spread", x_left, y, "Spread (Sk):", InpLabelColor, 9); CreateLabel("Desc_Spread", x_left + 5, y + 12, "Instant Spread Cost in Sekanas", InpDescColor, 7); y += 30; CreateLabel("Lbl_Commission", x_left, y, "Commission ($/Lot):", InpLabelColor, 9); CreateLabel("Desc_Commission", x_left + 5, y + 12, "Commission cost per 1 Lot", InpDescColor, 7); y += 30; string lot_size_label = StringFormat("Lot Size (%.0f$ Risk, %.1fSk):", InpRiskAmountUSD, InpStopLossSekanas); CreateLabel("Lbl_LotSize", x_left, y, lot_size_label, InpLabelColor, 9); CreateLabel("Desc_LotSize", x_left + 5, y + 12, "Calculated position size", InpDescColor, 7); y += 30; string total_cost_label = "Total Cost ($):"; CreateLabel("Lbl_TotalCost", x_left, y, total_cost_label, InpLabelColor, 9); CreateLabel("Desc_TotalCost", x_left + 5, y + 12, "Spread+Comm. for calculated lot", InpDescColor, 7); int x_right = 245; y = 15 + 25; CreateLabel("Val_SekanasValue", x_right - 70, y, "...", InpValueColor, 9, "Courier New"); y += 30; CreateLabel("Val_Spread", x_right - 70, y, "...", InpValueColor, 9, "Courier New"); y += 30; CreateLabel("Val_Commission", x_right - 70, y, "...", InpValueColor, 9, "Courier New"); y += 30; CreateLabel("Val_LotSize", x_right - 70, y, "...", InpValueColor, 9, "Courier New"); y += 30; CreateLabel("Val_TotalCost", x_right - 70, y, "...", InpValueColor, 9, "Courier New"); } //------------------------------------------------------------------ // 1 Sekanas'ın 1 Lot için anlık parasal değerini hesaplar. double CalculateSekanasMonetaryValue() { RefreshRates(); double ask = MarketInfo(Symbol(), MODE_ASK); double contract_size = MarketInfo(Symbol(), MODE_LOTSIZE); if(ask <= 0 || contract_size <= 0) return 0.0; return((ask * 0.0001) * contract_size); } //------------------------------------------------------------------ // Anlık spread farkını Sekanas birimine çevirir. double CalculateSpreadSekanas() { RefreshRates(); double ask = MarketInfo(Symbol(), MODE_ASK); double bid = MarketInfo(Symbol(), MODE_BID); if(ask <= 0) return 0.0; return(((ask - bid) / ask) * 10000.0); } //------------------------------------------------------------------ double GetAverageCommissionPerLot() { double total_comm = 0.0; double total_vol = 0.0; for(int i = 0; i < OrdersHistoryTotal(); i++) { if(OrderSelect(i, SELECT_BY_POS, MODE_HISTORY)) { if(OrderSymbol() == Symbol() && (OrderType() == OP_BUY || OrderType() == OP_SELL)) { if(OrderCommission() != 0) { total_comm += MathAbs(OrderCommission()); total_vol += OrderLots(); } } } } if(total_vol > 0.0) return total_comm / total_vol; return InpCommissionPerLot; } //------------------------------------------------------------------ void CalculateCostForRiskAmount(double risk_amount_usd, double sl_sekanas, double sekanas_value_usd, double spread_sekanas, double commission_per_lot_usd, double &out_lot_size, double &out_total_cost_usd) { out_lot_size = 0.0; out_total_cost_usd = 0.0; if(sl_sekanas <= 0 || sekanas_value_usd <= 0) return; double sl_value_per_lot_usd = sl_sekanas * sekanas_value_usd; if(sl_value_per_lot_usd <= 0) return; double required_lot = risk_amount_usd / sl_value_per_lot_usd; out_lot_size = NormalizeDouble(required_lot, 2); double spread_cost_per_lot_usd = spread_sekanas * sekanas_value_usd; out_total_cost_usd = (spread_cost_per_lot_usd + commission_per_lot_usd) * out_lot_size; } //------------------------------------------------------------------ // Paneldeki değerleri günceller. void UpdatePanel() { double sekanas_value = CalculateSekanasMonetaryValue(); double sp_sekanas = CalculateSpreadSekanas(); double commission_per_lot = GetAverageCommissionPerLot(); double calculated_lot_size; double total_cost_usd; CalculateCostForRiskAmount(InpRiskAmountUSD, InpStopLossSekanas, sekanas_value, sp_sekanas, commission_per_lot, calculated_lot_size, total_cost_usd); string val_sekanas_str = StringFormat("%.2f $", sekanas_value); string val_spread_str = StringFormat("%.2f Sk", sp_sekanas); string val_commission_str = StringFormat("%.2f $", commission_per_lot); string val_lot_size_str = StringFormat("%.2f Lot", calculated_lot_size); string val_total_cost_str = StringFormat("%.2f $", total_cost_usd); ObjectSetString(0, PANEL_PREFIX + "Val_SekanasValue", OBJPROP_TEXT, val_sekanas_str); ObjectSetString(0, PANEL_PREFIX + "Val_Spread", OBJPROP_TEXT, val_spread_str); ObjectSetString(0, PANEL_PREFIX + "Val_Commission", OBJPROP_TEXT, val_commission_str); ObjectSetString(0, PANEL_PREFIX + "Val_LotSize", OBJPROP_TEXT, val_lot_size_str); ObjectSetString(0, PANEL_PREFIX + "Val_TotalCost", OBJPROP_TEXT, val_total_cost_str); ChartRedraw(); } //------------------------------------------------------------------ // Bu gösterge tarafından oluşturulan tüm grafik nesnelerini siler. void DeleteAllPanelObjects() { for(int i = ObjectsTotal() - 1; i >= 0; i--) { string obj_name = ObjectName(i); if(StringFind(obj_name, PANEL_PREFIX) == 0) { ObjectDelete(obj_name); } } ChartRedraw(); } //================================================================== // BÖLÜM 4: ANA OLAY YÖNETİCİLERİ ("ORKESTRA ŞEFİ") //================================================================== //+------------------------------------------------------------------+ //| Başlatma fonksiyonu | //+------------------------------------------------------------------+ int init() { Comment(""); CreatePanel(); UpdatePanel(); return(INIT_SUCCEEDED); } //+------------------------------------------------------------------+ //| Durdurma fonksiyonu | //+------------------------------------------------------------------+ void deinit() { DeleteAllPanelObjects(); Comment(""); } //+------------------------------------------------------------------+ //| Ana döngü fonksiyonu (tick bazlı) | //+------------------------------------------------------------------+ int start() { UpdatePanel(); return(0); }