完善顾问的战略 - 页 5

 
https://www.mql5.com/ru/code/7108 这里也有一些关于拖网的有趣材料
 

3.标准的'阶梯式'拖尾。

void TrailingStairs(int ticket,int trldistance,int trlstep)

这种类型的拖尾是对标准拖尾的一种修改。如果我没有记错的话,KimIV 也曾经创造过类似的模型(但是因为相对来说比较好...:),它与标准的追踪不同,追踪止损不是按点转移的(例如,追踪止损在距离30点时为+31,在+32时为+2,等等)。例如,追踪距离为40点,止损距离为10点,当我们达到+40点时,止损将移至+10点,在我们达到+50点利润(40点+步长)之前没有任何变化(也就是说,我们给了价格一定的自由度,这是此算法的重点),只有在+50点时,止损将从+10点移至+20点,在+60点,止损将移至+30点,以此类推。

参数:
ticket -
唯一的订单号(在调用函数withOrderSelect()之前选择);
trldistance - 我们 "拖网 "的距离(点)(不低于MarketInfo(Symbol(),MODE_STOPLEVEL));
trlstep - 改变止损的 "步骤"(点)(不低于1)。

如果trlstep=1,这个功能将与标准的追踪止损没有区别。这种算法的主要 "特点",还是在于为汇率提供了一些 "移动的自由"--只有在价格 "四处游荡 "之后,才会提高止损。这种跟踪算法 我是在V. Barishpolts已经提到的 "移动通道 "战术规则的描述中第一次遇到的。

=================

专家顾问中的这一条很有意思

 
//+------------------------------------------------------------------+
//| ТРЕЙЛИНГ СТАНДАРТНЫЙ-СТУПЕНЧАСТЫЙ                                |
//| Функции передаётся тикет позиции, расстояние от курса открытия,  |
//| на котором трейлинг запускается (пунктов) и "шаг", с которым он  |
//| переносится (пунктов)                                            |
//| Пример: при +30 стоп на +10, при +40 - стоп на +20 и т.д.        |
//+------------------------------------------------------------------+
 
void TrailingStairs(int ticket,int trldistance,int trlstep)
   { 
   
   double nextstair; // ближайшее значение курса, при котором будем менять стоплосс
 
   // проверяем переданные значения
   if ((trldistance<MarketInfo(Symbol(),MODE_STOPLEVEL)) || (trlstep<1) || (trldistance<trlstep) || (ticket==0) || (!OrderSelect(ticket,SELECT_BY_TICKET,MODE_TRADES)))
      {
      Print("Трейлинг функцией TrailingStairs() невозможен из-за некорректности значений переданных ей аргументов.");
      return(0);
      } 
   
   // если длинная позиция (OP_BUY)
   if (OrderType()==OP_BUY)
      {
      // расчитываем, при каком значении курса следует скорректировать стоплосс
      // если стоплосс ниже открытия или равен 0 (не выставлен), то ближайший уровень = курс открытия + trldistance + спрэд
      if ((OrderStopLoss()==0) || (OrderStopLoss()<OrderOpenPrice()))
      nextstair = OrderOpenPrice() + trldistance*Point;
         
      // иначе ближайший уровень = текущий стоплосс + trldistance + trlstep + спрэд
      else
      nextstair = OrderStopLoss() + trldistance*Point;
 
      // если текущий курс (Bid) >= nextstair и новый стоплосс точно лучше текущего, корректируем последний
      if (Bid>=nextstair)
         {
         if ((OrderStopLoss()==0) || (OrderStopLoss()<OrderOpenPrice()) && (OrderOpenPrice() + trlstep*Point<Bid-MarketInfo(Symbol(),MODE_STOPLEVEL)*Point)) 
            {
            if (!OrderModify(ticket,OrderOpenPrice(),OrderOpenPrice() + trlstep*Point,OrderTakeProfit(),OrderExpiration()))
            Print("Не удалось модифицировать стоплосс ордера №",OrderTicket(),". Ошибка: ",GetLastError());
            }
         }
      else
         {
         if (!OrderModify(ticket,OrderOpenPrice(),OrderStopLoss() + trlstep*Point,OrderTakeProfit(),OrderExpiration()))
         Print("Не удалось модифицировать стоплосс ордера №",OrderTicket(),". Ошибка: ",GetLastError());
         }
      }
      
   // если короткая позиция (OP_SELL)
   if (OrderType()==OP_SELL)
      { 
      // расчитываем, при каком значении курса следует скорректировать стоплосс
      // если стоплосс ниже открытия или равен 0 (не выставлен), то ближайший уровень = курс открытия + trldistance + спрэд
      if ((OrderStopLoss()==0) || (OrderStopLoss()>OrderOpenPrice()))
      nextstair = OrderOpenPrice() - (trldistance + MarketInfo(Symbol(),MODE_SPREAD))*Point;
      
      // иначе ближайший уровень = текущий стоплосс + trldistance + trlstep + спрэд
      else
      nextstair = OrderStopLoss() - (trldistance + MarketInfo(Symbol(),MODE_SPREAD))*Point;
       
      // если текущий курс (Аск) >= nextstair и новый стоплосс точно лучше текущего, корректируем последний
      if (Ask<=nextstair)
         {
         if ((OrderStopLoss()==0) || (OrderStopLoss()>OrderOpenPrice()) && (OrderOpenPrice() - (trlstep + MarketInfo(Symbol(),MODE_SPREAD))*Point>Ask+MarketInfo(Symbol(),MODE_STOPLEVEL)*Point))
            {
            if (!OrderModify(ticket,OrderOpenPrice(),OrderOpenPrice() - (trlstep + MarketInfo(Symbol(),MODE_SPREAD))*Point,OrderTakeProfit(),OrderExpiration()))
            Print("Не удалось модифицировать стоплосс ордера №",OrderTicket(),". Ошибка: ",GetLastError());
            }
         }
      else
         {
         if (!OrderModify(ticket,OrderOpenPrice(),OrderStopLoss()- (trlstep + MarketInfo(Symbol(),MODE_SPREAD))*Point,OrderTakeProfit(),OrderExpiration()))
         Print("Не удалось модифицировать стоплосс ордера №",OrderTicket(),". Ошибка: ",GetLastError());
         }
      }      
   }

以下是它的完整代码,将被插入到以下位置

//+------------------------------------------------------------------+
void TrailingStairs(int ticket,int trldistance)
   {
    int Spred=Ask - Bid;
    if (OrderType()==OP_BUY)
      {
       if((Bid-OrderOpenPrice())>(Point*trldistance))
         {
          if(OrderStopLoss()<Bid-Point*trldistance || (OrderStopLoss()==0))
            {
             OrderModify(ticket,OrderOpenPrice(),Bid-Point*trldistance,OrderTakeProfit(),0,Green);
             if (PolLots)
             if (NormalizeDouble(OrderLots()/2,2)>MarketInfo(Symbol(), MODE_MINLOT))
               {
               OrderClose(ticket,NormalizeDouble(OrderLots()/2,2),Ask,3,Green);
               }
             else
               {
               OrderClose(ticket,OrderLots(),Ask,3,Green);
               }
            }
         }
       }
     else
       {
        if((OrderOpenPrice()-Ask)>(Point*trldistance))
          {
           if((OrderStopLoss()>(Ask+Point*trldistance)) || (OrderStopLoss()==0))
             {
              OrderModify(OrderTicket(),OrderOpenPrice(),Ask+Point*trldistance,OrderTakeProfit(),0,Red);
             if (PolLots)
             if (NormalizeDouble(OrderLots()/2,2)>MarketInfo(Symbol(), MODE_MINLOT))
               {
               OrderClose(ticket,NormalizeDouble(OrderLots()/2,2),Bid,3,Green);
               }
             else
               {
               OrderClose(ticket,OrderLots(),Bid,3,Green);
               }
             }
          }
        }
    }


这个

 

我建议开始修改你喜欢的EA,而不是把它插入你自己的EA中--结果几乎一样,但会有更少的麻烦。

此外,阅读和理解别人的代码的能力将派上用场......

 
ktest0:

我建议开始修改你喜欢的EA,而不是把它插入你自己的EA中--结果几乎一样,但会有更少的麻烦。

此外,阅读和理解别人的代码的能力将派上用场......

只要他想拥有,就不可能拥有!
 
borilunad:
只要他想拥有,就不可能拥有!

)))这就是每个人的开始...然后--越往林子里走,游击队就越胖......
 

你能告诉我如何在EA中写代码吗?
哪些会形成某一时期的高点和低点(如10.45-11.15)?

我在9点开启了EA-->当它在10点45分时,它开启并开始监控。 当一个条形图在11点15分关闭时(例如15分钟图),它读取并继续监控,例如我已经确定了高点和低点,并在离这些线不远的地方下单。

我预先感谢你的反馈。

 
好吧,你可以旋转议员....
 

我搞不清楚是用什么原理来连接电车的。

事实上,它应该只是工作

 
IRIP:

我搞不清楚是用什么原理来连接电车的。

毕竟,它应该,事实上,只是工作。


没有任何东西和任何人会 "只是工作"。

你需要了解这个特定的线索在搜索什么,在什么条件下搜索,以什么步骤搜索,是否有任何附加条件。

如果你把拖网代码拆开,一切都会变得清晰,但 "即插即用 "的原则并不能带来好的结果....。