有助于精简EA

 

有谁能帮我微调一下EA吗?

它可以做得更好 - 我所看到的是在错误的地方买入和卖出。

附加的文件:
jbtest3.mq4  5 kb
 
delcor wrote>>

有谁能帮我微调一下EA吗?

它可以做得更好 - 我所看到的是在错误的地方买入和卖出。

你想解释一下你的策略吗?在微调之前,我们需要检查它是否按照所述策略进行编码。

如果代码是正确的,而我们从EA得到的交易却很差,那么是策略出了问题?从手动交易来看,该策略运行良好吗?

 
ronaldosim:

你想解释一下你的策略吗?我们需要检查它是否按照所述策略进行编码,然后才能对其进行微调。

如果代码是正确的,而我们从EA得到的交易却很差,那么是策略出了问题?该策略在手动交易中是否运行良好?

谢谢你回来

该策略是--它必须只在ema交叉时买入或卖出。有一个设置工作得很好,如果它只在交叉时买入和卖出,它将获得利润

我已经把它捆绑在一起,但它不会在两个ema交叉时买入。

它必须关闭开仓订单,并在短ema与长ema交叉时买入,反之亦然。在这个阶段,我希望它只做这个。

然后我们就可以进行第二阶段了。在这个阶段没有资金管理。

你能帮助我吗?

目前,它对欧元/美元15和1小时TF做了工作 - 但还不够。

 
delcor wrote>>

谢谢你回来

该策略是--它必须只在ema交叉时买入或卖出。有一个设置工作得很好,如果它只在交叉时买入和卖出,它将获得利润。

我已经把它捆绑在一起,但它不会在两个ema交叉时买入。

它必须关闭开仓订单,并在短ema与长ema交叉时买入,反之亦然。在这个阶段,我希望它只做这个。

然后我们就可以进行第二阶段了。在这个阶段没有资金管理。

你能帮助我吗?

目前,它对欧元/美元15和1小时TF做了工作--但还不够。

我怀疑是这样;对于EMA交叉点,你的代码是不正确的

Ema=iMA(NULL,0,ShortEma,LongEma,MODE_EMA,PRICE_CLOSE,0)。

你需要两个iMA分别用于长EMA和短EMA

SEMA1=iMA(NULL,0,ShortEma,0,MODE_EMA,PRICE_CLOSE,1)。

LEMA1=iMA(NULL,0,LongEma,0,MODE_EMA,PRICE_CLOSE,1);

SEMA2=iMA(NULL,0,ShortEma,0,MODE_EMA,PRICE_CLOSE,2)。

LEMA2=iMA(NULL,0,LongEma,0,MODE_EMA,PRICE_CLOSE,2)。

并检查是否有交叉

如果(SEMA1>LEMA1 && SEMA2<LEMA2) 发送买入指令

而对于卖出

如果(SEMA1<LEMA1 && SEMA2>LEMA2) 发送卖出指令

 
ronaldosim:

我怀疑是这样;对于EMA交叉点,你的代码是不正确的

Ema=iMA(NULL,0,ShortEma,LongEma,MODE_EMA,PRICE_CLOSE,0)。

你需要两个iMA,分别用于长EMA和短EMA

SEMA1=iMA(NULL,0,ShortEma,0,MODE_EMA,PRICE_CLOSE,1)。

LEMA1=iMA(NULL,0,LongEma,0,MODE_EMA,PRICE_CLOSE,1);

SEMA2=iMA(NULL,0,ShortEma,0,MODE_EMA,PRICE_CLOSE,2)。

LEMA2=iMA(NULL,0,LongEma,0,MODE_EMA,PRICE_CLOSE,2)。

并检查是否有交叉

如果(SEMA1>LEMA1 && SEMA2<LEMA2) 发送买入指令

而对于卖出

如果(SEMA1<LEMA1 && SEMA2>LEMA2) 发送卖出指令

好的,所以

SEMA1=iMA(NULL,0,ShortEma,0,MODE_EMA,PRICE_CLOSE,1)。

LEMA1=iMA(NULL,0,LongEma,0,MODE_EMA,PRICE_CLOSE,1)。

SEMA2=iMA(NULL,0,ShortEma,0,MODE_EMA,PRICE_CLOSE,2);

LEMA2=iMA(NULL,0,LongEma,0,MODE_EMA,PRICE_CLOSE,2)。

必须放在 "检查未结订单的条件--在 "获得移动平均线 "下面

和"

if (SEMA1>LEMA1 && SEMA2<LEMA2) sendbuy order" 其中 ?

还有,LEMA1和LEMA2必须在顶部定义。


尚在襁褓之中

我的skype是delcor59,如果你想和我skype的话。

谢谢你的帮助

 
delcor wrote>>

好的,所以

SEMA1=iMA(NULL,0,ShortEma,0,MODE_EMA,PRICE_CLOSE,1)。

LEMA1=iMA(NULL,0,LongEma,0,MODE_EMA,PRICE_CLOSE,1)。

SEMA2=iMA(NULL,0,ShortEma,0,MODE_EMA,PRICE_CLOSE,2);

LEMA2=iMA(NULL,0,LongEma,0,MODE_EMA,PRICE_CLOSE,2)。

必须放在 "检查未结订单的条件--在 "获得移动平均线 "下面

和"

if (SEMA1>LEMA1 && SEMA2<LEMA2) send buy order" 其中 ?

另外,LEMA1和LEMA2必须在顶部定义。

我还是个新手

我的skype是delcor59,如果你想和我skype的话。

谢谢你的帮助

像这样修改你自己的代码....

空白的CheckForOpen()。
{
双倍Ema;
int res;
//----,只对新条形图的第一个点进行交易。
if(Volume[0]>1) return;
//---- 获取移动平均线
Ema=iMA(NULL,0,ShortEma,LongEma,MODE_EMA,PRICE_CLOSE,0)。
double SEMA1=iMA(NULL,0,ShortEma,0,MODE_EMA,PRICE_CLOSE,1);
double LEMA1=iMA(NULL,0,LongEma,0,MODE_EMA,PRICE_CLOSE,1);
double SEMA2=iMA(NULL,0,ShortEma,0,MODE_EMA,PRICE_CLOSE,2);
double LEMA2=iMA(NULL,0,LongEma,0,MODE_EMA,PRICE_CLOSE,2);

//---- 卖出条件
// if(Open[1]>Ema && Close[1]<Ema)
如果(SEMA1<LEMA1 && SEMA2>LEMA2)
{
res=OrderSend(Symbol(),OP_SELL,LotsOptimized(),Bid,3,0,0,",MAGICMA,0,Red)。
返回。
}
//---- 买入条件
// if(Open[1]<Ema && Close[1]>Ema)
如果(SEMA1>LEMA1 && SEMA2<LEMA2)
{
res=OrderSend(Symbol(),OP_BUY,LotsOptimized(),Ask,3,0,0,",MAGICMA,0,Blue)。
返回。
}
//----
}

空白 CheckForClose()
{
Double Ema;
//----,只对新条形图的第一个点进行交易。
if(Volume[0]>1) return;
//---- 获取移动平均线
Ema=iMA(NULL,0,ShortEma,LongEma,MODE_EMA,PRICE_CLOSE,0)。
double SEMA1=iMA(NULL,0,ShortEma,0,MODE_EMA,PRICE_CLOSE,1);
double LEMA1=iMA(NULL,0,LongEma,0,MODE_EMA,PRICE_CLOSE,1);
double SEMA2=iMA(NULL,0,ShortEma,0,MODE_EMA,PRICE_CLOSE,2);
double LEMA2=iMA(NULL,0,LongEma,0,MODE_EMA,PRICE_CLOSE,2);
//----
for(int i=0;i<OrdersTotal();i++)
{
if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES)==false) break;
如果(OrderMagicNumber()!=MAGICMA || OrderSymbol()!=Symbol()) 继续。
//---- 检查订单类型
如果(OrderType()==OP_BUY)
{
// if(Open[1]>Ema && Close[1]<Ema)
if (SEMA1<LEMA1 && SEMA2>LEMA2) OrderClose(OrderTicket(),OrderLots(),Bid,3,White) 。
休息。
}
如果(OrderType()==OP_SELL)
{
// if(Open[1]<Ema && Close[1]>Ema)
if (SEMA1>LEMA1 && SEMA2<LEMA2) OrderClose(OrderTicket(),OrderLots(),Ask,3,White) 。
休息。
}
}
//----
}

 
ronaldosim:

像这样修改自己的代码的东西....

空白的CheckForOpen()
{
double Ema;
int res;
//----,只对新条形图的第一个点进行交易。
if(Volume[0]>1) return;
//---- 获取移动平均线
Ema=iMA(NULL,0,ShortEma,LongEma,MODE_EMA,PRICE_CLOSE,0)。
double SEMA1=iMA(NULL,0,ShortEma,0,MODE_EMA,PRICE_CLOSE,1);
double LEMA1=iMA(NULL,0,LongEma,0,MODE_EMA,PRICE_CLOSE,1);
double SEMA2=iMA(NULL,0,ShortEma,0,MODE_EMA,PRICE_CLOSE,2);
double LEMA2=iMA(NULL,0,LongEma,0,MODE_EMA,PRICE_CLOSE,2);

//---- 卖出条件
// if(Open[1]>Ema && Close[1]<Ema)
如果(SEMA1<LEMA1 && SEMA2>LEMA2)
{
res=OrderSend(Symbol(),OP_SELL,LotsOptimized(),Bid,3,0,0,",MAGICMA,0,Red)。
返回。
}
//---- 买入条件
// if(Open[1]<Ema && Close[1]>Ema)
如果(SEMA1>LEMA1 && SEMA2<LEMA2)
{
res=OrderSend(Symbol(),OP_BUY,LotsOptimized(),Ask,3,0,0,",MAGICMA,0,Blue)。
返回。
}
//----
}

空白 CheckForClose()
{
Double Ema;
//----,只对新条形图的第一个点进行交易。
if(Volume[0]>1) return;
//---- 获取移动平均线
Ema=iMA(NULL,0,ShortEma,LongEma,MODE_EMA,PRICE_CLOSE,0)。
double SEMA1=iMA(NULL,0,ShortEma,0,MODE_EMA,PRICE_CLOSE,1);
double LEMA1=iMA(NULL,0,LongEma,0,MODE_EMA,PRICE_CLOSE,1);
double SEMA2=iMA(NULL,0,ShortEma,0,MODE_EMA,PRICE_CLOSE,2);
double LEMA2=iMA(NULL,0,LongEma,0,MODE_EMA,PRICE_CLOSE,2);
//----
for(int i=0;i<OrdersTotal();i++)
{
if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES)==false) break;
如果(OrderMagicNumber()!=MAGICMA || OrderSymbol()!=Symbol()) 继续。
//---- 检查订单类型
如果(OrderType()==OP_BUY)
{
// if(Open[1]>Ema && Close[1]<Ema)
if (SEMA1<LEMA1 && SEMA2>LEMA2) OrderClose(OrderTicket(),OrderLots(),Bid,3,White) 。
休息。
}
如果(OrderType()==OP_SELL)
{
// if(Open[1]<Ema && Close[1]>Ema)
if (SEMA1>LEMA1 && SEMA2<LEMA2) OrderClose(OrderTicket(),OrderLots(),Ask,3,White) 。
休息。
}
}
//----
}

再次感谢你

有些事情是不对的,当我回测Ea时,只显示买入,没有卖出。

 
delcor wrote>>

再次感谢您

有些事情是不对的。当我回测Ea时,它只显示买入,没有卖出。

我注意到,取决于哪个订单先被启动,即买入或卖出,一旦交叉开始,你就启动一个订单,当相反的交叉时,你就关闭订单;在yr start()中,当你检查市场订单的存在时,你将阻止订单类型的一个永远不会启动,即当你以买入开始时,它将总是买入;当你以卖出订单开始时,它将总是卖出订单;去掉这个检查条件

 
ronaldosim:

注意到,根据哪个订单先被启动,即买入或卖出,一旦交叉开始,你就启动一个订单,当相反的交叉时,你就关闭订单;在yr start()中,当你检查市场订单的存在时,你将阻止订单类型的一个永远不会启动,即当你以买入开始时,它将永远是买入;当你以卖出订单开始时,它将永远是卖出订单;去掉这个检查条件

你指的是EA底部的检查条件吗?

//+------------------------------------------------------------------+
//| 启动功能|
//+------------------------------------------------------------------+
void start()
{
//---- 检查历史和交易
if(Bars<100 || IsTradeAllowed()==false) return;
//---- 按当前符号计算未结订单
if(CalculateCurrentOrders(Symbol() ==0)CheckForOpen();
else CheckForClose();
//----

}


因为还有

空白 检查开仓()

无效CheckForClose()

 
delcor:

你指的是EA底部的检查条件吗?

//+------------------------------------------------------------------+
//|启动功能|
//+------------------------------------------------------------------+
空白启动()
{
//---- 检查历史和交易情况
如果(Bars<100 || IsTradeAllowed()==false) 返回。
//---- 按当前符号计算未结订单
如果(CalculateCurrentOrders(Symbol())==0)CheckForOpen();
否则CheckForClose()。
//----

}


因为还有

void CheckForOpen()

无效CheckForClose()




请告诉我,在EA程序中是否有一个测试系统,以显示该EA运行时的步骤。

 
delcor wrote>>

你指的是EA底部的检查条件吗?

//+------------------------------------------------------------------+
//| 启动功能|
//+------------------------------------------------------------------+
空白启动()
{
//---- 检查历史和交易情况
如果(Bars<100 || IsTradeAllowed()==false) 返回。
//---- 按当前符号计算未结订单
如果(CalculateCurrentOrders(Symbol())==0)CheckForOpen();
否则CheckForClose()。
//----

}

因为还有

void CheckForOpen()

无效的CheckForClose()

如果(Bars<100 || IsTradeAllowed()==false) 返回。
//---- 按当前符号计算未结订单
CheckForOpen();
CheckForClose();
//----