# ping_pong/index.js

    'use strict'

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

    /**
     * @module PingPong
     * @param {boolean} endless - if enabled, pong fill will trigger a new ping
     * @param {string} symbol - symbol to trade on
     * @param {number} amount - individual ping/pong order amount
     * @param {number} orderCount - number of ping/pong pairs to create, 1 or more
     * @param {number} [pingPrice] - used for a single ping/pong pair
     * @param {number} [pongPrice] - used for a single ping/pong pair
     * @param {number} [pingMinPrice] - minimum price for ping orders
     * @param {number} [pingMaxPrice] - maximum price for ping orders
     * @param {number} [pongDistance] - pong offset from ping orders for multiple pairs
     *
     * @example
     * await host.startAO('bfx-ping_pong', {
     *   symbol: 'tBTCUSD',
     *   amount: 0.5,
     *   orderCount: 5,
     *   pingMinPrice: 6000,
     *   pingMaxPrice: 6700,
     *   pongDistance: 300,
     *   submitDelay: 150,
     *   cancelDelay: 150,
     *   _margin: false,
     * })
     */
    const PingPong = defineAlgoOrder({
      id: 'bfx-ping_pong',
      name: 'Ping/Pong',

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

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

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

    module.exports = PingPong