int start()
{
if(IsNewCandle())
{
CheckForMaTrade();//signals, deletions and candle trails only need checked on a new candle.
}
if(OpenOrdersThisPair(Symbol())>0)
{
if(UseMoveToBreakEven)MoveToBreakEven();//Move to b/e, normal trail and MA_trail need to trail on each tickif(Use_MA_Trail)MA_Trail();
}
//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////if(OrderSelect(OrderTicket(),SELECT_BY_TICKET, MODE_TRADES)==True)
{
if(OpenOrdersThisPair(Symbol())>0 && OrderSymbol()==Symbol() && OrderType()==OP_SELL)
{
CloseHalfOrder1();
}
if(OpenOrdersThisPair(Symbol())>0 && OrderSymbol()==Symbol() && OrderType()==OP_BUY)
{
CloseHalfOrder();
}
}
}
for(int b=OrdersTotal()-1; b>=0; b--)
{
if(!OrderSelect(b, SELECT_BY_POS, MODE_TRADES)) continue;
if( OrderType() == OP_BUYSTOP &&
OrderMagicNumber() == MagicNumber &&
OrderSymbol() == Symbol() )
{
if(OrderStopLoss() < iMA(NULL, 60, MA_Period, 0, 1, 0, 0) - ATR)
{
Stored_BuyPrice = OrderOpenPrice();
DeleteOrder = OrderDelete(OrderTicket());
}
if(OpenOrdersThisPair(Symbol()) == 0 && DeleteOrder) // If there are no open orders = place a new order.
{
int NewBuyOrder = OrderSend(Symbol(), OP_BUYSTOP, LotSize, Stored_BuyPrice, 3, BuyStopPrice, btp, NULL, MagicNumber, 0, Green);
if(NewBuyOrder == -1) Print("New Buy Order Last Error = ", GetLastError());
}
}
}
bool IsNewCandle()
{
static datetime Bar1Time;
if(Bar1Time == Time[1]) //"Time" used to be "Bars" with no brackets
return(false);
Bar1Time = Time[1]; //"Time" used to be "Bars" with no brackets
return(true);
}
//+----------------------------------------------------------------------------------------------------------------------------------------+ //Moving Average Trailing Stop Function//+----------------------------------------------------------------------------------------------------------------------------------------+ void MA_Trail()
{
double ATR = iATR(NULL,60,14,1);
double MA = iMA(NULL,60,MA_Period,0,1,0,1);
double BuyStopPriceMath = MA - ATR;
double SellStopPriceMath = MA + ATR;
double BuyStopPrice = NormalizeDouble(BuyStopPriceMath,5);
double SellStopPrice = NormalizeDouble(SellStopPriceMath,5);
for(int b=OrdersTotal()-1; b>=0; b--)
{
if(OrderSelect(b,SELECT_BY_POS,MODE_TRADES))
if(OrderMagicNumber()==MagicNumber)
if(OrderSymbol()==Symbol())
{
//buy order section - This is where the stop will trail based // upon a fixed point value stated on the EA. It will trail with price.if(OrderType()==OP_BUY)
{
if(OrderStopLoss() > BuyStopPrice) break;
if(OrderStopLoss() < BuyStopPrice)
bool BuyModify = OrderModify(OrderTicket(),OrderOpenPrice(),BuyStopPrice,OrderTakeProfit(),0,CLR_NONE);
if(!BuyModify)Print(" Buy Trailing Stop Failed: ", GetLastError());
}
// sell order section - This is where the stop will trail based // upon a fixed point value stated on the EA. It will trail with price. if(OrderType()==OP_SELL)
{
if(OrderStopLoss() < SellStopPrice) break;
if(OrderStopLoss() > SellStopPrice)
bool SellModify = OrderModify(OrderTicket(),OrderOpenPrice(),SellStopPrice,OrderTakeProfit(),0,CLR_NONE);
if(!SellModify)Print(" Sell Trailing Stop Failed: ", GetLastError());
}
}
}
}
对不起 - 这是我的错,我没有解释清楚。我在D1、4Hr和1Hr上查看MA的扇形分布(在其他过滤器中)--一旦它们都排好队,在H1上,它将等待任何条形回拉到21 EMA一次,然后从那里它将在高点以上下单,并在60 EMA以下停止--ATR。
回撤到21 EMA的情况只发生一次。从那里开始,它将停止寻找对21 EMA的任何回撤。然而,它应该做的是,确保当前打开的待定订单与每小时收盘后的手数、止损和获利都是准确的更新。然而,我无法理解,为什么有时它能完美地工作,并在每个H1收盘后更新挂单,而有时却不能?为什么挂单会自行更新的原因是""if(OrderStopLoss() < iMA(NULL, 60, MA_Period, 0,1, 0, 0)) - ATR)"。
如果这不是真的,那么它就不会 - 然而,有无数次,当这是真的,但它不会删除订单并以新的价值放置一个新的订单?
不知道你是否能在上面的代码中看到与视频有关的东西?(你纠正的第一个代码)。希望这更清楚?
我认为你必须以艰难的方式来做......打印相关的变量,在策略测试器中 通过时间移动,如果需要的话,逐点验证变量是什么......然后如果你发现它们应该使某些事情发生,而它们没有,你可以专注于该代码。
发现别人代码中的简单语法问题相对容易,发现其策略编码中的错误则更难,也更耗时,因为要做到这一点,策略的理解必须和做编码的人一样,甚至更好。
我需要弄清楚的一件事是;这里的代码,在循环中,我如何确保它正在执行OrderDelete()函数,并且循环是在每一个H1收盘时循环 的?这是因为我在 "int start "处有这个,描述了循环是否在H1基础上完成?("IsNewCandle()")?
CheckForMATrade()在每个新条上被调用一次,如果你在H1图表上运行,那就是在新的H1条开始时调用一次 ......其余的是在每个点上 执行。
你是否为新条形图的开始计算了正确的ATR值? 考虑到你刚刚开始了第0条,你是否真的想获得基于第0条的MA值?指标不是我的专长,所以不要以为我说你错了,我只是问一下
。
是的,我刚刚做了一个打印,仔细检查了MA-ATR的计算。它是正确的。我是在第1条(最近关闭的H1条)上做的。数学是正确的,我只是不认为计算是在每一个上半年收盘时进行的...。
虽然MA不在第1小节上......。
最后一个问题,如果你不介意的话--我仍然收到这个该死的订单修改错误 1!当我把它打印出来时,发现它是从这里来的?有什么想法吗?
说得好--谢谢 :)我想我知道为什么它没有删除订单......如果OrderStopLoss不大于MA-ATR,那么它就不会做任何事情......所以这是有道理的...只是有时我看着它,它好像不想删除订单,而在它应该删除的时候放置一个新的订单?
最后一个问题,如果你不介意的话--我仍然收到这个该死的订单修改错误1!当我把它打印出来时,发现它是从这里来的?有什么想法吗?
这就是问题所在 .... (OP_SELL的情况也类似)
if( OrderStopLoss() < BuyStopPrice )
. . . 当你得到一个错误1,这是因为OrderStopLoss() == BuyStopPrice,所以你修改订单,使其具有相同的StopLoss值,因此错误1,所以现在你在想,一方面OrderStopLoss()== BuyStopPrice,另一方面OrderStopLoss()< BuyStopPrice
你有没有按照帖子中的链接阅读,直到你的眼睛出血? 我打赌你没有 . . .https://www.mql5.com/en/forum/146380 如果你继续忽视这个问题,它就会一直抓住你,你就会一直浪费时间 . . . 掌握它,了解它,不要再受它的影响,要快乐起来
好吧,我再读一遍所有的内容--回到所附视频的问题上,我认为我已经解决了这个问题,但是,它在买入方面不起作用?由于某些原因,根本就没有交易被触发。然而,在卖出方面,它完全按照我想要的方式工作?
买方的一切都完全颠倒了。所有这些if语句只是移动平均线。我所改变的具体行数是"triggerBarTime+H1_high >= ema21"。在买入方面,它看起来像= "triggerBarTime+H1_low <= ema21" - 如果我去掉 "triggerBarTime",那么它将对买入和卖出订单都有效。然而,如果我保留 "triggerBarTime",它将在卖出方完美地工作(例如,在每一个柱子上关闭订单,完美地重新计算,然后用调整后的参数下一个新订单!)。但在买入方面,却不能下任何订单,也不能尝试做任何事情?这是一个非常重要的调整,我需要做...
请看这个视频: http://screencast.com/t/uJu3nlNxAXDF - 希望这能很好地解释它!:D
如果你不能提供帮助,请不要担心 :)