⑴ 什么是动态规划如何运用动态规划解决实际问题
我也不明白,找一下看有用没。
动态规划算法的应用
一、动态规划的概念
近年来,涉及动态规划的各种竞赛题越来越多,每一年的NOI几乎都至少有一道题目需要用动态规划的方法来解决;而竞赛对选手运用动态规划知识的要求也越来越高,已经不再停留于简单的递推和建模上了。
要了解动态规划的概念,首先要知道什么是多阶段决策问题。
1. 多阶段决策问题
如果一类活动过程可以分为若干个互相联系的阶段,在每一个阶段都需作出决策(采取措施),一个阶段的决策确定以后,常常影响到下一个阶段的决策,从而就完全确定了一个过程的活动路线,则称它为多阶段决策问题。
各个阶段的决策构成一个决策序列,称为一个策略。每一个阶段都有若干个决策可供选择,因而就有许多策略供我们选取,对应于一个策略可以确定活动的效果,这个效果可以用数量来确定。策略不同,效果也不同,多阶段决策问题,就是要在可以选择的那些策略中间,选取一个最优策略,使在预定的标准下达到最好的效果.
2.动态规划问题中的术语
阶段:把所给求解问题的过程恰当地分成若干个相互联系的阶段,以便于求解,过程不同,阶段数就可能不同.描述阶段的变量称为阶段变量。在多数情况下,阶段变量是离散的,用k表示。此外,也有阶段变量是连续的情形。如果过程可以在任何时刻作出决策,且在任意两个不同的时刻之间允许有无穷多个决策时,阶段变量就是连续的。
在前面的例子中,第一个阶段就是点A,而第二个阶段就是点A到点B,第三个阶段是点B到点C,而第四个阶段是点C到点D。
状态:状态表示每个阶段开始面临的自然状况或客观条件,它不以人们的主观意志为转移,也称为不可控因素。在上面的例子中状态就是某阶段的出发位置,它既是该阶段某路的起点,同时又是前一阶段某支路的终点。
在前面的例子中,第一个阶段有一个状态即A,而第二个阶段有两个状态B1和B2,第三个阶段是三个状态C1,C2和C3,而第四个阶段又是一个状态D。
过程的状态通常可以用一个或一组数来描述,称为状态变量。一般,状态是离散的,但有时为了方便也将状态取成连续的。当然,在现实生活中,由于变量形式的限制,所有的状态都是离散的,但从分析的观点,有时将状态作为连续的处理将会有很大的好处。此外,状态可以有多个分量(多维情形),因而用向量来代表;而且在每个阶段的状态维数可以不同。
当过程按所有可能不同的方式发展时,过程各段的状态变量将在某一确定的范围内取值。状态变量取值的集合称为状态集合。
无后效性:我们要求状态具有下面的性质:如果给定某一阶段的状态,则在这一阶段以后过程的发展不受这阶段以前各段状态的影响,所有各阶段都确定时,整个过程也就确定了。换句话说,过程的每一次实现可以用一个状态序列表示,在前面的例子中每阶段的状态是该线路的始点,确定了这些点的序列,整个线路也就完全确定。从某一阶段以后的线路开始,当这段的始点给定时,不受以前线路(所通过的点)的影响。状态的这个性质意味着过程的历史只能通过当前的状态去影响它的未来的发展,这个性质称为无后效性。
决策:一个阶段的状态给定以后,从该状态演变到下一阶段某个状态的一种选择(行动)称为决策。在最优控制中,也称为控制。在许多间题中,决策可以自然而然地表示为一个数或一组数。不同的决策对应着不同的数值。描述决策的变量称决策变量,因状态满足无后效性,故在每个阶段选择决策时只需考虑当前的状态而无须考虑过程的历史。
决策变量的范围称为允许决策集合。
策略:由每个阶段的决策组成的序列称为策略。对于每一个实际的多阶段决策过程,可供选取的策略有一定的范围限制,这个范围称为允许策略集合。允许策略集合中达到最优效果的策略称为最优策略。
给定k阶段状态变量x(k)的值后,如果这一阶段的决策变量一经确定,第k+1阶段的状态变量x(k+1)也就完全确定,即x(k+1)的值随x(k)和第k阶段的决策u(k)的值变化而变化,那么可以把这一关系看成(x(k),u(k))与x(k+1)确定的对应关系,用x(k+1)=Tk(x(k),u(k))表示。这是从k阶段到k+1阶段的状态转移规律,称为状态转移方程。
最优性原理:作为整个过程的最优策略,它满足:相对前面决策所形成的状态而言,余下的子策略必然构成“最优子策略”。
最优性原理实际上是要求问题的最优策略的子策略也是最优。让我们通过对前面的例子再分析来具体说明这一点:从A到D,我们知道,最短路径是AB1C2D,这些点的选择构成了这个例子的最优策略,根据最优性原理,这个策略的每个子策略应是最优:AB1C2是A到C2的最短路径,B1C2D也是B1到D的最短路径……——事实正是如此,因此我们认为这个例子满足最优性原理的要求。
[编辑本段]动态规划练习题
USACO
2.2 Subset Sums
题目如下:
对于从1到N的连续整集合合,能划分成两个子集合,且保证每个集合的数字和是相等的。
举个例子,如果N=3,对于{1,2,3}能划分成两个子集合,他们每个的所有数字和是相等的:
{3}and {1,2}
这是唯一一种分发(交换集合位置被认为是同一种划分方案,因此不会增加划分方案总数)
如果N=7,有四种方法能划分集合{1,2,3,4,5,6,7},每一种分发的子集合各数字和是相等的:
{1,6,7} and {2,3,4,5} {注 1+6+7=2+3+4+5}
{2,5,7} and {1,3,4,6}
{3,4,7} and {1,2,5,6}
{1,2,4,7} and {3,5,6}
给出N,你的程序应该输出划分方案总数,如果不存在这样的划分方案,则输出0。程序不能预存结果直接输出。
PROGRAM NAME: subset
INPUT FORMAT
输入文件只有一行,且只有一个整数N
SAMPLE INPUT (file subset.in)
7
OUTPUT FORMAT
输出划分方案总数,如果不存在则输出0。
SAMPLE OUTPUT (file subset.out)
4
参考程序如下(c语言):
#include <fstream>
using namespace std;
const unsigned int MAX_SUM = 1024;
int n;
unsigned long long int dyn[MAX_SUM];
ifstream fin ("subset.in");
ofstream fout ("subset.out");
int main() {
fin >> n;
fin.close();
int s = n*(n+1);
if (s % 4) {
fout << 0 << endl;
fout.close ();
return ;
}
s /= 4;
int i, j;
dyn [0] = 1;
for (i = 1; i <= n; i++)
for (j = s; j >= i; j--)
dyn[j] += dyn[j-i];
fout << (dyn[s]/2) << endl;
fout.close();
return 0;
}
USACO 2.3
Longest Prefix
题目如下:
在生物学中,一些生物的结构是用包含其要素的大写字母序列来表示的。生物学家对于把长的序列分解成较短的(称之为元素的)序列很感兴趣。
如果一个集合 P 中的元素可以通过串联(允许重复;串联,相当于 Pascal 中的 “+” 运算符)组成一个序列 S ,那么我们认为序列 S 可以分解为 P 中的元素。并不是所有的元素都必须出现。举个例子,序列 ABABACABAAB 可以分解为下面集合中的元素:
{A, AB, BA, CA, BBC}
序列 S 的前面 K 个字符称作 S 中长度为 K 的前缀。设计一个程序,输入一个元素集合以及一个大写字母序列,计算这个序列最长的前缀的长度。
PROGRAM NAME: prefix
INPUT FORMAT
输入数据的开头包括 1..200 个元素(长度为 1..10 )组成的集合,用连续的以空格分开的字符串表示。字母全部是大写,数据可能不止一行。元素集合结束的标志是一个只包含一个 “.” 的行。集合中的元素没有重复。接着是大写字母序列 S ,长度为 1..200,000 ,用一行或者多行的字符串来表示,每行不超过 76 个字符。换行符并不是序列 S 的一部分。
SAMPLE INPUT (file prefix.in)
A AB BA CA BBC
.
ABABACABAABC
OUTPUT FORMAT
只有一行,输出一个整数,表示 S 能够分解成 P 中元素的最长前缀的长度。
SAMPLE OUTPUT (file prefix.out)
11
示例程序如下:
#include <stdio.h>
/* maximum number of primitives */
#define MAXP 200
/* maximum length of a primitive */
#define MAXL 10
char prim[MAXP+1][MAXL+1]; /* primitives */
int nump; /* number of primitives */
int start[200001]; /* is this prefix of the sequence expressible? */
char data[200000]; /* the sequence */
int ndata; /* length of the sequence */
int main(int argc, char **argv)
{
FILE *fout, *fin;
int best;
int lv, lv2, lv3;
if ((fin = fopen("prim.in", "r")) == NULL)
{
perror ("fopen fin");
exit(1);
}
if ((fout = fopen("prim.out", "w")) == NULL)
{
perror ("fopen fout");
exit(1);
}
/* read in primitives */
while (1)
{
fscanf (fin, "%s", prim[nump]);
if (prim[nump][0] != '.') nump++;
else break;
}
/* read in string, one line at a time */
ndata = 0;
while (fscanf (fin, "%s", data+ndata) == 1)
ndata += strlen(data+ndata);
start[0] = 1;
best = 0;
for (lv = 0; lv < ndata; lv++)
if (start[lv])
{ /* for each expressible prefix */
best = lv; /* we found a longer expressible prefix! */
/* for each primitive, determine the the sequence starting at
this location matches it */
for (lv2 = 0; lv2 < nump; lv2++)
{
for (lv3 = 0; lv + lv3 < ndata && prim[lv2][lv3] &&
prim[lv2][lv3] == data[lv+lv3]; lv3++)
;
if (!prim[lv2][lv3]) /* it matched! */
start[lv + lv3] = 1; /* so the expanded prefix is also expressive */
}
}
/* see if the entire sequence is expressible */
if (start[ndata]) best = ndata;
fprintf (fout, "%i\n", best);
return 0;
}
USACO 3.1
Score Inflation
题目如下:
我们试着设计我们的竞赛以便人们能尽可能的多得分,这需要你的帮助。
我们可以从几个种类中选取竞赛的题目,这里的一个"种类"是指一个竞赛题目的集合,解决集合中的题目需要相同多的时间并且能得到相同的分数。
你的任务是写一个程序来告诉USACO的职员,应该从每一个种类中选取多少题目,使得解决题目的总耗时在竞赛规定的时间里并且总分最大。
输入包括竞赛的时间,M(1 <= M <= 10,000)和N,"种类"的数目1 <= N <= 10,000。
后面的每一行将包括两个整数来描述一个"种类":
第一个整数说明解决这种题目能得的分数(1 <= points <= 10000),第二整数说明解决这种题目所需的时间(1 <= minutes <= 10000)。
你的程序应该确定我们应该从每个"种类"中选多少道题目使得能在竞赛的时间中得到最大的分数。
来自任意的"种类"的题目数目可能任何非负数(0或更多)。
计算可能得到的最大分数。
PROGRAM NAME: inflate
INPUT FORMAT
第 1 行: M, N--竞赛的时间和题目"种类"的数目。
第 2-N+1 行: 两个整数:每个"种类"题目的分数和耗时。
SAMPLE INPUT (file inflate.in)
300 4
100 60
250 120
120 100
35 20
OUTPUT FORMAT
单独的一行包括那个在给定的限制里可能得到的最大的分数。
SAMPLE OUTPUT (file inflate.out)
605
{从第2个"种类"中选两题,第4个"种类"中选三题}
示例程序如下:
#include <fstream.h>
ifstream fin("inflate.in");
ofstream fout("inflate.out");
const short maxm = 10010;
long best[maxm], m, n;
void
main()
{
short i, j, len, pts;
fin >> m >> n;
for (j = 0; j <= m; j++)
best[j] = 0;
for (i = 0; i < n; i++) {
fin >> pts >> len;
for (j = len; j <= m; j++)
if (best[j-len] + pts > best[j])
best[j] = best[j-len] + pts;
}
fout << best[m] << endl; // 由于数组元素不减,末元素最大
}
USACO 3.3
A Game
题目如下:
有如下一个双人游戏:N(2 <= N <= 100)个正整数的序列放在一个游戏平台上,两人轮流从序列的两端取数,取数后该数字被去掉并累加到本玩家的得分中,当数取尽时,游戏结束。以最终得分多者为胜。
编一个执行最优策略的程序,最优策略就是使自己能得到在当前情况下最大的可能的总分的策略。你的程序要始终为第二位玩家执行最优策略。
PROGRAM NAME: game1
INPUT FORMAT
第一行: 正整数N, 表示序列中正整数的个数。
第二行至末尾: 用空格分隔的N个正整数(大小为1-200)。
SAMPLE INPUT (file game1.in)
6
4 7 2 9
5 2
OUTPUT FORMAT
只有一行,用空格分隔的两个整数: 依次为玩家一和玩家二最终的得分。
SAMPLE OUTPUT (file game1.out)
18 11
参考程序如下:
#include <stdio.h>
#define NMAX 101
int best[NMAX][2], t[NMAX];
int n;
void
readx () {
int i, aux;
freopen ("game1.in", "r", stdin);
scanf ("%d", &n);
for (i = 1; i <= n; i++) {
scanf ("%d", &aux);
t = t[i - 1] + aux;
}
fclose (stdin);
}
inline int
min (int x, int y) {
return x > y ? y : x;
}
void
solve () {
int i, l;
for (l = 1; l <= n; l++)
for (i = 1; i + l <= n + 1; i++)
best[l%2] = t[i + l - 1] - t[i - 1] - min (best[i + 1][(l - 1) % 2],
best[(l - 1) % 2]);
}
void writex () {
freopen ("game1.out", "w", stdout);
printf ("%d %d\n", best[1][n % 2], t[n] - best[1][n % 2]);
fclose (stdout);
}
int
main () {
readx ();
solve ();
writex ();
return 0;
}
USACO 3.4
Raucous Rockers
题目如下:
你刚刚得到了流行的“破锣摇滚”乐队录制的尚未发表的N(1 <= N <= 20)首歌的版权。你打算从中精选一些歌曲,发行M(1 <= M <= 20)张CD。每一张CD最多可以容纳T(1 <= T <= 20)分钟的音乐,一首歌不能分装在两张CD中。
不巧你是一位古典音乐迷,不懂如何判定这些歌的艺术价值。于是你决定根据以下标准进行选择:
歌曲必须按照创作的时间顺序在CD盘上出现。
选中的歌曲数目尽可能地多。
PROGRAM NAME: rockers
INPUT FORMAT
第一行: 三个整数:N, T, M.
第二行: N个整数,分别表示每首歌的长度,按创作时间顺序排列。
SAMPLE INPUT (file rockers.in)
4 5 2
4 3 4 2
OUTPUT FORMAT
一个整数,表示可以装进M张CD盘的乐曲的最大数目。
SAMPLE OUTPUT (file rockers.out)
3
参考程序如下:
#include <stdio.h>
#define MAX 25
int dp[MAX][MAX][MAX], length[MAX];
int
main ()
{
FILE *in = fopen ("rockers.in", "r");
FILE *out = fopen ("rockers.out", "w");
int a, b, c, d, best, numsongs, cdlength, numcds;
fscanf (in, "%d%d%d", &numsongs, &cdlength, &numcds);
for (a = 1; a <= numsongs; a++)
fscanf (in, "%d", &length[a]);
best = 0;
for (a = 0; a < numcds; a++)/*当前cd */
for (b = 0; b <= cdlength; b++) /* 已过的时间*/
for (c = 0; c <= numsongs; c++) { /* 上一曲*/
for (d = c + 1; d <= numsongs; d++) { /* 下一曲*/
if (b + length[d] <= cdlength) {
if (dp[a][c] + 1 > dp[a][b + length[d]][d])
dp[a][b + length[d]][d] = dp[a][c] + 1;
}
else {
if (dp[a][c] + 1 > dp[a + 1][length[d]][d])
dp[a + 1][length[d]][d] = dp[a][c] + 1;
}
}
if (dp[a][c] > best)
best = dp[a][c];
}
fprintf (out, "%d\n", best);
return 0;
}
USACO
4.3 Buy Low, Buy Lower
“逢低吸纳”是炒股的一条成功秘诀。如果你想成为一个成功的投资者,就要遵守这条秘诀:
"逢低吸纳,越低越买"
这句话的意思是:每次你购买股票时的股价一定要比你上次购买时的股价低.按照这个规则购买股票的次数越多越好,看看你最多能按这个规则买几次。
给定连续的N天中每天的股价。你可以在任何一天购买一次股票,但是购买时的股价一定要比你上次购买时的股价低。写一个程序,求出最多能买几次股票。
以下面这个表为例, 某几天的股价是:
天数 1 2 3 4 5 6 7 8 9 10 11 12
股价 68 69 54 64 68 64 70 67 78 62 98 87
这个例子中, 聪明的投资者(按上面的定义),如果每次买股票时的股价都比上一次买时低,那么他最多能买4次股票。一种买法如下(可能有其他的买法):
天数 2 5 6 10
股价 69 68 64 62
PROGRAM NAME: buylow
INPUT FORMAT
第1行: N (1 <= N <= 5000), 表示能买股票的天数。
第2行以下: N个正整数 (可能分多行) ,第i个正整数表示第i天的股价. 这些正整数大小不会超过longint(pascal)/long(c++).
SAMPLE INPUT (file buylow.in)
12
68 69 54 64 68 64 70 67
78 62 98 87
OUTPUT FORMAT
只有一行,输出两个整数:
能够买进股票的天数
长度达到这个值的股票购买方案数量
在计算解的数量的时候,如果两个解所组成的字符串相同,那么这样的两个解被认为是相同的(只能算做一个解)。因此,两个不同的购买方案可能产生同一个字符串,这样只能计算一次。
SAMPLE OUTPUT (file buylow.out)
4 2
参考程序如下:
#include <stdio.h>
#include <assert.h>
#include <stdlib.h>
typedef struct BIGNUM *bignum_t;
struct BIGNUM
{
int val;
bignum_t next;
};
int num[5000];
int len[5000];
int nlen;
bignum_t cnt[5000];
bignum_t get_big(void)
{
static bignum_t block;
static int size = 0;
if (size == 0)
{
block = (bignum_t)malloc(sizeof(*block)*128);
size = 128;
}
size--;
return block++;
}
/*初始化高精度数*/
void init_big(bignum_t *num, int val)
{
*num = get_big();
/* initialize */
(*num)->val = val;
(*num)->next = NULL;
}
void add(bignum_t a, bignum_t b)
{
int c; /* carry */
c = 0;
while (b || c)
{
a->val += c;
if (b) a->val += b->val;
/* if a->val is too large, we need to carry */
c = (a->val / 1000000);
a->val = (a->val % 1000000);
if (b) b = b->next;
if (!a->next && (b || c))
{ /* allocate if we need to */
a->next = get_big();
a = a->next;
a->val = 0;
a->next = NULL;
} else a = a->next;
}
}
void out_num(FILE *f, bignum_t v)
{
if (v->next)
{
out_num(f, v->next);
fprintf (f, "%06i", v->val);
}
else
fprintf (f, "%i", v->val);
}
int main(int argc, char **argv)
{
FILE *fout, *fin;
int lv, lv2;
int c;
int max;
int l;
bignum_t ans;
if ((fin = fopen("buylow.in", "r")) == NULL)
{
perror ("fopen fin");
exit(1);
}
if ((fout = fopen("buylow.out", "w")) == NULL)
{
perror ("fopen fout");
exit(1);
}
fscanf (fin, "%d", &nlen);
for (lv = 0; lv < nlen; lv++)
fscanf (fin, "%d", &num[lv]);
/* 用DP计算最大长度*/
for (lv = 0; lv < nlen; lv++)
{
max = 1;
for (lv2 = lv-1; lv2 >= 0; lv2--)
if (num[lv2] > num[lv] && len[lv2]+1 > max) max = len[lv2]+1;
len[lv] = max;
}
for (lv = 0; lv < nlen; lv++)
{
if (len[lv] == 1) init_big(&cnt[lv], 1);
else
{
init_big(&cnt[lv], 0);
l = -1;
max = len[lv]-1;
for (lv2 = lv-1; lv2 >= 0; lv2--)
if (len[lv2] == max && num[lv2] > num[lv] && num[lv2] != l)
add(cnt[lv], cnt[lv2]);
l = num[lv2];
}
}
}
/* 找最长串*/
max = 0;
for (lv = 0; lv < nlen; lv++)
if (len[lv] > max) max = len[lv];
init_big(&ans, 0);
l = -1;
for (lv = nlen-1; lv >= 0; lv--)
if (len[lv] == max && num[lv] != l)
{
add(ans, cnt[lv]);
l = num[lv];
}
/* output answer */
fprintf (fout, "%i ", max);
out_num(fout, ans);
fprintf (fout, "\n");
return 0;
}
动态规划作为一种重要的信息学竞赛算法,具有很强的灵活性。以上提供的是一些入门练习题,深入的学习还需要逐步积累经验。
⑵ 通达信怎么看板块走势图
如图:选择板块之后就可以看到板块走势图。
走势图是把股票市场或期货市场等交易信息用曲线或K线在坐标图上加以显示的技术图形。坐标的横轴是固定的时间周期,纵轴的上半部分是该时间周期的股价或指数,下半部分显示的是成交量。
⑶ 通达信指标怎么同步到另一部手机
通达信指标转移或保存:
比如华为手机P30Pro, 鸿蒙2.0操作系统
在软件的 左上角打开:功能--公式系统--公式管理器
进入管理器以后,注意右侧的功能,有个:导出公式。
好了按步骤做就可以了,再次导入的时候还是按顺序操作,只是最后是导入就OK。
(3)nmax股票交易平台扩展阅读:
一、通达信软件是多功能的证券信息平台,与其他行情软件相比,有简洁的界面和行情更新速度较快等优点。通达信允许用户自由划分屏幕,并规定每一块对应哪个内容。至于快捷键,也是通达信的特色之一。通达信还有一个有用的功能,就是"在线人气",可以了解哪些是当前关注,哪些是持续关注,又有哪些是当前冷门,可以更直接了解各个股票的关注度。
二、 通达信的哲学是给证券经营机构和广大投资者提供独一无二有效的证券投资分析系统。全方位的功能整合、专业精美的界面表达、独到精妙的创新设计,将通达信的深厚专业底蕴和独树一帜风格的品牌形象进行了全新演绎。商家取得成功的关键是适应顾客的需求,通达信始终以市场的需求为产品研发的方向。其产品的研究开发借鉴了国际同类主流软件所反映的先进投资理念,融合通达信长期以来对中国证券市场的深刻理解。所有的科研人员和管理人员都兢兢业业的工作。公司的发展目标和个人的成长目标相一致,所以公司有较强的凝聚力。
三、2008年11月20日,经过通达信Flash开发人员半年的辛勤努力 通达信软件终于推出了全新的Flash行情版。即便您出差在外地,在宾馆里面想看看您的股票,您可以打开浏览器,直接在网页上使用通达信Flash版,此版本跨平台可以同时兼容Mac os和Linux。并且可以运行于机顶盒、各种嵌入式设备中。
四、举例应用
找出近5日内创历史新高的股票
NHIGH:HHV(HIGH,5)== HHV(HIGH,0);
首先定义输出线变量:NHIGH,对其进行输出.
5日内创历史新高,也即近5日的最高价为历史最高价,由HHV(HIGH,5)可以求出近5日的最高价,而HHV函数的第二个参数为0时,表示对所有数据求值,所以由HHV(HIGH,0)可以得到历史最高价.
最后,由条件判断确定这两个新高是否同一数值.
一直在60日季均线下潜伏近日上攻的股票
在60日季均线下潜伏,也即收盘价一直低于其60日移动平均;近日上攻,也即近日上穿其均线:
NCROSS:LAST(CLOSEMA(CLOSE,60);
找出今日涨幅大于大盘涨幅的股票
NMAX1:=(CLOSE-REF(CLOSE,1))/REF(CLOSE,1);
NMAX2:=(INDEXC-REF(INDEXC,1))/REF(INDEXC,1);
NMAX:NMAX1>NMAX2;
⑷ 通达信的软件应用
找出近5日内创历史新高的股票
NHIGH:HHV(HIGH,5)== HHV(HIGH,0);
首先定义输出线变量:NHIGH,对其进行输出.
5日内创历史新高,也即近5日的最高价为历史最高价,由HHV(HIGH,5)可以求出近5日的最高价,而HHV函数的第二个参数为0时,表示对所有数据求值,所以由HHV(HIGH,0)可以得到历史最高价.
最后,由条件判断确定这两个新高是否同一数值.
一直在60日季均线下潜伏近日上攻的股票
在60日季均线下潜伏,也即收盘价一直低于其60日移动平均;近日上攻,也即近日上穿其均线:
NCROSS:LAST(CLOSEMA(CLOSE,60);
找出今日涨幅大于大盘涨幅的股票
NMAX1:=(CLOSE-REF(CLOSE,1))/REF(CLOSE,1);
NMAX2:=(INDEXC-REF(INDEXC,1))/REF(INDEXC,1);
NMAX:NMAX1>NMAX2;
找出近7日都收阳线的股票
NRED:EVERY(CLOSE>OPEN,7);
《通达信集成版》软件新语法新函数
引用各种公式
从《通达信集成版》软件开始,交易系统公式,条件选股公式也可以被引用.引用时若有参数指定,则使用指定参数,否则使用指标的缺省参数;指定了指标的某一条输出线,则使用该输出线,否则使用第一条输出线.
引用画线指标公式
画线指标直接引用或以引号说明.
例如:MID:=KDJ.K(10,2) 或 MID:=KDJ.K(10,2)表示以(10,2)为参数计算指标公式KDJ的K值,并赋值给MID.
引用分析家的公式
公式名称.指标线名称(参数表)
其中参数表中的参数个数应该与该公式的实际参数数量一致,若不写参数表,则表示使用缺省参数.例如MACD.DIF表示引用根据缺省参数计算的MACD指标中的DIF指标线数值.
引用交易系统公式
SYSTEM.公式名称.交易类型(参数表)
交易类型可以为ENTERLONG,EXITLONG,ENTERSHORT或者EXITSHORT,分别表示引用多头买入,多头卖出,空头买入,空头卖出.考虑兼容,BUYPOINT,
SELLPOINT等老的方式仍然支持.
引用条件选股公式
条件选股公式由EXPLORER导出.
例如引用条件选股的KDJ,则表述为:EXPLORER. KDJ;交易系统公式由SYSTEM导出.系统暂时还不支持引用五彩K线公式.
例如,要指示涨停版的K线画蓝色,可以定义输出线:UP:CLOSE>=REF(CLOSE,1)×1.1, COLORBLUE.
跨周期引用公式
引用其他周期数据,使用#运算符指明周期.
包括: MIN1[分钟],MIN5[5分钟],MIN15[15分钟],MIN30[30分钟],MIN60[60分钟],DAY[日线],WEEK[周线],MONTH[月线].
例如得到KDJ的周线数据,可以表述为:MACD#WEEK.应注意的是,只能从较短周期引用较长周期,反方向的引用不允许.
引用其它股票数据
您还可以在公式中引用其它任和股票的数据,方法为:
股票代码$数据名称
例如要得到0001的收盘价,可以表示:0001$CLOSE;
数据名称可以是OPEN,HIGH,LOW,CLOSE,VOL,AMOUNT,分别表示包括开盘价,最高价,最低价,收盘价,成交量,成交额.
公式导出,导入
导出公式
1.点击公式管理器的〖导出公式〗按钮,弹出对话框供用户输出公式.
2.在输出公式时,系统列出可供输出的四类公式,用鼠标点取待输出公式前的方框将其选中.
导入公式
在引入公式时,系统显示所有待引入的公式.若某公式在系统中已存在同名公式则会在导入公式对话框下方提示.新引入公式的名称可以被更改,方法是先选中该公式,然后用鼠标再次点击它的名称部分.
临时引入
临时引入的公式将不保存在系统硬盘上,退出后这些公式随即自动消失.这对需要公式保密的网络版用户很有帮助.
新增函数
一 ,行情函数
HIGH 最高价
返回该周期最高价.
用法: HIGH
H 最高价
返回该周期最高价.
用法: H
LOW 最低价
返回该周期最低价.
用法: LOW
L 最低价
返回该周期最低价.
用法: L
CLOSE 收盘价
返回该周期收盘价.
用法: CLOSE
C 收盘价
返回该周期收盘价.
用法: C
VOL 成交量
返回该周期成交量.
用法: VOL
V 成交量
返回该周期成交量.
用法: V
OPEN 开盘价
返回该周期开盘价.
用法: OPEN
O: 开盘价
返回该周期开盘价.
用法: O
ADVANCE 上涨家数
返回该周期上涨家数.
用法: ADVANCE (本函数仅对大盘有效)
DECLINE 下跌家数
返回该周期下跌家数.
用法: DECLINE (本函数仅对大盘有效)
AMOUNT 成交额
返回该周期成交额.
用法: AMOUNT
ASKPRICE 委卖价
返回委卖1--委卖3价格.
用法: ASKPRICE(N) N取1―3.
(本函数仅个股在分笔成交分析周期有效)
ASKVOL 委卖量
返回委卖1--委卖3量.
用法: ASKVOL(N) N取1―3.
(本函数仅个股在分笔成交分析周期有效)
BIDPRICE 委买价
返回委买1--委买3价格.
用法: BIDPRICE(N) N取1―3.
(本函数仅个股在分笔成交分析周期有效)
BIDVOL 委买量
返回委买1--委买3量.
用法: BIDVOL(N) N取1―3.
(本函数仅个股在分笔成交分析周期有效)
BUYVOL 主动性买盘
返回主动性买单量.
用法: BUYVOL 当本笔成交为主动性买盘时,其数值等于成交量,否则为0.
(本函数仅个股在分笔成交分析周期有效)
SELLVOL 主动性卖盘
返回主动性卖单量.
用法: SELLVOL 当本笔成交为主动性卖盘时,其数值等于成交量,否则为0.
(本函数仅个股在分笔成交分析周期有效)
ISBUYORDER 主动性买单
返回该成交是否为主动性买单.
用法: ISBUYORDER 当本笔成交为主动性买盘时,返回1,否则为0.
(本函数仅个股在分笔成交分析周期有效)
ISSELLORDER 主动性卖单
返回该成交是否为主动性卖单.
用法: ISSELLORDER 当本笔成交为主动性卖盘时,返回1,否则为0.
(本函数仅个股在分笔成交分析周期有效)
通达信在券商中的占比
截止2010年10月份,共有75家券商用的是通达信交易(全国券商也只有100家左右):
01=银河证券
02=国泰君安
03=国信证券
04=海通证券(上线过程中)
05=招商证券
06=广发证券 (只有行情版本)
07=华泰证券
08=申银万国
09=中信建投
10=光大证券
11=齐鲁证券
12=安信证券
13=中信证券
14=中投证券
15=联合证券
16=方正证券
17=中信金通
18=长江证券
19=东方证券
20=兴业证券
21=宏源证券
22=华西证券
23=中银国际
24=国元证券
25=平安证券
26=长城证券
27=湘财证券
28=信达证券
29=上海证券
30=东海证券
31=东兴证券
32=中信万通
33=渤海证券
34=南京证券
35=东北证券
36=国金证券
37=国海证券
38=民族证券
39=东莞证券
40=山西证券
41=西南证券
42=国联证券
43=华安证券
44=新时代证券
45=民生证券
46=中航证券
47=财富证券
48=华林证券
49=江海证券
50=英大证券
51=国盛证券
52=广州证券
53=金元证券
54=大通证券
55=第一创业
56=太平洋证券
57=世纪证券
58=华鑫证券
59=华创证券
60=红塔证券
61=首创证券
62=德邦证券
63=华融证券
64=爱建证券
65=和兴证券
66=华宝证券
67=厦门证券
68=大同证券
69=银泰证券
70=国开证券
71=众成证券
72=万和证券
73=开源证券
74=五矿证券
75=财通证券
还有几家券商(比如中原证券等),只用到了通达信行情和资讯,没有用通达信交易。
通达信的券商网上交易占比达80%以上。