百花园乡村酒店怎么走:摘自中国自动化交易中心

来源:百度文库 编辑:偶看新闻 时间:2024/05/07 11:34:39
自中国自动化交易中心-专业的自动化交易论坛  

2010-11-25 05:59:44|  分类: 默认分类 |  标签: |字号大中小 订阅

 

EA乐园一群:68172795,二群:108075359,三群:54761312
http://chinaautotrading.com/forum/

EA编写技术问答

http://chinaautotrading.com/forum/viewtopic.php?f=8&t=137

分页: 2 / 2

问6)如何限制在同1个K只接受1次信号

发表于 : 2010年 9月 7日 23:55toptemple引自群友问题:“比如,在一个蜡烛内,我要求只能发出一个交易信号,比如是buy,但行情波动,
可能后续会发出Sell信号,第二个信号我不需要”
答6)下面的代码可以实现。

bool done;//设置一个全局逻辑变量记录信号发生事件
int TmOld;//设置一个全局变量用于记录新K的时刻
//----------------------------------------------------------------------------+
int cond1(){
if(done) return(0);       //A或B已经有一个成立啦,A就不检测了
/*在这里写你的交易条件A*/
if (条件A成立) done= true ;
return(0);}
int cond2(){
if(done) return(0);      //A或B已经有一个成立啦,B就不检测了
/*在这里写你的交易条件B*/
if(条件B成立)done=true ;
return(0);}
int start(){
if(TmOld != Time[0])
{TmOld= Time[0]; done=false;}            //新K来临,更新K时刻记录,给done赋值为假
cond1(); cond2();                         //测试条件A及B
return(0);}         //-----------------------------------------------------------------+

您注意到没有,在cond1()和cond2()里,done只能从false变成true而不能相反,这就意味着只
要A或B成立过一次,done就再也不可能false了,相应地cond1()及cond2()无论如何调用都不会
有结果发生。而一旦一个新K来临,done会被重新赋值成false,这样cond1()及cond2()被调用
时,只要相应的条件成立就会有结果发生,一旦发生结果done就又成true,就不会再发生事件,
直到又一个新K来临。

问7) 怎样去除红箭头之间的白箭头

发表于 : 2010年 9月 8日 01:55toptemple问7) 怎样去除红箭头之间的白箭头
原由:群友梦幻成真提出的问题,已知图表上一些红箭头和一些白箭头,现在想要
1.在白箭头和白箭头之间如果有多个红箭头,则保留最高的那个,其他去除
2.在红箭头和红箭头之间如果有多个白箭头,则保留最低的那个,其他去除
最后形成一红一白相间出现的箭头组。
答7)

double whites[][2];      //存储白箭头
double reddds[][2];    //存储红箭头
double whiteR[][2];      //存储白箭头结果
double redddR[][2];    //存储红箭头结果
int wC;     //白箭头原有数目
int rC;     //红箭头原有数目
int wR;    //白箭头结果数目
int rR;     //红箭头结果数目
//----------------------------------------------------------------------------+


int cut()  {//削减函数----------------------------------------------------------+
//入口要求已经在whites[i][]中存储了白箭头,i从1起计
//[i][0]指向横座标(通常为时间),[i][1]指向纵座标(通常是价格)
//入口要求已经在reddds[i][]中存储了红箭头,i从1起计
//[][0]指向横座标(通常为时间),[][1]指向纵座标(通常是价格)
double maxx,minn;//最大数--最小数
int id;//横座标
int w1=2,r1=2;
if(whites[1][0]>reddds[1][0]){w1=1;whites[0][0]=reddds[1][0]-1;}//首个箭头为红色
else {r1=1;reddds[0][0]=whites[1][0]-1;}//首个箭头为白色
wR=0;rR=0;//结果数目初始化
ArrayResize(whiteR,wC);//重定义白箭头结果数组
ArrayResize(redddR,rC);//重定义红箭头结果数组

for(int i =r1;i<=rC;i++){//遍历红箭头
minn=999999;
for(int j=1;jif (whites[j][0]>reddds[i-1][0] && whites[j][0]{ if(whites[j][1]if(minn<999999){wR++;whiteR[wR][0]=whites[id][0];whiteR[wR][1]=minn; }
}//for(int j=1;j
for(i =w1;i<=wC;i++){//遍历白箭头
maxx=-999999;
for(j=1;jif (reddds[j][0]>whites[i-1][0] && reddds[j][0]{ if(reddds[j][1]>maxx) { maxx=reddds[j][1];id=j;}}}//for(j=1;jif(maxx>-999999){rR++;redddR[rR][0]=reddds[id][0];redddR[rR][1]=maxx;}
}//for(int j=1;jreturn(0);}//+-------------------------------------------------------+

上面这个cut()函数的设计是这样的
首先,在首个箭头之前再加一个假想的相反颜色箭头。这是为了下面的程序更容易设计。
在任意两个相邻红箭之间,假想最初有一个很高的白箭(999999)并记录之。在这两个红箭之间查找所有白箭,如果是
一个新低,则记录在案,原先的白箭放弃掉。
查找完毕,如果保留下来的白箭头仍然是999999,说明这两红箭头之间并无白箭头;反之,那个保留下来的就是最低的
白箭头(在此2红之间的),也就是我们需要保留的结果之一。
对任意两相邻白箭头同样的程序做一遍(方向相反),我们就得到应该保留的箭头组,而应该去除的已经全部去除了。

设计中使用了假想数据的技术。在首个箭头前假想一个反向的箭头,这可以避免判断箭头排列先后。在相邻两同色箭头
中假想一个反向特大箭头的存在,可以避免判断此两箭头之间到底有没有反向箭头,同时给maxx和minn赋值逻辑提供方
便。两种假想都使得程序变得更容易编写,逻辑性也更清晰。

问8)如何检测一张挂单是否已经成交

发表于 : 2010年 9月 8日 09:27toptemple问8)如何检测一张挂单是否已经成交
答8)在MQL4语言中,交易类型有6 种,即
OP_BUY =0:买单
OP_SELL =1:卖单
OP_BUYLIMIT =2:买挂单
OP_SELLLIMIT=3:卖挂单
OP_BUYSTOP =4:买停挂单
OP_SELLSTOP=5:卖停挂单
我们注意到交易类型实际有值,数据类型为int型。当一张挂单挂出去后,它的类型先是2、3、4、5中的其中一种。一旦
这张挂单被执行成交,它的交易类型就会变成0或1了。所以我们只要检测交易类型,即可以知道此单是否已经被成交。

bool IsOpened(int tik){//tik=帐单号-----------------检测是否成交单------------+
OrderSelect(tik,SELECT_BY_TICKET);
if (OrderType()<2) return(true);
return(false);}//---------------如果未成交返回false,反之返回true---------------+

问9)如何检测一张交易单是否已经被打止损或打止盈

发表于 : 2010年 9月 8日 09:49toptemple问9)如何检测一张交易单是否已经被打止损或打止盈
答9)OrderCloseTime()这个函数返回的是订单的收盘时间。如果订单正在交易中而未平仓,此函数
返回的是0,如果平仓,此值就会变成平仓当时的服务器时间,是一个很大的正整数。
int IsClosed(int tik){//tik=帐单号-----------------检测是否平仓-----------------+
OrderSelect(tik,SELECT_BY_TICKET);
if (OrderCloseTime()<1)return(0); //未平仓,返回0
if(OrderType()==OP_BUY ){if(OrderClosePrice()>=OrderTakeProfit())return(1);}
if(OrderType()==OP_SELL){if(OrderClosePrice()<=OrderTakeProfit())return(1);}
return(-1);}//--- 返回值 未平仓=0 止损平仓=-1 止盈平仓=1 -----------------+
有的朋友可能会质疑,打止损或打止盈的订单,其OrderComment()会包含sl或tp字样,检测这个不是
更方便吗?你要这样说我完全同意,不过上面的函数也完全可以实现功能,这个例子同时说明编程不
是死的,我们可以用不同的方式完成同一件任务。

Re: EA编写技术问答

发表于 : 2010年 9月 8日 17:41laoyee漂亮,在你的帮助下,我解决了问题,送一朵红花以资鼓励

Re: EA编写技术问答

发表于 : 2010年 9月 8日 19:48laoyee问:怎么能在屏幕显示自定义的文字:
答:下面是一个在屏幕上显示文字的函数。尽管用print和comment()命令也可以,但是这段代码可以设置字体、字号、颜色以及显示位置。
代码: 全选
/*
函数:在屏幕上显示标签,参数说明如下:
      LableName:标签名称;LableDoc:文本内容;LableX:标签X位置;LableY:标签Y位置;DocSize:文本字号;DocStyle:文本字体;DocColor:文本颜色
*/
void SetLable(string LableName,string LableDoc,int LableX,int LableY,int DocSize,string DocStyle,color DocColor)
   {
   ObjectCreate(LableName, OBJ_LABEL, 0, 0, 0);
   ObjectSetText(LableName,LableDoc,DocSize,DocStyle,DocColor);
   ObjectSet(LableName, OBJPROP_XDISTANCE, LableX);
   ObjectSet(LableName, OBJPROP_YDISTANCE, LableY);
   }

Re: EA编写技术问答

发表于 : 2010年 9月 8日 19:59laoyee问:怎么在屏幕上画出自己想要的连线?
答:发一个画线函数在下面,程序中直接调用即可。

代码: 全选
/*
函数:在屏幕上画线,参数说明如下:
      myOrderTicket:订单号,myOrderType:订单类型,myOpenTime:开仓时间,myOpenPrice:开仓价格,
      myCloseTime:平仓时间,myClosePrice:平仓价格
*/
void  SetObj(int myOrderTicket,int myOrderType,int myOpenTime,double myOpenPrice,int myCloseTime,double myClosePrice)

   {
    string myObjectName=DoubleToStr(myOrderTicket,0);
    ObjectCreate(myObjectName,OBJ_TREND,0,myOpenTime,myOpenPrice,myCloseTime,myClosePrice);//画趋势线,确定两点坐标
    if (myOrderType==0) ObjectSet(myObjectName,OBJPROP_COLOR,Green);
    if (myOrderType==1) ObjectSet(myObjectName,OBJPROP_COLOR,Red);
    ObjectSet(myObjectName,OBJPROP_STYLE,STYLE_DOT);
    ObjectSet(myObjectName,OBJPROP_WIDTH, 1);
    ObjectSet(myObjectName,OBJPROP_BACK,false);
    ObjectSet(myObjectName,OBJPROP_RAY,false);
   }

当前时区为 UTC + 8 小时
分页: 2 / 2Powered by phpBB ? 2000, 2002, 2005, 2007 phpBB Group
http://www.phpbb.com/