Antares_messages_public
// This source code is subject to the terms of the Mozilla Public License 2.0 at https://mozilla.org/MPL/2.0/
// © taran1tul

//@version=5

// @description This library add messages for yours strategy for use in Antares trading system for binance and bybit exchanges. 
// Данная библиотека позволяет формировать сообщения в алертах стратегий для Antares в более упрощенном для пользователя режиме, включая всплывающие подсказки и т.д.
library("Antares_messages_public")
// TODO: Leverage and hedge mode now in separate message . Leverage set теперь в отдельном сообщении, т.к. используются крайне редко. hedge задавать через cli или сайт биржи
// add silence! in multi orders
// version 3.0 at 00:35 20.07.23
// binance_spot = 'binance'
// binance_futures = 'binancefru'
// bybit_spot = 'bybit'
// bybit_futures = 'bybitfru'

//  binance - спотовый рынок Binance
//  binancefru - USDT-фьючерсы Binance.
//  binancefro - COIN-M фьючерсы Binance. Рынок инвертированных фьючерсов. Сделку можно совершить продав свою монету к USD.
//  bybit - спотовый рынок Bybit.
//  bybitfu - USDT-фьючерсы Binance
//  bybitfi - Рынок инвертированных фьючерсов. Сделку можно совершить продав свою монету к USD.
//futures_exchanges = array.from('binancefru','binancefro','bybitfu', 'bybitfi')
//bybit_exchanges = array.from('bybit','bybitfu', 'bybitfi')



// 1 part of all messages with token (if exist), market and ticker
main_mess(string token, string market, string ticker) =>
    token_del_spaces = str.replace_all(token, ' ', '')
    token_mess = token_del_spaces == '0' or token_del_spaces == '' ? '' : 'token=' + token + ';'

    token_mess + 'market=' + market + ';symbol=' + ticker  + ';'

hedge_mess(string market, bool hedge, string side) =>
    futures =  str.contains(market,  'fru')    // проверяем в названии биржи 'fru' - фьючи
    hedge_mess = futures and hedge ? 'positionside=' + side + ';' : ''

closePosition_mess(bool hedge) =>
    closePos_mess = hedge ? '' : 'closePosition=true;' //при хедже убираем данную строку

qty_string(string type_qty, float qty, bool futures) =>
    mess=''
    if qty > 0
        qty_string_part1 = type_qty=='qty' or type_qty=='' or na(type_qty) ? 'quantity=' :
                              type_qty=='quqty' ? 'ququantity=' :
                              type_qty=='open%' and not futures ? 'quantityproc=' : type_qty=='open%' and futures ? 'openquantityproc=' :
                              type_qty=='close%' ? 'closequantityproc=' : 'error_in_type_quantity'
        mess :=  qty_string_part1 + str.tostring(qty) +';'
    
    mess

// @function Set leverage for ticker on specified market. 
// @param token (integer or 0) token for trade in system, if  = 0 then token part mess is empty. Токен,  При значениb = 0 не включается в формирование строки алерта.
// @param market (string) Spot 'binance' , 'bybit' . Futures  ('binancefru','binancefro','bybitfu', 'bybitfi'). Строковая переменная названия биржи.
// @param ticker_id (string) ticker in market ('btcusdt', 'ethusdt' etc...). Строковая переменная названия тикера (пары).
// @param leverage (float)  leverage level. Устанавливаемое плечо.
// @returns 'Set leverage message'. 
export set_leverage(string token, string market, string ticker_id, float leverage) =>
    'setvalue=LEVERAGE;' + main_mess(token, market, ticker_id) + 'leverage=' + str.tostring(leverage) + ';'

// @function Set pause in message.  '::' -left and  '::' -right included.
export pause(int time_pause) =>
    '::pause=' + str.tostring(time_pause) + ';::'
//========================================================= Режим 1 сторонней торговли  (18-270)==============================================================

// @function  Buy order with limit price and quantity. 
// Лимитный ордер на покупку(в лонг).
// @param token (integer or 0) token for trade in system, if  = 0 then token part mess is empty. Токен,  При значениb = 0 не включается в формирование строки алерта.
// @param market (string) Spot 'binance' , 'bybit' . Futures  ('binancefru','binancefro','bybitfu', 'bybitfi'). Строковая переменная названия биржи.
// @param ticker_id (string) ticker in market ('btcusdt', 'ethusdt' etc...). Строковая переменная названия тикера (пары).
// @param type_qty (string) type of quantity:  1. 'qty' or '' or na - standart (in coins), 2. 'quqty'- in assets (usdt,btc,etc..), 3.open% - open position(futures) or buy (spot) in % of base 4. close% - close in % of position (futures) or sell (spot) coins in % for current quantity
// @param quantity (float) orders size, see at 'type_qty'. Размер ордера, базы или % в соответствии с 'type_qty'
// @param price (float) price for limit order. Цена по которой должен быть установлен лимитный ордер.
// @param leverageforqty (bool) use leverage in qty. Использовать плечо при расчете количества или нет.
// @param orderId (string) if use order id you may change or cancel your order after or set it ''. Используйте OrderId если хотите изменить или отменить ордер в будущем.
// @returns 'Limit Buy order'. Лимитный ордер на покупку (лонг).
export LongLimit(string token, string market, string ticker_id, string type_qty, float quantity, float price, string orderId, bool leverageforqty)  => 
    futures_exchanges = array.from('binancefru','binancefro','bybitfu', 'bybitfi')
    futures = array.includes(futures_exchanges, market) ? true : false
    lvrg_qty_string = leverageforqty and futures ? 'leverageforqty=true;' : leverageforqty==false and futures ? 'leverageforqty=false;' : ''
    orderId_string = orderId=='' or na(orderId) ? '' : 'newclientorderid=' + str.tostring(orderId) + ';'
        
    main_mess(token, market, ticker_id) + 'side=Buy;'+ qty_string(type_qty,quantity,futures) +  'orderType=LIMIT;price=' + str.tostring(price) + ';' + lvrg_qty_string + orderId_string
   

// @function  Market Buy order with quantity. 
// Рыночный ордер на покупку (в лонг).
// @param token (integer or 0) token for trade in system, if  = 0 then token part mess is empty. Токен,  При значениb = 0 не включается в формирование строки алерта.
// @param market (string) Spot 'binance' , 'bybit' . Futures  ('binancefru','binancefro','bybitfu', 'bybitfi'). Строковая переменная названия биржи.
// @param ticker_id (string) ticker in market ('btcusdt', 'ethusdt' etc...). Строковая переменная названия тикера (пары).
// @param type_qty (string) type of quantity:  1. 'qty' or '' or na - standart (in coins), 2. 'quqty'- in assets (usdt,btc,etc..), 3.open% - open position(futures) or buy (spot) in % of base 4. close% - close in % of position (futures) or sell (spot) coins in % for current quantity
// @param quantity (float) orders size, see at 'type_qty'. Размер ордера, базы или % в соответствии с 'type_qty'
// @param leverageforqty (bool) use leverage in qty. Использовать плечо при расчете количества или нет.
// @returns 'Market Buy order'. Маркетный ордер на покупку (лонг).
export LongMarket(string token, string market, string ticker_id, string type_qty, float quantity, bool leverageforqty) =>
    futures_exchanges = array.from('binancefru','binancefro','bybitfu', 'bybitfi')
    futures = array.includes(futures_exchanges, market) ? true : false
    lvrg_qty_string = leverageforqty and futures ? 'leverageforqty=true;' : leverageforqty==false and futures ? 'leverageforqty=false;' : ''
        
    main_mess(token, market, ticker_id) + 'side=Buy;'+ qty_string(type_qty,quantity,futures)  + 'orderType=MARKET;' +  lvrg_qty_string
 
// @function  Sell order with limit price and quantity.
// Лимитный ордер на продажу(в шорт).
// @param token (integer or 0) token for trade in system, if  = 0 then token part mess is empty. Токен,  При значениb = 0 не включается в формирование строки алерта.
// @param market (string) Spot 'binance' , 'bybit' . Futures  ('binancefru','binancefro','bybitfu', 'bybitfi'). Строковая переменная названия биржи.
// @param ticker_id (string) ticker in market ('btcusdt', 'ethusdt' etc...). Строковая переменная названия тикера (пары).
// @param type_qty (string) type of quantity:  1. 'qty' or '' or na - standart (in coins), 2. 'quqty'- in assets (usdt,btc,etc..), 3.open% - open position(futures) or buy (spot) in % of base 4. close% - close in % of position (futures) or sell (spot) coins in % for current quantity
// @param quantity (float) orders size, see at 'type_qty'. Размер ордера, базы или % в соответствии с 'type_qty'
// @param price (float) price for limit order. Цена по которой должен быть установлен лимитный ордер.
// @param leverageforqty (bool) use leverage in qty. Использовать плечо при расчете количества или нет.
// @param orderId (string) if use order id you may change or cancel your order after or set it ''. Используйте OrderId если хотите изменить или отменить ордер в будущем.
// @returns 'Limit Sell order'. Лимитный ордер на продажу (шорт).
export ShortLimit(string token, string market, string ticker_id, string type_qty, float quantity, float price, bool leverageforqty, string orderId)  => 
    futures_exchanges = array.from('binancefru','binancefro','bybitfu', 'bybitfi')
    futures = array.includes(futures_exchanges, market) ? true : false
    lvrg_qty_string = leverageforqty and futures ? 'leverageforqty=true;' : leverageforqty==false and futures ? 'leverageforqty=false;' : ''
    orderId_string = orderId=='' or  na(orderId) ? '' : 'newclientorderid=' + str.tostring(orderId) + ';'
        
    main_mess(token, market, ticker_id) + 'side=Sell;'+ qty_string(type_qty,quantity,futures)  + 'orderType=LIMIT;price=' + str.tostring(price) + ';' + lvrg_qty_string + orderId_string

// @function Sell by market price and quantity.
// Рыночный ордер на продажу(в шорт).
// @param token (integer or 0) token for trade in system, if  = 0 then token part mess is empty. Токен,  При значениb = 0 не включается в формирование строки алерта.
// @param market (string) Spot 'binance' , 'bybit' . Futures  ('binancefru','binancefro','bybitfu', 'bybitfi'). Строковая переменная названия биржи.
// @param ticker_id (string) ticker in market ('btcusdt', 'ethusdt' etc...). Строковая переменная названия тикера (пары).
// @param type_qty (string) type of quantity:  1. 'qty' or '' or na - standart (in coins), 2. 'quqty'- in assets (usdt,btc,etc..), 3.open% - open position(futures) or buy (spot) in % of base 4. close% - close in % of position (futures) or sell (spot) coins in % for current quantity
// @param quantity (float) orders size, see at 'type_qty'. Размер ордера, базы или % в соответствии с 'type_qty'
// @param leverageforqty (bool) use leverage in qty. Использовать плечо при расчете количества или нет.
// @returns 'Market Sell order'. Маркетный ордер на продажу (шорт).
export ShortMarket(string token, string market, string ticker_id, string type_qty, float quantity, bool leverageforqty) =>
    futures_exchanges = array.from('binancefru','binancefro','bybitfu', 'bybitfi')
    futures = array.includes(futures_exchanges, market) ? true : false
    lvrg_qty_string = leverageforqty and futures ? 'leverageforqty=true;' : leverageforqty==false and futures ? 'leverageforqty=false;' : ''
        
    main_mess(token, market, ticker_id) + 'side=Sell;'+ qty_string(type_qty,quantity,futures)  + 'orderType=MARKET;' + lvrg_qty_string


//**********************************************   CANCEL ORDERS    *****************************************************

// @function Cancel all orders for market and ticker in setups. Отменяет все ордера на заданной бирже и заданном токене(паре).
// @param market (string) Spot 'binance' , 'bybit' . Futures  ('binancefru','binancefro','bybitfu', 'bybitfi'). Строковая переменная названия биржи.
// @param ticker_id (string) ticker in market ('btcusdt', 'ethusdt' etc...). Строковая переменная названия тикера (пары).
// @returns 'Cancel all orders'. Отмена всех ордеров на заданной бирже и заданном токене(паре).
export Cancel_by_ticker(string token, string market, string ticker_id) =>
   
    main_mess(token, market, ticker_id)  + 'cancelorder=symbol;'

// @function Cancel order by Id for market and ticker in setups. Отменяет ордер по Id на заданной бирже и заданном токене(паре).
// @param market (string) Spot 'binance' , 'bybit' . Futures  ('binancefru','binancefro','bybitfu', 'bybitfi'). Строковая переменная названия биржи.
// @param ticker_id (string) ticker in market ('btcusdt', 'ethusdt' etc...). Строковая переменная названия тикера (пары).
// @param order_id (string) order id for cancel . Строковая переменная названия ордера, заданного при его открытии.
// @returns 'Cancel order'. Отмена ордера по Id на заданной бирже и заданном токене(паре).
export Cancel_by_id(string token, string market, string ticker_id, string orderId) =>
    
    main_mess(token, market, ticker_id) + 'cancelorder=order;' + 'clientorderid=' + str.tostring(orderId) + ';'
    



//***********************************************    CLOSE ORDERS   **************************************************************
// @function Close all positions for market and ticker in setups. Закрывает все позиции на заданной бирже и заданном токене(паре).
// @param market (string) Spot 'binance' , 'bybit' . Futures  ('binancefru','binancefro','bybitfu', 'bybitfi'). Строковая переменная названия биржи.
// @param ticker_id (string) ticker in market ('btcusdt', 'ethusdt' etc...). Строковая переменная названия тикера (пары).
// @returns 'Close positions'
export Close_positions(string token, string market, string ticker_id) =>

    main_mess(token, market, ticker_id) + 'closepos=position;'

// @function Close limit order for long position. (futures)
// Лимитный ордер на продажу(в шорт) для закрытия лонговой позиции(reduceonly).
// @param token (integer or 0) token for trade in system, if  = 0 then token part mess is empty. Токен,  При значениb = 0 не включается в формирование строки алерта.
// @param market (string) Spot 'binance' , 'bybit' . Futures  ('binancefru','binancefro','bybitfu', 'bybitfi'). Строковая переменная названия биржи.
// @param ticker_id (string) ticker in market ('btcusdt', 'ethusdt' etc...). Строковая переменная названия тикера (пары).
// @param type_qty (string) type of quantity:  1. 'qty' or '' or na - standart (in coins), 2. 'quqty'- in assets (usdt,btc,etc..), 3.open% - open position(futures) or buy (spot) in % of base 4. close% - close in % of position (futures) or sell (spot) coins in % for current quantity
// @param quantity (float) orders size, see at 'type_qty'. Размер ордера, базы или % в соответствии с 'type_qty'
// @param price (float) price for limit order. Цена по которой должен быть установлен лимитный ордер.
// @param leverageforqty (bool) use leverage in qty. Использовать плечо при расчете количества или нет.
// @param orderId (string) if use order id you may change or cancel your order after or set it ''. Используйте OrderId если хотите изменить или отменить ордер в будущем.
// @returns 'Limit Sell order reduce only (close long position)'. Лимитный ордер на продажу для снижения текущего лонга(в шорт не входит).
export CloseLongLimit(string token, string market, string ticker_id, string type_qty, float quantity, float price, string orderId, bool leverageforqty)  => 
    futures_exchanges = array.from('binancefru','binancefro','bybitfu', 'bybitfi')
    futures = array.includes(futures_exchanges, market) ? true : false
    lvrg_qty_string = leverageforqty and futures ? 'leverageforqty=true;' : leverageforqty==false and futures ? 'leverageforqty=false;' : ''
    orderId_string = orderId=='' or  na(orderId) ? '' : 'newclientorderid=' + str.tostring(orderId) + ';'
        
    main_mess(token, market, ticker_id)  + 'reduceOnly=true;side=Sell;'+ qty_string(type_qty,quantity,futures)  + 'orderType=LIMIT;price=' + str.tostring(price) + ';' + lvrg_qty_string + orderId_string

// @function Close market order for long position.
// Рыночный ордер на продажу(в шорт) для закрытия лонговой позиции(reduceonly).
// @param token (integer or 0) token for trade in system, if  = 0 then token part mess is empty. Токен,  При значениb = 0 не включается в формирование строки алерта.
// @param market (string) Spot 'binance' , 'bybit' . Futures  ('binancefru','binancefro','bybitfu', 'bybitfi'). Строковая переменная названия биржи.
// @param ticker_id (string) ticker in market ('btcusdt', 'ethusdt' etc...). Строковая переменная названия тикера (пары).
// @param type_qty (string) type of quantity:  1. 'qty' or '' or na - standart (in coins), 2. 'quqty'- in assets (usdt,btc,etc..), 3.open% - open position(futures) or buy (spot) in % of base 4. close% - close in % of position (futures) or sell (spot) coins in % for current quantity
// @param quantity (float) orders size, see at 'type_qty'. Размер ордера, базы или % в соответствии с 'type_qty'
// @param price (float) price for limit order. Цена по которой должен быть установлен лимитный ордер.
// @param leverageforqty (bool) use leverage in qty. Использовать плечо при расчете количества или нет.
// @returns 'Market Sell order reduce only (close long position)'. Ордер на снижение/закрытие текущего лонга(в шорт не входит) по рыночной цене.
export CloseLongMarket(string token, string market, string ticker_id, string type_qty, float quantity,  bool leverageforqty)  => 
    futures_exchanges = array.from('binancefru','binancefro','bybitfu', 'bybitfi')
    futures = array.includes(futures_exchanges, market) ? true : false
    lvrg_qty_string = leverageforqty and futures ? 'leverageforqty=true;' : leverageforqty==false and futures ? 'leverageforqty=false;' : ''
        
    main_mess(token, market, ticker_id)  + 'reduceOnly=true;side=Sell;orderType=MARKET;'+ qty_string(type_qty,quantity,futures) + lvrg_qty_string

// @function Close limit order for short position.
// Лимитный ордер на покупку(в лонг) для закрытия шортовой позиции(reduceonly).
// @param token (integer or 0) token for trade in system, if  = 0 then token part mess is empty. Токен,  При значениb = 0 не включается в формирование строки алерта.
// @param market (string) Spot 'binance' , 'bybit' . Futures  ('binancefru','binancefro','bybitfu', 'bybitfi'). Строковая переменная названия биржи.
// @param ticker_id (string) ticker in market ('btcusdt', 'ethusdt' etc...). Строковая переменная названия тикера (пары).
// @param type_qty (string) type of quantity:  1. 'qty' or '' or na - standart (in coins), 2. 'quqty'- in assets (usdt,btc,etc..), 3.open% - open position(futures) or buy (spot) in % of base 4. close% - close in % of position (futures) or sell (spot) coins in % for current quantity
// @param quantity (float) orders size, see at 'type_qty'. Размер ордера, базы или % в соответствии с 'type_qty'
// @param price (float) price for limit order. Цена по которой должен быть установлен лимитный ордер.
// @param leverageforqty (bool) use leverage in qty. Использовать плечо при расчете количества или нет.
// @param orderId (string) if use order id you may change or cancel your order after or set it ''. Используйте OrderId если хотите изменить или отменить ордер в будущем.
// @returns'Limit Buy order reduce only (close short position)' . Лимитный ордер на покупку (лонг) для сокращения/закрытия текущего шорта.
export CloseShortLimit(string token, string market, string ticker_id, string type_qty, float quantity, float price, string orderId, bool leverageforqty)  => 
    futures_exchanges = array.from('binancefru','binancefro','bybitfu', 'bybitfi')
    futures = array.includes(futures_exchanges, market) ? true : false
    lvrg_qty_string = leverageforqty and futures ? 'leverageforqty=true;' : leverageforqty==false and futures ? 'leverageforqty=false;' : ''
    orderId_string = orderId=='' or na(orderId) ? '' : 'newclientorderid=' + str.tostring(orderId) + ';'
        
    main_mess(token, market, ticker_id) + 'reduceOnly=true;side=Buy;'+ qty_string(type_qty,quantity,futures) + 'orderType=LIMIT;price=' + str.tostring(price) + ';' + lvrg_qty_string + orderId_string

// @function Set Close limit order for long position.
// Рыночный ордер на покупку(в лонг) для сокращения/закрытия шортовой позиции(reduceonly).
// @param token (integer or 0) token for trade in system, if  = 0 then token part mess is empty. Токен,  При значениb = 0 не включается в формирование строки алерта.
// @param market (string) Spot 'binance' , 'bybit' . Futures  ('binancefru','binancefro','bybitfu', 'bybitfi'). Строковая переменная названия биржи.
// @param ticker_id (string) ticker in market ('btcusdt', 'ethusdt' etc...). Строковая переменная названия тикера (пары).
// @param type_qty (string) type of quantity:  1. 'qty' or '' or na - standart (in coins), 2. 'quqty'- in assets (usdt,btc,etc..), 3.open% - open position(futures) or buy (spot) in % of base 4. close% - close in % of position (futures) or sell (spot) coins in % for current quantity
// @param quantity (float) orders size, see at 'type_qty'. Размер ордера, базы или % в соответствии с 'type_qty'
// @param leverageforqty (bool) use leverage in qty. Использовать плечо при расчете количества или нет.
// @returns'Market Buy order reduce only (close short position)'. Маркетного ордера на покупку (лонг) для сокращения/закрытия текущего шорта.
export CloseShortMarket(string token, string market, string ticker_id, string type_qty, float quantity,  bool leverageforqty)  => 
    futures_exchanges = array.from('binancefru','binancefro','bybitfu', 'bybitfi')
    futures = array.includes(futures_exchanges, market) ? true : false
    lvrg_qty_string = leverageforqty and futures ? 'leverageforqty=true;' : leverageforqty==false and futures ? 'leverageforqty=false;' : ''
        
    main_mess(token, market, ticker_id) + 'reduceOnly=true;side=Buy;'+ qty_string(type_qty,quantity,futures) + 'orderType=MARKET;' + lvrg_qty_string

// @function Set string of 2 orders : CancelAll + ClosePositions
// Отмена всех лимитных ордеров и закрытие всех по тикеру
// @param market (string) 'binance' , 'binancefru'  etc.. Строковая переменная названия биржи.
// @param ticker_id (string) ticker in market ('btcusdt', 'ethusdt' etc...). Строковая переменная названия тикера (пары).

// @returns Set string of 2 orders : CancelAll + ClosePositiond  Закрытие позициий и отмена всех лимитных ордеров
export cancel_all_close(string token, string market, string ticker_id) =>
    futures_exchanges = array.from('binancefru','binancefro','bybitfu', 'bybitfi')
    futures = array.includes(futures_exchanges, market) ? true : false
    Cancel_by_ticker(token, market, ticker_id) + "::" + Close_positions(token, market, ticker_id)
      
// @function Set multi order for Bybit : limit + takeprofit + stoploss
// Выставление тройного ордера на Bybit лимитка со стоплоссом и тейкпрофитом
// @param token (integer or 0) token for trade in system, if  = 0 then token part mess is empty. Токен,  При значениb = 0 не включается в формирование строки алерта.
// @param ticker_id (string) ticker in market ('btcusdt', 'ethusdt' etc...). Строковая переменная названия тикера (пары).
// @param orderId (string) if use order id you may change or cancel your order after or set it ''. Используйте OrderId если хотите изменить или отменить ордер в будущем.
// @param side (bool) "buy side" if true or "sell side" if false. true для лонга, false для шорта.
// @param type_qty (string) type of quantity:  1. 'qty' or '' or na - standart (in coins), 2. 'quqty'- in assets (usdt,btc,etc..), 3.open% - open position(futures) or buy (spot) in % of base 4. close% - close in % of position (futures) or sell (spot) coins in % for current quantity
// @param quantity (float) orders size, see at 'type_qty'. Размер ордера, базы или % в соответствии с 'type_qty'
// @param price (float) price for limit order by 'side'. Цена лимитного ордера
// @param tp_price (float) price for take profit order. 
// @param sl_price (float) price for stoploss order
// @param leverageforqty (bool) use leverage in qty. Использовать плечо при расчете количества или нет.
// @returns Set multi order for Bybit : limit + takeprofit + stoploss.
export limit_tpsl_bybitfu(string token, string ticker_id,string order_id, bool side, string type_qty, float quantity, float price, float tp_price, float sl_price, bool leverageforqty) =>
    market = 'bybitfu'
    futures_exchanges = array.from('binancefru','binancefro','bybitfu', 'bybitfi')
    futures = array.includes(futures_exchanges, market) ? true : false
    price_str = price > 0 ? 'price=' + str.tostring(price) + ';' : ''
    tp_price_str = tp_price > 0 ? 'takeprofitprice=' + str.tostring(tp_price) + ';' : ''
    sl_price_str = sl_price > 0 ? 'stoplossprice=' + str.tostring(sl_price) + ';' : ''
    prices_str = price_str + tp_price_str + sl_price_str
    lvrg_qty_string = leverageforqty and futures ? 'leverageforqty=true;' : leverageforqty==false and futures ? 'leverageforqty=false;' : ''
    side_str = side ? 'buy' : side == false ? 'sell' : 'error side'
	main_mess(token, market, ticker_id) + 'side=' + side_str + ';orderType=limit;newclientorderid=' + str.tostring(order_id) + qty_string(type_qty,quantity,futures) + prices_str + lvrg_qty_string 

// @function Change multi order for Bybit : limit + takeprofit + stoploss
// Изменение тройного ордера на Bybit лимитка со стоплоссом и тейкпрофитом
// @param token (integer or 0) token for trade in system, if  = 0 then token part mess is empty. Токен,  При значениb = 0 не включается в формирование строки алерта.
// @param ticker_id (string) ticker in market ('btcusdt', 'ethusdt' etc...). Строковая переменная названия тикера (пары).
// @param orderId (string) if use order id you may change or cancel your order after or set it ''. Используйте OrderId если хотите изменить или отменить ордер в будущем.
// @param side (bool) "buy side" if true or "sell side" if false. true для лонга, false для шорта.
// @param type_qty (string) type of quantity:  1. 'qty' or '' or na - standart (in coins), 2. 'quqty'- in assets (usdt,btc,etc..), 3.open% - open position(futures) or buy (spot) in % of base 4. close% - close in % of position (futures) or sell (spot) coins in % for current quantity
// @param quantity (float) orders size, see at 'type_qty'. Размер ордера, базы или % в соответствии с 'type_qty'
// @param price (float) price for limit order by 'side'. Цена лимитного ордера
// @param tp_price (float) price for take profit order. 
// @param sl_price (float) price for stoploss order
// @param leverageforqty (bool) use leverage in qty. Использовать плечо при расчете количества или нет.
// @returns Set multi order for Bybit : limit + takeprofit + stoploss.
export replace_limit_tpsl_bybitfu(string token, string ticker_id,string order_id, bool side, string type_qty, float quantity, float price, float tp_price, float sl_price, bool leverageforqty) =>
    market = 'bybitfu'
    futures_exchanges = array.from('binancefru','binancefro','bybitfu', 'bybitfi')
    futures = array.includes(futures_exchanges, market) ? true : false
    price_str = price > 0 ? 'price=' + str.tostring(price) + ';' : ''
    tp_price_str = tp_price > 0 ? 'takeprofitprice=' + str.tostring(tp_price) + ';' : ''
    sl_price_str = sl_price > 0 ? 'stoplossprice=' + str.tostring(sl_price) + ';' : ''
    prices_str = price_str + tp_price_str + sl_price_str
    lvrg_qty_string = leverageforqty and futures ? 'leverageforqty=true;' : leverageforqty==false and futures ? 'leverageforqty=false;' : ''
    side_str = side ? 'buy' : side == false ? 'sell' : 'error side'
    main_mess(token, market, ticker_id) + 'side=' + side_str + ';orderType=replace_limit;origclientorderid=' + str.tostring(order_id) + qty_string(type_qty,quantity,futures) + prices_str + lvrg_qty_string
          
   
//******************************  STOPLOSSES ****************************

// @function Stop market order for long position 
// Рыночный стоп-ордер на продажу для закрытия лонговой позиции.
// @param market (string) 'binance' , 'binancefru'  etc.. Строковая переменная названия биржи.
// @param ticker_id (string) ticker in market ('btcusdt', 'ethusdt' etc...). Строковая переменная названия тикера (пары).
// @param type_qty (string) type of quantity:  1. 'qty' or '' or na - standart (in coins), 2. 'quqty'- in assets (usdt,btc,etc..), 3.open% - open position(futures) or buy (spot) in % of base 4. close% - close in % of position (futures) or sell (spot) coins in % for current quantity
// @param quantity (float) orders size. Размер ордера.
// @param l_stop (float) price for activation stop order. Цена активации стоп-ордера.
// @param leverageforqty (bool) use leverage in qty. Использовать плечо при расчете количества или нет.
// @returns 'Stop Market Sell order (close long position)'. Маркетный стоп-ордер на снижения/закрытия текущего лонга.
export long_stop(string token, string market, string ticker_id, string type_qty, float quantity, float l_stop, bool leverageforqty) =>
    futures_exchanges = array.from('binancefru','binancefro','bybitfu', 'bybitfi')
    futures = array.includes(futures_exchanges, market) ? true : false
    lvrg_qty_string = leverageforqty and futures ? 'leverageforqty=true;' : leverageforqty==false and futures ? 'leverageforqty=false;' : ''
    reduce_str = futures ? 'reduceonly!;' : ''
    main_mess(token, market, ticker_id) + qty_string(type_qty,quantity,futures) + ';orderType=stop_market;side=sell;stopPrice=' + 
          str.tostring(l_stop) + ';'  + 'newClientOrderId=stop_long;' + lvrg_qty_string + reduce_str

// @function Stop market order for short position 
// Рыночный стоп-ордер на покупку(в лонг) для закрытия шорт позиции.
// @param market (string) 'binance' , 'binancefru'  etc.. Строковая переменная названия биржи.
// @param ticker_id (string) ticker in market ('btcusdt', 'ethusdt' etc...). Строковая переменная названия тикера (пары).
// @param type_qty (string) type of quantity:  1. 'qty' or '' or na - standart (in coins), 2. 'quqty'- in assets (usdt,btc,etc..), 3.open% - open position(futures) or buy (spot) in % of base 4. close% - close in % of position (futures) or sell (spot) coins in % for current quantity
// @param quantity (float) orders size. Размер ордера.
// @param s_stop (float) price for activation stop order. Цена активации стоп-ордера.
// @param leverageforqty (bool) use leverage in qty. Использовать плечо при расчете количества или нет.
// @returns 'Stop Market Buy order (close short position)'. Маркетный стоп-ордер на снижения/закрытия текущего шорта.
export short_stop(string token, string market, string ticker_id, string type_qty, float quantity, float s_stop, bool leverageforqty) =>
    futures_exchanges = array.from('binancefru','binancefro','bybitfu', 'bybitfi')
    futures = array.includes(futures_exchanges, market) ? true : false
    lvrg_qty_string = leverageforqty and futures ? 'leverageforqty=true;' : leverageforqty==false and futures ? 'leverageforqty=false;' : ''
    reduce_str = futures ? 'reduceonly!;' : ''
    
    main_mess(token, market, ticker_id) + qty_string(type_qty,quantity,futures) + ';orderType=stop_market;side=buy;stopPrice=' + 
          str.tostring(s_stop) + ';'  + 'newClientOrderId=stop_short;' + lvrg_qty_string + reduce_str

//Смещаем стоп (трейлинг по Вашему алгоритму из tradingview):

// @function Change Stop market order for long position 
// Изменяем стоп-ордер на продажу(в шорт) для закрытия лонг позиции.
// @param market (string) 'binance' , 'binancefru'  etc.. Строковая переменная названия биржи.
// @param ticker_id (string) ticker in market ('btcusdt', 'ethusdt' etc...). Строковая переменная названия тикера (пары).
// @param type_qty (string) type of quantity:  1. 'qty' or '' or na - standart (in coins), 2. 'quqty'- in assets (usdt,btc,etc..), 3.open% - open position(futures) or buy (spot) in % of base 4. close% - close in % of position (futures) or sell (spot) coins in % for current quantity
// @param quantity (float) orders size. Размер ордера.
// @param l_stop (float) price for activation stop order. Цена активации стоп-ордера.
// @param leverageforqty (bool) use leverage in qty. Использовать плечо при расчете количества или нет.
// @returns 'Change Stop Market Buy order (close long position)'. Смещает цену активации Маркетного стоп-ордер на снижения/закрытия текущего лонга.
export change_stop_l(string token, string market, string ticker_id, string type_qty, float quantity, float l_stop, bool leverageforqty) =>

    Cancel_by_id(token,market,ticker_id,'stop_long') + "::" + pause(1000) + "::" +
          long_stop(token, market, ticker_id, type_qty, quantity, l_stop, leverageforqty)

// @function Change Stop market order for short position 
// Смещает цену активации Рыночного стоп-ордера на покупку(в лонг) для закрытия шорт позиции.
// @param market (string) 'binance' , 'binancefru'  etc.. Строковая переменная названия биржи.
// @param ticker_id (string) ticker in market ('btcusdt', 'ethusdt' etc...). Строковая переменная названия тикера (пары).
// @param quantity (float) orders size. Размер ордера.
// @param s_stop (float) price for activation stop order. Цена активации стоп-ордера.
// @param leverageforqty (bool) use leverage in qty. Использовать плечо при расчете количества или нет.
// @returns 'Change Stop Market Buy order (close short position)'. Смещает цену активации Маркетного стоп-ордер на снижения/закрытия текущего шорта.
export change_stop_s(string token, string market, string ticker_id, string type_qty, float quantity, float s_stop, bool leverageforqty) =>
     
    Cancel_by_id(token,market,ticker_id,'stop_short') + "::" + pause(1000) + "::" +
          short_stop(token, market, ticker_id, type_qty, quantity, s_stop, leverageforqty)
// Вход в лонг с выставлением стопа

// @function Cancel and close all orders and positions by ticker , then open Long position by market price with stop order
// Отменяет все лимитки и закрывает все позы по тикеру, затем открывает лонг по маркету с выставлением стопа (переворот позиции, при необходимости).
// @param market (string) 'binance' , 'binancefru'  etc.. Строковая переменная названия биржи.
// @param ticker_id (string) ticker in market ('btcusdt', 'ethusdt' etc...). Строковая переменная названия тикера (пары).
// @param type_qty (string) type of quantity:  1. 'qty' or '' or na - standart (in coins), 2. 'quqty'- in assets (usdt,btc,etc..), 3.open% - open position(futures) or buy (spot) in % of base 4. close% - close in % of position (futures) or sell (spot) coins in % for current quantity
// @param quantity (float) orders size. Размер ордера.
// @param l_stop (float). Price for activation stop loss. Цена активации стоп-лосса.
// @param leverageforqty (bool) use leverage in qty. Использовать плечо при расчете количества или нет.
// @silence command dont send report to telegram
// @returns'command_all_close + LongMarket + long_stop.
export open_long_position(string token, string market, string ticker_id, string type_qty, float quantity, float l_stop, bool leverageforqty, bool silence) =>
	silence_m = silence ? 'silence!;' : ''    
	cancel_all_close(token, market, ticker_id) + silence_m + "::" + pause(1000) + silence_m + "::" +
          LongMarket(token, market, ticker_id, type_qty, quantity, leverageforqty) + silence_m + "::" + 
          long_stop(token, market, ticker_id, type_qty, quantity, l_stop, leverageforqty) + silence_m

// Вход в шорт с выставлением стопа 

// @function Cancel and close all orders and positions , then open Short position by market price with stop order 
// Отменяет все лимитки и закрывает все позы по тикеру, затем открывает шорт по маркету с выставлением стопа(переворот позиции, при необходимости).
// @param market (string) 'binance' , 'binancefru'  etc.. Строковая переменная названия биржи.
// @param ticker_id (string) ticker in market ('btcusdt', 'ethusdt' etc...). Строковая переменная названия тикера (пары).
// @param type_qty (string) type of quantity:  1. 'qty' or '' or na - standart (in coins), 2. 'quqty'- in assets (usdt,btc,etc..), 3.open% - open position(futures) or buy (spot) in % of base 4. close% - close in % of position (futures) or sell (spot) coins in % for current quantity
// @param quantity (float) orders size. Размер ордера.
// @param s_stop (float). Price for activation stop loss. Цена активации стоп-лосса.
// @param leverageforqty (bool) use leverage in qty. Использовать плечо при расчете количества или нет.
// @silence command dont send report to telegram
// @returns'command_all_close + ShortMarket + short_stop'.
export open_short_position(string token, string market, string ticker_id, string type_qty, float quantity, float s_stop, bool leverageforqty, bool silence) =>
    silence_m = silence ? 'silence!;' : ''   
	cancel_all_close(token, market, ticker_id) + silence_m + "::" + pause(1000) + silence_m + "::" +
      ShortMarket(token, market, ticker_id, type_qty, quantity, leverageforqty) + silence_m + "::" + 
      short_stop(token, market, ticker_id, type_qty, quantity, s_stop, leverageforqty) + silence_m
    
//Вход в long с выставлением стопа и тейков (переворот позиции, при необходимости):

// @function Cancell and close all orders and positions , then open Long position by market price with stop order and take 1 ,take 2, take 3
// Отменяет все лимитки и закрывает все позы по тикеру, затем открывает лонг по маркету с выставлением стопа и 3 тейками (переворот позиции, при необходимости).
// @param market (string) 'binance' , 'binancefru'  etc.. Строковая переменная названия биржи.
// @param ticker_id (string) ticker in market ('btcusdt', 'ethusdt' etc...). Строковая переменная названия тикера (пары).
// @param type_qty (string) type of quantity:  1. 'qty' or '' or na - standart (in coins), 2. 'quqty'- in assets (usdt,btc,etc..), 3.open% - open position(futures) or buy (spot) in % of base 4. close% - close in % of position (futures) or sell (spot) coins in % for current quantity
// @param quantity (float) enter order size, see at type_qty. Размер ордера входа, согласно type_qty.
// @param l_stop (float). Price for activation stop loss. Цена активации стоп-лосса.
// @param qty_ex1 (float). Quantity for 1th take see at type_qty, if = 0 string for order dont set. Размер лимитного ордера для 1го тейка, согласно type_qty.. Если 0, то строка для этого тейка не формируется
// @param price_ex1 (float). Price for 1th take , if = 0 string for order dont set. Цена лимитного ордера для 1го тейка. Если 0, то строка для этого тейка не формируется
// @param qty_ex2 (float). Quantity for 2th take see at type_qty, if = 0 string for order dont set. Размер лимитного ордера для 2го тейка, согласно type_qty..Если 0, то строка для этого тейка не формируется
// @param price_ex2 (float). Price for 2th take, if = 0 string for order dont set. Цена лимитного ордера для 2го тейка. Если 0, то строка для этого тейка не формируется
// @param qty_ex3 (float). Quantity for 3th take see at type_qty, if = 0 string for order dont set. Размер лимитного ордера для 2го тейка, согласно type_qty..Если 0, то строка для этого тейка не формируется
// @param price_ex3 (float). Price for 3th take, if = 0 string for order dont set. Цена лимитного ордера для 3го тейка. Если 0, то строка для этого тейка не формируется
// @param leverage (integer or 0) change leverage, if  = 0 then leverage part mess is empty. Установка плеча для фьючерсов, при значении 0  не включается в формирование строки алерта.
// @silence command dont send report to telegram
// @returns'cancel_all_close + LongMarket + long_stop + CloseLongLimit1 + CloseLongLimit2+CloseLongLimit3'.
export open_long_trade(string token, string market, string ticker_id, string type_qty, float quantity, float l_stop, 
                          float qty_ex1, float price_ex1, float qty_ex2, float price_ex2, float qty_ex3, float price_ex3,  bool leverageforqty, bool silence) =>
	silence_m = silence ? 'silence!;' : '' 					
    close1_str = qty_ex1 == 0 or price_ex1 == 0 ? '' : "::" + CloseLongLimit(token, market, ticker_id, type_qty, qty_ex1, price_ex1, '', leverageforqty) + silence_m
    close2_str = qty_ex2 == 0 or price_ex2 == 0 ? '' : "::" + CloseLongLimit(token, market, ticker_id, type_qty, qty_ex2, price_ex2, '', leverageforqty) + silence_m
    close3_str = qty_ex3 == 0 or price_ex3 == 0 ? '' : "::" + CloseLongLimit(token, market, ticker_id, type_qty, qty_ex3, price_ex3, '', leverageforqty) + silence_m
        
    cancel_all_close(token, market, ticker_id) + silence_m + "::" + pause(1000) + silence_m + "::" +
          LongMarket(token, market, ticker_id, type_qty, quantity, leverageforqty) + silence_m + "::" + pause(1000) + silence_m + "::" +
          long_stop(token, market, ticker_id, type_qty, quantity, l_stop, leverageforqty) + silence_m + 
          close1_str + close2_str + close3_str
          
    
//Вход в short с выставлением стопа и тейков (переворот позиции, при необходимости):

// @function Cancell and close all orders and positions , then open Short position by market price with stop order and take 1 and take 2 
// Отменяет все лимитки и закрывает все позы по тикеру, затем открывает шорт по маркету с выставлением стопа и 3 тейками (переворот позиции, при необходимости).
// @param market (string) 'binance' , 'binancefru'  etc.. Строковая переменная названия биржи.
// @param ticker_id (string) ticker in market ('btcusdt', 'ethusdt' etc...). Строковая переменная названия тикера (пары).
// @param qty_all_close (float) Quantity for all close command. Количество для команды на закрытие пред позиций.
// @param qty_enter (float). Quantity for enter position. Размер позиции для входа.
// @param s_stop (float). Price for activation stop loss. Цена активации стоп-лосса.
// @param qty_ex1 (float). Quantity for 1th take see at type_qty, if = 0 string for order dont set. Размер лимитного ордера для 1го тейка, согласно type_qty.. Если 0, то строка для этого тейка не формируется
// @param price_ex1 (float). Price for 1th take , if = 0 string for order dont set. Цена лимитного ордера для 1го тейка. Если 0, то строка для этого тейка не формируется
// @param qty_ex2 (float). Quantity for 2th take see at type_qty, if = 0 string for order dont set. Размер лимитного ордера для 2го тейка, согласно type_qty..Если 0, то строка для этого тейка не формируется
// @param price_ex2 (float). Price for 2th take, if = 0 string for order dont set. Цена лимитного ордера для 2го тейка. Если 0, то строка для этого тейка не формируется
// @param qty_ex3 (float). Quantity for 3th take see at type_qty, if = 0 string for order dont set. Размер лимитного ордера для 2го тейка, согласно type_qty..Если 0, то строка для этого тейка не формируется
// @param price_ex3 (float). Price for 3th take, if = 0 string for order dont set. Цена лимитного ордера для 3го тейка. Если 0, то строка для этого тейка не формируется
// @param leverage (integer or 0) change leverage, if  = 0 then leverage part mess is empty. Установка плеча для фьючерсов, при значении 0  не включается в формирование строки алерта.
// @silence command dont send report to telegram	
// @returns'command_all_close + ShortMarket + short_stop + CloseShortLimit + CloseShortLimit(2)'.
export open_short_trade(string token, string market, string ticker_id, string type_qty, float quantity, float s_stop, 
                          float qty_ex1, float price_ex1, float qty_ex2, float price_ex2, float qty_ex3, float price_ex3,  bool leverageforqty, bool silence) =>
	silence_m = silence ? 'silence!;' : '' 							
    close1_str = qty_ex1 == 0 or price_ex1 == 0 ? '' : "::" + CloseShortLimit(token, market, ticker_id, type_qty, qty_ex1, price_ex1, '', leverageforqty) + silence_m
    close2_str = qty_ex2 == 0 or price_ex2 == 0 ? '' : "::" + CloseShortLimit(token, market, ticker_id, type_qty, qty_ex2, price_ex2, '', leverageforqty) + silence_m
    close3_str = qty_ex3 == 0 or price_ex3 == 0 ? '' : "::" + CloseShortLimit(token, market, ticker_id, type_qty, qty_ex3, price_ex3, '', leverageforqty) + silence_m
        
    cancel_all_close(token, market, ticker_id) + silence_m + "::" + pause(1000) + silence_m + "::" +
          ShortMarket(token, market, ticker_id, type_qty, quantity, leverageforqty) + silence_m + "::" + pause(1000) + silence_m + "::" +
          short_stop(token, market, ticker_id, type_qty, quantity, s_stop, leverageforqty) + 
          close1_str + close2_str + close3_str

// @function  8 or less Buy orders with limit price and quantity. 
// До 8 Лимитных ордеров на покупку(в лонг).
// @param token (integer or 0) token for trade in system, if  = 0 then token part mess is empty. Токен,  При значениb = 0 не включается в формирование строки алерта.
// @param market (string) Spot 'binance' , 'bybit' . Futures  ('binancefru','binancefro','bybitfu', 'bybitfi'). Строковая переменная названия биржи.
// @param ticker_id (string) ticker in market ('btcusdt', 'ethusdt' etc...). Строковая переменная названия тикера (пары).
// @param type_qty (string) type of quantity:  1. 'qty' or '' or na - standart (in coins), 2. 'quqty'- in assets (usdt,btc,etc..), 3.open% - open position(futures) or buy (spot) in % of base 4. close% - close in % of position (futures) or sell (spot) coins in % for current quantity
// @param qty (float) orders size, see at 'type_qty'. If = 0 order is off (except 1th). Размер ордера, базы или % в соответствии с 'type_qty'. Если = 0 ордер отключен (кроме 1го)
// @param price (float) price for limit order. If = 0 order is off (except 1th). Цена по которой должен быть установлен лимитный ордер. Если = 0 ордер отключен (кроме 1го)
// @param leverageforqty (bool) use leverage in qty. Использовать плечо при расчете количества или нет.
// @param orderId (string) if use order id you may change or cancel your order after or set it ''. Используйте OrderId если хотите изменить или отменить ордер в будущем.
// @silence command dont send report to telegram
// @returns 'Limit Buy order'. Лимитный ордер на покупку (лонг).
export Multi_LongLimit(string token, string market, string ticker_id, string type_qty, float qty1, float price1, float qty2, float price2,float qty3, float price3,
                          float qty4, float price4, float qty5, float price5, float qty6, float price6,float qty7, float price7,float qty8, float price8, bool leverageforqty, bool silence)  => 
    silence_m = silence ? 'silence!;' : '' 	
	lim1_str = qty1 == 0 or price1 == 0 ? '' : LongLimit(token, market, ticker_id, type_qty, qty1, price1, '', leverageforqty)  + silence_m
    lim2_str = qty2 == 0 or price2 == 0 ? '' : "::" + LongLimit(token, market, ticker_id, type_qty, qty2, price2, '', leverageforqty) + silence_m
    lim3_str = qty3 == 0 or price3 == 0 ? '' : "::" + LongLimit(token, market, ticker_id, type_qty, qty3, price3, '', leverageforqty) + silence_m
    lim4_str = qty4 == 0 or price4 == 0 ? '' : "::" + LongLimit(token, market, ticker_id, type_qty, qty4, price4, '', leverageforqty) + silence_m
    lim5_str = qty5 == 0 or price5 == 0 ? '' : "::" + LongLimit(token, market, ticker_id, type_qty, qty5, price5, '', leverageforqty) + silence_m
    lim6_str = qty6 == 0 or price6 == 0 ? '' : "::" + LongLimit(token, market, ticker_id, type_qty, qty6, price6, '', leverageforqty) + silence_m
    lim7_str = qty7 == 0 or price7 == 0 ? '' : "::" + LongLimit(token, market, ticker_id, type_qty, qty7, price7, '', leverageforqty) + silence_m
    lim8_str = qty8 == 0 or price8 == 0 ? '' : "::" + LongLimit(token, market, ticker_id, type_qty, qty8, price8, '', leverageforqty) + silence_m

    lim1_str + lim2_str + lim3_str + lim4_str + lim5_str + lim6_str + lim7_str + lim8_str
              
