在测试器中拖放SL和TP。 - 页 13

 
Artyom Trishkin:
或者你可以把它与键盘按钮结合起来;)
是的,也是一种选择。
 
khorosh:
所以这就是我的错误所在。如果我们需要从订单开盘线中拉出SL和TP,我们不能这样做,因为存在一个如何知道拉什么的问题。因此,我们需要在真实的图表上确定行动的类型,因为在光标的方向上,可以使用键盘键或创建一个按钮来设置行动的类型。第一个选项用于真实的图表上,在我看来是最好的。
Ctrl+mouse - 停止。只是鼠标--采取。并一次性拖到你需要的地方。
 
Artyom Trishkin:
是的,这很清楚。我的意思是:如果没有止损,我们可以拉动订单本身的线条,止损将被设置在我们 "拉动 "线条的地方。如果我们没有外卖处理,就会出现这种情况。如果我们对止损点和脚趾都进行了处理,但订单两者都没有,那么如果我们绘制订单线,我们应该设置什么?是采取还是停止?

如果没有停止并采取

例如买入:如果你拉起,然后轻拍,如果你拉下,然后滑动。

 
pako:

如果没有停止并采取

例如买入:如果你拉起,然后轻拍,如果你拉下,然后滑动。

这就是它在终端的工作方式。而把止损点移到买入的利润区--这就是我们讨论的内容。
 
Artyom Trishkin:
这是它在终端的方式。而要使买入止损点移动到盈利区--这就是我们讨论的内容。
这就是我要说的:让它像在终端一样
 
pako:
我说的是让它像终端一样。
已经说过要像在终端那样做。现在是关于如何不在终端做这件事。
 
Artyom Trishkin:
在终端的方式已经解释过了。现在是关于如何不在终端做这件事。
我想我是在用俄语写作
 
pako:
我想我是用俄语写的。
我在用同样的语言回答...;)
 

今天早上,在头脑清醒的情况下,我找到了一个解决方案。此外,我摆脱了修改函数中的额外循环。我为两个变体做了一个修改功能。

1) 如果一个订单没有设置SL和TP,点击订单,SL和TP将弹出50点。如果需要,在需要的地方拖放它们。如果订单已经有SL和TP,我们就把它们拖到我们想要的地方。

2)在真正的图表上如何做的一个变体。如果我们没有SL和TP,我们就把它们从订单行中拖出来,然后把它们移到我们想要的地方。

第一个变体。

void ModifySlTp(double priceModify=0)
 {
  double sl=0,tp=0;
  if(TicketModifyOrder==0)
    {  
     for(int i=0; i<OrdersTotal(); i++) 
      { 
       if(OrderSelect(i, SELECT_BY_POS, MODE_TRADES)) 
         { 
          if(OrderSymbol()==Symbol() && OrderMagicNumber()==MagicNumber) 
            {
             if(MathAbs(OrderStopLoss()-priceModify)<30*Point())   {OnSL=true;}
             if(MathAbs(OrderTakeProfit()-priceModify)<30*Point()) {OnTP=true;}
             if(MathAbs(OrderOpenPrice()-priceModify)<30*Point())  {OnOrd=true;} 
               { 
                if(OnSL || OnTP || OnOrd)
                  {
                   TicketModifyOrder=OrderTicket(); break;
                  }
               }
            }
         }  
      }
    }
   if(TicketModifyOrder>0)
     {
      if(OrderSelect(TicketModifyOrder, SELECT_BY_TICKET))
        {
         bool typOrdBuy = OrderType()==OP_BUY  || OrderType()==OP_BUYSTOP  || OrderType()==OP_BUYLIMIT;
         bool typOrdSell= OrderType()==OP_SELL || OrderType()==OP_SELLSTOP || OrderType()==OP_SELLLIMIT;
         if(OnOrd)
           {
            if(typOrdBuy)
              {
               sl = NormalizeDouble(OrderOpenPrice()-500*Point(),Digits);
               tp = NormalizeDouble(OrderOpenPrice()+500*Point(),Digits);
              }
            if(typOrdSell)
              {
               sl = NormalizeDouble(OrderOpenPrice()+500*Point(),Digits);
               tp = NormalizeDouble(OrderOpenPrice()-500*Point(),Digits);
              }
           }
         if(OnSL) {sl=NormalizeDouble(priceModify,Digits);tp=OrderTakeProfit();}
         if(OnTP) {tp=NormalizeDouble(priceModify,Digits);sl=OrderStopLoss();}   
                                           
          ModifyOrder1(-1, sl, tp, 0);   
        }           
     }  
 }

第二个选择。

void ModifySlTp(double priceModify=0)
 {
  double sl=0,tp=0;
  if(TicketModifyOrder==0)
    {  
     for(int i=0; i<OrdersTotal(); i++) 
      { 
       if(OrderSelect(i, SELECT_BY_POS, MODE_TRADES)) 
         { 
          if(OrderSymbol()==Symbol() && OrderMagicNumber()==MagicNumber) 
            {
             if(MathAbs(OrderStopLoss()-priceModify)<50*Point())   {OnSL=true;}
             if(MathAbs(OrderTakeProfit()-priceModify)<50*Point()) {OnTP=true;}
             if(MathAbs(OrderOpenPrice()-priceModify)<50*Point())  {OnOrd=true;} 
               { 
                if(OnSL || OnTP || OnOrd)
                  {
                   TicketModifyOrder=OrderTicket(); break;
                  }
               }
            }
         }  
      }
    }
   if(TicketModifyOrder>0)
     {
      if(OrderSelect(TicketModifyOrder, SELECT_BY_TICKET))
        {
         bool typOrdBuy = OrderType()==OP_BUY  || OrderType()==OP_BUYSTOP  || OrderType()==OP_BUYLIMIT;
         bool typOrdSell= OrderType()==OP_SELL || OrderType()==OP_SELLSTOP || OrderType()==OP_SELLLIMIT;
         if(OnOrd)
           {
            if(typOrdBuy)
              {
               if(priceModify>OrderOpenPrice()) {tp=NormalizeDouble(priceModify,Digits);sl=OrderStopLoss();}
               if(priceModify<OrderOpenPrice()) {sl=NormalizeDouble(priceModify,Digits);tp=OrderTakeProfit();} 
              }
            if(typOrdSell)
              {
               if(priceModify<OrderOpenPrice()) {tp=NormalizeDouble(priceModify,Digits);sl=OrderStopLoss();}
               if(priceModify>OrderOpenPrice()) {sl=NormalizeDouble(priceModify,Digits);tp=OrderTakeProfit();} 
              }
           }
         if(OnSL) {sl=NormalizeDouble(priceModify,Digits);tp=OrderTakeProfit();}
         if(OnTP) {tp=NormalizeDouble(priceModify,Digits);sl=OrderStopLoss();}   
                                           
          ModifyOrder1(-1, sl, tp, 0);   
        }           
     }  
 } 

我们不应该忘记声明全局变量 OnSL、OnTp和OnOrd。还有,在重置TicketModifyOrder 的专家顾问中,增加重置这些变量 的内容。在EA中,一些变量的名称和修改函数的名称是正确的。

我在等待来自感激的公众的掌声。让我们鼓掌,散去吧,先生们)。

 

我还想到了第三种选择。这是为那些不喜欢携带SL和TP的人准备的。设置SL和TP的算法如下:你应该在订单上点击一次,从而选择它(我们定义票据),然后在你想设置SL的图表点上点击一次(通常是超出本地价格最低和最高点的点)。同时,SL将被设置在选定的点上,TP将被设置在距离订单价格Kt倍的点上,该点比SL距离订单价格要远。Ktp是SL大于SL的多少倍,在一个外部变量中定义。注意,TicketModifyOrder和OnOrd现在不是在OnTick()主体中重置,而是在函数本身中重置。在OnTick()主体中重设这些变量的做法应该被删除。在这个变体中,也有可能实现拖放SL和TP的功能,但我懒得去想了。如果需要,你可以直接切换到1个变体。并以按钮的形式进行切换。

void ModifySlTp2(double priceModify=0)
 {
  double sl=0,tp=0;  
  for(int i=0; i<OrdersTotal(); i++) 
     { 
      if(OrderSelect(i, SELECT_BY_POS, MODE_TRADES)) 
        { 
         if(OrderSymbol()==Symbol() && OrderMagicNumber()==MagicNumber) 
           {
            OnOrd=false;
            if(MathAbs(OrderOpenPrice()-priceModify)<30*Point()) {OnOrd=true;}    
            if(OnOrd)
              {
               TicketModifyOrder=OrderTicket();
               return;
              }
           }
        }  
     }  
   if(TicketModifyOrder>0)
     {
      if(OrderSelect(TicketModifyOrder, SELECT_BY_TICKET))
        {
         bool typOrdBuy = OrderType()==OP_BUY  || OrderType()==OP_BUYSTOP  || OrderType()==OP_BUYLIMIT;
         bool typOrdSell= OrderType()==OP_SELL || OrderType()==OP_SELLSTOP || OrderType()==OP_SELLLIMIT;
         if(!OnOrd)
           {
            if(typOrdBuy)
              {
               sl = NormalizeDouble(priceModify,Digits);
               tp = NormalizeDouble(OrderOpenPrice()+Ktp*(OrderOpenPrice()-sl),Digits);
              }
            if(typOrdSell)
              {
               sl = NormalizeDouble(priceModify,Digits);
               tp = NormalizeDouble(OrderOpenPrice()-Ktp*(sl-OrderOpenPrice()),Digits);
              }                                               
            ModifyOrder1(-1, sl, tp, 0);
            TicketModifyOrder = 0;
           }   
        }           
     }  
 }