English Chinese French German Italian Portuguese Spanish
Войти
  1. ВКонтакте
  2. Facebook
  1. Официальный форум 1b bot. » 1b bot PRO ZEUS » Бесплатные стратегии от наших пользователей для бота 1b bot PRO » Справка (*.chm) и примеры.
Новые публикации Скрыть панель справаПоказать панель справа

Справка (*.chm) и примеры.

Гуру
  1. Оффлайн
  2. Посетители
  3. 164 сообщений
  4. Сообщение
  5. Личные данные
Полезность: 0 | сообщение № 16 отправлено 15:51, 03.10.2018
Пример объединения партий.

Бот с использованием существующего оператора MergeParties() позволяет сделать только общее объединение всех существующих на данный момент партий в одну большую партию со средней ценой.
Например
If (botInfo.cntParties>4) and (GetPartyPrice(0)< currTicker.buy) and (GetPartyPrice(5)>2* currTicker.buy ) then // какие-то условия из-за которых требуется объединение
begin
MergeParties();
end;

в результате существующие партии (в данном примере в кол-ве более 4 шт) будут объединены в 1 большую партию.

Но таких слияний практически не надо. Только при стоп-лоссе скорее всего.
А требуется при определенных условиях произвести объединение нужных партий.
Например, когда одна партия очень маленькая и отдельно не может продаваться (например меньше или равна botMinLim1).
Тогда мы также можем использовать стандартный оператор MergeParties(); но только при наличии не более 2-х партий ибо если партий больше, то они все объединяться как указано в примере выше.
if (botInfo.cntParties =2) and ((GetPartyAmnt(0) < botMinLim1) or (GetPartyAmnt(1) < botMinLim1)) then
begin
MergeParties();
trade:='Merge, idA ='+FloatToStr(GetPartyAmnt(0)) +’…idP= ‘FloatToStr(GetPartyPrice (0));
// выводим в Watch результаты слияния
end;

Существуют гораздо более сложные варианты слияния любых партий и любых кол-в крипты, для этого предназначены новые функции в версиях 2.0,0.70 и выше.

Последний раз редактировал Igor F P 17:35, 05.10.2018
Гуру
  1. Оффлайн
  2. Посетители
  3. 164 сообщений
  4. Сообщение
  5. Личные данные
Полезность: 0 | сообщение № 17 отправлено 17:48, 04.10.2018
Пример работы с ордерами.

На биржах можно применять 2-а способа осуществления сделок buy и sell:
Способ А (самый простой):
«С ходу» по позициям стаканов, т.е. у вас нет выставления ордера как такового, боту сразу даем команду купить указывая цену соответствующую currTicker.buy или продать с ценой currTicker.sell. Эти значения являются крайними в стаканах и тут только одно условие требуется, что бы кол-во крипты с вашей стороны было меньше чем в стакане.

В результате ваша цена покупки = цене стакане продажи, кол-во должно быть не более чем в позиции 1 этого стакана , и соответственно для продажи также.
Если у вас в такой сделке кол-во больше чем в стакане, то это приведет к следующему, совпадающие кол-ва будут оприходованы биржей и ботом, а вот недостающее кол-во будет иметь варианты реализации или предьявлено вам в виде всплываюшего окна с указанием цены по корой биржа купит/продаст оставшуюся вашу часть крипты или будет выставлен ордер не недостающее кол-во, но с вашей ценой (может висеть бесконечно, пока или не исполнится или вы не снимете его через бот).

Способ Б:
Создавая, выставляя и снимая ордера.
Для начала нам надо создать ордер.
Для этого у бота есть операторы (они описаны в справке и вообще все примеры опираются на операторы, функции, процедуры указанные в справке)

для покупки:
LastBuyOrder:=now
LastBuyOrderPrice:=RPrice;

Для продажи:
LastSellOrder:=now;
LastSellOrderPrice:=RPrice;

Что они делают?
LastBuyOrder:=now и LastSellOrder:=now; указывают что ордер создан прямо сейчас, т.е. устанавливают время создания ордера (прим: можно попробовать поставить и определенное время, но я не пробовал)
LastBuyOrderPrice:=RPrice; и LastSellOrderPrice:=RPrice; указываю цену этого ордера.
Все это устанавливается вами в соответствующем разделе процедуры procedure TTradeStrategy.CanBuy в момент проведения сделки и создания ордера
RAmnt:=RAmntBuy;// кол-во крипты для сделки
RCanBuy:=true; // подтверждение осуществить операцию покупки
RPrice:= currTicker.buy*(1-XXX); // устанавливаем цену покупки
LastBuyOrder:=now; // операторы ордера
LastBuyOrderPrice:=RPrice;
(для sell все аналогично)
Вот все эти выше указанные операторы собранные в одном месте и создают ордер.
Т.е. здесь так же ничего особо сложного нет.
Можно еще ввести свой счетчик ордеров, добавив к указанному выше строку
BuyOrdersCNT:=BuyOrdersCNT+1;
Ибо отдельного счетчика по типам ордеров в боте нет.
Есть общий счетчик GetOrdersCnt(), он укажет сколько у нас всего ордеров выставлено и оператор GetOrderType(i), указывающий по запросу тип ордера buy или sell.
И так мы выставили ордера.
А что с ними дальше делать? Так и будут висеть все время пока не исполняться изымая наши деньги из оборота или ими (ордерами) можно управлять?
Да, можно управлять, выставлять условия существования, продолжительность «жизни» и т.д.
Вот эти операции создаются и осуществляются в разделе function TTradeStrategy.CanCancelOrder.
Самое просто отменить ордера, т.е. выставили если за 1-2 сек они не исполнены то отменяются.

Пишем в разделе function TTradeStrategy.CanCancelOrder(const AID:string;const AType:Boolean;const AAmnt,APrice:Double;const ADate:TDateTime):boolean;override;
begin
cancelAllOrders:=true;
end;


и все, вы отменили все ордера. Просто, но не эффективно. Мы же хотим, что бы ордера были выполнены и принесли профит.
Рассмотрим вариант ограничения «жизни» ордера, типа считаем если ордер за 5 мин не исполнился, то ситуация на бирже изменилась, надо этот удалить, а новый выставить.

В том же разделе пишем:
if (SecondsBetween(now,LastBuyOrder)>5*60) or (SecondsBetween(now,LastSellOrder)>5*60)
then
begin
cancelAllOrders:=true;
// сняли ордера
BuyOrdersCNT:=0; // обнулили счетчики
SellOrdersCNT:=0;
end;

Можно описать и другие условия отмены по кол-ву выставленных ордеров, по уходу курса выше или ниже ордеров и т.д.
Можно разделить удаление по типу «все buy махом» и/или «все sell махом».
В этом случае
if AType then result:=true; // удаляем buy ордера
или
if (not AType) then result:=true; // удаляем sell ордера

А если нам надо удалить конкретный ордер?
Нам известен ID ордера, правда он имеет тип данных String и ужасный не запоминающийся внешний вид типа 68ea96ef-a8aa-4e65-9139-47acaf22c500

Пишем:
Id:= GetOrderID(L+1);// учитываем при его создании, где L условный счетчик, может для упрощения даже совпадать с SellOrdersCNT например.
Далее в разделе function TTradeStrategy.CanCancelOrder
IF id=AID then result:=true;
Или по кол-ву
If RAmntBuy=AAmnt then result:=true;
Или по цене или все вместе, но для раздельного и удаления конкретного ордера надо будет вести базу, т.е. массив, куда записывать номера, кол-во, тип, цену.

Ну, а условия при которых отменяются ордера, они зависят от вашего сценария.

Последний раз редактировал Igor F P 08:15, 05.10.2018
Гуру
  1. Оффлайн
  2. Посетители
  3. 164 сообщений
  4. Сообщение
  5. Личные данные
Полезность: 0 | сообщение № 18 отправлено 15:44, 05.10.2018
Пример вывода информации на экран монитора.

Бот предоставляет нам 4 окна для получения информации


1- Watch/Values
2- Log
3- Candlies / Deltae
4- Order book
Окна 3 и 4 предназначены для отображения уже заложенной разработчиками информации и данных из стакана. Пользователь не имеет возможности, что либо там менять, но может использовать информацию с этих экранов для своих целей, однако сохранение этой информации пользователь делает в ручную типа с помощью ручки и бумаги.
Окна 1 и 2 предназначены для отображения информации пользователя, при этом в окне 1 предоставляет вывод любых типов данных , а в окне 2 только типа String. При этом на окне 2 также выводится служебная информация бота об ошибках, ордерах и т.д..
И так как нам вывести нужную информацию в окно 1 (Watch)?
Для этого бот предоставляет нам набор разных операторов (см. справку, раздел Bot-RW), например AWriter.WriteStr() для ввода текстовой информации или AWriter.WriteInt() для вывода типа данных Integer и т.д.
Примеры кода для окна 1
AWriter.WriteBool('Флаг Sell',SellFlag); // при этом SellFlag:=Boolean, а на экране мы увидим цифру 1 если SellFlag :=true и -1 если SellFlag :=false
или более сложный вариант
AWriter.WriteBool('Sell MAX',(currTicker.sell/1.01)>=(botInfo.c1Cost/botInfo.c1Amnt) );
//выводим булевую функцию, результат будет в данном примере= 1 если условие выполнено и -1 если условие не выполнено.
AWriter.WriteStr('CC','bi3='+IntToStr(bi3)+' cc96='+ FloatToStr(Round(10000* (m[1,96]))/10000)+' cc97='+ FloatToStr(Round(10000* (m[1,97]))/10000) + '... cc105= '+ FloatToStr(Round(10000*(m[1,105]))/10000) + '...BuyFlag= '+ BoolToStr(BuyFlag) );
// выводим много цифровых данных в одну строку, ибо только «AWriter.WriteStr» позволяет разместить одновременно много данных, при этом операторы IntToStr и FloatToStr позволяют превратить для бота цифры в текст, и как видим так можно выводить одновременно несколько типов данных.
AWriter.WriteDouble('Buy next ~', botInfo.lastOpPrice/(1+ХХХХ)); // для вывода цифрового данных, самый простой для вывода вариант, только один тип данных

Но размер этого окна 1 достаточной маленький в исходном состоянии, поэтому разработчики предусмотрели возможность увеличения размера, для этого достаточно дважды «тяпнуть» по слову Watch и экран распахнется (аналогично и с окном 2 - Log).
Но такое увеличение окон возможно только в версии бота ПРО.
Демо версия не позволяет распахивать окна 1 и 2.
И нам остается довольствоваться маленьким окошком 1, в котором тяжело и не удобно разместить много инфы.
Тут нам приходит на помощь окно 2. В версии ПРО оно также расширяется, но других отличий между демо и про версиями по окну 2 нет. Однако я не использую его в версии ПРО для вывода каких-либо данных, только текущая инфа бота об ошибках, ордерах и т.д., ибо окно 1 в распахнутом виде достаточно большое, но вдруг вам будет мало в окне 1 места.
В окно 2 выводят данные типа string. Однако никто не запрещает осуществить туда вывод любых данных, правильно их указав.
В окно 2 в демо боте влезает так что бы было видно сразу 12 строк (учитывайте это, лучше поставить несколько "разделителей", чем будет мельчишение), из 12 строк одну строку делаем разделителем
Пишем:
If (secondsbetween(now,mod_log)>30) then // обновляем окно 2 один раз в 30 сек, иначе будут постоянно бегущие строки.
begin
logs0:='========= след цикл==========='
;// разделитель между циклами обновления

// а далее создаете свою информацию, выводимую в окно 2.
logs1:= '...SOv=' + sovet11 +'...BS4='+ FloatToStr(Round(10000* (kw*sumB1/sumS1))/10000) + '...BS8= '+ FloatToStr(Round(10000*(sumB/sumS))/10000)+'...V%= '+ FloatToStr(Round(100*(-100+obStat.vBuy*100/obStat.vSell))/100);
logs2:='...tr1-2^='+FloatToStr(Round(10000*(tr1-tr2))/10000) +'...tr1Buy=' +FloatToStr(Round(10000*(tr1))/10000)+'...tr2Sell='+FloatToStr(Round(10000*(tr2) )/10000);
logs3:='СursЕ= '+ FloatToStr(Round(10000* (XXXXXX))/10000) +'..Предел_H= '+ FloatToStr(Round(10000*(tt[1]))/10000)+'..BUY_h= '+ FloatToStr(Round(10000*(currTicker.buy))/10000) +'..SELL_l= '+ FloatToStr(Round(10000*(currTicker.sell))/10000) +'..Предел_L= '+ FloatToStr(Round(pord*10000* (tt[2]))/10000);
logs4:='сейчас % ...'+ FloatToStr(Round(1000* (currTicker.sell*100/GetPartyPrice(0)-100))/1000) +'...Sell Next~> ' +FloatToStr(Round(10000*ma1*(1+Profit))/10000) +'...If_Buy_to_Sell =' +FloatToStr(Round(10000*currTicker.buy*(1+Profit))/10000);

log (logs0); // начало вывода информации в окно 2, разделитель
log (sovet0); // sovet 0-8 это любая информация о чем либо имеющая тип string.
log (sovet1);
log (sovet2);
log (sovet3);
log (sovet4);
log (sovet5);
log (sovet7+'...SOv='+sovet11);
// можно и такие описания делать
log (sovet8);
log (logs4); // любая информация, пример см.выше
log (logs3);
log (logs2);
log (logs1);
mod_log:=now;
// обновление времени
end;
в результате мы в окне 2 увидим

но все наши данные при выводе их в окно 2 записываются ботом в папку LogsProg.
Что бы отменить (если не нужно) такую запись, ибо файл с инфой создается каждую секунду и достаточно быстро можно наделать десятки тысяч файлов,
во вкладке
Options-Trade options-Other снимаем выбор опции "Save program logs"
На следующей неделе будет новый материал, может быть и опишу возможности демо бота для получения профита (которые знаю )

Последний раз редактировал Igor F P 12:19, 09.10.2018
Гуру
  1. Оффлайн
  2. Посетители
  3. 164 сообщений
  4. Сообщение
  5. Личные данные
Полезность: 0 | сообщение № 19 отправлено 11:13, 10.10.2018
Демо-бот, часть1

Среди предложений разных типов версий ботов (ПРО, ЛАЙТ) у разработчиков есть и демо-версия для ПРО-версии (для лайта своя версия есть, но я с ней не работаю), эта версия бесплатная, работает с определенными биржами .
Отличить ее можно по обозначению на основной вкладке, там 2-а раза есть надпись DEMO.


Специфический продукт, прямо скажу, не плане оформления, нет с оформлением все нормально, а в плане возможностей.
С одной стороны он не дает понимания, как идет торговля, ибо блоки SELL и BUY вырезаны, с другой стороны его возможности уходят далеко за просто проверку правильности написания кодов стратегий.
И так.
Во первых все настройки и отображение информации вкладок Options, Bot,Wallet, Local Data, Parties,Trades,Log,Orders и т.д. такие же как в версии ПРО.
Отображение информации в окнах Watch и Log такое же как у ПРО, правда сами окна не раскрываются в полный размер, это отличие от ПРО-версии.
Работает с кодами стратегий до ПРО-версии 2.0.0.69 , дальше не понимает ряд новых функций связанных с работой с партиями.
На этом, пожалуй, сходство и завершается.
Отличие существенное и основное – отсутствуют коды покупки и продажи, а также нет обмена информацией с биржей по покупке и продаже.
К чему это приводит? Демо-версия эмулирует у себя продажу и покупку. Это значит, что бот сравнив цену и кол-во в стакане и условия стратегии «изображает» сделку, но при этом он не учитывает возможности других игроков и самих бирж перехватить его операцию или вообще не провести или время ожидания превысить и т.д.
Т.е. фактически то, что демо-версия показывает во вкладках Parties,Trades,Log,Orders в момент и по результатам операции это фантастика!
При этом более, менее демо-версия, в плане отображения результатов сделок, работает со стратегиями «золотого века» крипты (2010-01.2018), а работа стратегий учитывающих современные реалии приводит к ошибкам демо-версии, типа сплошная продажа одной и той же партии, правда в профит .


Также часто биржи "игнорируют" демо-версии запаздывая с ответами на запросы по API или вообще присылают не те данные, как например ниже, где данные стакана биржи и отправленные демо-боту не совпадают.


В тоже время без демо-версии создание стратегий и их отладка стали бы в сотни раз дороже для создателей стратегий, надеюсь понятно почему. Так что демо-версия очень нужна.

Для чего она нужна.
Ну, самое «вкусное» во второй части, позднее, ибо я пока еще только начал такое использование демо-версии и хотя подводных камней как бы и нет, но и описание не готово.
И так, демо-версия в первую очередь нужна для правильного написания кодов самой стратегии, проверки работы этих кодов на наличие ошибок в их написании, так и конфликтов между операторами, командами и т.д.
Т.е. мы написали некий код и запустили его в демо-версии. Демо-версия (как и ПРО) перед пуском проверяет код на наличие различных ошибок и в случае выявление сообщает об этом.
Как видим у нас появилось окошко, и на нем надпись, что есть ошибка - обнаружен не задокументированный идентификатор «trtk» в строке 447.


Такое сообщение показывает, что мы в где-то разделе TYPE… забыли указать что типа
Var trtk: double;
Короче, бот не знает что такое trtk, к какому типу данных относится, что с ним можно делать и т.д. И стратегия не будет работать, пока мы не устраним это.
При этом специфика 1BBOT такая, что часто (но не всегда!!!) сама ошибка находится на строке указанной ботом +1 строка, т.е. у нас написано 447, а фактически идентификатор «trtk» обнаружен в строке 448.
Поэтому смотрим на строку 448, понимаем (или не понимаем, но это значит, что не вы создатель стратегии) что за trtk, заходим в раздел TYPE и добавляем его там, ну или удаляем его в строке 448.
Следующая распространенная ошибка, забыли поставить знаки типа ; или : как того требуют правила написания Паскаль.
Как видим ниже, бот нашел ошибку и пишет, что должен быть оператор END , а найден FOR в строке 1252.


Смотрим 1252 и там нет завершения строки – отсутствует «;» .


Часто происходит не совпадение типов данных, как в примере внизу.
В строке 63 (помним, что часто надо «строка бота+1») мы попробовали вывести на экран тип данных INTEGER, но сами данные относятся к типу DOUBLE.


Также бот указывает в окне LOG все наши ошибки, они будут там находится до перезапуска бота или до обновления окна, если такое указано у нас в стратегии.
И так демо-бот помогает нам отладить коды стратегии удалив оттуда определенные ошибки.
В случае отладки стратегий с новыми операторами/командами появившимися после 69 версии, то задокументируем строки, где эти команды находятся и можно дальше будет проверять стратегию
Также демо-бот ничего делает с процедурами OnSellCompleted() и OnBuyCompleted(), ибо просто между демо-ботом и биржей нет никакого обмена данными по сделкам, ведь у демо-бота отсутствуют нужные коды.

Последний раз редактировал Igor F P 12:19, 10.10.2018
 
Перейти
Найти

Доступ закрыт.

  1. Вам запрещено отвечать в темах данного форума.

Последние темы

Изменения статуса

  1. профиль В поиске... 09:52, 29.06.2018
  2. профиль http://bit.ly/dolevik Доли проектов: Выпуск / Дивиденды / По... 09:56, 14.05.2016
  3. профиль http://ethereum.today/btccloud 16:33, 21.03.2015
  4. Просмотреть все статусы

Статьи