请帮忙修改一下移动止盈函数

 
请帮忙修改一下移动止盈,或者请用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 #:

问题多多。详细可联系。


不知道这里可不可以放其他链接,还是不放了。

我在eahub的悬赏区有放布 5个币 解决这个问题

 
这种改代码的问题,不付费没人愿意看,代码看着头疼
 
Yuan Lu Xu #:
这种改代码的问题,不付费没人愿意看,代码看着头疼
很简单,主要时止损止盈的价格格式不对,应用NormalizeDouble就可以了