关于同双向挂单EA
(2013-01-05 06:18:26)
标签:
杂谈 |
|
|
各位高人,问题如下,我想编写一个在阻力和支撑位同时挂单EA,阻力位为和支撑位在属性里输入,首先取消阻力位和支撑位置间的所有挂单,然后,当一张订单处于开仓状态(挂单价格被触发),就取消另一张反方向的挂单。可是我发现,每次都是所有订单全部被取消,经过反复查看,我认为是OrderTicket()的确定问题,就是不能正确的分配订单号,因此一取消,就全取消了。我的代码如下,希望高人帮忙看一下,能帮忙改好最好,如果过太麻烦,给指条明路,给个思路,或者告诉一个例子,我自己去阅读理解,我实在是没办法了,各种方法都是过了,觉得自己已经走进了死胡同,希望高人帮忙,万分感激。
-
//+------------------------------------------------------------------+
-
//|
Two Direction Order.mq4 | -
//|
Copyright ?2010, MetaQuotes Software Corp. | -
//|
http://www.metaquotes.net | -
//+------------------------------------------------------------------+
-
#define Magic 020909 //
-
extern int Slippage=3;//滑点
-
extern
double R=1.4200;//Zone 的阻力位 -
extern double S=1.4100;//Zone 的支撑位
-
-
//----全局变量===================
-
-
int OrderTotal;//持仓总单数
-
int TickLong;//突破多单挂单单号
-
int TickShort;//突破空单挂单单号
-
int TickOther;
-
-
double LongOpenPrice;
-
double ShortOpenPrice;
-
double OtherOpenPrice;
-
-
int TypeLong; //突破多单订单类型
-
int TypeShort;//突破空单订单类型
-
int TypeOther;//区间订单类型
-
-
double StopLost;
-
-
-
-
//+------------------------------------------------------------------+
-
//| expert initialization
function
|
-
//+------------------------------------------------------------------+
-
int init()//初始化函数,负责程序变量及数据初始输入;只在程序调入时执行一次,一般不用重写内容。
-
{ -
-
-
-
//----
-
return(0);
-
} -
//+------------------------------------------------------------------+
-
//| expert deinitialization
function
|
-
//+------------------------------------------------------------------+
-
int
deinit()//反初始化函数,负责程序退出时,将数据从内存中清除;只在程序退出时,执行一次,一般不用重写内容。
-
{ -
-
-
//----
-
return(0);
-
} -
//+------------------------------------------------------------------+
-
//| expert start
function
|
-
//+------------------------------------------------------------------+
-
int start()
-
{ -
int Ticket; //自定义局部变量Ticket 用于记录每次下单后的状态,用于判断下单动作是否成功,如果不成功则做相应处理和提示 -
int Ticket1; -
-
int OrderTotal=GetOrderTypeHolding(); -
-
if(OrderTotal==0)//完全没有订单的情况
-
{//1
-
Ticket=OrderSend( Symbol(), OP_BUYSTOP, 0.1, R, Slippage,R-50*Point, 0, "Long", 020909, 0, Lime) ; -
Ticket1=OrderSend( Symbol(), OP_SELLSTOP, 0.1, S, Slippage,S+50*Point, 0, "Short", 020909, 0, Red) ; -
-
if(Ticket<0)
-
{
-
Print("挂单失败"+GetLastError()); //打印挂单失败 -
return(0); //退出本次start函数的执行 -
}
-
if(Ticket1<0)
-
{
-
Print("挂单失败"+GetLastError()); //打印挂单失败 -
return(0); //退出本次start函数的执行 -
}
-
-
}//1
-
-
else //有订单情况 -
{//2
-
OrderDelete(TickOther, Yellow);//消区间空单挂单
-
if(LongOpenPrice>=R||ShortOpenPrice<=S)//如果开仓位置为突破交易位置
-
{//2-1
-
if(LongOpenPrice>=R&&TypeLong==OP_BUY)//突破多单已经开仓情况
-
{//2-1-1
-
OrderDelete(TickShort, Yellow);//消突破空单挂单 -
}//2-1-1
-
if(ShortOpenPrice>=R&&TypeShort==OP_SELL)//突破空单已经开仓情况
-
{//2-1-2
-
OrderDelete(TickLong, Yellow);//消突破多单挂单 -
}//2-1-2
-
}//2-1
-
}//2
-
-
return(0);
-
}
-
//====================自定义函数部分================================================
-
//+------------------------------------------------------------------+
-
//|自定义判断持仓情况
|
-
//+------------------------------------------------------------------+
-
int GetOrderTypeHolding()//从最近持仓单提取订单类型
-
{//1 -
OrderTotal=OrdersTotal();
-
-
for(int i=OrdersTotal()-1;i>=0;i--)//循环条件 -
{//1-1
-
OrderSelect(i, SELECT_BY_POS, MODE_TRADES);//查找订单函数 -
if(OrderSymbol()==Symbol())//如果仓单货币=目前的货币
-
{//1-2
-
StopLost=OrderStopLoss(); //自定义止损变量=返回的订单止损 -
if(OrderOpenPrice( )>=R) -
{//1-2-1
-
TickLong=OrderTicket();//突破多单挂单单号 -
LongOpenPrice=OrderOpenPrice();
-
TypeLong=OrderType();
-
}//1-2-1
-
if(OrderOpenPrice( )<=S) -
{//1-2-2
-
TickShort=OrderTicket();//突破空单挂单单号 -
ShortOpenPrice=OrderOpenPrice();
-
TypeShort=OrderType();
-
}//1-2-2
-
if(S<OrderOpenPrice()<R)//区间内挂单单号 -
{//1-2-3
-
TickOther=OrderTicket();
-
OtherOpenPrice=OrderOpenPrice();
-
TypeOther=OrderType();
-
}//1-2-3
-
}//1-2
-
}//1-1
-
return(OrderTotal);//返回OrderTotal值
-
}//1
发表于 2010-2-3
22:57
|
首先的是你需要判断当前订单的类型,如果为空,则取消多头挂单。如果为多,则取消空头挂单 在else后面加上 if(OrderTotal==1) OrderDelete(Tick0, Yellow);// if(OrderTotal==0) OrderDelete(Tick1, Yellow);// 你总共只有两个不同类型的订单,所很好判断 |
谢谢回复先,可是,我的情况是同时挂两个反方向的单,并且先把区间里的地其他挂单都取消,等待一个方向的订单已经执行(就是说已经不再是挂单状态),再取消另一个方向的挂单。如果为空就取消多单,那么这个时候并不知道多单的挂单是否已经执行,不知道我说明白了吗?继续等待指点
只能从magic入手 设置 magic全局 在send后面进行运算magic++; 这样先前的挂单的
magic肯定小于当前magic 比较magic,删除挂单。
明白了 。
明白了 。
首先你使用 根据持仓单的数量进行两类状态分别处理时正确的。
其次,在持仓单=0的第一状态下,要先判断挂单个数是否为0 ,如果为0 再进行挂单入场动作。(道理自己想想)
第三、在持仓单>0的时候,要去的挂单的Ticket号码(这个可以写自定义函数,函数输出-1-表示没有挂单了,输出非-1数值为实际Ticket) 根据这个自定义函数的输出决定是删除Ticket对应的挂单还是已经没挂单了不做任何处理。
大致就是这样流程。
其次,在持仓单=0的第一状态下,要先判断挂单个数是否为0 ,如果为0 再进行挂单入场动作。(道理自己想想)
第三、在持仓单>0的时候,要去的挂单的Ticket号码(这个可以写自定义函数,函数输出-1-表示没有挂单了,输出非-1数值为实际Ticket) 根据这个自定义函数的输出决定是删除Ticket对应的挂单
大致就是这样流程。
| 搞定了,谢谢朋友们的帮忙,问题出在这里if(S<OrderOpenPrice()<R),改成if(S<OrderOpenPrice()&&OrderOpenPrice()&&<R),问题就解决了。 |
分享:
喜欢
0
赠金笔
加载中,请稍候......

加载中…