int BreakEvenPoints=50;
double BE_Decimal=BreakEvenPoints*Point;
//--- modifies Stop Loss price for buy order if(BreakEvenPoints>0)
{
OrderSelect(BuyTicket,SELECT_BY_TICKET);
if(Bid-OrderOpenPrice()>BE_Decimal)
{
if(OrderStopLoss()<OrderOpenPrice())
{
bool res=OrderModify(BuyTicket,OrderOpenPrice(),NormalizeDouble(OrderOpenPrice()+Point,Digits),
OrderTakeProfit(),0,clrNONE);
if(!res)
Print("Error in OrderModify to BE. Error code=",GetLastError());
elsePrint("Order modified to BE successfully.");
}
}
}
int start()
{
staticdatetime 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(BuyTicket==-1)
{
if((iOpen(NULL,0,1)<PreviousSlow && PreviousPriceClose>=PreviousSlow && Bid>=(PreviousSlow+PipsBeforeEntry*Pips)) )
{
BuyTicket=OrderSend(Symbol(),OP_BUY,LotSize,Ask,Slippage,Ask-(StopLoss*Pips),0,"Main Entry EA",MagicNumber,0,clrLimeGreen);
}
}
//Stop Order Modify for buy starts hereint BreakEvenPoints=50;
double BE_Decimal=BreakEvenPoints*Point;
if(BreakEvenPoints>0)
{
OrderSelect(BuyTicket,SELECT_BY_TICKET);
if(Bid-OrderOpenPrice()>BE_Decimal)
{
if(OrderStopLoss()<OrderOpenPrice())
{
bool res=OrderModify(BuyTicket,OrderOpenPrice(),NormalizeDouble(OrderOpenPrice()+Point,Digits),OrderTakeProfit(),0,clrNONE);
if(!res)
Print("Error in OrderModify to BE. Error code=",GetLastError());
elsePrint("Order modified to BE successfully.");
}
}
}
elseif(OrderSelect(BuyTicket,SELECT_BY_TICKET))
{
if(OrderCloseTime()==0)
{
if(Close[0]<PreviousSlow)
{
bool CloseTicket=OrderClose(BuyTicket,LotSize,Bid,Slippage,clrPink);
if(CloseTicket)
BuyTicket=-1;
}
}
else
BuyTicket=-1; //Order has closed so reset variable
}
更新。
我又在网上搜索了一下,把它改成了以下内容。
int BreakEvenPoints=50;
double BE_Decimal=BreakEvenPoints*Point;
if(BreakEvenPoints>0)
{
if (OrderSelect(BuyTicket,SELECT_BY_TICKET))
{if(Bid-OrderOpenPrice()>BE_Decimal)
{
if(OrderStopLoss()<OrderOpenPrice())
{
bool res=OrderModify(BuyTicket,OrderOpenPrice(),NormalizeDouble(OrderOpenPrice()+10*Point,Digits),OrderTakeProfit(),0,clrNONE);
if(!res)
Print("Error in OrderModify to BE. Error code=",GetLastError());
elsePrint("Order modified to BE successfully.");
}
}
}
}
这是个小变化,因为它正在检查关闭一个没有的订单。
根据代码,没有理由在买入结束后立即打开卖出。
退出买入的条件与打开卖出的条件是不一样的。
请记住,由于你只检查蜡烛的开盘情况,Close[0]将是该蜡烛的第一个刻度的买入值。
嘿,GumRai。
我想知道你是否能够/愿意在我的代码上多帮我一点?如果你能告诉我,我应该研究哪些代码,我会先自己尝试编码,然后有什么问题再来找你。
我想要的是,一旦进行交易,它将止损 放在,比如,50点(这是它现在做的)。然而,一旦价格向交易方向移动60点,它就会将止损移到收支平衡点,再往后就会变成距离交易70点的拖曳止损。
我怎样才能做到这一点呢?像往常一样,我们将非常感谢任何帮助。
对于收支平衡,我总是把SL移到至少收支平衡+1点。这就避免了在以后的检查中可能出现的比较双倍的问题。
这只是一个检查2个条件的案例(对于买入)。
和
然后修改订单,使止损点为开盘价+1点或你可能决定锁定的任何金额。
对于卖出来说,它是相反的条件,但你也应该编写代码,以考虑到如果SL最初是0。
OrderOpenPrice()>OrderStopLoss() || OrderStopLoss()==0
对于收支平衡,我总是把SL移到至少收支平衡+1点。这就避免了在以后的检查中可能出现的比较双倍的问题。
这只是一个检查2个条件的案例(对于买入)。
和
然后修改订单,使止损点为开盘价+1点或你可能决定锁定的任何金额。
对于卖出来说,它是相反的条件,但你也应该编写代码,以考虑到如果SL最初是0。
非常感谢。事实上,我所要做的是增加足够的点数,以便它刚好(大致)覆盖交易的经纪费用。
对于第二行......我为什么要使用Orderclose价格-OrderOpenPrice?我不太理解这段代码。我不是应该使用 "买入价-订单开盘价 "吗,因为这样可以跟踪价格的变化情况?
我在这里做的事和下面的事接近吗?
我已经把上面的佣金作为一个外部声明。而且我用Bid代替了。
编辑。
所以我猜(根据我在下面发现的),我在上面发布的代码是不正确的?我在MQL4的书/帮助中发现了以下内容......它似乎只是一个追踪止损,而我需要的是首先是一个平衡止损,然后是追踪止损。我怎样才能修改这个?
你的整个代码块是以BuyTicket==-为条件的。
如果订单被打开,那么BuyTicket不会=-1,所以在交易打开的时候,不会对移动到BE进行检查。
票号与价格有什么关系?
你 必须 在使用OrderOpenPrice()之前选择一个订单
OrderClosePrice()是选择买入订单时的买入价,卖出订单时的卖出价(当订单仍处于开放状态)。
所以我猜(根据我发现的以下情况),我上面发布的代码是不正确的?我在MQL4的书/帮助中发现了以下内容......它似乎只是一个追踪止损,而我需要的是首先是一个平衡止损,然后是追踪止损。我怎样才能修改这个?
试试这个
谢谢你的点拨!我已经做了必要的修改。当我编译时,它显示了一个警告:"应检查'OrderSelect'的返回值。奇怪的是,这意味着只有一个买入被触发,其余的又是一个4108错误代码。卖出工作正常(我没有对其进行任何修改)。
这是买入代码的整个部分,以防我做错了什么--但这部分不应该是,因为我所添加的只是中间的这段代码。其余部分和以前一样,工作得非常好。我在这里犯了什么错?
更新。
我又在网上搜索了一下,把它改成了以下内容。
这消除了我点击编译时产生的错误。但它仍然在日志中产生OrderModify错误4108。
你所有的代码都包含在if条件中
所以它只在每个新条形图上执行一次。
当BuyTicket == -1时,你是想选择票号为-1的订单,当然它不存在。
在尝试选择订单之前,请检查 BuyTicket是否>0
你所有的代码都包含在if条件中
所以它只在每个新柱子上执行一次。
谢谢你指出这一点。
因此,我在顶部创建了一个额外的括号,就在Start之后,像这样。
int start() { {
然后关闭了一个括号(它结束了整个if(bar_time!=Time[0]) 部分,然后将代码放在最后,后面是一个回车(0);和结束括号来结束start()。
无论是代码还是回测 日志都没有错误,但它只进行了一次买入交易,仅此而已--那也是在开盘时关闭的,尽管价格没有比开盘时高多少--更不用说移动50点了。
我想这可能与你提到的BuyTicket == -1有关。但说实话,我不知道如何去改变它。我根据你对初始代码的建议把-1的东西放进去了--这非常有效。但我如何在选择订单前检查BuyTicket是否为0?
但我如何在选择订单之前检查BuyTicket>0?
很抱歉,如果你非要问这个问题,那么你想写的代码对你的知识水平来说太复杂了。
我不能为你一次写一点的代码。