请帮忙修改一下移动止盈函数 新评论 Wen Feng Lin 2023.06.03 00:46 请帮忙修改一下移动止盈,或者请用MQ5帮忙写一个移动止盈的函数 需求如下: 初设止损点为500毫点,初设止盈点为600毫点,第一个止盈点为700 毫点,第二个止盈点为800毫点, 第二个止盈点为900毫点. 1.当行情盈利大于或等于初设止盈点600毫点,且小于第一个止盈点700毫点时 止损点修改为初设止盈点, 止盈点修改为第一个止盈点 . 2. 当行情盈利大于或等于第一个止盈点700毫点, 且小于第二个止盈点800毫点时 止损点修改为 第一个止盈点 , 止盈点修改为第二个止盈点 . 3. 当行情盈利大于或等于第二个止盈点800毫点, 且小于 第三个止盈点900毫点时 止损点修改为第二个止盈点 , 止盈点修改为第三个止盈点 . 以此类推. 自己试写了一下,欧美和黄金都回测过,但都不生效。请帮忙看一下以下代码或者逻辑有没有问题。 #property copyright "Copyright 2022, MetaQuotes Ltd." #property link "https://www.mql5.com" #property version "1.00" input int slpoint=500; // 初设止损点为500毫点 input int tppoint=600; // 初设止盈点为600毫点 input int tppoint1=700; // 初设第一个止盈点为700毫点 input int tppoint2=800; // 初设第二个止盈点为800毫点 input int tppoint3=900; // 初设第三个止盈点为900毫点 input double lots=0.01; // 开仓手数 input int magic=123; // 魔术码 int OnInit() { return(INIT_SUCCEEDED); } void OnDeinit(const int reason) { } void OnTick() { buy;// 开多单函数是没有问题的 TrailingStop (_Symbol,POSITION_TYPE_BUY,magic); } void TrailingStop (string symbol,ENUM_POSITION_TYPE type,int magic) { int t=PositionsTotal(); // 取得成交单子总数 if (t>0) // 如果有单子 { for(int i=t-1;i>=0;i--) // 历遍所有单子 { if(PositionGetTicket(i)>0) // 选中单子 { if(PositionGetString(POSITION_SYMBOL)==symbol) // 选取当前货币对 { double bid=SymbolInfoDouble(symbol,SYMBOL_BID); // 获取卖价 double ask=SymbolInfoDouble(symbol,SYMBOL_ASK); // 获取买价 double pot=SymbolInfoDouble(symbol,SYMBOL_POINT); // 获取点数 double op=PositionGetDouble(POSITION_PRICE_OPEN); // 获取成交价 double sl=PositionGetDouble(POSITION_SL); // 获取止损价 double tp=PositionGetDouble(POSITION_TP); // 获取止盈价 if(type==POSITION_TYPE_BUY) // 如果是买单 { if(bid-op>=pot*tppoint && bid-op<pot*tppoint1) // 当行情盈利大于或等于初设止盈点600毫点,且小于第一个止盈点700毫点时 { if(magic==0) // 如果单子没有设置魔术码 { MqlTradeRequest request={}; MqlTradeResult result={}; request.action=TRADE_ACTION_SLTP; request.position=PositionGetTicket(i); // 单子成交编号 request.symbol=symbol; request.magic=0; request.sl=tppoint*pot; //按需求把止损点修改为初设止盈点,但是不生效. request.tp=tppoint1*pot; //按需求把 止盈点修改为第一个止盈点 ,但是不生效 ,请帮忙修改一下代码或者用MQ5重新写过生效的,谢谢。 if(!OrderSend(request,result)) PrintFormat("OrderSend error %d",GetLastError()); } else { if(PositionGetInteger(POSITION_MAGIC)==magic) // 如果单子设置了魔术码 { MqlTradeRequest request={}; MqlTradeResult result={}; request.action=TRADE_ACTION_SLTP; request.position=PositionGetTicket(i); // 单子成交编号 request.symbol=symbol; request.magic=magic; request.sl=tppoint*pot; // 止损点修改为初设止盈点 request.tp=tppoint1*pot; //止盈点修改为第一个止盈点 // request.sl=bid-pot*yidongdian; // request.tp=tp; if(!OrderSend(request,result)) PrintFormat("OrderSend error %d",GetLastError()); } } } } if(type==POSITION_TYPE_SELL) { if((op-ask)>=pot*yidongdian && ((sl>(ask+pot*yidongdian)) || (sl==0))) { if(magic==0) { MqlTradeRequest request={}; MqlTradeResult result={}; request.action=TRADE_ACTION_SLTP; request.position=PositionGetTicket(i); request.symbol=symbol; // request.sl=ask+pot*yidongdian; // request.tp=tp; request.sl=ask+pot*yidongdian; request.tp=0; request.magic=0; if(!OrderSend(request,result)) PrintFormat("OrderSend error %d",GetLastError()); } else { if(PositionGetInteger(POSITION_MAGIC)==magic) { MqlTradeRequest request={}; MqlTradeResult result={}; request.action=TRADE_ACTION_SLTP; request.position=PositionGetTicket(i); request.symbol=symbol; request.magic=magic; request.sl=ask+pot*yidongdian; request.tp=tp; if(!OrderSend(request,result)) PrintFormat("OrderSend error %d",GetLastError()); } } } } } } } } } Lin Luo 2023.06.03 03:02 #1 问题多多。详细可联系。 Wen Feng Lin 2023.06.30 08:59 #2 Lin Luo #: 问题多多。详细可联系。 不知道这里可不可以放其他链接,还是不放了。 我在eahub的悬赏区有放布 5个币 解决这个问题 Yuan Lu Xu 2023.06.30 09:01 #3 这种改代码的问题,不付费没人愿意看,代码看着头疼 kuge699 2023.08.05 09:26 #4 Yuan Lu Xu #: 这种改代码的问题,不付费没人愿意看,代码看着头疼 很简单,主要时止损止盈的价格格式不对,应用NormalizeDouble就可以了 新评论 您错过了交易机会: 免费交易应用程序 8,000+信号可供复制 探索金融市场的经济新闻 注册 登录 拉丁字符(不带空格) 密码将被发送至该邮箱 发生错误 使用 Google 登录 您同意网站政策和使用条款 如果您没有帐号,请注册 可以使用cookies登录MQL5.com网站。 请在您的浏览器中启用必要的设置,否则您将无法登录。 忘记您的登录名/密码? 使用 Google 登录