1 - Биржа Poloniex(расмотрим некоторые тех. моменты)

Тема создана по аналогии Темы http://forum.sistem.in.ua/viewtopic.php?pid=2992
и некоторые моменты будут заимствованы из этой темы.
Тема создана исключительно в ознакомительных целях и рассмотрения некоторых моментов!!!

некоторые моменты могут не работать в не которых версиях FF
я использовала FF42

1.Рассмотрим синхронный POST запрос на получения баланса

для начало я создам функцию для отправки POST запроса(она будет не совершенной)
которая будет принимать несколько параметров(сылку, параметры и подписанные параметры секретным ключом)
и будет она называться getPOST(url, param, Sign)

объявляем ф-ю getPOST

Скрытый текст
function getPOST(url, param, Sign){
xhr=new XMLHttpRequest();
xhr.open('POST', url, false);
xhr.setRequestHeader('Content-Type','application/x-www-form-urlencoded');
xhr.setRequestHeader('Key', apiKey);
xhr.setRequestHeader('Sign', Sign);
xhr.send(param);
if (xhr.status == 200) {
    return xhr.responseText;
} else {
    //обрабатываем ошибки если с запросом, что то не так
    //в данный момент будет исклучение
    throw new Error(xhr.status + ': ' + xhr.statusText);
};
};

теперь создам ф-ю которая подпишет наши параметры секретным ключем(она будет немного отличатся от соседней темы)
будет называться getCrypto

объявляем ф-ю getCrypto

Скрытый текст
function getCrypto(aData, secret){

// выше FF 42
//var bytes = Array.from(aData).map(b => b.charCodeAt(0));

var bytes= new Uint8Array(aData.length);
for (var i = 0; i < aData.length; i++) bytes[i] = aData.charCodeAt(i);

var keyObject = Components.classes["@mozilla.org/security/keyobjectfactory;1"]
                .getService(Components.interfaces.nsIKeyObjectFactory)
                .keyFromString(Components.interfaces.nsIKeyObject.HMAC, secret);

var hmac = Components.classes["@mozilla.org/security/hmac;1"]
           .createInstance(Components.interfaces.nsICryptoHMAC);
           
           hmac.init(hmac.SHA512, keyObject);
           hmac.update(bytes, bytes.length);
     
hash = hmac.finish(false);

// выше FF 42
//var hex = Array.from(hash, (c, i) => ("0" + hash.charCodeAt(i).toString(16)).slice(-2)).join("");

var hex = "";
for (var i = 0; i < hash.length; i++) hex += ("0" + hash.charCodeAt(i).toString(16)).slice(-2);

return hex;

};

теперь делаем вызов функций и получаем ответ

Скрытый текст
var XMLHttpRequest = Components.Constructor("@mozilla.org/xmlextras/xmlhttprequest;1");

var apiKey= '';
var apiSecret =  '';


var param = 'nonce='+Number(new Date().getTime()) + '&command=returnBalances';

var Sign = getCrypto(param, apiSecret);

var result = getPOST('https://poloniex.com/tradingApi', param, Sign);
window.console.log(result);

2 - Биржа Poloniex(расмотрим некоторые тех. моменты)

Спасибо за новую тему,
по мере прогресса, обещаю выкладывать куски кода,
может кому пригодится

3 - Биржа Poloniex(расмотрим некоторые тех. моменты) (2018-08-26 16:21:54 отредактировано Egorushka1974)

Добрый день.
Мозга совсем сломал, подскажите, где лажаю?
с биржи ответ так приходит

Скрытый текст

{"1CR":"0.00000000","ABY":"0.00000000","AC":"0.00000000",
"ACH":"0.00000000","ADN":"0.00000000","AEON":"0.00000000"}

вынимаю нужное таким образом

var text = postreturnBalances();
//alert(text);
var a = JSON.parse(text);
balances = a.BTC;
//alert(balances);

а так приходит

Скрытый текст

[{"orderNumber":"10819622554","type":"sell","rate":"0.00000080","startingAmount":"9980.00000000","amount":"9980.00000000","total":"0.00798400","date":"2018-07-02 21:31:44","margin":0}]

указанным способом нифига не могу вынуть, что только не пробовал,
понимаю что [] мешает спарсить данные, как убрать, не могу сообразить, регулярка темный лес для меня пока.
Спасибо.

4 - Биржа Poloniex(расмотрим некоторые тех. моменты) (2018-08-26 17:24:24 отредактировано Zizya)

var a = JSON.parse(text);
alert(a[0]["rate"]); // 0.00000080
Ученье - путь к уменью.

5 - Биржа Poloniex(расмотрим некоторые тех. моменты)

или

var a = JSON.parse(text);
alert(a[0].orderNumber);

6 - Биржа Poloniex(расмотрим некоторые тех. моменты) (2018-08-26 19:10:38 отредактировано Egorushka1974)

Alexiya, Zizya
Спасибо, попробую, отпишусь по результату.

Попробовал, все получилось, спасибо.

7 - Биржа Poloniex(расмотрим некоторые тех. моменты)

вот выкладываю как вынимать данные приходящие в ответ на различные запросы POST к бирже полониекс
*returnAvailableAccountBalances

var a = JSON.parse(text);
alert(a.lending["MAID"]);
alert(a.exchange["BCN"]);

*returnTradableBalances

var a = JSON.parse(text);
alert(a.BTC_DOGE["BTC"]);
alert(a.BTC_DOGE["DOGE"]);

*returnCompleteBalances

var a = JSON.parse(text);
alert(a.DOGE["available"]);
alert(a.DOGE["btcValue"]);

и так далее

8 - Биржа Poloniex(расмотрим некоторые тех. моменты)

Всем добрый день.
Народ подскажите, на запрос postreturnOrderTrades();
получаю данные данные об исполненных ордерах.
Если например ордер не исполнился и нет информации по ordrNumber
приходит такая строка

{"error":"Order not found, or you are not the person who placed it."}

как правильно сделать сравнение, пришла эта строка или строка с данными, мозга сломал уже?
вызываю функцию так

var text = postreturnOrderTrades();

Спасибо.

9 - Биржа Poloniex(расмотрим некоторые тех. моменты) (2018-08-31 12:26:58 отредактировано Zizya)

Egorushka1974 пишет

Всем добрый день.
Народ подскажите, на запрос postreturnOrderTrades();
получаю данные данные об исполненных ордерах.
Если например ордер не исполнился и нет информации по ordrNumber
приходит такая строка

{"error":"Order not found, or you are not the person who placed it."}

как правильно сделать сравнение, пришла эта строка или строка с данными, мозга сломал уже?
вызываю функцию так

var text = postreturnOrderTrades();

Спасибо.

Проверяй ответ на наличие error.

var text = postreturnOrderTrades();
var a = JSON.parse(text);
if(a.error){alert('error');}
Ученье - путь к уменью.

10 - Биржа Poloniex(расмотрим некоторые тех. моменты)

Вот балда, я всю строку пытался проверять.
Спасибо.

11 - Биржа Poloniex(расмотрим некоторые тех. моменты)

Egorushka1974 пишет

Вот балда, я всю строку пытался проверять.
Спасибо.


можно и всю строчку проверить на наличие "error"

if(text.indexOf('error') !== -1){
alert('error')
//обрабатываем ошибки и направляем код в нужное место(выполняем код, который требуется при данной ошибке)
}else{
alert('ok')
//парсим (выполняем код который требуется ) 
var a = JSON.parse(text);
};

12 - Биржа Poloniex(расмотрим некоторые тех. моменты)

Добрый вечер.
Народ, подскажите, как правильно реализовать следующий момент,
я выставил ордер, получил его orderNumber как результат POST запроса

var by = postbuy(); //ставим ордер на покупку
        var a = JSON.parse(by);
	      orderNumber = +a.orderNumber; //получаем номер ордера выставленного на покупку

дальше запрашиваю из трэйд хистори orderNumber из 0-й строчки
   

   var trade_history = postreturnTradeHistory(); //вызываем историю торгов
           var a = JSON.parse(trade_history);
             Numbers = +a[0]["orderNumber"]; //достаем номер ордера из 0 строки
	           amount_s = +a[0]["amount"];
	             type_s = a[0]["type"];

дальше сравниваю эти два номера ордеров и объем, если оба условия совпали, т.е.
мы купили некий заданный объем монеты полностью, то выходим из функции покупки

if (Numbers == orderNumber && amount_s >= volbuy) break torgiby;

volbuy некий объем монеты которую покупает бот
тут работает все четко
сложности начинаются когда ордер например исполняется частями, мои попытки в цикле
реализовать проверку по строкам в трэйд хистори номер ордера и купленный объем, на предмет совпадения номера
с номером выставленного ордера и сложить все объемы соответствующие этому номеру ордера
упираются в ответ об ошибке

+a[i] is undefind

, второй день бьюсь, не могу понять где ошибаюсь, вот код всего куска проверки покупки ордера

 var trade_history = postreturnTradeHistory(); //вызываем историю торгов
  var a = JSON.parse(trade_history);
   Numbers = +a[0]["orderNumber"]; //достаем номер ордера из 0 строки
   amount_s = +a[0]["amount"];
   type_s = a[0]["type"];
   //Log('номер последнего исполненного ордера = '+Numbers+'\nобъем = '+amount_s+'\nтип = '+type_s+'');			
  if (Numbers == orderNumber && amount_s < volbuy) {
      for (i=1; ; i++) {
		//Log('prohod'+i+'');
        var trade_history = postreturnTradeHistory();
          var a = JSON.parse(trade_history);
             Numbers_i = +a[i]["orderNumber"]; //достаем номер ордера из i строки вот тут и вылетает всегда
	         amount_s_i = +a[i]["amount"];
		    if (Numbers == Numbers_i) amount_s = eval(amount_s+amount_s_i).toFixed(8);  
       }
   } 
   if (Numbers == orderNumber && amount_s >= volbuy) break torgiby; 

Не судите строго если код кривой, только учусь.
Спасибо.

13 - Биржа Poloniex(расмотрим некоторые тех. моменты)

Egorushka1974 пишет

Добрый вечер.
Народ, подскажите, как правильно реализовать следующий момент,
я выставил ордер, получил его orderNumber как результат POST запроса

var by = postbuy(); //ставим ордер на покупку
        var a = JSON.parse(by);
	      orderNumber = +a.orderNumber; //получаем номер ордера выставленного на покупку

дальше запрашиваю из трэйд хистори orderNumber из 0-й строчки
   

   var trade_history = postreturnTradeHistory(); //вызываем историю торгов
           var a = JSON.parse(trade_history);
             Numbers = +a[0]["orderNumber"]; //достаем номер ордера из 0 строки
	           amount_s = +a[0]["amount"];
	             type_s = a[0]["type"];

дальше сравниваю эти два номера ордеров и объем, если оба условия совпали, т.е.
мы купили некий заданный объем монеты полностью, то выходим из функции покупки

if (Numbers == orderNumber && amount_s >= volbuy) break torgiby;

volbuy некий объем монеты которую покупает бот
тут работает все четко
сложности начинаются когда ордер например исполняется частями, мои попытки в цикле
реализовать проверку по строкам в трэйд хистори номер ордера и купленный объем, на предмет совпадения номера
с номером выставленного ордера и сложить все объемы соответствующие этому номеру ордера
упираются в ответ об ошибке

+a[i] is undefind

, второй день бьюсь, не могу понять где ошибаюсь, вот код всего куска проверки покупки ордера

 var trade_history = postreturnTradeHistory(); //вызываем историю торгов
  var a = JSON.parse(trade_history);
   Numbers = +a[0]["orderNumber"]; //достаем номер ордера из 0 строки
   amount_s = +a[0]["amount"];
   type_s = a[0]["type"];
   //Log('номер последнего исполненного ордера = '+Numbers+'\nобъем = '+amount_s+'\nтип = '+type_s+'');			
  if (Numbers == orderNumber && amount_s < volbuy) {
      for (i=1; ; i++) {
		//Log('prohod'+i+'');
        var trade_history = postreturnTradeHistory();
          var a = JSON.parse(trade_history);
             Numbers_i = +a[i]["orderNumber"]; //достаем номер ордера из i строки вот тут и вылетает всегда
	         amount_s_i = +a[i]["amount"];
		    if (Numbers == Numbers_i) amount_s = eval(amount_s+amount_s_i).toFixed(8);  
       }
   } 
   if (Numbers == orderNumber && amount_s >= volbuy) break torgiby; 

Не судите строго если код кривой, только учусь.
Спасибо.

----------------
для начала
почему используется такой цикл  for (i=1; ; i++)  и по чему начинается с 1, а не с 0?
потом ты парсишь ответ от  postreturnTradeHistory();
и у тебя
Numbers_i = +a["orderNumber"]
где i уже равна 1, и с каждой кругом в цикле увеличивается на 1, а там такой длины нет
будет
Numbers_i = +a[0]["orderNumber"]
поэтому и выскакивает ошибка

здесь нужно добавить еще цикл который будет перебирать значения

.........
var trade_history = postreturnTradeHistory();
          var a = JSON.parse(trade_history);


 for(key in a){

Numbers_i = a[key]["orderNumber"]
alert(Numbers_i);
amount_s_i = a[key]["amount"];
alert(amount_s_i);

....................
}

....................

14 - Биржа Poloniex(расмотрим некоторые тех. моменты)

Про цикл for, показалось что так сработает
почему начинался с 1 а не с 0, так нулевая строка читается выше,
хотел проверить с первой строки по orderNumber если они совпали, то прибавить
объем из первой строки к объему из нулевой и дальше сравнивать.

За идею с циклом по перебору значений спасибо.
Попробовал в отдельном файле запустить и перебрать значения, все получилось,
нашел объемы в строках где одинаковые orderNumber, сейчас попробую написать небольшой кусочек
поиска и сложения объемов и по результату вставить в итоговый код бота.
По результату отпишусь.

15 - Биржа Poloniex(расмотрим некоторые тех. моменты) (2018-09-12 19:48:35 отредактировано Egorushka1974)

вот что получилось
нужно например проверить, для случая когда мы покупаем и продаем
последовательно, купили весь заданный объем и должны продать
заданный объем, как проверить все ли мы купили, например с учетом комиссии
10 монет у нас превращаются в 9,99 монет, тогда проверить можно так

var trade_history = postreturnTradeHistory();
          var a = JSON.parse(trade_history);
// предполагается что это используется в отдельных функциях покупки/продажи в оформлении {...........}
//поэтому использую объявление переменных let

let sum_amount = 0; //ставим суммарный объем равным 0
let flag = 'buy'; // ставим флаг на какой тип проверяем

for(key in a){
Numbers = a[key]["orderNumber"] // если цена поменялась и бот переставил ордер, при покупке по частям номера будут разные, поэтому проверяем по типу ордера бай/селл
alert(Numbers);
amount = +a[key]["amount"];
alert(amount);
type = a[key]["type"];
alert(type);
var t = strcmp(type, flag); // проверяем совпадает ли тип ордеров в нулевой и последующих строках
if (t == 0){ // если тип ордеров совпал, и в случае покупки по частям, складываем купленные объемы
	sum_amount += +a[key]["amount"]; 
alert(sum_amount);
} else break; // если наткнулись на тип ордера не соответствующий заданному флагу выходим из цикла перебора
}

function strcmp(type, flag) { //функция сравнения рипа ордера с заданным для сравнения флагом
    if (type.toString() < flag.toString()) return -1; 
    if (type.toString() > flag.toString()) return 1; 
    return 0; 
} 

соответственно можно проверить сколько куплено и
выставлять на продажу значение полученное
в sum_amount

16 - Биржа Poloniex(расмотрим некоторые тех. моменты)

Свершилось, я написал своего первого биржевого бота.
Спредовик, ищет разбежку между бид и асск, при ее наличии
ставит ордер по бид и сопровождает его, таким образом,
чтобы никто не влез на ценовой уровень, с большим объемом,
следит за тем когда схлопнется спред, чтобы снять ордер,
следит если например в стакане ниже нашего ордера
убрали ордера на покупку, переставляет на более низкие цены,
ну и много чего еще, в целом пока идет период тестирования, ловля багов и прочее.
Главное работает.
Вопрос в следующем, как можно отлавливать ошибки, которые связаны в обрывом интернета,
не ответил на запрос сервер биржи, т.к. написано на JS то каждая такая ошибка выбивает бота из работы.
Сейчас читаю про оборачивание JS в PHP, в принципе стоит опенсервер, можно и так наверное,
пока изучаю этот вопрос, что посоветуете?

17 - Биржа Poloniex(расмотрим некоторые тех. моменты)

try {} catch() {} спасет отца русской демократии

Telegram: @FastLiker