Example #1
0
 private void process_execution(double exec_price, int order_serial_num, int i, string dt)
 {
     calc_fee(order_data.order_size[order_serial_num], exec_price, order_data.order_type[order_serial_num] == "limit" ? "maker" : "taker");
     if (holding_data.holding_side == "")
     {
         if (order_data.order_side[order_serial_num] == "buy")
         {
             performance_data.num_buy++;
         }
         else
         {
             performance_data.num_sell++;
         }
         holding_data.update_holding(order_data.order_side[order_serial_num], exec_price, order_data.order_size[order_serial_num], i);
         log_data.add_log_data(i, dt, "New Entry:" + order_data.order_type[order_serial_num], holding_data, order_data, performance_data);
     }
     else if (holding_data.holding_side == order_data.order_side[order_serial_num])
     {
         var ave_price = Math.Round(((holding_data.holding_price * holding_data.holding_size) + (exec_price * order_data.order_size[order_serial_num])) / (order_data.order_size[order_serial_num] + holding_data.holding_size), 1);
         holding_data.update_holding(holding_data.holding_side, ave_price, order_data.order_size[order_serial_num] + holding_data.holding_size, i);
         log_data.add_log_data(i, dt, "Additional Entry.", holding_data, order_data, performance_data);
     }
     else if (holding_data.holding_size > order_data.order_size[order_serial_num])
     {
         calc_executed_pl(exec_price, order_data.order_size[order_serial_num], i);
         holding_data.update_holding(holding_data.holding_side, holding_data.holding_price, holding_data.holding_size - order_data.order_size[order_serial_num], i);
         log_data.add_log_data(i, dt, "Exit Order (h>o)", holding_data, order_data, performance_data);
     }
     else if (holding_data.holding_size == order_data.order_size[order_serial_num])
     {
         calc_executed_pl(exec_price, order_data.order_size[order_serial_num], i);
         //initialize_holding_data();
         holding_data = new HoldingData();
         log_data.add_log_data(i, dt, "Exit Order (h=o)", holding_data, order_data, performance_data);
     }
     else if (holding_data.holding_size < order_data.order_size[order_serial_num])
     {
         if (order_data.order_side[order_serial_num] == "buy")
         {
             performance_data.num_buy++;
         }
         else
         {
             performance_data.num_sell++;
         }
         calc_executed_pl(exec_price, holding_data.holding_size, i);
         holding_data.update_holding(order_data.order_side[order_serial_num], exec_price, order_data.order_size[order_serial_num] - holding_data.holding_size, i);
         log_data.add_log_data(i, dt, "'Exit & Entry Order (h<o)", holding_data, order_data, performance_data);
     }
     else
     {
         Console.WriteLine("Unknown situation in process execution !");
     }
 }