upbtc怎么样upbtc量化策略运行教程

当前位置:首页 > 币圈百科 > upbtc怎么样upbtc量化策略运行教程

upbtc怎么样upbtc量化策略运行教程

2022-12-01币圈百科211

UPBTC是专为高端专业投资者开发的数字货币交易客户端。

image.png

软件集成了多个数字货币交易所的实时行情和账户系统,方便查看多平台行情,快速下单。

提供专业k线图功能。投资者可以自己编写个性化的技术指标,实时输出到k线图进行技术分析。

条件单帮你监控行情,实现跟踪止损止盈。

当订单长时间不成交,或者下单后价格偏离太大,交易助手会自动撤单重发,保证交易。

利用历史k线模拟策略交易的操作,生成回测报告。策略的历史表现和优缺点一目了然。

量化交易,编写自己独特的交易策略,24小时监控行情,在满足策略条件时实时下单。

一种特殊的事务脚本语言,语法简单,无需编程。内置大量交易功能,简单快速的把自己的交易系统转换成代码,让电脑帮你赚钱。

位置监控,自动监控账户真实位置与任务总位置是否一致,不一致自动修正同步。

我们致力于提供协助加密货币投资者获利的工具。我们希望用户可以利用这个软件建立和优化自己的交易系统,形成自己的交易策略,有稳定的利润。

在解释语法规则之前,我们先简单说一下交易策略操作的全过程,以便更好的理解。

策略操作流程

一个完整的交易流程可以分为三个部分:接收市场报价、思考判断、下单(或不下单)。同样,量化交易系统也是这样工作的。

首先,我们需要选择想要交易的标的,然后加载交易策略。交易策略就是量化我们大脑对市场的思考和判断。每当接到新的行情,我们都会判断是否满足设定的下单条件。如果是这样,我们将发布命令。如果没有,我们将继续监测市场。

我们用伪代码来梳理一下整个过程。

周期:无论何时(收到新报价)?执行{?阅读市场的任务?运营策略?如果(满足政策顺序条件)?执行?{?订单?在k线上标出下单信号?}}

UPBTC平台会帮你做除了交易策略以外的一切事情。你只需要用专用的Up Language语言把交易思路写成策略,然后就可以完全自动的标记交易了。不是很简单吗?

示例策略

我们在任何目标k线上加载一个已经内置的示例策略(Strategy_DualMA)。现在让我们看看这个策略是如何运作的。

这里是这个策略的代码(你也可以在“量化-策略公式”页面自己查看)对策略做一些简单的点评。

如果中间有看不懂的地方,可以先跳过继续看。先大致了解一下运算原理,再仔细看看Up语言的语法规则。

策略代码由三部分组成:参数(Params)、变量(Vars)和Begin和End之间的策略主体。所有代码内容都不区分大小写。

这里我们将代码逐行翻译成自然语言,以便于理解。

在编译器的输入框中写代码的时候,可以使用//注释,这样在以后自己调试修改的时候可以快速理解代码。//之后编译器不会运行,也不需要遵循策略语法。

?//?参数(Params)部分。参数是可以在量化任务中修改并传递给策略的值。//?Numeric是声明参数的类型,表示它是一个数值参数。FastLength是参数的名称,我们用它来表示短均线的根长。任何时候我们使用这个名字,都会得到相应的值。具体数值在括号内。一行以分号结束。 Params?????//?告诉策略编译器以下是声明的参数?数字?fast length(5);?//?短均线用多久?数字?慢速长度(20);//?这是长均线的长度吗?数字?地段(1);?//?下订单时使用的交易数量?//?变量(Vars)部分,变量可蓑衣网小编2022以理解为存储值的盒子,我们可以通过运算得到的值给一个变量赋参数或者其他变量。然后我们就可以直接用变量名来获取存储值了?//?序列变量是一个很长的变量列表,可以在每根k线上存储为不同的values Vars?????//?告诉策略编译器声明了以下变量。数字系列?AvgValue1??//?数字序列变量。变量1用于存储短移动平均线的计算值。数字系列?AvgValue2??//?平均变量2,用来存储长均线的值?//?在Begin和End之间代码的主要部分是Begin吗??????//?战略科目开始?AvgValue1?=?AverageFC(Close,fast length);//?使用快速平均功能输入k线收盘价和要计算的短均线长度。然后把平均值赋给平均变量1?AvgValue2?=?AverageFC(Close,slow length);//?同样,计算长均线的值,赋给变量2?PlotNumeric('MA1 ',avg 蓑衣网小编2022 value 1);?//?在k线上画一条线,画一条短均线,名字叫MA1?PlotNumeric('MA2 ',avg value 2);?//?画一条长均线?//?如果(现在战略位置不长,最后一根k线上短均线的值大于长均线的值),运行下面花括号里的代码。在序列变量后加括号得到回溯值,[1]表示得到最后一根k线上这个序列变量的值,后面会详细解释?如果(MarketPosition?=?1?AvgValue1[1]?AvgValue2[1])?{?买入(手,开仓);//?打开更多订单。如果有空单,系统会自动平仓空单,开更多单。}?//?如果(现在战略位置不做空,最后一根k线上短均线的值小于等于长均线的值),运行下面花括号里的代码?如果(MarketPosition?=?-1?AvgValue1[1]?AvgValue2[1])?{?卖空(很多,未平仓);//?开仓,如果有多单,系统会自动平仓多单,重新开仓。}End?//?策略结束?https://www.UpBTC.com?实例策略

通过这个策略的讲解,你应该对交易策略的操作原理有个大概的了解,理解什么并不重要。让我们仔细研究一下Up语言的语法规则。

Up语言语法规则

基本定义

杠数据(非常重要)

每根k线都是一根杠。该策略基于Bar数据的基本数据源。

栏与循环有关。在日常循环中,一天是一个小节。以15分钟为周期,15分钟是一个条形

条形,按时间排列形成串行数据。最新的条形被定义为条形[0]。再往后,就是杠[1],杠[2]…。使用最新信息时,可以省略索引[0]。

引号可以理解为数据和时间的序列。k线从左到右按时间排序,交易策略也是从左到右逐一运行。

设定时间段内的所有k线,从第一根到最后一根,在每根k线上,从上到下计算并运行一次策略内的代码。

在会话中,每收到一个新的报价,策略就会被驱动运行一次。

每根棒线包含时间、行情信息、标的基本属性信息、策略的一些信息等。和Bar都是串行数据,支持回溯。也就是向前引用数据。比如我们想得到前一根棒线的收盘价信息,可以用Close[1];Hour[10]可用于前10根棒线的市场时间信息。只能是正整数。这是一个非常重要的机制

如果回溯的长度超过了数据的有效长度,将返回第一条的值。比如总共只有10根棒线,close[10]超过第一根棒线(最新的棒线是bar [0],如果有10根棒线,第一根棒线是bar [9]),最多只能追溯到close[9]。所以close[10]将返回close[9]的值。

数据类型

有三种基本的数据类型:数值型、字符串型和布尔型。每个都支持引用和回溯。下表:

类型描述Bool Boolean类型BoolRef Boolean类型是指具有相同周期长度的BoolSeries和Boolean系列值,可以追溯到Numeric Numeric type Numeric ref Numeric类型是指具有相同周期长度的NumericSeries和Numeric系列值。您可以回溯字符串string StringRef string以引用具有相同周期长度的StringSeries和字符串序列值。可以回溯

引用类型只能作为参数使用,在用户函数需要输出多个值的时候可以使用。用户执行函数后,函数给引用参数赋值,被调用的策略会通过传递给引用参数的变量得到修改后的值。的具体用法可以参考内置函数Sar和parabolicsar。

1.0.2添加GlobalNumeric变量类型。全局变量将保存最后一次赋值,它将在软件打开和未关闭的整个期间有效,并且可以跨策略传递值,只要策略声明了同一个全局变量。全局变量的声明与普通变量一致,GlobalNumeric MyNumeric;全局变量的默认值为0。最好不要自己设置默认值,因为多个策略的默认值可能会造成冲突。在任务A的策略中给MyNumeric赋一个值,任务B的策略可以直接取MyNumeric得到任务A赋的值,全局变量可以实现跨周期取值和多目标对冲套利的功能。

命名规则

参数、变量和策略的命名规则:

仅支持英文,不区分大小写;

不能超过32个字符;

所有公式的名称不能重复,一个策略中不能有相同的参数和变量名;

不能与系统中的保留字重复;

参数和变量不能与策略公式的名称重复。

语句

一行语句以“;”开头英文分号结束;

仅支持英文半角符号;

可以给布尔变量赋值真、假、判断表达式,myBool=true;或者myBool1=Open Close

你可以给数值型变量赋一个数值型公式或者有数值型计算结果的公式,myNumeric=100;或者my numeric 1=(high low)/2;

文本字符可以赋给字符串变量,myString=" Text(value)";) ";或者myString1=" text

运算符和函数关键字

运算符:

类型描述算术运算符加减-乘*除/模%关系运算符大于,小于=,小于等于=,等于==,不等于!=and赋值=(注意:程序中,等号表示不等于,而是给变量赋值。要判断两个值是否相等,需要使用“==”)逻辑运算符and,or ,not!(逻辑非)圆括号方法()的参数和计算优先级,代码块{},回溯[]标点当一个方法有多个参数时,用逗号“,”隔开。使用分号";“结束一行语句。使用双引号“文本”来表示字符串。的”。”保留为未确定的注释//or/* */

function keyword

keyword description Params声明参数的开始。参数必须有默认值Vars声明变量的开始,并且变量可以没有初始值。变量不能使用引用数据。IF语句Else条件语句Begin策略主体start End策略主体end For循环递增循环递减循环While循环直到满足条件中断循环继续End此循环继续运行循环True False boolean数据False返回并结束此轮代码运行。该函数使用返回变量的名称来返回变量输出。ReturnThisBar返回并结束在此栏上运行的代码,直到生成新的栏。

控制语句

If条件语句,如果满足条件,就执行后面花括号里的代码。如果公式只有一行,可以省略花括号。两行或更多行必须有花括号。

?If(条件)

?{

?公式;

?}

If-Else语句。如果满足条件,则执行公式1,否则,执行公式2。

?If(条件)

?{

?方程式1;

?}

?Else

?{

?公式2;

?}

If-Else if-Else语句。如果满足条件1,则执行公式1;如果不满足条件1,满足条件2,则执行公式2;如果不满足条件1和2,将执行公式3。当条件1满足时,执行完公式1后,整个语句结束,条件2不再判断。如果不满足条件1,满足条件2,则执行公式2后,不会再次执行公式3。

?If(条件1)

?{

?方程式1;

?}

?Else If(condition2)

?{

?公式2;

?}

?Else

?{

?公式3;

?}

条件语句可以嵌套。

?If(条件1)

?{

?If(条件2)

?{

?方程式1;

?}

?Else

?{

?公式2;

?}

?}

?Else

?{

?公式3;

?}

For loop,循环变量是声明变量,循环从初始值到结束值递增(to)或递减(downto)循环变量,反复执行公式。直到跟随环变量超出结束值。

?For 循环变量=初始值 to/downto 结束值

?{

? ? ?公式;

?}

While循环,条件为真,则重复运行公式,直到条件为假。注意如果条件恒为真,会造成死循环。需要有跳出循环的出口。

?While(Condition)

?{

? ? ?公式;

?}

Break,跳出循环。While判断条件恒为真,直到condition条件为真时,执行break,跳出此循环,继续往下执行其他的代码。

?While(True)

?{

? ? ?公式;

? ? ?If(Condition)

? ? ? ? ?Break;

?}

Continue,当条件2为真时,不会执行公式2,直接进入下一个循环。

?While(Condition1)

?{

? ? ?公式1;

? ? ?If(Condition2)

? ? ? ? ?Continue;

? ? ?公式2;

?}

逻辑运算

有时候我们需要将多个布尔变量进行运算,例如需要条件A和条件B同时满足时,或者条件A与条件B只要有一个满足时,下表列出了不同条件下逻辑运算符的结果。

表达式1表达式2表达式1 and 表达式2的结果TrueTrueTrueTrueFalseFalseFalseTrueFalseFalseFalseFalse表达式1表达式2表达式1 or 表达式2的结果TrueTrueTrueTrueFalseTrueFalseTrueTrueFalseFalseFalse表达式1not 表达式1的结果TrueFalseFalseTrue

从上面的表格我们可以看出,两个表达式都为True时,And才为True。而OR可以增加表达式的运算结果为True的可能性,两个表达式中只要有一个的值为True,那么表达式的运算结果就为True。

策略的结构

策略代码由参数定义(Params),变量定义(Vars)以及Begin与End之间的策略主体三部分组成,三部分顺序不能错乱。语法如下:

Params????参数定义语句;Vars????变量定义语句;Begin????策略主体;End

参数:

参数是一个预先声明的地址,用来存放输入参数的值,我们可以理解为一个带名称的盒子,里面放了值。在声明之后,您就可以在这个策略公式接下来的部分中使用该参数的名称来引用其值。参数的优势是可以在量化任务和k线图上直接修改,传给策略使用而不需要再重新编译策略公式。

一个策略公式中只能出现一个Params宣告,并且要放在公式最开始的部分,变量定义语句之前。

参数必须有初始值。参数在策略内部不能修改,一直保持不变,不能赋值(引用参数除外)。

引用参数是在策略公式作为函数使用时,调用的时候传入一个变量的地址(变量名),在函数内部会修改引用参数的值,在函数执行完毕,上层调用的公式会通过变量获得修改后的值,引用参数对于需要通过用户函数返回多个值的情况非常有用。

参数可以在个股和量化任务的界面直接修改,而无须重新编译策略。

参数可以使用所有9种数据类型。

序列参数可以通过回溯获取以前Bar的值。在作为函数使用时,将序列变量作为参数传递过来即可。

另外,在参数优化时,我们通过修改公式应用不同的参数,穷举测试交易策略的性能优劣,挑选最符合目标的参数值,达到优化参数的目的。

参数定义的语法:

Params????参数类型?参数名1(初始值);????参数类型?参数名2(初始值);????参数类型?参数名3(初始值);

例子:

Params????Numberic?Length(10);????????//?定义数值型参数Length,默认值为10????Bool?Con(False);????????????//?定义布尔型参数Con,默认值为False;????String?Str("Hello?World");??//?定义字符串参数Str,默认值为Hello?World;

变量

变量也是一个存储值的地址,我们同样也可以把它理解为一个带名称的盒子,和参数不同的是变量可以在策略公式中对其赋值。当变量被声明之后,就可以在这个策略公式中直接使用变量名称。变量用来存放计算或比较的结果,用”=”等号对变量赋值,然后在之后需要的地方直接引用计算所得的值,而无需再次计算。

使用变量可以提高策略的运行速度并节约内存空间,也可以提高程序的可读性,避免输入错误。如:

If(High?>=?Average(Close,20)?*?1.1)????Buy(1,Average(Close,20)?*?1.1);

就可以用变量重写为

myValue=?Average(Close,20)?*?1.1;If(High?>=?myValue)????Buy(1,myValue);

变量仅可在声明的策略公式内部使用,如果一类计算方法会经常需要在不同的策略中调用,可以建立函数来实现。函数的使用方式在后文会说明。

一个策略公式中只能出现一个Vars宣告,并且要放到公式的参数定义之后,主体之前。

变量可以没有初始值,如果没有赋初始值,则使用默认值。数值型默认值是0,布尔型默认值是false,字符串默认是空串。

变量可以在策略内部被赋值,主要用来存放计算或比较的结果。变量不能声明为引用数据类型。

序列变量和普通变量一样,可以在声明时赋默认值,也可在策略公式中对其赋值。声明时使用NumericSeries,就是数值型序列变量。另外还有布尔/字符串序列变量,BoolSeries/StringSeries。

序列变量可以进行回溯,获取在当前策略运行的k线之前的k线上的变量数据。除了支持全部简单变量的功能之外,序列变量还可以在变量名后加中括号”[nOffset]”来回溯以前的变量值,该偏移值必须是大于等于0的整数。

在新的一根bar产生时,序列变量会将上一根bar上的值传递到最新bar上,作为新bar的初始值。所以在声明序列变量时赋的初始值,只是对第一根bar生效,后面都是在传递值。

在开头示例的双均线策略,开仓条件就用到了序列变量。If(MarketPosition != 1 && AvgValue1[1] > AvgValue2[1])序列变量在最新的一根k线上的索引值为0,也就是AvgValue1[0],取最新的这个值时,[0]可以省略。索引值在k线上从后往前递增,所以AvgValue1[1]返回的值为当前运行策略的k线的前一根k线上的AvgValue1的值。同样的,我们计算均线的值的时候,使用的Close,因为要用到之前很多根k线的收盘价,所以Close其实也是一个序列值。

尽管序列变量可以实现普通变量的所有功能,但如果只需要使用普通变量就可满足需求的地方,我们建议您使用普通变量,速度更快。

我们内置了很多系统变量,可以快速的取到行情、账户和策略持仓等交易策略需要获取到的信息。系统变量由系统来赋值供您在策略中直接调用,您不可赋值,声明的变量名称也不可与系统变量重名。

变量定义的语法:

Vars????变量类型?变量名1(初始值);????变量类型?变量名2(初始值);????变量类型?变量名3(初始值);

例子:

Vars????Numberic?Length(10);????????//?定义数值型变量Length,默认值为10????NumbericSeries?Length;??????//?定义数值型序列变量参数Length,不声明默认值????Bool?Con(False);????????????//?定义布尔型变量Con,默认值为False;????String?Str("Hello?World");??//?定义字符串变量Str,默认值为Hello?World;

策略主体

策略主体部分将输入参数进行计算,根据条件执行对应的画线或下单动作,并且可以通过Return返回值来作为函数使用。

Begin与End之间的部分为策略的主体代码,每次策略被驱动,都运行一次该区域的代码。

在策略主体部分,您可以进行表达式运算、逻辑运算、条件判断、变量赋值、调用下单/画线等函数、输出返回值等操作。

函数

UPBTC的策略公式可以调用其他公式,有返回值的公式我们称为函数。函数是可以通过名称进行调用的一组语句的集合,函数会返回一个值,这个值可以是Numeric,Bool,String三种基本类型中的任何一种。您可以在策略公式内主体部分调用函数来完成相应的功能。

例如我们在最上面示例的双均线策略,就使用到了快速求平均函数AverageFC,传入需要使用的价格序列Price(这里我们传了Close),需要计算的长度Length,就会计算并返回之前多个k线的收盘价的平均值。每次用户需要进行求平均计算的时候,都可以调用AverageFC代替冗长的求平均代码,输入参数并获取返回值。我们内置了很多内置函数,还有一些底层来支持的系统函数,您都可以直接使用。并且,您也可以将经常需要用的方法自己编写为函数来使用。

函数通过参数传递输入数据,通过引用参数或返回值传递输出数据,AverageFC函数在示例策略被调用的时候格式如下:

AvgValue1?=?AverageFC(Close,FastLength);

在调用AverageFC的时候,需要根据定义时候的参数列表和顺序,输入相应的输入参数。有默认值的参数可以省略输入参数,但是不能省略函数后面的括号()。

函数须通过Return返回数据,返回数据类型为三种基本类型之一。

函数在调用时需要将返回值赋予类型相同的变量。

函数可以调用其他策略公式/函数,函数自身也可以递归调用其自身。

按照函数的实现机制不同,可分为普通函数和序列函数。普通函数输入参数,执行一段程序代码,返回需要的值。如Abs(-2); 返回2。序列函数是输入参数中有序列数据类型的用户函数。

为了保证序列数据的正确计算,序列函数需要每个Bar都被调用,如果有些Bar没有调用序列函数,序列函数中的序列数据则是空值。所以非常不建议在条件语句,条件语句的判断表达式,循环语句中使用序列函数。可以先在策略主体部分将序列函数赋值到变量,再使用变量。

交易策略和函数没有明确的区分,都可以被其他的策略调用。(效果等同于策略默认载入了所有策略函数)

策略的运算

普通变量的作用域、生命周期是当前tick(每一个报价更新,称为一个tick)。序列变量的作用域和生命周期是所有bar。

序列变量也可以理解为数组,和bar的根数一样,一一对应。一个bar上,序列变量只有一个值。

策略在历史bar上,从第一个bar到最后一个bar,依次计算,每个bar驱动策略计算一次。

实时行情时,最新的bar会随行情的波动继续更新,策略的运行机制不同于历史数据。每当有新的tick进来,策略都会被驱动,执行Begin-end之间的代码运算,但不再回去计算历史数据。简而言之就是历史bar每个bar计算一次策略,实时bar每个tick计算一次策略。

在最新的bar上,每次新的tick进来,普通变量都是以这个bar开始时的初始值开始计算,且无论这次计算怎么改变变量的值,都不影响下一个tick运行时普通变量的初始值。也即是说在最新bar内,普通变量不保留运算结果。

序列变量在一根bar上可以被多次赋值,并且会保留下来。在bar内取序列变量的值时,会取得最后一次的赋值。在这跟bar的最后一个tick走完时,会将值和这个bar的索引号保存在一起。

在策略从上往下运行的过程中,可以对一个变量多次赋值。

跳Tick

实时行情中,如果策略加载的标的的tick间隔非常短,或者策略的运算量非常大,有可能会发生两个tick的间隔时间内无法完整执行一次策略运算。这时新的ticker虽然进来,但是不会触发新的一轮策略运行。策略依然会继续执行之前未完的策略计算,直到策略的最后一行执行完毕。之后,直到再有新的tick进来,才会开始执行新的一轮计算。也就是说,在这样的情况下,有tick没有触发策略计算,被跳过了。

交易下单

下单方法有如下四个。Buy(买入,买入开多),Sell(卖出,卖出平多),SellShort(开空),BuyToCover(平空)。委托的单位为张(okex合约)、个(现货),输入参数为数量、价格。对策略对应标的下单,无需传入标的的代码等参数。在持多单时(buy),直接使用sellshort开空,平台会自动处理,平掉所有策略持仓的多单,再开空sellshort指定的数量。

如果标的不支持开空,则sellshort会变成sell。注意:现货持多单时,直接使用SellShort反手,首先会平策略所有多单,并且再发Sell委托单,有可能平掉您账户里面的持仓。sellshort开空时,使用buy下单方法同理。

下单方法除了可以在实时行情中发出下单指令外,还会在k线图表的k线上对应价格位置做出信号标识,持仓函数和回测、参数优化也是通过对这些方法的历史记录进行计算得出。

如果下单条件一直满足,策略会在每个tick运行时都重复发单,为了对重复发单做控制,可以使用MarketPosition之类的变量,下单之后,变量的值会改变,就不会再满足下单条件,不会重复再次发出委托单。可以参考常见问题里面的示例。

可能看到这里,您还是对Up Language策略语言理解有点模糊,没关系,您可以直接打开“函数手册-内置函数”,或者在客户端的“量化-策略公式”下,查看内置的策略、指标和函数。我们内置了大量的计算函数、指标,和一些比较简单的策略。通过阅读学习内置策略公式的写法,理解含义,然后动手写自己的交易策略试试吧。

upbtc怎么样upbtc量化策略运行教程 | 分享给朋友: