double CurrentSlow = iMA(NULL,0,SlowMa,SlowMaShift, SlowMaMethod, SlowMaAppliedTo,0);
这个值在当前的蜡烛中是变化的
double CurrentCandleOpen= iOpen(NULL,0,0);
这不是
BuyTicket = OrderSend(Symbol(),OP_BUY, LotSize,CurrentCandleOpen, Slippage, Ask-(StopLoss*Pips), Ask+(TakeProfit*Pips), "Main Entry EA", 0,0,clrLimeGreen);
CurrentCandleOpen不太可能是许多点的有效入场价格
如果你必须使用这个逻辑,只在一个新条形图打开时计算一次。
如果OrderSend失败,检查 返回值
这个值在当前的蜡烛中是变化的
这不是
CurrentCandleOpen不太可能是许多点的有效入场价格
如果你必须使用这个逻辑,只在一个新条形图打开时计算一次。
如果OrderSend失败,请检查返回值
谢谢你的快速回复让我看看我的理解是否正确。
- CurrentSlow不会真正发挥作用,因为它仍在形成。好的,这很好,我可以使用为前一根蜡烛形成的移动平均线 的值。这不应该是个问题。
- 既然CurrentCandleOpen不是一个移动值......那么我假设代码的这一部分是正确的?
- 我怎样才能使其工作,使其与CandleOpen足够接近?--你提到只在新条形图打开时计算一次。能否请你详细说明一下?我不太知道该怎么做。
大括号内的代码只在新条形图的第一个刻度处执行。
谢谢你的代码!我按照之前的讨论更新了以下内容。
- 将MA的当前慢速改为先前慢速。
- 删除了 CurrentCandleOpen与Ask。每当我使用CurrentCandleOpen,而不是Ask时,它没有进行任何交易。然而,当我用Ask代替它时,它起作用了,但当然是在Ask越过MA时进行交易,而不是在Candle Open时。
但是在这之后,当我把它放在你的代码中,如下所示,它又没有进行任何交易。我是否正确地插入了这个?
int start()
{
//---
double PreviousSlow = iMA(NULL,0,SlowMa,SlowMaShift, SlowMaMethod, SlowMaAppliedTo,1); //1 at the end signifies that we want it on candle close
double CurrentSlow = iMA(NULL,0,SlowMa,SlowMaShift, SlowMaMethod, SlowMaAppliedTo,0); //1 at the end signifies that we want it on candle close
double PreviousFast = iMA(NULL,0,FastMa,FastMaShift, FastMaMethod, FastMaAppliedTo,1); //1 at the end signifies that we want it on candle close
double CurrentFast = iMA(NULL,0,FastMa,FastMaShift, FastMaMethod, FastMaAppliedTo,0); //1 at the end signifies that we want it on candle close
double PreviousPriceClose= iClose(NULL, 0, 1);
double CurrentPriceClose= iOpen(NULL, 0, 0);
//----------------------Main calculation starts here
static datetime bar_time=0;
if(bar_time!=Time[0])
{
bar_time=Time[0];
if(PreviousPriceClose<PreviousSlow && Ask>PreviousSlow)
if(OrdersTotal () == 0)
BuyTicket = OrderSend(Symbol(),OP_BUY, LotSize,Ask, Slippage, Ask-(StopLoss*Pips), Ask+(TakeProfit*Pips), "Main Entry EA", 0,0,clrLimeGreen);
}
//--------------
return(0);
return(0);
}
为什么把iMA调用放在新的条形码之外?这意味着在不需要的情况下,它们每一次都 被调用,效率很低。
static datetime bar_time=0; if(bar_time!=Time[0]) { bar_time=Time[0]; double PreviousSlow = iMA(NULL,0,SlowMa,SlowMaShift,SlowMaMethod, SlowMaAppliedTo,1); double PreviousPriceClose=iClose(NULL,0,1); //You can just use Close[1] if(PreviousPriceClose<PreviousSlow && Bid>PreviousSlow) if(OrdersTotal()==0) { BuyTicket=OrderSend(Symbol(),OP_BUY,LotSize,Ask,Slippage,Ask-(StopLoss*Pips),Ask+(TakeProfit*Pips),"Main Entry EA",0,0,clrLimeGreen); if(BuyTicket==-1) { //Error checking code } }
不要使用Ask来比较MT4图表上的数值,它们是基于Bid价格的。
如果OrderSend失败,检查是否有错误。
你可能不会得到很多新条形图的第一个刻度在MA之上的情况,而前一个条形图的最后一个刻度是在MA之下。
似乎你有这个想法。
修改并发布你的代码,我或其他人会对它进行评论。
似乎你有这个想法。
修改并发布你的代码,我或其他人会对它进行评论。
我能够使它工作!谢谢GumRai。
现在我正在做同样的事情,但使用相反的规则来做空。独立运行时很好,但我不知道如何使用OrderCloseBy函数,以便如果多头未平仓,而空头触发时,它主要关闭多头,因为我不知道如何找到订单票。我尝试通过以下方式绕过OrderCloseBy。
int start() { //--- static datetime bar_time=0; if(bar_time!=Time[0]) { bar_time=Time[0]; double PreviousSlow = iMA(NULL,0,SlowMa,SlowMaShift,SlowMaMethod, SlowMaAppliedTo,1); double PreviousSlow2 = iMA(NULL,0,SlowMa,SlowMaShift,SlowMaMethod, SlowMaAppliedTo,2); double PreviousPriceClose=iClose(NULL,0,1); //You can just use Close[1] double PreviousPriceClose2=iClose(NULL, 0,2); if(PreviousPriceClose2<PreviousSlow2 && PreviousPriceClose>PreviousSlow && Bid>(PreviousSlow+PipsBeforeEntry*Pips)) if(OrdersTotal()==0) { BuyTicket=OrderSend(Symbol(),OP_BUY,LotSize,Ask,Slippage,Ask-(StopLoss*Pips),Ask+(TakeProfit*Pips),"Main Entry EA",0,0,clrLimeGreen); if(PreviousPriceClose2>PreviousSlow2 && PreviousPriceClose<PreviousSlow) if(OrdersTotal()==1) { OrderClose(BuyTicket,LotSize,Ask,Slippage,clrPink) && OrderSend(Symbol(), OP_SELL, LotSize, Bid, Slippage, Bid+(StopLoss*Pips),Bid-(TakeProfit*Pips),"Main Sell EA",0,0,clrAliceBlue); } if(OrdersTotal()==0) { OrderSend(Symbol(), OP_SELL, LotSize, Bid, Slippage, Bid+(StopLoss*Pips),Bid-(TakeProfit*Pips),"Main Sell EA",0,0,clrAliceBlue); } } //-------------- return(0); return(0); } return(0); }
if(PreviousPriceClose2>PreviousSlow2 && PreviousPriceClose<PreviousSlow) if(OrdersTotal()==1)
不能被满足,因为它是在条件块内。
if(OrdersTotal()==0)
static datetime bar_time=0; if(bar_time!=Time[0]) { bar_time=Time[0]; double PreviousSlow=iMA(NULL,0,SlowMa,SlowMaShift,SlowMaMethod,SlowMaAppliedTo,1); double PreviousSlow2=iMA(NULL,0,SlowMa,SlowMaShift,SlowMaMethod,SlowMaAppliedTo,2); double PreviousPriceClose=iClose(NULL,0,1); //You can just use Close[1] double PreviousPriceClose2=iClose(NULL,0,2); if(PreviousPriceClose2<PreviousSlow2 && PreviousPriceClose>PreviousSlow && Bid>(PreviousSlow+PipsBeforeEntry*Pips)) { if(OrdersTotal()==0) BuyTicket=OrderSend(Symbol(),OP_BUY,LotSize,Ask,Slippage,Ask-(StopLoss*Pips),Ask+(TakeProfit*Pips),"Main Entry EA",0,0,clrLimeGreen); } else if(PreviousPriceClose2>PreviousSlow2 && PreviousPriceClose<PreviousSlow) { if(OrdersTotal()==1) { OrderClose(BuyTicket,LotSize,Ask,Slippage,clrPink); OrderSend(Symbol(),OP_SELL,LotSize,Bid,Slippage,Bid+(StopLoss*Pips),Bid-(TakeProfit*Pips),"Main Sell EA",0,0,clrAliceBlue); } else if(OrdersTotal()==0) { OrderSend(Symbol(),OP_SELL,LotSize,Bid,Slippage,Bid+(StopLoss*Pips),Bid-(TakeProfit*Pips),"Main Sell EA",0,0,clrAliceBlue); } } }
我认为上面的方法更像你的意图
你应该检查 错误的返回代码
我认为上述情况更像你的意图
你应该检查错误的返回代码
谢谢你的代码......不幸的是,并没有真正发挥作用,因为它现在不止一次地进入空头。以下是我尝试做的事情--我把它分开--长线进入和退出,然后我将为短线进入和退出创建相反的方法。这对我来说更容易管理,而且更容易调整。我正在努力先把长线进场和出场部分做好。但不知何故,当蜡烛收于移动平均线以下时,这并没有关闭交易。知道我做错了什么吗?它给出了一个错误。应该检查'OrderClose'的返回值。我在网上搜索了一上午的解决方案,但似乎并不奏效。
static datetime bar_time=0; if(bar_time!=Time[0]) { bar_time=Time[0]; double PreviousSlow=iMA(NULL,0,SlowMa,SlowMaShift,SlowMaMethod,SlowMaAppliedTo,1); double PreviousSlow2=iMA(NULL,0,SlowMa,SlowMaShift,SlowMaMethod,SlowMaAppliedTo,2); double PreviousPriceClose=iClose(NULL,0,1); //You can just use Close[1] double PreviousPriceClose2=iClose(NULL,0,2); if(PreviousPriceClose2<PreviousSlow2 && PreviousPriceClose>PreviousSlow && Bid>(PreviousSlow+PipsBeforeEntry*Pips)) { if(OrdersTotal()==0) BuyTicket=OrderSend(Symbol(),OP_BUY,LotSize,Ask,Slippage,Ask-(StopLoss*Pips),Ask+(TakeProfit*Pips),"Main Entry EA",0,0,clrLimeGreen); } else if(PreviousPriceClose2>PreviousSlow2 && PreviousPriceClose<PreviousSlow && Bid<PreviousSlow) { OrderClose(BuyTicket,LotSize,Ask,Slippage,clrPink); }
更新:我已经摆脱了错误代码,但关闭票据似乎仍然不工作。我所希望的是,一旦蜡烛越过并收于MA下方,它就关闭买入。
嗨,伙计们。
我是在mql4中编码的新手,并且一直试图让我的第一个EA工作。老实说,我希望得到以下方面的帮助。这只是一个基本的交叉交易,但不是移动平均线交叉,而是价格越过移动平均线。
我需要一个订单在蜡烛开盘 时被触发,如果。(当前蜡烛开盘价 大于移动平均线),并且如果(前一根蜡烛收盘价低于移动平均线)。
到目前为止,我在主区域有以下代码。
//+------------------------------------------------------------------+
int start()
{
//---
double PreviousSlow = iMA(NULL,0,SlowMa,SlowMaShift, SlowMaMethod, SlowMaAppliedTo,1);
double CurrentSlow = iMA(NULL,0,SlowMa,SlowMaShift, SlowMaMethod, SlowMaAppliedTo,0);
double PreviousFast = iMA(NULL,0,FastMa,FastMaShift, FastMaMethod, FastMaAppliedTo,1);
double CurrentFast = iMA(NULL,0,FastMa,FastMaShift, FastMaMethod, FastMaAppliedTo,0);
double PreviousPriceClose= iClose(NULL, 0, 1);
double CurrentCandleOpen= iOpen(NULL,0,0);
//----------------------,主要计算从这里开始
如果(PreviousPriceClose<PreviousSlow && (CurrentCandleOpen>(CurrentSlow)))
如果(OrdersTotal() == 0)
BuyTicket = OrderSend(Symbol(),OP_BUY, LotSize,CurrentCandleOpen, Slippage, Ask-(StopLoss*Pips), Ask+(TakeProfit*Pips), "Main Entry EA", 0,0, clrLimeGreen);
//--------------
return(0);
return(0);
}
//+------------------------------------------------------------------+
无论我做什么,我似乎都不能工作,我认为我在这里做的事情不对。再次,我真的很感谢你的帮助