新dma指标原代码(超级主力指标源码公式?)
1. 超级主力指标源码公式?
DRAWGBK(1,STRIP(RGB(30,0,60),RGB(0,40,40),2));
//平均:TOSTRING((REF(H,1)+REF(L,1)+REF(O,1)+REF(C,1))/4,2),colorgreen;
//市值:TOSTRING(FINANCE(1)*C,3);
//主营收入:TOSTRING(FINANCE(20),3),colorred;
持仓:100*EMA((CLOSE-LLV(LOW,34))/(HHV(HIGH,34)-LLV(LOW,34)),3),linethick3,Colorff00ee;
//STICKLINE(持仓>0,0,持仓,12,1),color999999;
主力:100*WINNER(CLOSE*1.9-SHigh),LINETHICK2,Color00ffcc;
//通信达主力:100*WINNER(CLOSE*0.95),LINETHICK2,COLOR00bbbb;
//PJJ:DMA((H + L + C * 2) / 4,0.9)/HHV(C,120)*100;
成本:=DMA(AMOUNT/V,V/CAPITAL)/HHV(C,120)*100,colorgreen;
DRAWBAND(C/HHV(C,120)*100,RGB(200,200,00),成本,RGB(0,0,205));
AA:=(VOL/((HIGH-LOW)*2-ABS(CLOSE-OPEN)));
AAB:=(IF(CLOSE>OPEN,AA*(HIGH-LOW),IF(CLOSE<OPEN,AA*((HIGH-OPEN)+(CLOSE-LOW)),VOL/2)));
AAS:=(IF(CLOSE>OPEN,0-AA*((HIGH-CLOSE)+(OPEN-LOW)),IF(CLOSE<OPEN,0-AA*(HIGH-LOW),0-VOL/2)));
买力:=100*AAB/HHV(VOL,120);
卖力:=100*AAS/HHV(VOL,120);
STICKLINE(买力>0,0,买力,8,0),color0000dd;
STICKLINE(卖力<0,买力,买力-卖力,8,0),color00bb00;
QJ0:=(HIGH+LOW+CLOSE)/3;
QJ1:=IF(HIGH=LOW,1,HIGH-MAX(OPEN,CLOSE))/VOL*100;
QJ2:=IF(HIGH=LOW,1,MAX(CLOSE,OPEN)-QJ0)/VOL*100;
QJ3:=IF(HIGH=LOW,1,MIN(OPEN,CLOSE)-LOW)/VOL*100;
QJ4:=IF(HIGH=LOW,1,QJ0-MIN(CLOSE,OPEN))/VOL*100;
QJ5:=(VOL/(IF(HIGH=LOW,4,HIGH-LOW)));
特大:QJ4*QJ5,NODRAW,colorred;
大单:QJ3*QJ5,nodraw,colormagenta;
中单:QJ1*QJ5,NODRAW,colorgreen;
小单:QJ2*QJ5,NODRAW,colorblack;
//小散:=EMA(小单+中单,3),colorblack;
//大单走向:EMA(大单+特大,3),coloryellow;
//STICKLINE(特大>0,特大+大单-1,特大+大单,7,0),colorffffff;
//STICKLINE(特大>0,1,特大+大单,11,1),coloraaaaaa;
//STICKLINE(大单>0,特大,特大+大单,12,1),colormagenta;
//STICKLINE(大单>0,特大,特大+大单,11,1),colormagenta;
2. 强牛主图的用法?
相关简介:通达信强牛主图指标 源码 VAR1:=DMA(AMOUNT/V/100,V/CAPITAL); 筹码线:VAR1*1.1; 牛熊线:COST(75); 持仓线:MA(CLOSE,20), COLORGRAY; STICKLINE(C0,O,C,4,0) ,COLORBLUE; STICKLINE(C0,H,L,0.4,0) ,COLORBLUE; A:=CLOSE筹码线 AND CLOSE牛熊线 AND CLOSE持仓线; B:=CLOSE筹码线 AND CLOSE牛熊线 AND CLOSE持仓
SosoImg
通达信强牛主图指标
源码
VAR1:=DMA(AMOUNT/V/100,V/CAPITAL);
筹码线:VAR1*1.1;
牛熊线:COST(75);
持仓线:MA(CLOSE,20), COLORGRAY;
STICKLINE(C>0,O,C,4,0) ,COLORBLUE;
STICKLINE(C>0,H,L,0.4,0) ,COLORBLUE;
A:=CLOSE>筹码线 AND CLOSE>牛熊线 AND CLOSE>持仓线;
B:=CLOSE>筹码线 AND CLOSE<牛熊线 AND CLOSE>持仓线;
STICKLINE(A>0,O,C,4,0), COLORYELLOW;
STICKLINE(A>0,H,L,0.4,0), COLORYELLOW;
STICKLINE(B>0,H,L,0.4,0) ,COLORMAGENTA;
STICKLINE(B>0,O,C,4,0), COLORMAGENTA;
IF(CLOSE>牛熊线,牛熊线,DRAWNULL),COLORMAGENTA ,LINETHICK2;
IF(CLOSE>持仓线,持仓线,DRAWNULL),COLORGREEN ,LINETHICK2;
IF(CLOSE>筹码线,筹码线,DRAWNULL),COLORRED, LINETHICK2;
soso_tc_slider_img
3. 超级主力指标源码公式?
DRAWGBK(1,STRIP(RGB(30,0,60),RGB(0,40,40),2));
//平均:TOSTRING((REF(H,1)+REF(L,1)+REF(O,1)+REF(C,1))/4,2),colorgreen;
//市值:TOSTRING(FINANCE(1)*C,3);
//主营收入:TOSTRING(FINANCE(20),3),colorred;
持仓:100*EMA((CLOSE-LLV(LOW,34))/(HHV(HIGH,34)-LLV(LOW,34)),3),linethick3,Colorff00ee;
//STICKLINE(持仓>0,0,持仓,12,1),color999999;
主力:100*WINNER(CLOSE*1.9-SHigh),LINETHICK2,Color00ffcc;
//通信达主力:100*WINNER(CLOSE*0.95),LINETHICK2,COLOR00bbbb;
//PJJ:DMA((H + L + C * 2) / 4,0.9)/HHV(C,120)*100;
成本:=DMA(AMOUNT/V,V/CAPITAL)/HHV(C,120)*100,colorgreen;
DRAWBAND(C/HHV(C,120)*100,RGB(200,200,00),成本,RGB(0,0,205));
AA:=(VOL/((HIGH-LOW)*2-ABS(CLOSE-OPEN)));
AAB:=(IF(CLOSE>OPEN,AA*(HIGH-LOW),IF(CLOSE<OPEN,AA*((HIGH-OPEN)+(CLOSE-LOW)),VOL/2)));
AAS:=(IF(CLOSE>OPEN,0-AA*((HIGH-CLOSE)+(OPEN-LOW)),IF(CLOSE<OPEN,0-AA*(HIGH-LOW),0-VOL/2)));
买力:=100*AAB/HHV(VOL,120);
卖力:=100*AAS/HHV(VOL,120);
STICKLINE(买力>0,0,买力,8,0),color0000dd;
STICKLINE(卖力<0,买力,买力-卖力,8,0),color00bb00;
QJ0:=(HIGH+LOW+CLOSE)/3;
QJ1:=IF(HIGH=LOW,1,HIGH-MAX(OPEN,CLOSE))/VOL*100;
QJ2:=IF(HIGH=LOW,1,MAX(CLOSE,OPEN)-QJ0)/VOL*100;
QJ3:=IF(HIGH=LOW,1,MIN(OPEN,CLOSE)-LOW)/VOL*100;
QJ4:=IF(HIGH=LOW,1,QJ0-MIN(CLOSE,OPEN))/VOL*100;
QJ5:=(VOL/(IF(HIGH=LOW,4,HIGH-LOW)));
特大:QJ4*QJ5,NODRAW,colorred;
大单:QJ3*QJ5,nodraw,colormagenta;
中单:QJ1*QJ5,NODRAW,colorgreen;
小单:QJ2*QJ5,NODRAW,colorblack;
//小散:=EMA(小单+中单,3),colorblack;
//大单走向:EMA(大单+特大,3),coloryellow;
//STICKLINE(特大>0,特大+大单-1,特大+大单,7,0),colorffffff;
//STICKLINE(特大>0,1,特大+大单,11,1),coloraaaaaa;
//STICKLINE(大单>0,特大,特大+大单,12,1),colormagenta;
//STICKLINE(大单>0,特大,特大+大单,11,1),colormagenta;
4. cyc指标公式源码?
Cyc指标(Cycle Indicator)是一种用于研究股票、期货、外汇等市场的技术指标。它的计算方法比较复杂,涉及到多个参数和数学公式。以下是Cyc指标的计算公式源码,供参考:
```
// 计算Cyc指标
double[] Cyc(double[] close, int n, double w) {
// 初始化变量
double[] cycle = new double[close.Length];
double[] trend = new double[close.Length];
double[] deviation = new double[close.Length];
double[] period = new double[close.Length];
double[] smooth = new double[close.Length];
double[] dc = new double[close.Length];
double[] cyc = new double[close.Length];
double[] sum1 = new double[close.Length];
double[] sum2 = new double[close.Length];
double[] sum3 = new double[close.Length];
double[] sum4 = new double[close.Length];
double[] sum5 = new double[close.Length];
double[] sum6 = new double[close.Length];
double[] sum7 = new double[close.Length];
double[] sum8 = new double[close.Length];
double[] sum9 = new double[close.Length];
// 计算周期
for (int i = n + 1; i < close.Length; i++) {
// 计算价格波动率
double sum = 0;
for (int j = i - n; j <= i; j++) {
sum += Math.Abs(close[j] - close[j - 1]);
}
deviation[i] = sum / n;
// 计算周期
if (deviation[i] != 0) {
period[i] = 0.5 / (deviation[i] / close[i - 1]);
} else {
period[i] = period[i - 1];
}
}
// 计算趋势
for (int i = n + 1; i < close.Length; i++) {
if (i == n + 1) {
trend[i] = 0.5 * (close[i] - close[i - n]);
} else {
trend[i] = (1 - w) * trend[i - 1] + w * 0.5 * (close[i] - close[i - n]);
}
}
// 计算平滑系数
for (int i = n + 1; i < close.Length; i++) {
smooth[i] = 0.15 * period[i] + 0.85 * smooth[i - 1];
}
// 计算DC
for (int i = n + 1; i < close.Length; i++) {
dc[i] = 0.5 * (1 + Math.Cos(2 * Math.PI / smooth[i]));
}
// 计算Cyc
for (int i = n + 1; i < close.Length; i++) {
sum1[i] = 0.0962 * close[i] + 0.5769 * close[i - 2] - 0.5769 * close[i - 4] - 0.0962 * close[i - 6];
sum2[i] = 0.075 * sum1[i] + 0.54 * sum1[i - 1] + 0.54 * sum1[i - 2] + 0.075 * sum1[i - 3];
sum3[i] = sum2[i] - dc[i] * sum2[i];
sum4[i] = 0.0962 * sum3[i] + 0.5769 * sum3[i - 2] - 0.5769 * sum3[i - 4] - 0.0962 * sum3[i - 6];
sum5[i] = 0.075 * sum4[i] + 0.54 * sum4[i - 1] + 0.54 * sum4[i - 2] + 0.075 * sum4[i - 3];
sum6[i] = sum5[i] - dc[i] * sum5[i];
sum7[i] = 0.0962 * sum6[i] + 0.5769 * sum6[i - 2] - 0.5769 * sum6[i - 4] - 0.0962 * sum6[i - 6];
sum8[i] = 0.075 * sum7[i] + 0.54 * sum7[i - 1] + 0.54 * sum7[i - 2] + 0.075 * sum7[i - 3];
sum9[i] = sum8[i] - dc[i] * sum8[i];
cyc[i] = 0.2 * sum9[i] + 0.8 * cyc[i - 1];
}
return cyc;
}
```
其中,参数`close`表示收盘价序列,`n`表示周期长度,`w`表示趋势平滑系数。该源码中包含了Cyc指标的完整计算过程,可以直接调用该方法进行计算。
5. 超级主力指标源码公式?
DRAWGBK(1,STRIP(RGB(30,0,60),RGB(0,40,40),2));
//平均:TOSTRING((REF(H,1)+REF(L,1)+REF(O,1)+REF(C,1))/4,2),colorgreen;
//市值:TOSTRING(FINANCE(1)*C,3);
//主营收入:TOSTRING(FINANCE(20),3),colorred;
持仓:100*EMA((CLOSE-LLV(LOW,34))/(HHV(HIGH,34)-LLV(LOW,34)),3),linethick3,Colorff00ee;
//STICKLINE(持仓>0,0,持仓,12,1),color999999;
主力:100*WINNER(CLOSE*1.9-SHigh),LINETHICK2,Color00ffcc;
//通信达主力:100*WINNER(CLOSE*0.95),LINETHICK2,COLOR00bbbb;
//PJJ:DMA((H + L + C * 2) / 4,0.9)/HHV(C,120)*100;
成本:=DMA(AMOUNT/V,V/CAPITAL)/HHV(C,120)*100,colorgreen;
DRAWBAND(C/HHV(C,120)*100,RGB(200,200,00),成本,RGB(0,0,205));
AA:=(VOL/((HIGH-LOW)*2-ABS(CLOSE-OPEN)));
AAB:=(IF(CLOSE>OPEN,AA*(HIGH-LOW),IF(CLOSE<OPEN,AA*((HIGH-OPEN)+(CLOSE-LOW)),VOL/2)));
AAS:=(IF(CLOSE>OPEN,0-AA*((HIGH-CLOSE)+(OPEN-LOW)),IF(CLOSE<OPEN,0-AA*(HIGH-LOW),0-VOL/2)));
买力:=100*AAB/HHV(VOL,120);
卖力:=100*AAS/HHV(VOL,120);
STICKLINE(买力>0,0,买力,8,0),color0000dd;
STICKLINE(卖力<0,买力,买力-卖力,8,0),color00bb00;
QJ0:=(HIGH+LOW+CLOSE)/3;
QJ1:=IF(HIGH=LOW,1,HIGH-MAX(OPEN,CLOSE))/VOL*100;
QJ2:=IF(HIGH=LOW,1,MAX(CLOSE,OPEN)-QJ0)/VOL*100;
QJ3:=IF(HIGH=LOW,1,MIN(OPEN,CLOSE)-LOW)/VOL*100;
QJ4:=IF(HIGH=LOW,1,QJ0-MIN(CLOSE,OPEN))/VOL*100;
QJ5:=(VOL/(IF(HIGH=LOW,4,HIGH-LOW)));
特大:QJ4*QJ5,NODRAW,colorred;
大单:QJ3*QJ5,nodraw,colormagenta;
中单:QJ1*QJ5,NODRAW,colorgreen;
小单:QJ2*QJ5,NODRAW,colorblack;
//小散:=EMA(小单+中单,3),colorblack;
//大单走向:EMA(大单+特大,3),coloryellow;
//STICKLINE(特大>0,特大+大单-1,特大+大单,7,0),colorffffff;
//STICKLINE(特大>0,1,特大+大单,11,1),coloraaaaaa;
//STICKLINE(大单>0,特大,特大+大单,12,1),colormagenta;
//STICKLINE(大单>0,特大,特大+大单,11,1),colormagenta;
6. 强牛主图的用法?
相关简介:通达信强牛主图指标 源码 VAR1:=DMA(AMOUNT/V/100,V/CAPITAL); 筹码线:VAR1*1.1; 牛熊线:COST(75); 持仓线:MA(CLOSE,20), COLORGRAY; STICKLINE(C0,O,C,4,0) ,COLORBLUE; STICKLINE(C0,H,L,0.4,0) ,COLORBLUE; A:=CLOSE筹码线 AND CLOSE牛熊线 AND CLOSE持仓线; B:=CLOSE筹码线 AND CLOSE牛熊线 AND CLOSE持仓
SosoImg
通达信强牛主图指标
源码
VAR1:=DMA(AMOUNT/V/100,V/CAPITAL);
筹码线:VAR1*1.1;
牛熊线:COST(75);
持仓线:MA(CLOSE,20), COLORGRAY;
STICKLINE(C>0,O,C,4,0) ,COLORBLUE;
STICKLINE(C>0,H,L,0.4,0) ,COLORBLUE;
A:=CLOSE>筹码线 AND CLOSE>牛熊线 AND CLOSE>持仓线;
B:=CLOSE>筹码线 AND CLOSE<牛熊线 AND CLOSE>持仓线;
STICKLINE(A>0,O,C,4,0), COLORYELLOW;
STICKLINE(A>0,H,L,0.4,0), COLORYELLOW;
STICKLINE(B>0,H,L,0.4,0) ,COLORMAGENTA;
STICKLINE(B>0,O,C,4,0), COLORMAGENTA;
IF(CLOSE>牛熊线,牛熊线,DRAWNULL),COLORMAGENTA ,LINETHICK2;
IF(CLOSE>持仓线,持仓线,DRAWNULL),COLORGREEN ,LINETHICK2;
IF(CLOSE>筹码线,筹码线,DRAWNULL),COLORRED, LINETHICK2;
soso_tc_slider_img
7. dma windows驱动源码吗?
在《深入理解Linux内核》中的第545页介绍了DMA的相关操作。说道DMA,那就不得不提到Cache(高速缓存)的问题。书中引用了如下一段例子来描述了Cache一致性问题:
逗假设设备驱动程序把一些数据填充到内存缓冲区中,然后立刻命令硬件设备利用DMA传送方式读取该数据。如果DMA访问这些物理RAM内存单元,而相应的硬件高速缓存行的内容还没有写入RAM中,那么硬件设备所读取的至就是内存缓冲区中的旧值。地
现在有两种方法来处理DMA缓冲区:
一致性DMA映射:
书上讲的比较抽象,通俗地所就是任何对DMA缓冲区的改写都会直接更新到内存中,也称之为逗同步的地或者逗一致的地。
流式DMA映射:
根据个人的理解,这里的流即输入输出流,我们需要事先指定DMA缓冲区的方向,比如是地读缓冲区地还是逗写缓冲区地。也称之为逗异步的地或逗非一致性的地,详细的内容请看下文。
由于x86体系结构中,硬件设备驱动程序本身会逗窥探地所访问的硬件告诉缓存,因此x86体系结构中不存在DMA一致性问题。而对于其他一些架构如MIPS,SPARC以及POWERPC(包括ARM在内)需要在软件上保证其DMA一致性。
对于以上两者如何选择,书中有一个合适的建议,如果CPU和DMA处理器以不可预知的方式去访问一个缓冲区,那么必须强制使用一致性DMA映射方式(这里我对不可预知的理解是,不能确定在何时它们访问缓冲区),其他情形下,流式DMA映射方式更可取,因为在一些体系结构中处理一致性DMA映射是很麻烦的,并且可能导致更低的系统性能。
这里详细介绍流式DMA:
需要访问的缓冲区需要在数据传送之前被映射(这里的映射也就是需要调用一些函数告知内核,该缓冲区进行流式映射),在传送之后被取消映射。
启动一次流式DMA数据传输分为如下步骤:
1. 分配DMA缓冲区。
在DMA设备不采用S/G(分散/聚集)模式的情况下,必须保证缓冲区是物理上连续的,linux内核有两个函数用来分配连续的内存:kmalloc()和__get_free_pages()。这两个函数都有分配连续内存的最大值,kmalloc以分配字节为单位,最大约为64KB,__get_free_pages()以分配页为单位,最大能分配2^order数目的页,order参数的最大值由include/linux/Mmzone.h文件中的MAX_ORDER宏决定(在默认的2.6.18内核版本中,该宏定义为10。也就是说在理论上__get_free_pages函数一次最多能申请1
2. 建立流式映射。
在对DMA冲区进行读写访问之后,且在启动DMA设备传输之前,启用dma_map_single()函数建立流式DMA映射,这两个函数接受缓冲区的线性地址作为其参数并返回相应的总线地址。
3. 释放流式映射。
当DMA传输结束之后我们需要释放该映射,这时调用dma_unmap_single()函数。
注意:
(1). 为了避免高速缓存一致性问题,驱动程序在开始从RAM到设备的DMA数据传输之前,如果有必要,应该调用dma_sync_single_for_device()函数刷新与DMA缓冲区对应的高速缓存行。
(2). 从设备到RAM的一次DMA数据传送完成之前设备驱动程序是不可以访问内存缓冲区的,但如果有必要的话,驱动程序在读缓冲区之前,应该调用dma_sync_single_for_cpu()函数使相应的硬件高速缓存行无效。
(3). 虽然kmalloc底层也是用__get_free_pages实现的,不过kmalloc对应的释放缓冲区函数为kfree,而__get_free_pages对应的释放缓冲区函数为free_pages。具体与__get_free_pages有关系的几个申请与释放函数如下:
申请函数:
alloc_pages(gfp_mask,order)返回第一个所分配页框描述符的地址,或者如果分配失败则返回NULL。__get_free_pages(gfp_mask,order)类似于alloc_pages(),但它返回第一个所分配页的线性地址。如果需要获得线性地址对应的页框号,那么需要调用virt_to_page(addr)宏产生线性地址。释放函数:__free_pages(page,order)这里主要强调page是要释放缓冲区的线性首地址所在的页框号free_pages(page,order)这个函数类似于__free_pages(page,order),但是它接收的参数为要释放的第一个页框的线性地址addr
8. cyc指标公式源码?
Cyc指标(Cycle Indicator)是一种用于研究股票、期货、外汇等市场的技术指标。它的计算方法比较复杂,涉及到多个参数和数学公式。以下是Cyc指标的计算公式源码,供参考:
```
// 计算Cyc指标
double[] Cyc(double[] close, int n, double w) {
// 初始化变量
double[] cycle = new double[close.Length];
double[] trend = new double[close.Length];
double[] deviation = new double[close.Length];
double[] period = new double[close.Length];
double[] smooth = new double[close.Length];
double[] dc = new double[close.Length];
double[] cyc = new double[close.Length];
double[] sum1 = new double[close.Length];
double[] sum2 = new double[close.Length];
double[] sum3 = new double[close.Length];
double[] sum4 = new double[close.Length];
double[] sum5 = new double[close.Length];
double[] sum6 = new double[close.Length];
double[] sum7 = new double[close.Length];
double[] sum8 = new double[close.Length];
double[] sum9 = new double[close.Length];
// 计算周期
for (int i = n + 1; i < close.Length; i++) {
// 计算价格波动率
double sum = 0;
for (int j = i - n; j <= i; j++) {
sum += Math.Abs(close[j] - close[j - 1]);
}
deviation[i] = sum / n;
// 计算周期
if (deviation[i] != 0) {
period[i] = 0.5 / (deviation[i] / close[i - 1]);
} else {
period[i] = period[i - 1];
}
}
// 计算趋势
for (int i = n + 1; i < close.Length; i++) {
if (i == n + 1) {
trend[i] = 0.5 * (close[i] - close[i - n]);
} else {
trend[i] = (1 - w) * trend[i - 1] + w * 0.5 * (close[i] - close[i - n]);
}
}
// 计算平滑系数
for (int i = n + 1; i < close.Length; i++) {
smooth[i] = 0.15 * period[i] + 0.85 * smooth[i - 1];
}
// 计算DC
for (int i = n + 1; i < close.Length; i++) {
dc[i] = 0.5 * (1 + Math.Cos(2 * Math.PI / smooth[i]));
}
// 计算Cyc
for (int i = n + 1; i < close.Length; i++) {
sum1[i] = 0.0962 * close[i] + 0.5769 * close[i - 2] - 0.5769 * close[i - 4] - 0.0962 * close[i - 6];
sum2[i] = 0.075 * sum1[i] + 0.54 * sum1[i - 1] + 0.54 * sum1[i - 2] + 0.075 * sum1[i - 3];
sum3[i] = sum2[i] - dc[i] * sum2[i];
sum4[i] = 0.0962 * sum3[i] + 0.5769 * sum3[i - 2] - 0.5769 * sum3[i - 4] - 0.0962 * sum3[i - 6];
sum5[i] = 0.075 * sum4[i] + 0.54 * sum4[i - 1] + 0.54 * sum4[i - 2] + 0.075 * sum4[i - 3];
sum6[i] = sum5[i] - dc[i] * sum5[i];
sum7[i] = 0.0962 * sum6[i] + 0.5769 * sum6[i - 2] - 0.5769 * sum6[i - 4] - 0.0962 * sum6[i - 6];
sum8[i] = 0.075 * sum7[i] + 0.54 * sum7[i - 1] + 0.54 * sum7[i - 2] + 0.075 * sum7[i - 3];
sum9[i] = sum8[i] - dc[i] * sum8[i];
cyc[i] = 0.2 * sum9[i] + 0.8 * cyc[i - 1];
}
return cyc;
}
```
其中,参数`close`表示收盘价序列,`n`表示周期长度,`w`表示趋势平滑系数。该源码中包含了Cyc指标的完整计算过程,可以直接调用该方法进行计算。
9. cyc指标公式源码?
Cyc指标(Cycle Indicator)是一种用于研究股票、期货、外汇等市场的技术指标。它的计算方法比较复杂,涉及到多个参数和数学公式。以下是Cyc指标的计算公式源码,供参考:
```
// 计算Cyc指标
double[] Cyc(double[] close, int n, double w) {
// 初始化变量
double[] cycle = new double[close.Length];
double[] trend = new double[close.Length];
double[] deviation = new double[close.Length];
double[] period = new double[close.Length];
double[] smooth = new double[close.Length];
double[] dc = new double[close.Length];
double[] cyc = new double[close.Length];
double[] sum1 = new double[close.Length];
double[] sum2 = new double[close.Length];
double[] sum3 = new double[close.Length];
double[] sum4 = new double[close.Length];
double[] sum5 = new double[close.Length];
double[] sum6 = new double[close.Length];
double[] sum7 = new double[close.Length];
double[] sum8 = new double[close.Length];
double[] sum9 = new double[close.Length];
// 计算周期
for (int i = n + 1; i < close.Length; i++) {
// 计算价格波动率
double sum = 0;
for (int j = i - n; j <= i; j++) {
sum += Math.Abs(close[j] - close[j - 1]);
}
deviation[i] = sum / n;
// 计算周期
if (deviation[i] != 0) {
period[i] = 0.5 / (deviation[i] / close[i - 1]);
} else {
period[i] = period[i - 1];
}
}
// 计算趋势
for (int i = n + 1; i < close.Length; i++) {
if (i == n + 1) {
trend[i] = 0.5 * (close[i] - close[i - n]);
} else {
trend[i] = (1 - w) * trend[i - 1] + w * 0.5 * (close[i] - close[i - n]);
}
}
// 计算平滑系数
for (int i = n + 1; i < close.Length; i++) {
smooth[i] = 0.15 * period[i] + 0.85 * smooth[i - 1];
}
// 计算DC
for (int i = n + 1; i < close.Length; i++) {
dc[i] = 0.5 * (1 + Math.Cos(2 * Math.PI / smooth[i]));
}
// 计算Cyc
for (int i = n + 1; i < close.Length; i++) {
sum1[i] = 0.0962 * close[i] + 0.5769 * close[i - 2] - 0.5769 * close[i - 4] - 0.0962 * close[i - 6];
sum2[i] = 0.075 * sum1[i] + 0.54 * sum1[i - 1] + 0.54 * sum1[i - 2] + 0.075 * sum1[i - 3];
sum3[i] = sum2[i] - dc[i] * sum2[i];
sum4[i] = 0.0962 * sum3[i] + 0.5769 * sum3[i - 2] - 0.5769 * sum3[i - 4] - 0.0962 * sum3[i - 6];
sum5[i] = 0.075 * sum4[i] + 0.54 * sum4[i - 1] + 0.54 * sum4[i - 2] + 0.075 * sum4[i - 3];
sum6[i] = sum5[i] - dc[i] * sum5[i];
sum7[i] = 0.0962 * sum6[i] + 0.5769 * sum6[i - 2] - 0.5769 * sum6[i - 4] - 0.0962 * sum6[i - 6];
sum8[i] = 0.075 * sum7[i] + 0.54 * sum7[i - 1] + 0.54 * sum7[i - 2] + 0.075 * sum7[i - 3];
sum9[i] = sum8[i] - dc[i] * sum8[i];
cyc[i] = 0.2 * sum9[i] + 0.8 * cyc[i - 1];
}
return cyc;
}
```
其中,参数`close`表示收盘价序列,`n`表示周期长度,`w`表示趋势平滑系数。该源码中包含了Cyc指标的完整计算过程,可以直接调用该方法进行计算。
10. 强牛主图的用法?
相关简介:通达信强牛主图指标 源码 VAR1:=DMA(AMOUNT/V/100,V/CAPITAL); 筹码线:VAR1*1.1; 牛熊线:COST(75); 持仓线:MA(CLOSE,20), COLORGRAY; STICKLINE(C0,O,C,4,0) ,COLORBLUE; STICKLINE(C0,H,L,0.4,0) ,COLORBLUE; A:=CLOSE筹码线 AND CLOSE牛熊线 AND CLOSE持仓线; B:=CLOSE筹码线 AND CLOSE牛熊线 AND CLOSE持仓
SosoImg
通达信强牛主图指标
源码
VAR1:=DMA(AMOUNT/V/100,V/CAPITAL);
筹码线:VAR1*1.1;
牛熊线:COST(75);
持仓线:MA(CLOSE,20), COLORGRAY;
STICKLINE(C>0,O,C,4,0) ,COLORBLUE;
STICKLINE(C>0,H,L,0.4,0) ,COLORBLUE;
A:=CLOSE>筹码线 AND CLOSE>牛熊线 AND CLOSE>持仓线;
B:=CLOSE>筹码线 AND CLOSE<牛熊线 AND CLOSE>持仓线;
STICKLINE(A>0,O,C,4,0), COLORYELLOW;
STICKLINE(A>0,H,L,0.4,0), COLORYELLOW;
STICKLINE(B>0,H,L,0.4,0) ,COLORMAGENTA;
STICKLINE(B>0,O,C,4,0), COLORMAGENTA;
IF(CLOSE>牛熊线,牛熊线,DRAWNULL),COLORMAGENTA ,LINETHICK2;
IF(CLOSE>持仓线,持仓线,DRAWNULL),COLORGREEN ,LINETHICK2;
IF(CLOSE>筹码线,筹码线,DRAWNULL),COLORRED, LINETHICK2;
soso_tc_slider_img
11. cyc指标公式源码?
Cyc指标(Cycle Indicator)是一种用于研究股票、期货、外汇等市场的技术指标。它的计算方法比较复杂,涉及到多个参数和数学公式。以下是Cyc指标的计算公式源码,供参考:
```
// 计算Cyc指标
double[] Cyc(double[] close, int n, double w) {
// 初始化变量
double[] cycle = new double[close.Length];
double[] trend = new double[close.Length];
double[] deviation = new double[close.Length];
double[] period = new double[close.Length];
double[] smooth = new double[close.Length];
double[] dc = new double[close.Length];
double[] cyc = new double[close.Length];
double[] sum1 = new double[close.Length];
double[] sum2 = new double[close.Length];
double[] sum3 = new double[close.Length];
double[] sum4 = new double[close.Length];
double[] sum5 = new double[close.Length];
double[] sum6 = new double[close.Length];
double[] sum7 = new double[close.Length];
double[] sum8 = new double[close.Length];
double[] sum9 = new double[close.Length];
// 计算周期
for (int i = n + 1; i < close.Length; i++) {
// 计算价格波动率
double sum = 0;
for (int j = i - n; j <= i; j++) {
sum += Math.Abs(close[j] - close[j - 1]);
}
deviation[i] = sum / n;
// 计算周期
if (deviation[i] != 0) {
period[i] = 0.5 / (deviation[i] / close[i - 1]);
} else {
period[i] = period[i - 1];
}
}
// 计算趋势
for (int i = n + 1; i < close.Length; i++) {
if (i == n + 1) {
trend[i] = 0.5 * (close[i] - close[i - n]);
} else {
trend[i] = (1 - w) * trend[i - 1] + w * 0.5 * (close[i] - close[i - n]);
}
}
// 计算平滑系数
for (int i = n + 1; i < close.Length; i++) {
smooth[i] = 0.15 * period[i] + 0.85 * smooth[i - 1];
}
// 计算DC
for (int i = n + 1; i < close.Length; i++) {
dc[i] = 0.5 * (1 + Math.Cos(2 * Math.PI / smooth[i]));
}
// 计算Cyc
for (int i = n + 1; i < close.Length; i++) {
sum1[i] = 0.0962 * close[i] + 0.5769 * close[i - 2] - 0.5769 * close[i - 4] - 0.0962 * close[i - 6];
sum2[i] = 0.075 * sum1[i] + 0.54 * sum1[i - 1] + 0.54 * sum1[i - 2] + 0.075 * sum1[i - 3];
sum3[i] = sum2[i] - dc[i] * sum2[i];
sum4[i] = 0.0962 * sum3[i] + 0.5769 * sum3[i - 2] - 0.5769 * sum3[i - 4] - 0.0962 * sum3[i - 6];
sum5[i] = 0.075 * sum4[i] + 0.54 * sum4[i - 1] + 0.54 * sum4[i - 2] + 0.075 * sum4[i - 3];
sum6[i] = sum5[i] - dc[i] * sum5[i];
sum7[i] = 0.0962 * sum6[i] + 0.5769 * sum6[i - 2] - 0.5769 * sum6[i - 4] - 0.0962 * sum6[i - 6];
sum8[i] = 0.075 * sum7[i] + 0.54 * sum7[i - 1] + 0.54 * sum7[i - 2] + 0.075 * sum7[i - 3];
sum9[i] = sum8[i] - dc[i] * sum8[i];
cyc[i] = 0.2 * sum9[i] + 0.8 * cyc[i - 1];
}
return cyc;
}
```
其中,参数`close`表示收盘价序列,`n`表示周期长度,`w`表示趋势平滑系数。该源码中包含了Cyc指标的完整计算过程,可以直接调用该方法进行计算。
12. 强牛主图的用法?
相关简介:通达信强牛主图指标 源码 VAR1:=DMA(AMOUNT/V/100,V/CAPITAL); 筹码线:VAR1*1.1; 牛熊线:COST(75); 持仓线:MA(CLOSE,20), COLORGRAY; STICKLINE(C0,O,C,4,0) ,COLORBLUE; STICKLINE(C0,H,L,0.4,0) ,COLORBLUE; A:=CLOSE筹码线 AND CLOSE牛熊线 AND CLOSE持仓线; B:=CLOSE筹码线 AND CLOSE牛熊线 AND CLOSE持仓
SosoImg
通达信强牛主图指标
源码
VAR1:=DMA(AMOUNT/V/100,V/CAPITAL);
筹码线:VAR1*1.1;
牛熊线:COST(75);
持仓线:MA(CLOSE,20), COLORGRAY;
STICKLINE(C>0,O,C,4,0) ,COLORBLUE;
STICKLINE(C>0,H,L,0.4,0) ,COLORBLUE;
A:=CLOSE>筹码线 AND CLOSE>牛熊线 AND CLOSE>持仓线;
B:=CLOSE>筹码线 AND CLOSE<牛熊线 AND CLOSE>持仓线;
STICKLINE(A>0,O,C,4,0), COLORYELLOW;
STICKLINE(A>0,H,L,0.4,0), COLORYELLOW;
STICKLINE(B>0,H,L,0.4,0) ,COLORMAGENTA;
STICKLINE(B>0,O,C,4,0), COLORMAGENTA;
IF(CLOSE>牛熊线,牛熊线,DRAWNULL),COLORMAGENTA ,LINETHICK2;
IF(CLOSE>持仓线,持仓线,DRAWNULL),COLORGREEN ,LINETHICK2;
IF(CLOSE>筹码线,筹码线,DRAWNULL),COLORRED, LINETHICK2;
soso_tc_slider_img
13. dma windows驱动源码吗?
在《深入理解Linux内核》中的第545页介绍了DMA的相关操作。说道DMA,那就不得不提到Cache(高速缓存)的问题。书中引用了如下一段例子来描述了Cache一致性问题:
逗假设设备驱动程序把一些数据填充到内存缓冲区中,然后立刻命令硬件设备利用DMA传送方式读取该数据。如果DMA访问这些物理RAM内存单元,而相应的硬件高速缓存行的内容还没有写入RAM中,那么硬件设备所读取的至就是内存缓冲区中的旧值。地
现在有两种方法来处理DMA缓冲区:
一致性DMA映射:
书上讲的比较抽象,通俗地所就是任何对DMA缓冲区的改写都会直接更新到内存中,也称之为逗同步的地或者逗一致的地。
流式DMA映射:
根据个人的理解,这里的流即输入输出流,我们需要事先指定DMA缓冲区的方向,比如是地读缓冲区地还是逗写缓冲区地。也称之为逗异步的地或逗非一致性的地,详细的内容请看下文。
由于x86体系结构中,硬件设备驱动程序本身会逗窥探地所访问的硬件告诉缓存,因此x86体系结构中不存在DMA一致性问题。而对于其他一些架构如MIPS,SPARC以及POWERPC(包括ARM在内)需要在软件上保证其DMA一致性。
对于以上两者如何选择,书中有一个合适的建议,如果CPU和DMA处理器以不可预知的方式去访问一个缓冲区,那么必须强制使用一致性DMA映射方式(这里我对不可预知的理解是,不能确定在何时它们访问缓冲区),其他情形下,流式DMA映射方式更可取,因为在一些体系结构中处理一致性DMA映射是很麻烦的,并且可能导致更低的系统性能。
这里详细介绍流式DMA:
需要访问的缓冲区需要在数据传送之前被映射(这里的映射也就是需要调用一些函数告知内核,该缓冲区进行流式映射),在传送之后被取消映射。
启动一次流式DMA数据传输分为如下步骤:
1. 分配DMA缓冲区。
在DMA设备不采用S/G(分散/聚集)模式的情况下,必须保证缓冲区是物理上连续的,linux内核有两个函数用来分配连续的内存:kmalloc()和__get_free_pages()。这两个函数都有分配连续内存的最大值,kmalloc以分配字节为单位,最大约为64KB,__get_free_pages()以分配页为单位,最大能分配2^order数目的页,order参数的最大值由include/linux/Mmzone.h文件中的MAX_ORDER宏决定(在默认的2.6.18内核版本中,该宏定义为10。也就是说在理论上__get_free_pages函数一次最多能申请1
2. 建立流式映射。
在对DMA冲区进行读写访问之后,且在启动DMA设备传输之前,启用dma_map_single()函数建立流式DMA映射,这两个函数接受缓冲区的线性地址作为其参数并返回相应的总线地址。
3. 释放流式映射。
当DMA传输结束之后我们需要释放该映射,这时调用dma_unmap_single()函数。
注意:
(1). 为了避免高速缓存一致性问题,驱动程序在开始从RAM到设备的DMA数据传输之前,如果有必要,应该调用dma_sync_single_for_device()函数刷新与DMA缓冲区对应的高速缓存行。
(2). 从设备到RAM的一次DMA数据传送完成之前设备驱动程序是不可以访问内存缓冲区的,但如果有必要的话,驱动程序在读缓冲区之前,应该调用dma_sync_single_for_cpu()函数使相应的硬件高速缓存行无效。
(3). 虽然kmalloc底层也是用__get_free_pages实现的,不过kmalloc对应的释放缓冲区函数为kfree,而__get_free_pages对应的释放缓冲区函数为free_pages。具体与__get_free_pages有关系的几个申请与释放函数如下:
申请函数:
alloc_pages(gfp_mask,order)返回第一个所分配页框描述符的地址,或者如果分配失败则返回NULL。__get_free_pages(gfp_mask,order)类似于alloc_pages(),但它返回第一个所分配页的线性地址。如果需要获得线性地址对应的页框号,那么需要调用virt_to_page(addr)宏产生线性地址。释放函数:__free_pages(page,order)这里主要强调page是要释放缓冲区的线性首地址所在的页框号free_pages(page,order)这个函数类似于__free_pages(page,order),但是它接收的参数为要释放的第一个页框的线性地址addr
14. dma windows驱动源码吗?
在《深入理解Linux内核》中的第545页介绍了DMA的相关操作。说道DMA,那就不得不提到Cache(高速缓存)的问题。书中引用了如下一段例子来描述了Cache一致性问题:
逗假设设备驱动程序把一些数据填充到内存缓冲区中,然后立刻命令硬件设备利用DMA传送方式读取该数据。如果DMA访问这些物理RAM内存单元,而相应的硬件高速缓存行的内容还没有写入RAM中,那么硬件设备所读取的至就是内存缓冲区中的旧值。地
现在有两种方法来处理DMA缓冲区:
一致性DMA映射:
书上讲的比较抽象,通俗地所就是任何对DMA缓冲区的改写都会直接更新到内存中,也称之为逗同步的地或者逗一致的地。
流式DMA映射:
根据个人的理解,这里的流即输入输出流,我们需要事先指定DMA缓冲区的方向,比如是地读缓冲区地还是逗写缓冲区地。也称之为逗异步的地或逗非一致性的地,详细的内容请看下文。
由于x86体系结构中,硬件设备驱动程序本身会逗窥探地所访问的硬件告诉缓存,因此x86体系结构中不存在DMA一致性问题。而对于其他一些架构如MIPS,SPARC以及POWERPC(包括ARM在内)需要在软件上保证其DMA一致性。
对于以上两者如何选择,书中有一个合适的建议,如果CPU和DMA处理器以不可预知的方式去访问一个缓冲区,那么必须强制使用一致性DMA映射方式(这里我对不可预知的理解是,不能确定在何时它们访问缓冲区),其他情形下,流式DMA映射方式更可取,因为在一些体系结构中处理一致性DMA映射是很麻烦的,并且可能导致更低的系统性能。
这里详细介绍流式DMA:
需要访问的缓冲区需要在数据传送之前被映射(这里的映射也就是需要调用一些函数告知内核,该缓冲区进行流式映射),在传送之后被取消映射。
启动一次流式DMA数据传输分为如下步骤:
1. 分配DMA缓冲区。
在DMA设备不采用S/G(分散/聚集)模式的情况下,必须保证缓冲区是物理上连续的,linux内核有两个函数用来分配连续的内存:kmalloc()和__get_free_pages()。这两个函数都有分配连续内存的最大值,kmalloc以分配字节为单位,最大约为64KB,__get_free_pages()以分配页为单位,最大能分配2^order数目的页,order参数的最大值由include/linux/Mmzone.h文件中的MAX_ORDER宏决定(在默认的2.6.18内核版本中,该宏定义为10。也就是说在理论上__get_free_pages函数一次最多能申请1
2. 建立流式映射。
在对DMA冲区进行读写访问之后,且在启动DMA设备传输之前,启用dma_map_single()函数建立流式DMA映射,这两个函数接受缓冲区的线性地址作为其参数并返回相应的总线地址。
3. 释放流式映射。
当DMA传输结束之后我们需要释放该映射,这时调用dma_unmap_single()函数。
注意:
(1). 为了避免高速缓存一致性问题,驱动程序在开始从RAM到设备的DMA数据传输之前,如果有必要,应该调用dma_sync_single_for_device()函数刷新与DMA缓冲区对应的高速缓存行。
(2). 从设备到RAM的一次DMA数据传送完成之前设备驱动程序是不可以访问内存缓冲区的,但如果有必要的话,驱动程序在读缓冲区之前,应该调用dma_sync_single_for_cpu()函数使相应的硬件高速缓存行无效。
(3). 虽然kmalloc底层也是用__get_free_pages实现的,不过kmalloc对应的释放缓冲区函数为kfree,而__get_free_pages对应的释放缓冲区函数为free_pages。具体与__get_free_pages有关系的几个申请与释放函数如下:
申请函数:
alloc_pages(gfp_mask,order)返回第一个所分配页框描述符的地址,或者如果分配失败则返回NULL。__get_free_pages(gfp_mask,order)类似于alloc_pages(),但它返回第一个所分配页的线性地址。如果需要获得线性地址对应的页框号,那么需要调用virt_to_page(addr)宏产生线性地址。释放函数:__free_pages(page,order)这里主要强调page是要释放缓冲区的线性首地址所在的页框号free_pages(page,order)这个函数类似于__free_pages(page,order),但是它接收的参数为要释放的第一个页框的线性地址addr
15. 超级主力指标源码公式?
DRAWGBK(1,STRIP(RGB(30,0,60),RGB(0,40,40),2));
//平均:TOSTRING((REF(H,1)+REF(L,1)+REF(O,1)+REF(C,1))/4,2),colorgreen;
//市值:TOSTRING(FINANCE(1)*C,3);
//主营收入:TOSTRING(FINANCE(20),3),colorred;
持仓:100*EMA((CLOSE-LLV(LOW,34))/(HHV(HIGH,34)-LLV(LOW,34)),3),linethick3,Colorff00ee;
//STICKLINE(持仓>0,0,持仓,12,1),color999999;
主力:100*WINNER(CLOSE*1.9-SHigh),LINETHICK2,Color00ffcc;
//通信达主力:100*WINNER(CLOSE*0.95),LINETHICK2,COLOR00bbbb;
//PJJ:DMA((H + L + C * 2) / 4,0.9)/HHV(C,120)*100;
成本:=DMA(AMOUNT/V,V/CAPITAL)/HHV(C,120)*100,colorgreen;
DRAWBAND(C/HHV(C,120)*100,RGB(200,200,00),成本,RGB(0,0,205));
AA:=(VOL/((HIGH-LOW)*2-ABS(CLOSE-OPEN)));
AAB:=(IF(CLOSE>OPEN,AA*(HIGH-LOW),IF(CLOSE<OPEN,AA*((HIGH-OPEN)+(CLOSE-LOW)),VOL/2)));
AAS:=(IF(CLOSE>OPEN,0-AA*((HIGH-CLOSE)+(OPEN-LOW)),IF(CLOSE<OPEN,0-AA*(HIGH-LOW),0-VOL/2)));
买力:=100*AAB/HHV(VOL,120);
卖力:=100*AAS/HHV(VOL,120);
STICKLINE(买力>0,0,买力,8,0),color0000dd;
STICKLINE(卖力<0,买力,买力-卖力,8,0),color00bb00;
QJ0:=(HIGH+LOW+CLOSE)/3;
QJ1:=IF(HIGH=LOW,1,HIGH-MAX(OPEN,CLOSE))/VOL*100;
QJ2:=IF(HIGH=LOW,1,MAX(CLOSE,OPEN)-QJ0)/VOL*100;
QJ3:=IF(HIGH=LOW,1,MIN(OPEN,CLOSE)-LOW)/VOL*100;
QJ4:=IF(HIGH=LOW,1,QJ0-MIN(CLOSE,OPEN))/VOL*100;
QJ5:=(VOL/(IF(HIGH=LOW,4,HIGH-LOW)));
特大:QJ4*QJ5,NODRAW,colorred;
大单:QJ3*QJ5,nodraw,colormagenta;
中单:QJ1*QJ5,NODRAW,colorgreen;
小单:QJ2*QJ5,NODRAW,colorblack;
//小散:=EMA(小单+中单,3),colorblack;
//大单走向:EMA(大单+特大,3),coloryellow;
//STICKLINE(特大>0,特大+大单-1,特大+大单,7,0),colorffffff;
//STICKLINE(特大>0,1,特大+大单,11,1),coloraaaaaa;
//STICKLINE(大单>0,特大,特大+大单,12,1),colormagenta;
//STICKLINE(大单>0,特大,特大+大单,11,1),colormagenta;
16. 市场成本的计算公式?
市场成本计算公式编辑1.公式源代码MCST:DMA(AMOUNT/(100*VOL),VOL/CAPITAL)
;2.市场成本以成交量(手)/当前流通股本(手)为权重成交额(元)/(100*成交量(手))的动态移动平均市场成本应用法则编辑1.MCST是市场平均成本价格
17. dma windows驱动源码吗?
在《深入理解Linux内核》中的第545页介绍了DMA的相关操作。说道DMA,那就不得不提到Cache(高速缓存)的问题。书中引用了如下一段例子来描述了Cache一致性问题:
逗假设设备驱动程序把一些数据填充到内存缓冲区中,然后立刻命令硬件设备利用DMA传送方式读取该数据。如果DMA访问这些物理RAM内存单元,而相应的硬件高速缓存行的内容还没有写入RAM中,那么硬件设备所读取的至就是内存缓冲区中的旧值。地
现在有两种方法来处理DMA缓冲区:
一致性DMA映射:
书上讲的比较抽象,通俗地所就是任何对DMA缓冲区的改写都会直接更新到内存中,也称之为逗同步的地或者逗一致的地。
流式DMA映射:
根据个人的理解,这里的流即输入输出流,我们需要事先指定DMA缓冲区的方向,比如是地读缓冲区地还是逗写缓冲区地。也称之为逗异步的地或逗非一致性的地,详细的内容请看下文。
由于x86体系结构中,硬件设备驱动程序本身会逗窥探地所访问的硬件告诉缓存,因此x86体系结构中不存在DMA一致性问题。而对于其他一些架构如MIPS,SPARC以及POWERPC(包括ARM在内)需要在软件上保证其DMA一致性。
对于以上两者如何选择,书中有一个合适的建议,如果CPU和DMA处理器以不可预知的方式去访问一个缓冲区,那么必须强制使用一致性DMA映射方式(这里我对不可预知的理解是,不能确定在何时它们访问缓冲区),其他情形下,流式DMA映射方式更可取,因为在一些体系结构中处理一致性DMA映射是很麻烦的,并且可能导致更低的系统性能。
这里详细介绍流式DMA:
需要访问的缓冲区需要在数据传送之前被映射(这里的映射也就是需要调用一些函数告知内核,该缓冲区进行流式映射),在传送之后被取消映射。
启动一次流式DMA数据传输分为如下步骤:
1. 分配DMA缓冲区。
在DMA设备不采用S/G(分散/聚集)模式的情况下,必须保证缓冲区是物理上连续的,linux内核有两个函数用来分配连续的内存:kmalloc()和__get_free_pages()。这两个函数都有分配连续内存的最大值,kmalloc以分配字节为单位,最大约为64KB,__get_free_pages()以分配页为单位,最大能分配2^order数目的页,order参数的最大值由include/linux/Mmzone.h文件中的MAX_ORDER宏决定(在默认的2.6.18内核版本中,该宏定义为10。也就是说在理论上__get_free_pages函数一次最多能申请1
2. 建立流式映射。
在对DMA冲区进行读写访问之后,且在启动DMA设备传输之前,启用dma_map_single()函数建立流式DMA映射,这两个函数接受缓冲区的线性地址作为其参数并返回相应的总线地址。
3. 释放流式映射。
当DMA传输结束之后我们需要释放该映射,这时调用dma_unmap_single()函数。
注意:
(1). 为了避免高速缓存一致性问题,驱动程序在开始从RAM到设备的DMA数据传输之前,如果有必要,应该调用dma_sync_single_for_device()函数刷新与DMA缓冲区对应的高速缓存行。
(2). 从设备到RAM的一次DMA数据传送完成之前设备驱动程序是不可以访问内存缓冲区的,但如果有必要的话,驱动程序在读缓冲区之前,应该调用dma_sync_single_for_cpu()函数使相应的硬件高速缓存行无效。
(3). 虽然kmalloc底层也是用__get_free_pages实现的,不过kmalloc对应的释放缓冲区函数为kfree,而__get_free_pages对应的释放缓冲区函数为free_pages。具体与__get_free_pages有关系的几个申请与释放函数如下:
申请函数:
alloc_pages(gfp_mask,order)返回第一个所分配页框描述符的地址,或者如果分配失败则返回NULL。__get_free_pages(gfp_mask,order)类似于alloc_pages(),但它返回第一个所分配页的线性地址。如果需要获得线性地址对应的页框号,那么需要调用virt_to_page(addr)宏产生线性地址。释放函数:__free_pages(page,order)这里主要强调page是要释放缓冲区的线性首地址所在的页框号free_pages(page,order)这个函数类似于__free_pages(page,order),但是它接收的参数为要释放的第一个页框的线性地址addr
18. 市场成本的计算公式?
市场成本计算公式编辑1.公式源代码MCST:DMA(AMOUNT/(100*VOL),VOL/CAPITAL)
;2.市场成本以成交量(手)/当前流通股本(手)为权重成交额(元)/(100*成交量(手))的动态移动平均市场成本应用法则编辑1.MCST是市场平均成本价格
19. 市场成本的计算公式?
市场成本计算公式编辑1.公式源代码MCST:DMA(AMOUNT/(100*VOL),VOL/CAPITAL)
;2.市场成本以成交量(手)/当前流通股本(手)为权重成交额(元)/(100*成交量(手))的动态移动平均市场成本应用法则编辑1.MCST是市场平均成本价格
20. 市场成本的计算公式?
市场成本计算公式编辑1.公式源代码MCST:DMA(AMOUNT/(100*VOL),VOL/CAPITAL)
;2.市场成本以成交量(手)/当前流通股本(手)为权重成交额(元)/(100*成交量(手))的动态移动平均市场成本应用法则编辑1.MCST是市场平均成本价格