cdf888 2007-11-4 11:31
各位老师请指教一个语句的使用
我看资料说是开仓或修改或平仓的指令要紧跟一条Exit命令,以确保指令完成
可我怎么找不到这条Exit命令的具体用法?请指教谢谢
cdf888 2007-11-4 17:02
有几个学习mq4的困惑,请不吝赐教
1、变量用中文的话,会不会出错?
2、 for(int i = OrdersTotal (); i >= 0; i --) 和 for(int i = OrdersTotal () - 1; i >= 0; i --)的区别在哪里?怎么都能用啊?初始值后一个少1啊,请问怎么使用?
3、Point和MarketInfo(OrderSymbol(), MODE_POINT)的区别在哪里?虽然结果一样,但具体在哪里区别对待?
4、对定单的操作(如开仓、平仓、修改)怎么才能确保成功?虽然可以判断返回值,但是假如返回负值,怎么才能从新操作以便确保操作成功?
xfxyldj 2007-11-5 00:02
[quote]原帖由 [i]cdf888[/i] 于 2007-11-4 11:31 发表 [url=http://www.onefx.net/bbs/redirect.php?goto=findpost&pid=142757&ptid=34086][img]http://www.onefx.net/bbs/images/common/back.gif[/img][/url]
我看资料说是开仓或修改或平仓的指令要紧跟一条Exit命令,以确保指令完成
可我怎么找不到这条Exit命令的具体用法?请指教谢谢 [/quote]
我想原文的意思应该是对这三种指令的返回码进行判断。以确定指令正确执行。
即使没成功完成也要返回一个错误号码。
据我所知在mt4中没有你说的EXIT指令。
xfxyldj 2007-11-5 00:15
回复 2楼 的帖子
1、我用过中文变量,还未遇到问题,如果您不放心最好使用英文变量名。
2、后一个语句是对的。for(int i = OrdersTotal () - 1; i >= 0; i --)
需要减一。OrdersTotal () 返回的是订单总数。但是其索引是从0开始的而不是1开始。因此遍历的时候是从0到(N-1)的遍历。而不是从0到N的遍历。用前面的语句一般不会出什么问题。因为当遍历N的时候找不到订单的。也就不能实行后续的操作。
3、Point只能取当前图表的小数位。而MarketInfo(Symbol(), MODE_POINT)可以取任何货币兑的小数位。只要将Symbol()换成相应的货币标示。(另:OrderSymbol()这个参量用在这里是错误的。这个是返回的订单的货币标记。而不是图表的货币标记。个人认为这里应该是图表的货币标示。Symbol())。
4、你可以循环开单直到成功为止。一般的处理是如果开单失败就停止操作打印错误。等待下一个报价再开新单。。
cdf888 2007-11-5 13:49
//+------------------------------------------------------------------+
//| 已开仓管理EA.mq4|
//| |
//| |
//+------------------------------------------------------------------+
#property copyright "Copyright Chendafa"
#property link "http://dazhongtan.ys168.com"
extern double Get = 4; //盈利大于4点则设1点保护至少4点点差
extern double MinTakeProfit = 1;
extern bool Alert_sound = true; //语音报警开关
extern bool Auto_stp = true; //追踪止损开关
extern double OverTakeProfit = 24; //获利大于24点开始追踪止损
extern double N = 15; //止损价距离极值价的差距(至少为15)
//+------------------------------------------------------------------+
//| 主代码 |
//+------------------------------------------------------------------+
//bool OK = false; //全局变量,判断是否首次盈利>2点
//首次盈利大于2点,ok为ture,若盈利小于2且ok为ture,执行平仓操作
int start()
{
string Text;
for(int cnt=OrdersTotal() - 1; cnt >= 0; cnt --)
{
OrderSelect(cnt, SELECT_BY_POS, MODE_TRADES);
{
Text = OrderComment();
double stp = OrderStopLoss();
double tpt = OrderTakeProfit();
double open = OrderOpenPrice();
double sl,mstp;
bool result = false;
//追踪止损:只要赢利不断增加,就自动抬高止损价,尽可能多的让获利单奔跑
if(OrderType() == OP_BUY)
{
if((Bid - open) / Point > OverTakeProfit * Point && Auto_stp == true)
mstp = Bid - N * Point;
if(mstp > stp) //新的价格更具优势才修改
result = OrderModify(OrderTicket(),OrderOpenPrice(),mstp,0,0,Green);
Alert (result);
}
if(OrderType() == OP_SELL)
{
if((open - Ask) / Point > OverTakeProfit * Point && Auto_stp == true)
mstp = Ask + N * Point;
if(mstp < stp) //新的价格更具优势才修改
result = OrderModify(OrderTicket(),OrderOpenPrice(),mstp,0,0,Green);
Alert (result);
}
//最小盈利保护:不允许盈利单变为亏损单
if((OrderType() == OP_BUY) && (Bid - open) / Point > Get && (stp < open))
{
sl = open + MinTakeProfit * Point;
result = OrderModify(OrderTicket(),OrderOpenPrice(),sl,tpt,0,Green);
if(Alert_sound == true) PlaySound("news");
//---------------删除挂单
for(int i = OrdersTotal () - 1; i >= 0; i --)
{
OrderSelect(i, SELECT_BY_POS);
if (OrderType () == 5 && OrderComment() == Text) //保证删除的是对应的挂单
OrderDelete (OrderTicket ());
}
//---------------
}
if((OrderType() == OP_SELL) && (open - Ask) / Point > Get && (open < stp))
{
sl = open - MinTakeProfit * Point;
result = OrderModify(OrderTicket(),OrderOpenPrice(),sl,tpt,0,Green);
if(Alert_sound == true) PlaySound("news");
//---------------删除挂单
for(int j = OrdersTotal () - 1; j >= 0; j --)
{
OrderSelect(j, SELECT_BY_POS);
if (OrderType () == 4 && OrderComment() == Text) //保证删除的是对应的挂单
OrderDelete (OrderTicket ());
}
//---------------
}
}
}
}
cdf888 2007-11-5 13:52
各位老师,上楼这个代码是我学习的作品,有个问题我实在是找不到原因:
就是单开的仓单是sell单时,这个ea会自动将止损修改为0,我从代码上却找不到原因,请帮忙看看谢谢!
xfxyldj 2007-11-5 16:29
回复 7楼 的帖子
有错误
1、(Bid - open) / Point > OverTakeProfit * Point 这个有问题。
同样的(open - Ask) / Point > OverTakeProfit * Point一样的问题。
两个值的数量级不同。去掉一个 Point 。
其他的没看。
你先修改下这个看看。空单的这个语句使得mstp = Ask + N * Point;语句不能执行。因此mstp始终不能赋值。
cdf888 2007-11-5 17:53
//+------------------------------------------------------------------+
//| 已开仓管理EA.mq4|
//| |
//| |
//+------------------------------------------------------------------+
#property copyright "Copyright Chendafa"
#property link "http://dazhongtan.ys168.com"
extern double Get = 4; //盈利大于4点则设1点保护至少4点点差
extern double MinTakeProfit = 1;
extern bool Alert_sound = true; //语音报警开关
extern bool Auto_stp = true; //追踪止损开关
extern int OverTakeProfit = 24; //获利大于24点开始追踪止损
extern int N = 15; //止损价距离极值价的差距(至少为15)
//+------------------------------------------------------------------+
//| 主代码 |
//+------------------------------------------------------------------+
//bool OK = false; //全局变量,判断是否首次盈利>2点
//首次盈利大于2点,ok为ture,若盈利小于2且ok为ture,执行平仓操作
int start()
{
string Text;
for(int cnt=OrdersTotal() - 1; cnt >= 0; cnt --)
{
OrderSelect(cnt, SELECT_BY_POS, MODE_TRADES);
{
double stp = OrderStopLoss();
double tpt = OrderTakeProfit();
double open = OrderOpenPrice();
double sl,mstp;
bool result = false;
//追踪止损:只要赢利不断增加,就自动抬高止损价,尽可能多的让获利单奔跑
//最小盈利保护:不允许盈利单变为亏损单 )
if((OrderType() == OP_BUY) && (Bid - open) / Point > Get && (stp < open))
Text = OrderComment(); //返回当前选中定单的注释
Print(Text);
sl = open + MinTakeProfit * Point;
result = OrderModify(OrderTicket(),OrderOpenPrice(),sl,tpt,0,Green);
if(Alert_sound == true) PlaySound("news");
{
for(int i = OrdersTotal () - 1; i >= 0; i --)
{
OrderSelect(i, SELECT_BY_POS, MODE_TRADES);
if (OrderType () == 5 && OrderComment() == Text) //保证删除的是对应的挂单
OrderDelete (OrderTicket ());
}
}
if((OrderType() == OP_SELL) && (open - Ask) / Point > Get && (open < stp))
Text = OrderComment(); //返回当前选中定单的注释
Print(Text);
sl = open - MinTakeProfit * Point;
result = OrderModify(OrderTicket(),OrderOpenPrice(),sl,tpt,0,Green);
if(Alert_sound == true) PlaySound("news");
{
for(int j = OrdersTotal () - 1; j >= 0; j --)
{
OrderSelect(j, SELECT_BY_POS, MODE_TRADES);
if (OrderType () == 4 && OrderComment() == Text) //保证删除的是对应的挂单
OrderDelete (OrderTicket ());
}
}
}
}
}
cdf888 2007-11-5 17:54
我修改了,但是还是存在错误:
不能在盈利>4点后设置+1点保护,而且也不删除对应的挂单,请老师再帮忙看看谢谢
xfxyldj 2007-11-5 19:52
回复 10楼 的帖子
1、检查下你平台的止损止赢的要求。一般的平台要求止损止赢距离现价4个点以上才可以。出数据的时候要15个点。
2、对于删除订单。估计是这个语句OrderComment() == Text有问题。我没用过OrderComment() 不太了解其特点。有空试试。
zennchew 2007-11-26 00:51
趁机学习,谢谢。