初学者求解EA反复开单问题

 

各路大神,小弟最近在学习,练习MQL5编程,遇到困难请求帮助!

尝试做了一个最简单的双均线交叉开多单或空单,成功开单,但是会反复开单。

如何能控制双均线交叉仅开一次单而不重复开单?不平仓的情形下,下一次交叉还能继续开单并保证仍是仅开一次单?

比如,4小时K线图,某时间点maFast5与maSlow20金叉仅下一次多单,一直不平仓多单(可手动平仓),下一个时间点5与20均线再次金叉又仅下一次多单,如此反复。


int

int OnInit()

{

}


void OnTick()

{

//---

MqlTradeRequest request={};

MqlTradeResult  result={};


CopyBuffer(maFastHandle, 0, 0, 3, maFast); //将句柄对应的指标数值复制入数组

CopyBuffer(maSlowHandle, 0, 0, 3, maSlow); //同上


if (maFast[1]>maSlow[1] && maFast[2]<=maSlow[2]) //数组获得指标的数值后,就可以进行均线交叉的判定了

{

request.action = TRADE_ACTION_DEAL;

request.symbol = Symbol();

request.volume = 0.11;

request.price = SymbolInfoDouble(Symbol(), SYMBOL_ASK);

request.type = ORDER_TYPE_BUY;

//--- 发送请求

   if(!OrderSend(request,result))

      PrintFormat("OrderSend error %d",GetLastError());     // 如果不能发送请求,输出错误代码

//--- 操作信息

   PrintFormat("retcode=%u  deal=%I64u  order=%I64u",result.retcode,result.deal,result.order);

}

else if ()

{


} 

}

 

同样的问题,几乎隔一周就有人问一次。

一、先检查持仓,有仓就不开单。

二、不要用挂单,每次挂一张单,可能会挂出几千单。

三、长短均线在交叉临界点上震荡,每次震荡都开一张单。
 
交叉判断的时候增加一个仓位判断就可以满足你要的功能,但是获取持仓单数据的时候,最好包含魔法号和开仓方向的限制,要不然如果还有其他非当前EA开仓的单子,或者不是想要的方向的单子,就乱了。
 
控制双均线交叉仅开一次单而不重复开单 …… (可手动平仓)   声明两个bool变量,一个为开BUY,一个为开SELL,如:bool flagB=false,flagS=false;   当开BUY成功时, flagB=true;  当满足BUY平仓条件时, flagB=false ;这样,即使你手动平仓了该BUY单,因为还没满足EA的BUY平仓条件,flagB仍为真,即使均线仍处于金叉状态,也不会再次开立BUY订单了。空间类推。当然,这个得根据你的策略,具体情况具体分析使用,你问题没描述离场,所以也不确定 此法一定可行。如果仅控制不重复开单,不考虑  可手动平仓,那楼上1、2楼答主方案均可用。
 
Lin Luo #:
控制双均线交叉仅开一次单而不重复开单 …… (可手动平仓)   声明两个bool变量,一个为开BUY,一个为开SELL,如:bool flagB=false,flagS=false;   当开BUY成功时, flagB=true;  当满足BUY平仓条件时, flagB=false ;这样,即使你手动平仓了该BUY单,因为还没满足EA的BUY平仓条件,flagB仍为真,即使均线仍处于金叉状态,也不会再次开立BUY订单了。空间类推。当然,这个得根据你的策略,具体情况具体分析使用,你问题没描述离场,所以也不确定 此法一定可行。如果仅控制不重复开单,不考虑  可手动平仓,那楼上1、2楼答主方案均可用。
请问下如果当根k线没走完因波幅大打止损了但是仍然满足开单条件会再次开单这该怎么限制它一根k线同一个方向只能开一次,打了止损如果满足了开反方向单当根k线也只能开一次。这个该如何解决。一根k线时间长的话即使限制了只下一单,打止损了因为满足条件也会反复开单再次打止损
 
crt6789 #:
请问下如果当根k线没走完因波幅大打止损了但是仍然满足开单条件会再次开单这该怎么限制它一根k线同一个方向只能开一次,打了止损如果满足了开反方向单当根k线也只能开一次。这个该如何解决。一根k线时间长的话即使限制了只下一单,打止损了因为满足条件也会反复开单再次打止损

止损有两种损法:一种是达到自定义止损点值时发送平仓指令OrderClose()的止损,另一种是按止损点值计算为止损价直接报平台,因触发此止损价的止损。不同的止损法需要采用不同的识别判断方法,前者直接用上述方法,如不想再开,则此平仓时标志不置假即可,后者则可从历史订单中找注释标记有sl字样订单,如果最后平仓订单为此订单则当前K不再开仓,OK。

 
Lin Luo #:

止损有两种损法:一种是达到自定义止损点值时发送平仓指令OrderClose()的止损,另一种是按止损点值计算为止损价直接报平台,因触发此止损价的止损。不同的止损法需要采用不同的识别判断方法,前者直接用上述方法,如不想再开,则此平仓时标志不置假即可,后者则可从历史订单中找注释标记有sl字样订单,如果最后平仓订单为此订单则当前K不再开仓,OK。

多些解惑。第一种用平仓方式来止损应该还能起到防止平台在某个时段标的物流动性不好而刻意操纵触发客户止损单的功效吗?我们大多数人思维只局限于第二种显式的点位止损了
 
Lin Luo #:

止损有两种损法:一种是达到自定义止损点值时发送平仓指令OrderClose()的止损,另一种是按止损点值计算为止损价直接报平台,因触发此止损价的止损。不同的止损法需要采用不同的识别判断方法,前者直接用上述方法,如不想再开,则此平仓时标志不置假即可,后者则可从历史订单中找注释标记有sl字样订单,如果最后平仓订单为此订单则当前K不再开仓,OK。

修改之后控制了只下一次单,当根k线不再重复下单,不过,之后更新的k线也不能够加仓了。请问这加仓的控制该如何修正一下呢?

 

还有个办法,每次开仓在出现新K线的时候就行,当前K就会只开一次

增加一个判断是否产生新K线的函数,放在开仓前(或者比较两个MA线之前)就好