新人对MQL4和MQL5的任何问题,对算法和代码的帮助和讨论 - 页 1831

 
Mihail Matkovskij #:

如果价格向TP的方向移动,应触发追踪止损,如果价格回撤,则不做任何操作。SL水平应该只向TP的方向发展,而不是回滚。

我知道

我写道。

无限多的 停止和采取的位置,即时

2021.12.23 21:07:51.634 2021.12.21 21:12:20 111 AUDUSD,M15: 买单修改成功!

2021.12.23 21:07:51.634 2021.12.21 21:12:20 111 AUDUSD,M15: 修改#2 买入0.02 AUDUSD at 0.71028 sl: 0.71288 tp: 0.72038 ok

2021.12.23 21:07:51.634 2021.12.21 21 12:12:18 111 AUDUSD,M15: 买单修改成功!

2021.12.23 21:07:51.634 2021.12.21 21:12:18 111 AUDUSD,M15: 修改#2 买入0.02 AUDUSD at 0.71028 sl: 0.71268 tp: 0.72018 ok

2021.12.23 21:07:51.634 2021.12.21 21 12:12:16 111 AUDUSD,M15: 买单修改成功!

2021.12.23 21:07:51.634 2021.12.21 21:12:16 111 AUDUSD,M15: 修改#2 买入0.02 AUDUSD at 0.71028 sl: 0.71248 tp: 0.71998 ok

2021.12.23 21:07:51.634 2021.12.21 21 12:12:15 111 AUDUSD,M15: 买单修改成功!

2021.12.23 21:07:51.634 2021.12.21 21:12:15 111 AUDUSD,M15: 修改 #2 在0.71028买入0.02 AUDUSD sl: 0.71228 tp: 0.71978 ok

2021.12.23 21:07:51.634 2021.12.21 21 12:12:13 111 AUDUSD,M15: 买单修改成功!

2021.12.23 21:07:51.634 2021.12.21 21:12:13 111 AUDUSD,M15: 修改 #2 在0.71028买入0.02 AUDUSD sl: 0.71208 tp: 0.71958 ok

2021.12.23 21:07:51.634 2021.12.21 21 12:12:11 111 AUDUSD,M15: 买单修改成功!

2021.12.23 21:07:51.634 2021.12.21 21:12:11 111 AUDUSD,M15: 修改#2 买入0.02 AUDUSD at 0.71028 sl: 0.71188 tp: 0.71938 ok

2021.12.23 21:07:51.634 2021.12.21 12:12:10 111 AUDUSD,M15: 买单修改成功!

2021.12.23 21:07:51.634 2021.12.21 21:12:10 111 AUDUSD,M15: 修改#2 买入0.02 AUDUSD at 0.71028 sl: 0.71168 tp: 0.71918 ok

2021.12.23 21:07:51.634 2021.12.21 21 12:12:08 111 AUDUSD,M15: 买单修改成功!

2021.12.23 21:07:51.634 2021.12.21 21:12:08 111 AUDUSD,M15: 修改#2 买入0.02 AUDUSD at 0.71028 sl: 0.71148 tp: 0.71898 ok

2021.12.23 21:07:51.634 2021.12.21 21 12:12:06 111 AUDUSD,M15: 买单修改成功!

2021.12.23 21:07:51.634 2021.12.21 21:12:06 111 AUDUSD,M15: 修改#2 买入0.02 AUDUSD at 0.71028 sl: 0.71128 tp: 0.71878 ok

2021.12.23 21:07:51.634 2021.12.21 21 12:12:05 111 AUDUSD,M15: 买单修改成功!

2021.12.23 21:07:51.634 2021.12.21 21:12:05 111 AUDUSD,M15: 修改 #2 在0.71028买入0.02 AUDUSD sl: 0.71108 tp: 0.71858 ok

2021.12.23 21:07:51.634 2021.12.21 21 12:12:00 111 AUDUSD,M15: 修改买入指令成功!

2021.12.23 21:07:51.634 2021.12.21 21:12:00 111 AUDUSD,M15: 修改#2 买入0.02 AUDUSD at 0.71028 sl: 0.71088 tp: 0.71838 ok

2021.12.23 21:07:51.634 2021.12.21 12:11:53 111 AUDUSD,M15: 买单修改成功!

2021.12.23 21:07:51.634 2021.12.21 12:11:53 111 AUDUSD,M15: 修改#2 买入0.02 AUDUSD at 0.71028 sl: 0.71068 tp: 0.71818

2021.12.23 21:07:51.634 2021.12.21 12:11:52 111 AUDUSD,M15: 修改买入指令成功!


 
законопослушный гражданин #:

我知道。

我写道。

瞬间移动了无数次 的停止和采取

你应该得到被修改的订单的SL,并将其与计算的SL进行比较。如果它们相等,机器人应该什么都不做,直到计算的SL超过正在处理的订单的SL。如何比较两个双倍值:要么比较NodmalizeDouble(value, Digits)(每个值的),要么比较EqualDoubleshttps://www.mql5.com/ru/docs/basis/types/double

Документация по MQL5: Основы языка / Типы данных / Вещественные типы (double, float)
Документация по MQL5: Основы языка / Типы данных / Вещественные типы (double, float)
  • www.mql5.com
Вещественные типы (double, float) - Типы данных - Основы языка - Справочник MQL5 - Справочник по языку алгоритмического/автоматического трейдинга для MetaTrader 5
 
законопослушный гражданин #:

我知道。


你的设置是正确的。你在 TrailingOrders()函数 中改变了什么吗

 
Mihail Matkovskij #:

你应该得到被修改的订单的SL,并将其与计算的SL进行比较。

一般来说,规则如下。

  • 计算出的SL小于订单的SL(不太有利)--什么都不做
  • 计算出的SL等于订单的SL--什么都不做
  • 计算的SL超过订单的SL(更有利可图)--用计算值修改它
这些拖网规则可用于建立几乎任何具有任何SL计算算法的拖网。
 
Tretyakov Rostyslav #:

你的设置是正确的。你是否在 TrailingOrders()函数 中改变了什么

我改变了它,把它 "按原样",结果还是一样。

 
законопослушный гражданин #:

我改变了它,把它 "按原样",结果还是一样。

有必要查看输入参数,因为日志显示拖网工作正常。
 
Tretyakov Rostyslav #:
我们需要看到输入参数,因为根据日志,拖网工作正常。

2021.12.24 16:10:14.788 2021.12.17 00:00:00 111 - 副本:Lot=0.01; StopLoss=200; TakeProfit=560; Slippage=3; Magic=1; K_Martin1=0.01; K_Martin2=1.9; K_Martin3=1.4; OrdersClose=3; OrdersClose2=5; DigitsLot=2; PeriodMA=21; MovingShift=1。


 
законопослушный гражданин #:

2021.12.24 16:10:14.788 2021.12.17 00:00:00 111 - 副本:Lot=0.01; StopLoss=200; TakeProfit=560; Slippage=3; Magic=1; K_Martin1=0.01; K_Martin2=1.9; K_Martin3=1.4; OrdersClose=3; OrdersClose2=5; DigitsLot=2; PeriodMA=21; MovingShift=1。


也许我在代码中放的函数不正确?

void OnTick()
  {
// Получим значение индикатора
   dMA = iMA(Symbol(), 0,PeriodMA, MovingShift, MODE_SMA, PRICE_CLOSE, 0); // MODE_SMA - простое усреднение , значение 0. PRICE_CLOSE- цена закрытия, значение 0.
   TrailingOrders();
// Если нет открытых ордеров, то входим в условие
      if(CountOrders()==0)
     {

// Если появился сигнал на покупку, то откроем ордер на покупку
      if(bSignalBuy() == true)
         vOrderOpenBuy();

// Если появился сигнал на продажу, то откроем ордер на продажу
      if(bSignalSell() == true)
         vOrderOpenSell();
     } 
       DrawLABEL("nextlot",1,5,0,Color1(),StringConcatenate("CURRENT LOT: ",DoubleToStr(LOT(),2)));
       DrawLABEL("currentlot",1,5,0,Color2(),StringConcatenate("NEXT LOT: ",DoubleToStr(LOT(),2))); 
  }

并把函数本身分开

//-------------------------------------------------------------------+

void TrailingOrders()
  {
   for(int i = OrdersTotal()-1; i>=0; i--)
     {
      if(OrderSelect(i, SELECT_BY_POS, MODE_TRADES))
        {
         if(OrderSymbol() == Symbol() && OrderMagicNumber() == Magic)
           {
            if(OrderType() == OP_BUY)
              {
               if(Bid >= OrderOpenPrice()+(TakeProfit*0.75*_Point) && OrderStopLoss()<OrderOpenPrice()-20*_Point)
                 {
                  if(OrderModify(OrderTicket(), OrderOpenPrice(), OrderStopLoss()+20*_Point, OrderTakeProfit()+20*_Point, 0))
                     Print("Модификации ордера на покупку успешна!");
                  else
                     Print("Ошибка модификации ордера на покупку! - ",GetLastError());
                 }
               if(Bid >= OrderOpenPrice()+(TakeProfit*0.9*_Point) && OrderStopLoss()>=OrderOpenPrice()-20*_Point)
                 {
                  if(OrderModify(OrderTicket(), OrderOpenPrice(), OrderStopLoss()+30*_Point, OrderTakeProfit()+10*_Point, 0))
                     Print("Модификации ордера на покупку успешна!");
                  else
                     Print("Ошибка модификации ордера на покупку! - ",GetLastError());
                 }
              }
           }
        }
     }
  }
 
законопослушный гражданин #:

我在代码中放的功能不正确吗?

并把函数本身分开

//-------------------------------------------------------------------+

void TrailingOrders()
  {
   
   for(int i = OrdersTotal()-1; i>=0; i--)
     {
      if(OrderSelect(i, SELECT_BY_POS, MODE_TRADES))
        {
         if(OrderSymbol() == Symbol() && OrderMagicNumber() == Magic)
           {
            if(OrderType() == OP_BUY)
              {
               if(Bid >= OrderOpenPrice()+(TakeProfit*0.75*_Point) && OrderStopLoss()<=OrderOpenPrice()-StopLoss*_Point)
                 {
                  if(OrderModify(OrderTicket(), OrderOpenPrice(), OrderOpenPrice()-(StopLoss+20)*_Point, OrderTakeProfit()+20*_Point, 0))
                     Print("Модификации ордера на покупку успешна!");
                  else
                     Print("Ошибка модификации ордера на покупку! - ",GetLastError());
                 }
               if(Bid >= OrderOpenPrice()+(TakeProfit*0.9*_Point) && OrderStopLoss()>=OrderOpenPrice()-(StopLoss+20)*_Point)
                 {
                  if(OrderModify(OrderTicket(), OrderOpenPrice(), OrderStopLoss()+30*_Point, OrderTakeProfit()+10*_Point, 0))
                     Print("Модификации ордера на покупку успешна!");
                  else
                     Print("Ошибка модификации ордера на покупку! - ",GetLastError());
                 }
              }
           }
        }
     }
  }

这条线索是正确的。

试试这样的方式

 
Tretyakov Rostyslav #:

手推车站位正确。

试试这个。

升空

首先停止,然后立即与取款一起飞向太空(在途中关闭订单)。

按我的理解,这不是问题所在。

如果我说错了请纠正我: void OnTick()

如果没有未结订单并且有信号,那么vOrderOpenBuy() / vOrderOpenSell()

然后是 void vOrderModify(int iOTi) - 即他们设置停止和takei,然后检查是否有错误。

也就是说,在订单以止损或止盈收盘之前,是不可能在追踪方面进行修正的。

你需要一个(最多两个)多次的停顿和取舍。

如果你想改变追踪止损并获取利润,那么你应该手动操作。

我还在考虑如何实现它。

附加的文件:
111.mq4  25 kb