ken138888 发表于 2023-12-31 15:19:14

10H币帮忙修改一个移动止盈的函数

此函数的目的是:使用一次一单的策略时,当行情一直往盈利方向走,将利润最大化。
逻辑是分区间修改止损点止盈点。

例如 开仓时将单子的止损点设置为1500毫点,止盈点设置为6000毫点.

1. 当单子向盈利方向走,盈利大于或等于1000毫点, 且小于1100毫点这个区间时
   将原来的止损点的价格修改为盈利1000毫点时的价格,也就是新的止损点价格是盈利1000毫点时的价格.
   将原来的止盈点的价格修改为盈利1100毫点时的价格 ,也就是新的止盈点价格是盈利1100毫点时的价格.

这样修改的目的是当行情达到盈利1000毫点时,如果行情回调,回调到盈利1000毫点时就止损平仓,如果行情继续向盈利方向走,达到盈利1100毫点时就止盈平仓。


2. 当单子盈利大于或等于1100毫点, 且小于1200毫点这个区间时
   将原来的止损点修改为 1100毫点, 原来的止盈点修改为1200毫点 .

3. 当单子盈利大于或等于1200毫点, 且小于1300毫点这个区间时
   将原来的止损点修改为 1200毫点, 原来的止盈点修改为1300毫点 .

以此类推.


下面这个函数已经实现这个功能,但是有时候需要修改几次价格才能修改成功,日志显示 4756 Invalid stops 用MT5的“1分钟OHLC”模式回测时,一切正常,但用“每个点基于实时点”回测时,日志就显示4756错误代码 .

任务:反这个函数修改为一个,真正起效的,没有4756 Invalid stops这些错误的。

函数代码如下:

void yidong (double tppoint1,double tppoint2,double tppoint3,double tppoint4,string symbol,ENUM_POSITION_TYPE type,int magic,string comment)
{

if(PositionsTotal()>0)
for(int i= PositionsTotal() -1 ; i>=0 ; i--)
{

if(PositionGetTicket(i)>0 && PositionGetString(POSITION_SYMBOL)==symbol)

{
double op=PositionGetDouble(POSITION_PRICE_OPEN);
double sl=PositionGetDouble(POSITION_SL);
double tp=PositionGetDouble(POSITION_TP);
double ask=SymbolInfoDouble(symbol,SYMBOL_ASK);
double bid=SymbolInfoDouble(symbol,SYMBOL_BID);
double point=SymbolInfoDouble(symbol,SYMBOL_POINT);


//修改多单的止盈止损价格 开始

if(
   POSITION_TYPE_BUY==type &&
   PositionGetInteger(POSITION_MAGIC)==magic &&
   PositionGetString(POSITION_COMMENT)==comment
)

{

if (bid-op>=tppoint1*point && bid-op<tppoint2*point && sl< op+tppoint1*point && tp>op+tppoint2*point)

{
MqlTradeRequest request={};
MqlTradeResultresult={};
request.action = TRADE_ACTION_SLTP ;
request.type_filling=ORDER_FILLING_IOC;
request.position=PositionGetTicket(i);
request.symbol=symbol;
request.magic=magic;
request.comment=comment;
request.sl= NormalizeDouble( op+tppoint1*point,Digits()) ;
request.tp= NormalizeDouble(op+tppoint2*point,Digits()) ;

//--- 发送请求
if(!OrderSend(request,result))
PrintFormat("OrderSend error %d",GetLastError());// 如果不能发送请求,输出错误代码

}

if (bid-op>=tppoint2*point && bid-op<tppoint3*point && sl< op+tppoint2*point && tp>op+tppoint3*point)

{
MqlTradeRequest request={};
MqlTradeResultresult={};
request.action = TRADE_ACTION_SLTP ;
request.type_filling=ORDER_FILLING_IOC;
request.position=PositionGetTicket(i);
request.symbol=symbol;
request.magic=magic;
request.comment=comment;
request.sl= NormalizeDouble( op+tppoint2*point,Digits()) ;
request.tp= NormalizeDouble(op+tppoint3*point,Digits()) ;

//--- 发送请求
if(!OrderSend(request,result))
PrintFormat("OrderSend error %d",GetLastError());// 如果不能发送请求,输出错误代码

}

if (bid-op>=tppoint3*point && bid-op<tppoint4*point && sl< op+tppoint3*point && tp>op+tppoint4*point)

{
MqlTradeRequest request={};
MqlTradeResultresult={};
request.action = TRADE_ACTION_SLTP ;
request.type_filling=ORDER_FILLING_IOC;
request.position=PositionGetTicket(i);
request.symbol=symbol;
request.magic=magic;
request.comment=comment;
request.sl= NormalizeDouble( op+tppoint3*point,Digits()) ;
request.tp= NormalizeDouble(op+tppoint4*point,Digits()) ;

//--- 发送请求
if(!OrderSend(request,result))
PrintFormat("OrderSend error %d",GetLastError());// 如果不能发送请求,输出错误代码

}





}
// 修改多单的止盈止损价格 结束



//修改空单的止盈止损价格 开始

if(
   POSITION_TYPE_SELL==type &&
   PositionGetInteger(POSITION_MAGIC)==magic &&
   PositionGetString(POSITION_COMMENT)==comment
)

{

if (op-ask>=tppoint1*point && op-ask<tppoint2*point && op-tppoint1*point<sl && op-tppoint2*point>tp)


{
MqlTradeRequest request={};
MqlTradeResultresult={};
request.action = TRADE_ACTION_SLTP ;
request.type_filling=ORDER_FILLING_IOC;
request.position=PositionGetTicket(i);
request.symbol=symbol;
request.magic=magic;
request.comment=comment;
request.sl= NormalizeDouble( op-tppoint1*point,Digits()) ;
request.tp= NormalizeDouble(op-tppoint2*point,Digits()) ;

//--- 发送请求
if(!OrderSend(request,result))
PrintFormat("OrderSend error %d",GetLastError());// 如果不能发送请求,输出错误代码

}


if (op-ask>=tppoint2*point && op-ask<tppoint3*point && op-tppoint2*point<sl && op-tppoint3*point>tp )


{
MqlTradeRequest request={};
MqlTradeResultresult={};
request.action = TRADE_ACTION_SLTP ;
request.type_filling=ORDER_FILLING_IOC;
request.position=PositionGetTicket(i);
request.symbol=symbol;
request.magic=magic;
request.comment=comment;
request.sl= NormalizeDouble( op-tppoint2*point,Digits()) ;
request.tp= NormalizeDouble(op-tppoint3*point,Digits()) ;

//--- 发送请求
if(!OrderSend(request,result))
PrintFormat("OrderSend error %d",GetLastError());// 如果不能发送请求,输出错误代码

}


if (op-ask>=tppoint3*point && op-ask<tppoint4*point && op-tppoint3*point<sl && op-tppoint4*point>tp)


{
MqlTradeRequest request={};
MqlTradeResultresult={};
request.action = TRADE_ACTION_SLTP ;
request.type_filling=ORDER_FILLING_IOC;
request.position=PositionGetTicket(i);
request.symbol=symbol;
request.magic=magic;
request.comment=comment;
request.sl= NormalizeDouble( op-tppoint3*point,Digits()) ;
request.tp= NormalizeDouble(op-tppoint4*point,Digits()) ;

//--- 发送请求
if(!OrderSend(request,result))
PrintFormat("OrderSend error %d",GetLastError());// 如果不能发送请求,输出错误代码

}


}
//修改空单的止盈止损价格 结束



}



}



}




页: [1]
查看完整版本: 10H币帮忙修改一个移动止盈的函数