任务编号:77374
悬赏任务5H币
悬赏任务 : 按雇主需求进行任务后提交稿件,被采纳后即获得佣金。
距截止:
任务已圆满完成
雇主已托管赏金:50 H币
雇主发布需求23.06.01
雇主托管佣金23.06.01
投稿者投稿23.06.07
雇主开始选稿23.06.30
任务完成23.06.30
任务大厅共需10个合格投稿 | 每稿将获得5 H币 | 每人交稿次数不限 可多次任务
投诉举报
联系Ta
我来承接
已有5 个投稿 | 已采纳0 稿 | 拒绝5 稿 | 还需要10 稿
任务需求:
请帮忙修改一下移动止盈,或者请用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());
}
}
}
}
}
}
}
}
}
|