スクリプト: 履歴利益計算パネル

 

履歴利益計算パネル:

この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; // クローズ・バイ取引とイン・コミッションについては?
  
           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); // ループの中で毎回最初の条件をチェックするのは高くつく。
  
               // マジックスによるフィルタリング
               bool magic_filter_all = (StringFind(current_magics, "ALL") != -1); // ループの中で毎回チェックするのは高くつく。
              
               // 魔法士を含む文字列を配列に分割する。
               string magic_values[];
               int count = StringSplit(current_magics, ',', magic_values); // これもループから外すべきだった。
  
               // "Empty"(空)かどうかをチェックし、"Magick 0 "とする。
               bool magic_filter_empty = false;
               for (int j = 0; j < count; j++) // 親愛なるサイクルへ。
               {
                   if (magic_values[j] == "Empty" && deal_magic == 0) // 先に2番目の条件をチェックする方が安上がりである。
                   {
                       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 #:

コードについてのコメント

貴重なアドバイスをありがとうございました!今週末の課題にします ;))))))

 
よくやった。シェアしてくれてありがとう。