# ococo/index.js

    'use strict'

    const defineAlgoOrder = require('../define_algo_order')

    const validateParams = require('./meta/validate_params')
    const processParams = require('./meta/process_params')
    const initState = require('./meta/init_state')
    const onSelfSubmitInitialOrder = require('./events/self_submit_initial_order')
    const onSelfSubmitOCOOrder = require('./events/self_submit_oco_order')
    const onLifeStart = require('./events/life_start')
    const onLifeStop = require('./events/life_stop')
    const onOrdersOrderCancel = require('./events/orders_order_cancel')
    const onOrdersOrderFill = require('./events/orders_order_fill')
    const genOrderLabel = require('./meta/gen_order_label')
    const genPreview = require('./meta/gen_preview')
    const declareEvents = require('./meta/declare_events')
    const getUIDef = require('./meta/get_ui_def')
    const serialize = require('./meta/serialize')
    const unserialize = require('./meta/unserialize')

    /**
     * @module OCOCO
     * @param {string} symbol - symbol to trade on
     * @param {string} orderType - initial order type, LIMIT or MARKET
     * @param {number} orderPrice - price for initial order if `orderType` is LIMIT
     * @param {number} amount - initial order amount
     * @param {boolean} _margin - if false, order type is prefixed with EXCHANGE
     * @param {boolean} _futures - if false, order type is prefixed with EXCHANGE
     * @param {string} action - initial order direction, Buy or Sell
     * @param {number} limitPrice - oco order limit price
     * @param {number} stopPrice - oco order stop price
     * @param {number} ocoAmount - oco order amount
     * @param {string} ocoAction - oco order direction, Buy or Sell
     * @param {number} submitDelaySec - submit delay in seconds
     * @param {number} cancelDelaySec - cancel delay in seconds
     * @param {number} lev - leverage for relevant markets
     *
     * @example
     * await host.startAO('bfx-ma_crossover', {
     *   symbol: 'tLEOUSD',
     *   orderType: 'LIMIT',
     *   orderPrice: 2,
     *   amount: 30,
     *   action: 'Sell',
     *   limitPrice: 1.7,
     *   stopPrice: 2.1,
     *   ocoAmount: 30,
     *   ocoAction: 'Buy',
     *   submitDelaySec: 0,
     *   cancelDelaySec: 0,
     *   margin: true
     * })
     */
    const OCOCO = defineAlgoOrder({
      id: 'bfx-ococo',
      name: 'OCOCO',

      meta: {
        validateParams,
        processParams,
        declareEvents,
        getUIDef,
        genOrderLabel,
        genPreview,
        initState,
        serialize,
        unserialize
      },

      events: {
        self: {
          submit_initial_order: onSelfSubmitInitialOrder,
          submit_oco_order: onSelfSubmitOCOOrder
        },

        life: {
          start: onLifeStart,
          stop: onLifeStop
        },

        orders: {
          order_cancel: onOrdersOrderCancel,
          order_fill: onOrdersOrderFill
        }
      }
    })

    module.exports = OCOCO