class Builder {

    private final String symbol;
    @Nullable private BigDecimal orderQuantity;
    @Nullable private BigDecimal simpleOrderQuantity;
    @Nullable private BigDecimal displayQuantity;
    @Nullable private BigDecimal price;
    @Nullable private BigDecimal stopPrice;
    @Nullable private BitmexSide side;
    @Nullable private BitmexOrderType orderType;
    @Nullable private String clOrdId;
    @Nullable private List<BitmexExecutionInstruction> executionInstructions;
    @Nullable private String clOrdLinkId;
    @Nullable private BitmexContingencyType contingencyType;
    @Nullable private BigDecimal pegOffsetValue;
    @Nullable private BitmexPegPriceType pegPriceType;
    @Nullable private BitmexTimeInForce timeInForce;
    @Nullable private String text;

    public Builder(@Nonnull String symbol) {
      this.symbol = symbol;
    }

    @Nonnull
    public BitmexPlaceOrderParameters build() {
      return new BitmexPlaceOrderParameters(
          symbol,
          orderQuantity,
          simpleOrderQuantity,
          displayQuantity,
          price,
          stopPrice,
          side,
          orderType,
          clOrdId,
          executionInstructions,
          clOrdLinkId,
          contingencyType,
          pegOffsetValue,
          pegPriceType,
          timeInForce,
          text);
    }

    @Nonnull
    public Builder setOrderQuantity(@Nullable BigDecimal orderQuantity) {
      this.orderQuantity = orderQuantity;
      return this;
    }

    @Nonnull
    public Builder setSimpleOrderQuantity(@Nullable BigDecimal simpleOrderQuantity) {
      this.simpleOrderQuantity = simpleOrderQuantity;
      return this;
    }

    @Nonnull
    public Builder setDisplayQuantity(@Nullable BigDecimal displayQuantity) {
      this.displayQuantity = displayQuantity;
      return this;
    }

    @Nonnull
    public Builder setPrice(@Nullable BigDecimal price) {
      this.price = price;
      return this;
    }

    @Nonnull
    public Builder setStopPrice(@Nullable BigDecimal stopPrice) {
      this.stopPrice = stopPrice;
      return this;
    }

    @Nonnull
    public Builder setSide(@Nullable BitmexSide side) {
      this.side = side;
      return this;
    }

    @Nonnull
    public Builder setOrderType(@Nullable BitmexOrderType orderType) {
      this.orderType = orderType;
      return this;
    }

    @Nonnull
    public Builder setClOrdId(@Nullable String clOrdId) {
      this.clOrdId = clOrdId;
      return this;
    }

    @Nonnull
    public Builder setExecutionInstructions(
        @Nullable List<BitmexExecutionInstruction> executionInstructions) {
      this.executionInstructions = executionInstructions;
      return this;
    }

    @Nonnull
    public Builder addExecutionInstruction(@Nullable BitmexExecutionInstruction execInst) {
      if (this.executionInstructions == null) {
        this.executionInstructions = new ArrayList<>();
      }
      this.executionInstructions.add(execInst);
      return this;
    }

    @Nonnull
    public Builder setClOrdLinkId(@Nullable String clOrdLinkId) {
      this.clOrdLinkId = clOrdLinkId;
      return this;
    }

    @Nonnull
    public Builder setContingencyType(@Nullable BitmexContingencyType contingencyType) {
      this.contingencyType = contingencyType;
      return this;
    }

    @Nonnull
    public Builder setPegOffsetValue(@Nullable BigDecimal pegOffsetValue) {
      this.pegOffsetValue = pegOffsetValue;
      return this;
    }

    @Nonnull
    public Builder setPegPriceType(@Nullable BitmexPegPriceType pegPriceType) {
      this.pegPriceType = pegPriceType;
      return this;
    }

    @Nonnull
    public Builder setTimeInForce(@Nullable BitmexTimeInForce timeInForce) {
      this.timeInForce = timeInForce;
      return this;
    }

    @Nonnull
    public Builder setText(@Nullable String text) {
      this.text = text;
      return this;
    }
  }

  @Override
  public String toString() {<FILL_FUNCTION_BODY>

    return "BitmexPlaceOrderParameters{"
        + "symbol="
        + symbol
        + ", orderQuantity="
        + orderQuantity
        + ", simpleOrderQuantity="
        + simpleOrderQuantity
        + ", displayQuantity="
        + displayQuantity
        + ", price="
        + price
        + ", stopPrice="
        + stopPrice
        + ", side="
        + side
        + ", orderType="
        + orderType
        + ", clOrdId='"
        + clOrdId
        + "', executionInstructions="
        + StringUtils.join(executionInstructions)
        + ", clOrdLinkId='"
        + clOrdLinkId
        + "', contingencyType="
        + contingencyType
        + ", pegOffsetValue="
        + pegOffsetValue
        + ", pegPriceType="
        + pegPriceType
        + ", timeInForce='"
        + timeInForce
        + ", text='"
        + text
        + "'}";
  
<no_super_class>