请帮忙修改一下移动止盈函数
请帮忙修改一下移动止盈,或者请用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={};
MqlTradeResultresult={};
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={};
MqlTradeResultresult={};
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={};
MqlTradeResultresult={};
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={};
MqlTradeResultresult={};
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());
}
}
}
}
}
}
}
}
}
我也帮你,但是不会写[咖啡] 如果是多单,修改止盈止损时部分代码:
request.sl=op+tppoint*pot;
request.tp=op+tppoint1*pot;
如果是空单,修改止盈止损时部分代码:
request.sl=op-tppoint*pot;
request.tp=op-tppoint1*pot; 你好我们ea可以完美实现你所有的需求,界面简洁,功能多样且一目了然 其实挺简单的,你可以问一下GPT 比如投稿后,不采纳,是不是就什么都得不到
页:
[1]