public boolean startBacktest() {

    // backtest結果ファイルのpathをセット
    setFilePath();

    // set parameter
    btResult = new BacktestResultFx();
    btParam = new BacktestParamFx();
    btParamCoe = new BacktestParamFxCoe();
    setBacktestParam5();
    setSpread();
    initializeEntryControl();
    initializePosition();
    initializeResult();
    initilalizeMaxProfitLoss();
    log.info("setting parameter is done.");

    // predict結果ファイルをserverから作業ディレクトリにダウンロード
    if (!downloadPredictResulFile()) return false;

    // buffered reader にファイルをセット
    loadFile();

    // backtestの出力ファイルのヘッダを作成
    createHeader2();

    // datetimeごとの処理を開始
    // datetimeごとの処理を開始
    if (!entry()) return false;
    try {
      calcEvaluation();
    } catch (Exception e) {
      e.printStackTrace();
    }
    closeBufferedReader();

    // 結果ファイルをup
    if (ControlProgram.getLocation().equals(ControlProgram.Location.local)) {
      if (!upFile(testResultLocalPath, testResultServerPath)) return false;
    }
    if (ControlProgram.getLocation().equals(ControlProgram.Location.global)) {
      upFileFtp(testResultLocalPath, testResultFtpPath);
    }

    // resultテーブル更新
    updateResult();

    return true;
  }
  private boolean entry() {
    int progressCount = 1;
    boolean isLastDatetime = false;
    while (isLastDatetime == false) {

      // datetimeファイルとpredict結果ファイルを読み込み
      // datetimeの書式 ex.2013-01-01 00:06:00.0
      readNextDatetimeClassification5();

      // 初回時はfilterDatetimeの初期化する
      if (progressCount == 1) {
        filterDatetime = btParam.getNowDatetime();
      }

      log.debug("--------------------------------"); // 区切り表示
      log.debug("{} の計算を開始します。", btParam.getNowDatetime());

      // 進捗表示
      progressCount =
          ControlProgram.displayProgress(
              progressCount, 3000, backtest.getId(), btParam.getNowDatetime());

      // datetime&predict結果ファイルが最終行ならbreak
      if (btParam.getNowDatetime() == null & btParam.getAllProbs().length == 0) {
        log.info("work_id:{}  テスト期間の最終datetimeです", work.getId());
        isLastDatetime = true;
        continue;
      } else if ((btParam.getNowDatetime() == null & btParam.getAllProbs().length != 1)
          | (btParam.getNowDatetime() != null & btParam.getAllProbs().length == 0)) {
        log.error("work_id:{} ERROR!!! datetimeとpredict結果ファイルの行数が一致しません。", work.getId());
        return false;
      }

      // datetime filter
      if (isInDatetimeFilter()) continue;

      // 週末
      if (isWeekend()) continue;

      // 現在価格を取得
      btParam.setNowPrice(getCurrentPrice(btParam.getNowDatetime()));

      // 期待値を算出
      calcMlValueType2();

      // debugファイル記載
      if (ModeConstants.IS_OUTPUT_DEBUG)
        outputDebugFile5mean(btParam.getNowDatetime(), btParam.getAllProbs(), mlValue);

      // filter
      setFilterValue();

      // entry
      openPosition();
      closePosition();
    } // while end

    log.info("work_id:{} 最終datetimeまでbacktestが完了しました。", work.getId());
    return true;
  }