脚本: 历史利润计算面板

 

历史利润计算面板:

CalculateHistoryProfit 脚本 1.0 版旨在使用图表面板计算指定时期的利润。

历史利润计算面板

Author: Sergey Porphiryev

 
    //+------------------------------------------------------------------+
    //| 计算所选时期的总利润和交易次数
    //+------------------------------------------------------------------+
    void CalculateProfit()
    {
       total_profit = 0;
       total_deals = 0;
      
       HistorySelect(0, TimeCurrent());
       int total_orders = HistoryDealsTotal();
  
       for (int i = total_orders - 1; i >= 0; i--)
       {
           ulong deal_ticket = HistoryDealGetTicket(i);
           datetime deal_time = (datetime)HistoryDealGetInteger(deal_ticket, DEAL_TIME); // 为什么这一行不比下一行低?
           if (HistoryDealGetInteger(deal_ticket, DEAL_ENTRY) != 1) continue; // CloseBy 交易和 IN-commission 又是怎么回事?
  
           if (deal_time >= start_date && deal_time <= end_date) // 为什么不是 HistorySelect?
           {
               string deal_symbol = HistoryDealGetString(deal_ticket, DEAL_SYMBOL);
               int deal_magic = (int)HistoryDealGetInteger(deal_ticket, DEAL_MAGIC);
               int deal_type = (int)HistoryDealGetInteger(deal_ticket, DEAL_TYPE);
              
               // 根据交易类型(买入或卖出)进行筛选
               bool type_filter = (deal_type == 0 || deal_type == 1);
  
               // 字符过滤
               bool symbol_filter = (StringFind(current_symbols, "ALL") != -1) || (StringFind(current_symbols, deal_symbol) != -1); // 在循环中每次检查第一个条件的代价都很高。
  
               // 通过 Magiks 过滤
               bool magic_filter_all = (StringFind(current_magics, "ALL") != -1); // 在循环中每次检查的成本都很高。
              
               // 将包含法师的字符串拆分成数组
               string magic_values[];
               int count = StringSplit(current_magics, ',', magic_values); // 本应将其从循环中删除。
  
               // 检查 "空 "和魔法 0
               bool magic_filter_empty = false;
               for (int j = 0; j < count; j++) // Dear Cycle.
               {
                   if (magic_values[j] == "Empty" && deal_magic == 0) // 先检查第二个条件更省钱。
                   {
                       magic_filter_empty = true;
                       break;
                   }
               }
  
               // 检查特定魔法
               bool magic_filter_exact = false;
               for (int j = 0; j < count; j++)
               {
                   if (IntegerToString(deal_magic) == magic_values[j]) // 为什么要将字符串变量相互比较?
                   {
                       magic_filter_exact = true;
                       break;
                   }
               }

关于代码的一些评论。

 
fxsaber #:

关于代码的一些评论。

非常感谢你的宝贵意见!!!!!这将是本周末要做的事情 ;))))))

 
干得漂亮感谢您的分享。