ken138888 发表于 2023-6-1 18:38:04

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

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

                        }

                     }

                     }

               }

            }

         }

      }

    }

}


svip2022 发表于 2023-6-7 15:54:00

我也帮你,但是不会写[咖啡]

sunyu007 发表于 2023-6-9 12:07:32

如果是多单,修改止盈止损时部分代码:
request.sl=op+tppoint*pot;
request.tp=op+tppoint1*pot;

如果是空单,修改止盈止损时部分代码:
request.sl=op-tppoint*pot;
request.tp=op-tppoint1*pot;

对冲大魔王 发表于 2023-6-10 16:26:53

你好我们ea可以完美实现你所有的需求,界面简洁,功能多样且一目了然

seek_ideal 发表于 2023-6-17 05:33:41

其实挺简单的,你可以问一下GPT

bobo0116wan 发表于 2023-6-22 00:06:52

比如投稿后,不采纳,是不是就什么都得不到
页: [1]
查看完整版本: 请帮忙修改一下移动止盈函数