package ccxt

// PLEASE DO NOT EDIT THIS FILE, IT IS GENERATED AND WILL BE OVERWRITTEN:
// https://github.com/ccxt/ccxt/blob/master/CONTRIBUTING.md#how-to-contribute-code

type btcturk struct {
    Exchange

}

func NewBtcturkCore() btcturk {
   p := btcturk{}
   setDefaults(&p)
   return p
}

func  (this *btcturk) Describe() interface{}  {
    return this.DeepExtend(this.Exchange.Describe(), map[string]interface{} {
        "id": "btcturk",
        "name": "BTCTurk",
        "countries": []interface{}{"TR"},
        "rateLimit": 100,
        "pro": false,
        "has": map[string]interface{} {
            "CORS": true,
            "spot": true,
            "margin": false,
            "swap": false,
            "future": false,
            "option": false,
            "addMargin": false,
            "cancelOrder": true,
            "closeAllPositions": false,
            "closePosition": false,
            "createDepositAddress": false,
            "createOrder": true,
            "createReduceOnlyOrder": false,
            "fetchBalance": true,
            "fetchBorrowRateHistories": false,
            "fetchBorrowRateHistory": false,
            "fetchCrossBorrowRate": false,
            "fetchCrossBorrowRates": false,
            "fetchDepositAddress": false,
            "fetchDepositAddresses": false,
            "fetchDepositAddressesByNetwork": false,
            "fetchFundingHistory": false,
            "fetchFundingRate": false,
            "fetchFundingRateHistory": false,
            "fetchFundingRates": false,
            "fetchIndexOHLCV": false,
            "fetchIsolatedBorrowRate": false,
            "fetchIsolatedBorrowRates": false,
            "fetchLeverage": false,
            "fetchMarginMode": false,
            "fetchMarkets": true,
            "fetchMarkOHLCV": false,
            "fetchMyTrades": true,
            "fetchOHLCV": true,
            "fetchOpenInterestHistory": false,
            "fetchOpenOrders": true,
            "fetchOrderBook": true,
            "fetchOrders": true,
            "fetchPosition": false,
            "fetchPositionHistory": false,
            "fetchPositionMode": false,
            "fetchPositions": false,
            "fetchPositionsForSymbol": false,
            "fetchPositionsHistory": false,
            "fetchPositionsRisk": false,
            "fetchPremiumIndexOHLCV": false,
            "fetchTicker": true,
            "fetchTickers": true,
            "fetchTrades": true,
            "reduceMargin": false,
            "setLeverage": false,
            "setMarginMode": false,
            "setPositionMode": false,
            "ws": false,
        },
        "timeframes": map[string]interface{} {
            "1m": 1,
            "15m": 15,
            "30m": 30,
            "1h": 60,
            "4h": 240,
            "1d": "1 d",
            "1w": "1 w",
            "1y": "1 y",
        },
        "urls": map[string]interface{} {
            "logo": "https://github.com/user-attachments/assets/10e0a238-9f60-4b06-9dda-edfc7602f1d6",
            "api": map[string]interface{} {
                "public": "https://api.btcturk.com/api/v2",
                "private": "https://api.btcturk.com/api/v1",
                "graph": "https://graph-api.btcturk.com/v1",
            },
            "www": "https://www.btcturk.com",
            "doc": "https://github.com/BTCTrader/broker-api-docs",
        },
        "api": map[string]interface{} {
            "public": map[string]interface{} {
                "get": map[string]interface{} {
                    "orderbook": 1,
                    "ticker": 0.1,
                    "trades": 1,
                    "ohlc": 1,
                    "server/exchangeinfo": 1,
                },
            },
            "private": map[string]interface{} {
                "get": map[string]interface{} {
                    "users/balances": 1,
                    "openOrders": 1,
                    "allOrders": 1,
                    "users/transactions/trade": 1,
                },
                "post": map[string]interface{} {
                    "users/transactions/crypto": 1,
                    "users/transactions/fiat": 1,
                    "order": 1,
                    "cancelOrder": 1,
                },
                "delete": map[string]interface{} {
                    "order": 1,
                },
            },
            "graph": map[string]interface{} {
                "get": map[string]interface{} {
                    "ohlcs": 1,
                    "klines/history": 1,
                },
            },
        },
        "features": map[string]interface{} {
            "spot": map[string]interface{} {
                "sandbox": false,
                "createOrder": map[string]interface{} {
                    "marginMode": false,
                    "triggerPrice": true,
                    "triggerPriceType": nil,
                    "triggerDirection": false,
                    "stopLossPrice": false,
                    "takeProfitPrice": false,
                    "attachedStopLossTakeProfit": nil,
                    "timeInForce": map[string]interface{} {
                        "IOC": false,
                        "FOK": false,
                        "PO": false,
                        "GTD": false,
                    },
                    "hedged": false,
                    "leverage": false,
                    "marketBuyRequiresPrice": false,
                    "marketBuyByCost": false,
                    "selfTradePrevention": false,
                    "trailing": false,
                    "iceberg": false,
                },
                "createOrders": nil,
                "fetchMyTrades": map[string]interface{} {
                    "marginMode": false,
                    "limit": 100,
                    "daysBack": 100000,
                    "untilDays": 30,
                    "symbolRequired": true,
                },
                "fetchOrder": nil,
                "fetchOpenOrders": map[string]interface{} {
                    "marginMode": false,
                    "limit": nil,
                    "trigger": false,
                    "trailing": false,
                    "symbolRequired": true,
                },
                "fetchOrders": map[string]interface{} {
                    "marginMode": false,
                    "limit": 1000,
                    "daysBack": 100000,
                    "untilDays": 30,
                    "trigger": false,
                    "trailing": false,
                    "symbolRequired": true,
                },
                "fetchClosedOrders": nil,
                "fetchOHLCV": map[string]interface{} {
                    "limit": nil,
                },
            },
            "swap": map[string]interface{} {
                "linear": nil,
                "inverse": nil,
            },
            "future": map[string]interface{} {
                "linear": nil,
                "inverse": nil,
            },
        },
        "fees": map[string]interface{} {
            "trading": map[string]interface{} {
                "maker": this.ParseNumber("0.0005"),
                "taker": this.ParseNumber("0.0009"),
            },
        },
        "exceptions": map[string]interface{} {
            "exact": map[string]interface{} {
                "FAILED_ORDER_WITH_OPEN_ORDERS": InsufficientFunds,
                "FAILED_LIMIT_ORDER": InvalidOrder,
                "FAILED_MARKET_ORDER": InvalidOrder,
            },
        },
        "precisionMode": TICK_SIZE,
    })
}
/**
 * @method
 * @name btcturk#fetchMarkets
 * @description retrieves data on all markets for btcturk
 * @see https://docs.btcturk.com/public-endpoints/exchange-info
 * @param {object} [params] extra parameters specific to the exchange API endpoint
 * @returns {object[]} an array of objects representing market data
 */
func  (this *btcturk) FetchMarkets(optionalArgs ...interface{}) <- chan interface{} {
            ch := make(chan interface{})
            go func() interface{} {
                defer close(ch)
                defer ReturnPanicError(ch)
                    params := GetArg(optionalArgs, 0, map[string]interface{} {})
            _ = params
        
            response:= (<-this.PublicGetServerExchangeinfo(params))
            PanicOnError(response)
            //
            //    {
            //        "data": {
            //            "timeZone": "UTC",
            //            "serverTime": "1618826678404",
            //            "symbols": [
            //                {
            //                    "id": "1",
            //                    "name": "BTCTRY",
            //                    "nameNormalized": "BTC_TRY",
            //                    "status": "TRADING",
            //                    "numerator": "BTC",
            //                    "denominator": "TRY",
            //                    "numeratorScale": "8",
            //                    "denominatorScale": "2",
            //                    "hasFraction": false,
            //                    "filters": [
            //                        {
            //                            "filterType": "PRICE_FILTER",
            //                            "minPrice": "0.0000000000001",
            //                            "maxPrice": "10000000",
            //                            "tickSize": "10",
            //                            "minExchangeValue": "99.91",
            //                            "minAmount": null,
            //                            "maxAmount": null
            //                        }
            //                    ],
            //                    "orderMethods": [
            //                        "MARKET",
            //                        "LIMIT",
            //                        "STOP_MARKET",
            //                        "STOP_LIMIT"
            //                    ],
            //                    "displayFormat": "#,###",
            //                    "commissionFromNumerator": false,
            //                    "order": "1000",
            //                    "priceRounding": false
            //                },
            //                ...
            //            },
            //        ],
            //    }
            //
            var data interface{} = this.SafeDict(response, "data", map[string]interface{} {})
            var markets interface{} = this.SafeList(data, "symbols", []interface{}{})
        
            ch <- this.ParseMarkets(markets)
            return nil
        
            }()
            return ch
        }
func  (this *btcturk) ParseMarket(entry interface{}) interface{}  {
    var id interface{} = this.SafeString(entry, "name")
    var baseId interface{} = this.SafeString(entry, "numerator")
    var quoteId interface{} = this.SafeString(entry, "denominator")
    var base interface{} = this.SafeCurrencyCode(baseId)
    var quote interface{} = this.SafeCurrencyCode(quoteId)
    var filters interface{} = this.SafeList(entry, "filters", []interface{}{})
    var minPrice interface{} = nil
    var maxPrice interface{} = nil
    var minAmount interface{} = nil
    var maxAmount interface{} = nil
    var minCost interface{} = nil
    for j := 0; IsLessThan(j, GetArrayLength(filters)); j++ {
        var filter interface{} = GetValue(filters, j)
        var filterType interface{} = this.SafeString(filter, "filterType")
        if IsTrue(IsEqual(filterType, "PRICE_FILTER")) {
            minPrice = this.SafeNumber(filter, "minPrice")
            maxPrice = this.SafeNumber(filter, "maxPrice")
            minAmount = this.SafeNumber(filter, "minAmount")
            maxAmount = this.SafeNumber(filter, "maxAmount")
            minCost = this.SafeNumber(filter, "minExchangeValue")
        }
    }
    var status interface{} = this.SafeString(entry, "status")
    return map[string]interface{} {
        "id": id,
        "symbol": Add(Add(base, "/"), quote),
        "base": base,
        "quote": quote,
        "settle": nil,
        "baseId": baseId,
        "quoteId": quoteId,
        "settleId": nil,
        "type": "spot",
        "spot": true,
        "margin": false,
        "swap": false,
        "future": false,
        "option": false,
        "active": (IsEqual(status, "TRADING")),
        "contract": false,
        "linear": nil,
        "inverse": nil,
        "contractSize": nil,
        "expiry": nil,
        "expiryDatetime": nil,
        "strike": nil,
        "optionType": nil,
        "precision": map[string]interface{} {
            "amount": this.ParseNumber(this.ParsePrecision(this.SafeString(entry, "numeratorScale"))),
            "price": this.ParseNumber(this.ParsePrecision(this.SafeString(entry, "denominatorScale"))),
        },
        "limits": map[string]interface{} {
            "leverage": map[string]interface{} {
                "min": nil,
                "max": nil,
            },
            "amount": map[string]interface{} {
                "min": minAmount,
                "max": maxAmount,
            },
            "price": map[string]interface{} {
                "min": minPrice,
                "max": maxPrice,
            },
            "cost": map[string]interface{} {
                "min": minCost,
                "max": nil,
            },
        },
        "created": nil,
        "info": entry,
    }
}
func  (this *btcturk) ParseBalance(response interface{}) interface{}  {
    var data interface{} = this.SafeList(response, "data", []interface{}{})
    var result interface{} = map[string]interface{} {
        "info": response,
        "timestamp": nil,
        "datetime": nil,
    }
    for i := 0; IsLessThan(i, GetArrayLength(data)); i++ {
        var entry interface{} = GetValue(data, i)
        var currencyId interface{} = this.SafeString(entry, "asset")
        var code interface{} = this.SafeCurrencyCode(currencyId)
        var account interface{} = this.Account()
        AddElementToObject(account, "total", this.SafeString(entry, "balance"))
        AddElementToObject(account, "free", this.SafeString(entry, "free"))
        AddElementToObject(account, "used", this.SafeString(entry, "locked"))
        AddElementToObject(result, code, account)
    }
    return this.SafeBalance(result)
}
/**
 * @method
 * @name btcturk#fetchBalance
 * @description query for balance and get the amount of funds available for trading or funds locked in orders
 * @see https://docs.btcturk.com/private-endpoints/account-balance
 * @param {object} [params] extra parameters specific to the exchange API endpoint
 * @returns {object} a [balance structure]{@link https://docs.ccxt.com/#/?id=balance-structure}
 */
func  (this *btcturk) FetchBalance(optionalArgs ...interface{}) <- chan interface{} {
            ch := make(chan interface{})
            go func() interface{} {
                defer close(ch)
                defer ReturnPanicError(ch)
                    params := GetArg(optionalArgs, 0, map[string]interface{} {})
            _ = params
        
            retRes3778 := (<-this.LoadMarkets())
            PanicOnError(retRes3778)
        
            response:= (<-this.PrivateGetUsersBalances(params))
            PanicOnError(response)
        
                //
            //     {
            //       "data": [
            //         {
            //           "asset": "TRY",
            //           "assetname": "Türk Lirası",
            //           "balance": "0",
            //           "locked": "0",
            //           "free": "0",
            //           "orderFund": "0",
            //           "requestFund": "0",
            //           "precision": 2
            //         }
            //       ]
            //     }
            //
        ch <- this.ParseBalance(response)
            return nil
        
            }()
            return ch
        }
/**
 * @method
 * @name btcturk#fetchOrderBook
 * @description fetches information on open orders with bid (buy) and ask (sell) prices, volumes and other data
 * @see https://docs.btcturk.com/public-endpoints/orderbook
 * @param {string} symbol unified symbol of the market to fetch the order book for
 * @param {int} [limit] the maximum amount of order book entries to return
 * @param {object} [params] extra parameters specific to the exchange API endpoint
 * @returns {object} A dictionary of [order book structures]{@link https://docs.ccxt.com/#/?id=order-book-structure} indexed by market symbols
 */
func  (this *btcturk) FetchOrderBook(symbol interface{}, optionalArgs ...interface{}) <- chan interface{} {
            ch := make(chan interface{})
            go func() interface{} {
                defer close(ch)
                defer ReturnPanicError(ch)
                    limit := GetArg(optionalArgs, 0, nil)
            _ = limit
            params := GetArg(optionalArgs, 1, map[string]interface{} {})
            _ = params
        
            retRes4098 := (<-this.LoadMarkets())
            PanicOnError(retRes4098)
            var market interface{} = this.Market(symbol)
            var request interface{} = map[string]interface{} {
                "pairSymbol": GetValue(market, "id"),
            }
        
            response:= (<-this.PublicGetOrderbook(this.Extend(request, params)))
            PanicOnError(response)
            //     {
            //       "data": {
            //         "timestamp": 1618827901241,
            //         "bids": [
            //           [
            //             "460263.00",
            //             "0.04244000"
            //           ]
            //         ]
            //       }
            //     }
            var data interface{} = this.SafeDict(response, "data", map[string]interface{} {})
            var timestamp interface{} = this.SafeInteger(data, "timestamp")
        
            ch <- this.ParseOrderBook(data, GetValue(market, "symbol"), timestamp, "bids", "asks", 0, 1)
            return nil
        
            }()
            return ch
        }
func  (this *btcturk) ParseTicker(ticker interface{}, optionalArgs ...interface{}) interface{}  {
    //
    //   {
    //     "pair": "BTCTRY",
    //     "pairNormalized": "BTC_TRY",
    //     "timestamp": 1618826361234,
    //     "last": 462485,
    //     "high": 473976,
    //     "low": 444201,
    //     "bid": 461928,
    //     "ask": 462485,
    //     "open": 456915,
    //     "volume": 917.41368645,
    //     "average": 462868.29574589,
    //     "daily": 5570,
    //     "dailyPercent": 1.22,
    //     "denominatorSymbol": "TRY",
    //     "numeratorSymbol": "BTC",
    //     "order": 1000
    //   }
    //
    market := GetArg(optionalArgs, 0, nil)
    _ = market
    var marketId interface{} = this.SafeString(ticker, "pair")
    market = this.SafeMarket(marketId, market)
    var symbol interface{} = GetValue(market, "symbol")
    var timestamp interface{} = this.SafeInteger(ticker, "timestamp")
    var last interface{} = this.SafeString(ticker, "last")
    return this.SafeTicker(map[string]interface{} {
        "symbol": symbol,
        "timestamp": timestamp,
        "datetime": this.Iso8601(timestamp),
        "high": this.SafeString(ticker, "high"),
        "low": this.SafeString(ticker, "low"),
        "bid": this.SafeString(ticker, "bid"),
        "bidVolume": nil,
        "ask": this.SafeString(ticker, "ask"),
        "askVolume": nil,
        "vwap": nil,
        "open": this.SafeString(ticker, "open"),
        "close": last,
        "last": last,
        "previousClose": nil,
        "change": this.SafeString(ticker, "daily"),
        "percentage": this.SafeString(ticker, "dailyPercent"),
        "average": this.SafeString(ticker, "average"),
        "baseVolume": this.SafeString(ticker, "volume"),
        "quoteVolume": nil,
        "info": ticker,
    }, market)
}
/**
 * @method
 * @name btcturk#fetchTickers
 * @description fetches price tickers for multiple markets, statistical information calculated over the past 24 hours for each market
 * @see https://docs.btcturk.com/public-endpoints/ticker
 * @param {string[]|undefined} symbols unified symbols of the markets to fetch the ticker for, all market tickers are returned if not assigned
 * @param {object} [params] extra parameters specific to the exchange API endpoint
 * @returns {object} a dictionary of [ticker structures]{@link https://docs.ccxt.com/#/?id=ticker-structure}
 */
func  (this *btcturk) FetchTickers(optionalArgs ...interface{}) <- chan interface{} {
            ch := make(chan interface{})
            go func() interface{} {
                defer close(ch)
                defer ReturnPanicError(ch)
                    symbols := GetArg(optionalArgs, 0, nil)
            _ = symbols
            params := GetArg(optionalArgs, 1, map[string]interface{} {})
            _ = params
        
            retRes4918 := (<-this.LoadMarkets())
            PanicOnError(retRes4918)
        
            response:= (<-this.PublicGetTicker(params))
            PanicOnError(response)
            var tickers interface{} = this.SafeList(response, "data")
        
            ch <- this.ParseTickers(tickers, symbols)
            return nil
        
            }()
            return ch
        }
/**
 * @method
 * @name btcturk#fetchTicker
 * @description fetches a price ticker, a statistical calculation with the information calculated over the past 24 hours for a specific market
 * @see https://docs.btcturk.com/public-endpoints/ticker
 * @param {string} symbol unified symbol of the market to fetch the ticker for
 * @param {object} [params] extra parameters specific to the exchange API endpoint
 * @returns {object} a [ticker structure]{@link https://docs.ccxt.com/#/?id=ticker-structure}
 */
func  (this *btcturk) FetchTicker(symbol interface{}, optionalArgs ...interface{}) <- chan interface{} {
            ch := make(chan interface{})
            go func() interface{} {
                defer close(ch)
                defer ReturnPanicError(ch)
                    params := GetArg(optionalArgs, 0, map[string]interface{} {})
            _ = params
        
            retRes5078 := (<-this.LoadMarkets())
            PanicOnError(retRes5078)
        
            tickers:= (<-this.FetchTickers([]interface{}{symbol}, params))
            PanicOnError(tickers)
        
            ch <- this.SafeValue(tickers, symbol)
            return nil
        
            }()
            return ch
        }
func  (this *btcturk) ParseTrade(trade interface{}, optionalArgs ...interface{}) interface{}  {
    //
    // fetchTrades
    //     {
    //       "pair": "BTCUSDT",
    //       "pairNormalized": "BTC_USDT",
    //       "numerator": "BTC",
    //       "denominator": "USDT",
    //       "date": "1618916879083",
    //       "tid": "637545136790672520",
    //       "price": "55774",
    //       "amount": "0.27917100",
    //       "side": "buy"
    //     }
    //
    // fetchMyTrades
    //     {
    //       "price": "56000",
    //       "numeratorSymbol": "BTC",
    //       "denominatorSymbol": "USDT",
    //       "orderType": "buy",
    //       "orderId": "2606935102",
    //       "id": "320874372",
    //       "timestamp": "1618916479593",
    //       "amount": "0.00020000",
    //       "fee": "0",
    //       "tax": "0"
    //     }
    //
    market := GetArg(optionalArgs, 0, nil)
    _ = market
    var timestamp interface{} = this.SafeInteger2(trade, "date", "timestamp")
    var id interface{} = this.SafeString2(trade, "tid", "id")
    var order interface{} = this.SafeString(trade, "orderId")
    var priceString interface{} = this.SafeString(trade, "price")
    var amountString interface{} = Precise.StringAbs(this.SafeString(trade, "amount"))
    var marketId interface{} = this.SafeString(trade, "pair")
    var symbol interface{} = this.SafeSymbol(marketId, market)
    var side interface{} = this.SafeString2(trade, "side", "orderType")
    var fee interface{} = nil
    var feeAmountString interface{} = this.SafeString(trade, "fee")
    if IsTrue(!IsEqual(feeAmountString, nil)) {
        var feeCurrency interface{} = this.SafeString(trade, "denominatorSymbol")
        fee = map[string]interface{} {
            "cost": Precise.StringAbs(feeAmountString),
            "currency": this.SafeCurrencyCode(feeCurrency),
        }
    }
    return this.SafeTrade(map[string]interface{} {
        "info": trade,
        "id": id,
        "order": order,
        "timestamp": timestamp,
        "datetime": this.Iso8601(timestamp),
        "symbol": symbol,
        "type": nil,
        "side": side,
        "takerOrMaker": nil,
        "price": priceString,
        "amount": amountString,
        "cost": nil,
        "fee": fee,
    }, market)
}
/**
 * @method
 * @name btcturk#fetchTrades
 * @description get the list of most recent trades for a particular symbol
 * @see https://docs.btcturk.com/public-endpoints/trades
 * @param {string} symbol unified symbol of the market to fetch trades for
 * @param {int} [since] timestamp in ms of the earliest trade to fetch
 * @param {int} [limit] the maximum amount of trades to fetch
 * @param {object} [params] extra parameters specific to the exchange API endpoint
 * @returns {Trade[]} a list of [trade structures]{@link https://docs.ccxt.com/#/?id=public-trades}
 */
func  (this *btcturk) FetchTrades(symbol interface{}, optionalArgs ...interface{}) <- chan interface{} {
            ch := make(chan interface{})
            go func() interface{} {
                defer close(ch)
                defer ReturnPanicError(ch)
                    since := GetArg(optionalArgs, 0, nil)
            _ = since
            limit := GetArg(optionalArgs, 1, nil)
            _ = limit
            params := GetArg(optionalArgs, 2, map[string]interface{} {})
            _ = params
        
            retRes5878 := (<-this.LoadMarkets())
            PanicOnError(retRes5878)
            var market interface{} = this.Market(symbol)
            // let maxCount = 50;
            var request interface{} = map[string]interface{} {
                "pairSymbol": GetValue(market, "id"),
            }
            if IsTrue(!IsEqual(limit, nil)) {
                AddElementToObject(request, "last", limit)
            }
        
            response:= (<-this.PublicGetTrades(this.Extend(request, params)))
            PanicOnError(response)
            //
            //     {
            //       "data": [
            //         {
            //           "pair": "BTCTRY",
            //           "pairNormalized": "BTC_TRY",
            //           "numerator": "BTC",
            //           "denominator": "TRY",
            //           "date": 1618828421497,
            //           "tid": "637544252214980918",
            //           "price": "462585.00",
            //           "amount": "0.01618411",
            //           "side": "sell"
            //         }
            //       ]
            //     }
            //
            var data interface{} = this.SafeList(response, "data")
        
            ch <- this.ParseTrades(data, market, since, limit)
            return nil
        
            }()
            return ch
        }
func  (this *btcturk) ParseOHLCV(ohlcv interface{}, optionalArgs ...interface{}) interface{}  {
    //
    //    {
    //        "timestamp": 1661990400,
    //        "high": 368388.0,
    //        "open": 368388.0,
    //        "low": 368388.0,
    //        "close": 368388.0,
    //        "volume": 0.00035208,
    //    }
    //
    market := GetArg(optionalArgs, 0, nil)
    _ = market
    return []interface{}{this.SafeTimestamp(ohlcv, "timestamp"), this.SafeNumber(ohlcv, "open"), this.SafeNumber(ohlcv, "high"), this.SafeNumber(ohlcv, "low"), this.SafeNumber(ohlcv, "close"), this.SafeNumber(ohlcv, "volume")}
}
/**
 * @method
 * @name btcturk#fetchOHLCV
 * @description fetches historical candlestick data containing the open, high, low, and close price, and the volume of a market
 * @see https://docs.btcturk.com/public-endpoints/get-kline-data
 * @param {string} symbol unified symbol of the market to fetch OHLCV data for
 * @param {string} timeframe the length of time each candle represents
 * @param {int} [since] timestamp in ms of the earliest candle to fetch
 * @param {int} [limit] the maximum amount of candles to fetch
 * @param {object} [params] extra parameters specific to the exchange API endpoint
 * @param {int} [params.until] timestamp in ms of the latest candle to fetch
 * @returns {int[][]} A list of candles ordered as timestamp, open, high, low, close, volume
 */
func  (this *btcturk) FetchOHLCV(symbol interface{}, optionalArgs ...interface{}) <- chan interface{} {
            ch := make(chan interface{})
            go func() interface{} {
                defer close(ch)
                defer ReturnPanicError(ch)
                    timeframe := GetArg(optionalArgs, 0, "1h")
            _ = timeframe
            since := GetArg(optionalArgs, 1, nil)
            _ = since
            limit := GetArg(optionalArgs, 2, nil)
            _ = limit
            params := GetArg(optionalArgs, 3, map[string]interface{} {})
            _ = params
        
            retRes6538 := (<-this.LoadMarkets())
            PanicOnError(retRes6538)
            var market interface{} = this.Market(symbol)
            var request interface{} = map[string]interface{} {
                "symbol": GetValue(market, "id"),
                "resolution": this.SafeValue(this.Timeframes, timeframe, timeframe),
            }
            var until interface{} = this.SafeInteger(params, "until", this.Milliseconds())
            AddElementToObject(request, "to", this.ParseToInt((Divide(until, 1000))))
            if IsTrue(!IsEqual(since, nil)) {
                AddElementToObject(request, "from", this.ParseToInt(Divide(since, 1000)))
            } else if IsTrue(IsEqual(limit, nil)) {
                limit = 100 // default value
            }
            if IsTrue(!IsEqual(limit, nil)) {
                limit = mathMin(limit, 11000) // max 11000 candles diapason can be covered
                if IsTrue(IsEqual(timeframe, "1y")) {
                    panic(BadRequest(Add(this.Id, " fetchOHLCV () does not accept a limit parameter when timeframe == \"1y\"")))
                }
                var seconds interface{} = this.ParseTimeframe(timeframe)
                var limitSeconds interface{} = Multiply(seconds, (Subtract(limit, 1)))
                if IsTrue(!IsEqual(since, nil)) {
                    var to interface{} = Add(this.ParseToInt(Divide(since, 1000)), limitSeconds)
                    AddElementToObject(request, "to", mathMin(GetValue(request, "to"), to))
                } else {
                    AddElementToObject(request, "from", Subtract(this.ParseToInt(Divide(0, 1000)), limitSeconds))
                }
            }
        
            response:= (<-this.GraphGetKlinesHistory(this.Extend(request, params)))
            PanicOnError(response)
        
                //
            //    {
            //        "s": "ok",
            //        "t": [
            //          1661990400,
            //          1661990520,
            //          ...
            //        ],
            //        "h": [
            //          368388.0,
            //          369090.0,
            //          ...
            //        ],
            //        "o": [
            //          368388.0,
            //          368467.0,
            //          ...
            //        ],
            //        "l": [
            //          368388.0,
            //          368467.0,
            //          ...
            //        ],
            //        "c": [
            //          368388.0,
            //          369090.0,
            //          ...
            //        ],
            //        "v": [
            //          0.00035208,
            //          0.2972395,
            //          ...
            //        ]
            //    }
            //
        ch <- this.ParseOHLCVs(response, market, timeframe, since, limit)
            return nil
        
            }()
            return ch
        }
func  (this *btcturk) ParseOHLCVs(ohlcvs interface{}, optionalArgs ...interface{}) interface{}  {
    market := GetArg(optionalArgs, 0, nil)
    _ = market
    timeframe := GetArg(optionalArgs, 1, "1m")
    _ = timeframe
    since := GetArg(optionalArgs, 2, nil)
    _ = since
    limit := GetArg(optionalArgs, 3, nil)
    _ = limit
    tail := GetArg(optionalArgs, 4, false)
    _ = tail
    var results interface{} = []interface{}{}
    var timestamp interface{} = this.SafeList(ohlcvs, "t", []interface{}{})
    var high interface{} = this.SafeList(ohlcvs, "h", []interface{}{})
    var open interface{} = this.SafeList(ohlcvs, "o", []interface{}{})
    var low interface{} = this.SafeList(ohlcvs, "l", []interface{}{})
    var close interface{} = this.SafeList(ohlcvs, "c", []interface{}{})
    var volume interface{} = this.SafeList(ohlcvs, "v", []interface{}{})
    for i := 0; IsLessThan(i, GetArrayLength(timestamp)); i++ {
        var ohlcv interface{} = map[string]interface{} {
            "timestamp": this.SafeInteger(timestamp, i),
            "high": this.SafeNumber(high, i),
            "open": this.SafeNumber(open, i),
            "low": this.SafeNumber(low, i),
            "close": this.SafeNumber(close, i),
            "volume": this.SafeNumber(volume, i),
        }
        AppendToArray(&results,this.ParseOHLCV(ohlcv, market))
    }
    var sorted interface{} = this.SortBy(results, 0)
    return this.FilterBySinceLimit(sorted, since, limit, 0, tail)
}
/**
 * @method
 * @name btcturk#createOrder
 * @description create a trade order
 * @see https://docs.btcturk.com/private-endpoints/submit-order
 * @param {string} symbol unified symbol of the market to create an order in
 * @param {string} type 'market' or 'limit'
 * @param {string} side 'buy' or 'sell'
 * @param {float} amount how much of currency you want to trade in units of base currency
 * @param {float} [price] the price at which the order is to be fulfilled, in units of the quote currency, ignored in market orders
 * @param {object} [params] extra parameters specific to the exchange API endpoint
 * @returns {object} an [order structure]{@link https://docs.ccxt.com/#/?id=order-structure}
 */
func  (this *btcturk) CreateOrder(symbol interface{}, typeVar interface{}, side interface{}, amount interface{}, optionalArgs ...interface{}) <- chan interface{} {
            ch := make(chan interface{})
            go func() interface{} {
                defer close(ch)
                defer ReturnPanicError(ch)
                    price := GetArg(optionalArgs, 0, nil)
            _ = price
            params := GetArg(optionalArgs, 1, map[string]interface{} {})
            _ = params
        
            retRes7568 := (<-this.LoadMarkets())
            PanicOnError(retRes7568)
            var market interface{} = this.Market(symbol)
            var request interface{} = map[string]interface{} {
                "orderType": side,
                "orderMethod": typeVar,
                "pairSymbol": GetValue(market, "id"),
                "quantity": this.AmountToPrecision(symbol, amount),
            }
            if IsTrue(!IsEqual(typeVar, "market")) {
                AddElementToObject(request, "price", this.PriceToPrecision(symbol, price))
            }
            if IsTrue(InOp(params, "clientOrderId")) {
                AddElementToObject(request, "newClientOrderId", GetValue(params, "clientOrderId"))
            } else if !IsTrue((InOp(params, "newClientOrderId"))) {
                AddElementToObject(request, "newClientOrderId", this.Uuid())
            }
        
            response:= (<-this.PrivatePostOrder(this.Extend(request, params)))
            PanicOnError(response)
            var data interface{} = this.SafeDict(response, "data")
        
            ch <- this.ParseOrder(data, market)
            return nil
        
            }()
            return ch
        }
/**
 * @method
 * @name btcturk#cancelOrder
 * @description cancels an open order
 * @see https://docs.btcturk.com/private-endpoints/cancel-order
 * @param {string} id order id
 * @param {string} symbol not used by btcturk cancelOrder ()
 * @param {object} [params] extra parameters specific to the exchange API endpoint
 * @returns {object} An [order structure]{@link https://docs.ccxt.com/#/?id=order-structure}
 */
func  (this *btcturk) CancelOrder(id interface{}, optionalArgs ...interface{}) <- chan interface{} {
            ch := make(chan interface{})
            go func() interface{} {
                defer close(ch)
                defer ReturnPanicError(ch)
                    symbol := GetArg(optionalArgs, 0, nil)
            _ = symbol
            params := GetArg(optionalArgs, 1, map[string]interface{} {})
            _ = params
            var request interface{} = map[string]interface{} {
                "id": id,
            }
        
            response:= (<-this.PrivateDeleteOrder(this.Extend(request, params)))
            PanicOnError(response)
        
                //
            //    {
            //        "success": true,
            //        "message": "SUCCESS",
            //        "code": 0
            //    }
            //
        ch <- this.SafeOrder(map[string]interface{} {
                "info": response,
            })
            return nil
        
            }()
            return ch
        }
/**
 * @method
 * @name btcturk#fetchOpenOrders
 * @description fetch all unfilled currently open orders
 * @see https://docs.btcturk.com/private-endpoints/open-orders
 * @param {string} symbol unified market symbol
 * @param {int} [since] the earliest time in ms to fetch open orders for
 * @param {int} [limit] the maximum number of  open orders structures to retrieve
 * @param {object} [params] extra parameters specific to the exchange API endpoint
 * @returns {Order[]} a list of [order structures]{@link https://docs.ccxt.com/#/?id=order-structure}
 */
func  (this *btcturk) FetchOpenOrders(optionalArgs ...interface{}) <- chan interface{} {
            ch := make(chan interface{})
            go func() interface{} {
                defer close(ch)
                defer ReturnPanicError(ch)
                    symbol := GetArg(optionalArgs, 0, nil)
            _ = symbol
            since := GetArg(optionalArgs, 1, nil)
            _ = since
            limit := GetArg(optionalArgs, 2, nil)
            _ = limit
            params := GetArg(optionalArgs, 3, map[string]interface{} {})
            _ = params
        
            retRes8168 := (<-this.LoadMarkets())
            PanicOnError(retRes8168)
            var request interface{} = map[string]interface{} {}
            var market interface{} = nil
            if IsTrue(!IsEqual(symbol, nil)) {
                market = this.Market(symbol)
                AddElementToObject(request, "pairSymbol", GetValue(market, "id"))
            }
        
            response:= (<-this.PrivateGetOpenOrders(this.Extend(request, params)))
            PanicOnError(response)
            var data interface{} = this.SafeDict(response, "data", map[string]interface{} {})
            var bids interface{} = this.SafeList(data, "bids", []interface{}{})
            var asks interface{} = this.SafeList(data, "asks", []interface{}{})
        
            ch <- this.ParseOrders(this.ArrayConcat(bids, asks), market, since, limit)
            return nil
        
            }()
            return ch
        }
/**
 * @method
 * @name btcturk#fetchOrders
 * @description fetches information on multiple orders made by the user
 * @see https://docs.btcturk.com/private-endpoints/all-orders
 * @param {string} symbol unified market symbol of the market orders were made in
 * @param {int} [since] the earliest time in ms to fetch orders for
 * @param {int} [limit] the maximum number of order structures to retrieve
 * @param {object} [params] extra parameters specific to the exchange API endpoint
 * @returns {Order[]} a list of [order structures]{@link https://docs.ccxt.com/#/?id=order-structure}
 */
func  (this *btcturk) FetchOrders(optionalArgs ...interface{}) <- chan interface{} {
            ch := make(chan interface{})
            go func() interface{} {
                defer close(ch)
                defer ReturnPanicError(ch)
                    symbol := GetArg(optionalArgs, 0, nil)
            _ = symbol
            since := GetArg(optionalArgs, 1, nil)
            _ = since
            limit := GetArg(optionalArgs, 2, nil)
            _ = limit
            params := GetArg(optionalArgs, 3, map[string]interface{} {})
            _ = params
        
            retRes8428 := (<-this.LoadMarkets())
            PanicOnError(retRes8428)
            var market interface{} = this.Market(symbol)
            var request interface{} = map[string]interface{} {
                "pairSymbol": GetValue(market, "id"),
            }
            if IsTrue(!IsEqual(limit, nil)) {
                // default 100 max 1000
                AddElementToObject(request, "last", limit)
            }
            if IsTrue(!IsEqual(since, nil)) {
                AddElementToObject(request, "startTime", MathFloor(Divide(since, 1000)))
            }
        
            response:= (<-this.PrivateGetAllOrders(this.Extend(request, params)))
            PanicOnError(response)
            // {
            //   "data": [
            //     {
            //       "id": "2606012912",
            //       "price": "55000",
            //       "amount": "0.0003",
            //       "quantity": "0.0003",
            //       "stopPrice": "0",
            //       "pairSymbol": "BTCUSDT",
            //       "pairSymbolNormalized": "BTC_USDT",
            //       "type": "buy",
            //       "method": "limit",
            //       "orderClientId": "2ed187bd-59a8-4875-a212-1b793963b85c",
            //       "time": "1618913189253",
            //       "updateTime": "1618913189253",
            //       "status": "Untouched",
            //       "leftAmount": "0.0003000000000000"
            //     }
            //   ]
            // }
            var data interface{} = this.SafeList(response, "data")
        
            ch <- this.ParseOrders(data, market, since, limit)
            return nil
        
            }()
            return ch
        }
func  (this *btcturk) ParseOrderStatus(status interface{}) interface{}  {
    var statuses interface{} = map[string]interface{} {
        "Untouched": "open",
        "Partial": "open",
        "Canceled": "canceled",
        "Closed": "closed",
    }
    return this.SafeString(statuses, status, status)
}
func  (this *btcturk) ParseOrder(order interface{}, optionalArgs ...interface{}) interface{}  {
    //
    // fetchOrders / fetchOpenOrders
    //     {
    //       "id": 2605984008,
    //       "price": "55000",
    //       "amount": "0.00050000",
    //       "quantity": "0.00050000",
    //       "stopPrice": "0",
    //       "pairSymbol": "BTCUSDT",
    //       "pairSymbolNormalized": "BTC_USDT",
    //       "type": "buy",
    //       "method": "limit",
    //       "orderClientId": "f479bdb6-0965-4f03-95b5-daeb7aa5a3a5",
    //       "time": 0,
    //       "updateTime": 1618913083543,
    //       "status": "Untouched",
    //       "leftAmount": "0.00050000"
    //     }
    //
    // createOrder
    //     {
    //       "id": "2606935102",
    //       "quantity": "0.0002",
    //       "price": "56000",
    //       "stopPrice": null,
    //       "newOrderClientId": "98e5c491-7ed9-462b-9666-93553180fb28",
    //       "type": "buy",
    //       "method": "limit",
    //       "pairSymbol": "BTCUSDT",
    //       "pairSymbolNormalized": "BTC_USDT",
    //       "datetime": "1618916479523"
    //     }
    //
    market := GetArg(optionalArgs, 0, nil)
    _ = market
    var id interface{} = this.SafeString(order, "id")
    var price interface{} = this.SafeString(order, "price")
    var amountString interface{} = this.SafeString2(order, "amount", "quantity")
    var amount interface{} = Precise.StringAbs(amountString)
    var remaining interface{} = this.SafeString(order, "leftAmount")
    var marketId interface{} = this.SafeString(order, "pairSymbol")
    var symbol interface{} = this.SafeSymbol(marketId, market)
    var side interface{} = this.SafeString(order, "type")
    var typeVar interface{} = this.SafeString(order, "method")
    var clientOrderId interface{} = this.SafeString(order, "orderClientId")
    var timestamp interface{} = this.SafeInteger2(order, "updateTime", "datetime")
    var rawStatus interface{} = this.SafeString(order, "status")
    var status interface{} = this.ParseOrderStatus(rawStatus)
    return this.SafeOrder(map[string]interface{} {
        "info": order,
        "id": id,
        "price": price,
        "amount": amount,
        "remaining": remaining,
        "filled": nil,
        "cost": nil,
        "average": nil,
        "status": status,
        "side": side,
        "type": typeVar,
        "clientOrderId": clientOrderId,
        "timestamp": timestamp,
        "datetime": this.Iso8601(timestamp),
        "symbol": symbol,
        "fee": nil,
    }, market)
}
/**
 * @method
 * @name btcturk#fetchMyTrades
 * @description fetch all trades made by the user
 * @see https://docs.btcturk.com/private-endpoints/user-transactions
 * @param {string} symbol unified market symbol
 * @param {int} [since] the earliest time in ms to fetch trades for
 * @param {int} [limit] the maximum number of trades structures to retrieve
 * @param {object} [params] extra parameters specific to the exchange API endpoint
 * @returns {Trade[]} a list of [trade structures]{@link https://docs.ccxt.com/#/?id=trade-structure}
 */
func  (this *btcturk) FetchMyTrades(optionalArgs ...interface{}) <- chan interface{} {
            ch := make(chan interface{})
            go func() interface{} {
                defer close(ch)
                defer ReturnPanicError(ch)
                    symbol := GetArg(optionalArgs, 0, nil)
            _ = symbol
            since := GetArg(optionalArgs, 1, nil)
            _ = since
            limit := GetArg(optionalArgs, 2, nil)
            _ = limit
            params := GetArg(optionalArgs, 3, map[string]interface{} {})
            _ = params
        
            retRes9688 := (<-this.LoadMarkets())
            PanicOnError(retRes9688)
            var market interface{} = nil
            if IsTrue(!IsEqual(symbol, nil)) {
                market = this.Market(symbol)
            }
        
            response:= (<-this.PrivateGetUsersTransactionsTrade())
            PanicOnError(response)
            //
            //     {
            //       "data": [
            //         {
            //           "price": "56000",
            //           "numeratorSymbol": "BTC",
            //           "denominatorSymbol": "USDT",
            //           "orderType": "buy",
            //           "orderId": "2606935102",
            //           "id": "320874372",
            //           "timestamp": "1618916479593",
            //           "amount": "0.00020000",
            //           "fee": "0",
            //           "tax": "0"
            //         }
            //       ],
            //       "success": true,
            //       "message": "SUCCESS",
            //       "code": "0"
            //     }
            //
            var data interface{} = this.SafeList(response, "data")
        
            ch <- this.ParseTrades(data, market, since, limit)
            return nil
        
            }()
            return ch
        }
func  (this *btcturk) Nonce() interface{}  {
    return this.Milliseconds()
}
func  (this *btcturk) Sign(path interface{}, optionalArgs ...interface{}) interface{}  {
    api := GetArg(optionalArgs, 0, "public")
    _ = api
    method := GetArg(optionalArgs, 1, "GET")
    _ = method
    params := GetArg(optionalArgs, 2, map[string]interface{} {})
    _ = params
    headers := GetArg(optionalArgs, 3, nil)
    _ = headers
    body := GetArg(optionalArgs, 4, nil)
    _ = body
    if IsTrue(IsEqual(this.Id, "btctrader")) {
        panic(ExchangeError(Add(this.Id, " is an abstract base API for BTCExchange, BTCTurk")))
    }
    var url interface{} = Add(Add(GetValue(GetValue(this.Urls, "api"), api), "/"), path)
    if IsTrue(IsTrue((IsEqual(method, "GET"))) || IsTrue((IsEqual(method, "DELETE")))) {
        if IsTrue(GetArrayLength(ObjectKeys(params))) {
            url = Add(url, Add("?", this.Urlencode(params)))
        }
    } else {
        body = this.Json(params)
    }
    if IsTrue(IsEqual(api, "private")) {
        this.CheckRequiredCredentials()
        var nonce interface{} = ToString(this.Nonce())
        var secret interface{} = this.Base64ToBinary(this.Secret)
        var auth interface{} = Add(this.ApiKey, nonce)
        headers = map[string]interface{} {
            "X-PCK": this.ApiKey,
            "X-Stamp": nonce,
            "X-Signature": this.Hmac(this.Encode(auth), secret, sha256, "base64"),
            "Content-Type": "application/json",
        }
    }
    return map[string]interface{} {
        "url": url,
        "method": method,
        "body": body,
        "headers": headers,
    }
}
func  (this *btcturk) HandleErrors(code interface{}, reason interface{}, url interface{}, method interface{}, headers interface{}, body interface{}, response interface{}, requestHeaders interface{}, requestBody interface{}) interface{}  {
    var errorCode interface{} = this.SafeString(response, "code", "0")
    var message interface{} = this.SafeString(response, "message")
    var output interface{} = Ternary(IsTrue((IsEqual(message, nil))), body, message)
    this.ThrowExactlyMatchedException(GetValue(this.Exceptions, "exact"), message, Add(Add(this.Id, " "), output))
    if IsTrue(IsTrue((!IsEqual(errorCode, "0"))) && IsTrue((!IsEqual(errorCode, "SUCCESS")))) {
        panic(ExchangeError(Add(Add(this.Id, " "), output)))
    }
    return nil
}


func (this *btcturk) Init(userConfig map[string]interface{}) {
    this.Exchange = Exchange{}
    this.Exchange.InitParent(userConfig, this.Describe().(map[string]interface{}), this)
    this.Exchange.DerivedExchange = this
}