初始化图表和文件
图表初始化
因为赫兹量化需要看图表来标记数据,所以图表不能随意滚动,必须根据我们的手动操作进行滚动,因此我们需要禁用 CHART_AUTOSCROLL 和 CHART_SHIFT:
ChartSetInteger (0, CHART_AUTOSCROLL, false); ChartSetInteger (0, CHART_SHIFT, true); ChartSetInteger (0, CHART_MOUSE_SCROLL ,1);
注意:代码的绿色部分旨在允许赫兹量化使用鼠标滚轮控制图表文件初始化
文件的初始化应首先检查是否存在现有标签文件,如果存在历史文件,则将文件名保存到变量“reName”中:
do { //---Find if there are files that match the chart if (StringFind(name, Symbol())!=-1 && StringFind(name,".csv")!=-1) reName=name; } while (FileFindNext(hd,name));
注意:这里应该注意的是,赫兹量化使用的是“do-while”循环,它与“while”循环的不同之处在于,它首先执行运算符,然后计算表达式。但是名称的初始化是个问题,赫兹量化可以这样做
int hd= FileFindFirst("*",name,0);
如果有一个原始的标记文件,打开该文件并使用read_csv()函数获取标记的最后时间:
read_csv(file_handle,a);
然后将图表滚动到最后标记的时间:
shift = - iBarShift(Symbol(),PERIOD_CURRENT,(datetime)a[i-8]); ChartNavigate(0, CHART_END ,shift);
如果没有历史记录文件,就创建一个文件:
file_handle = FileOpen(StringFormat("%s%d-%d.csv",Symbol(),Period(),start_t), FILE_WRITE | FILE_CSV | FILE_READ);
然后将图表滚动到全局变量“start_t”指定的位置
shift = -iBarShift(Symbol(),PERIOD_CURRENT,(datetime)start_t); ChartNavigate(0,CHART_END,shift);
添加一条垂直红线以标记起始列:
ObjectCreate (0,"Start",OBJ_VLINE,0,(datetime)start_t,0)
这部分的逻辑是这样组织的:
if (FileIsExist(reName)) { file_handle = FileOpen(reName, FILE_WRITE | FILE_CSV | FILE_READ ); string a[]; int i= 0 ; read_csv(file_handle,a); i = ArraySize (a); shift = -iBarShift(Symbol(), PERIOD_CURRENT,(datetime)a[i-8]); ChartNavigate(0,CHART_END,shift); } else { file_handle = FileOpen (StringFormat ("%s%d-%d.csv", Symbol(), Period(),start_t), FILE_WRITE | FILE_CSV | FILE_READ ); Print ("There is no history file,create file:" , StringFormat ( "%s%d-%d",Symbol(), Period(),start_t)); shift = - iBarShift (Symbol(), PERIOD_CURRENT ,(datetime)start_t); ChartNavigate (0, CHART_END ,shift); ObjectCreate (0,"Start", OBJ_VLINE,0,(datetime)start_t,0); }
注意:由于我们想将图表向左移动,我们必须在“iBarShift()”函数之前添加“-”
shift = -iBarShift(Symbol(), PERIOD_CURRENT ,(datetime)start_t);
当然,它也可以在ChartNavigate()函数中实现,例如:
ChartNavigate(0,CHART_END,-shift);
本文中的代码仍然是根据第一种方法实现的。
这些初始化操作将在我们的OnInit()中实现,包括定义我们需要的变量。最重要的是明确我们希望图表移动的位置并开始标记。这主要由变量“shift”和“start_t”控制。我们将反映在最终代码中:
int OnInit() { //---initial string name; string reName="1"; int hd=FileFindFirst("*",name,0); int shift; ChartSetInteger(0,CHART_AUTOSCROLL,false); ChartSetInteger(0,CHART_SHIFT,false); ChartSetInteger(0,CHART_MOUSE_SCROLL,1); do { //---check File if(StringFind(name,Symbol())!=-1 && StringFind(name,".csv")!=-1) reName=name; } while(FileFindNext(hd,name)); if(FileIsExist(reName)) { file_handle = FileOpen(reName,FILE_WRITE|FILE_CSV|FILE_READ); string a[]; int i=0; read_csv(file_handle,a); i = ArraySize(a); shift = -iBarShift(Symbol(),PERIOD_CURRENT,(datetime)a[i-8]); ChartNavigate(0,CHART_END,shift); } else { file_handle = FileOpen(StringFormat("%s%d-%d.csv",Symbol(),Period(),start_t),FILE_WRITE|FILE_CSV|FILE_READ); Print(FileTell(file_handle)); Print("No history file,create file:",StringFormat("%s%d-%d",Symbol(),Period(),start_t)); shift = -iBarShift(Symbol(),PERIOD_CURRENT,(datetime)start_t); ChartNavigate(0,CHART_END,shift); ObjectCreate(0,"Start",OBJ_VLINE,0,(datetime)start_t,0); } return(INIT_SUCCEEDED); }
注意:
1. start_t变量-指定开始的时间范围; 2. shift 变量-指定要移位的列数,代码示例通过转换指定的时间显示要移位的列数; 3. read_csv()函数将在稍后定义。
read_csv()函数的定义:
void read_csv(int hd, string &arry[]) { int i= 0; while(!FileIsEnding(hd)) { ArrayResize(arry,i+1); arry[i]= FileReadString(hd); i++; } }
注意:我们使用“while”循环来查找历史注释文件的结束行,获取文件中的最后一行数据,并查找我们最后一次注释的结束时间。此注释将图表滚动到此柱状图,以便我们可以从此处继续进行注释。
设计和标记操作逻辑
操作图表:可以从客户端的帮助主题轻松查询此部分。
-
Home —移动到图表的最后一个柱;
-
End — 移动到图表的第一个柱;
-
Page Up — 将图表向后移动一个窗口的距离;
-
Page Down — 将图表向前移动一个窗口的距离;
-
Ctrl+I — 打开一个包含指标列表的窗口;
-
Ctrl+B — 打开一个包含对象列表的窗口;
-
Alt+1—图表显示为一系列柱形;
-
Alt+2 — 该图表被显示为日式蜡烛的序列;
-
Alt+3— 图表显示为连接收盘价格的线;
-
Ctrl+G — 在图表窗口中显示/隐藏网格;
-
"+"— 放大图表;
-
"-" - 缩小图表;
-
F12 — 逐步滚动图表(逐条滚动);
-
F8 — 打开属性窗口;
-
Backspace — 从图表中删除最后添加的对象;
-
Delete — 删除所有选定的对象;
-
Ctrl+Z — 取消删除最后一个对象。
控制逻辑:1. 按键告诉EA下一步标记的数据将是什么样的趋势定义'b'键,'s'键,由虚拟键值定义:
#define KEY_B 66 #define KEY_S 83
按‘b’然后按‘s’表示上升趋势,按‘s’然后按‘b’表示下降趋势,以上升趋势为例:1)此时按‘b’表示上升趋势。我们设置“typ”变量为0,“tp”变量为“start”,箭头颜色为“clrBlue”,标签计数“Num”增加1。需要注意的是,我们只需要在数据段的开头增加变量,并指定再次按下按钮将通过先反转来执行标记数据段的“end”部分