テスターでSLとTPをドラッグ&ドロップします。 - ページ 13

 
Artyom Trishkin:
あるいは、キーパッドのボタンと組み合わせることもできます ;)
はい、それも選択肢の一つです。
 
khorosh:
だから、ここが間違いなんです。注文の開始線からSLとTPの両方を引く必要がある場合、何を引けばいいのかが分からないという問題があるので、それはできない。そこで、実際のチャート上でカーソルの方向と同じように、キーボードキーを使うか、アクションの種類を設定するボタンを作成するかして、アクションの種類を特定する必要があるのです。最初のオプションは実際のチャートで使用されており、私の意見では最良である。
Ctrl+mouse - 停止します。ジャストマウス - テイク。そして、必要な場所を一度にドラッグする。
 
Artyom Trishkin:
はい、クリアです。どういうことかというと、ストップがない場合は、注文自体のラインを引っ張れば、ラインを「引っ張った」ところにストップが設定されるということなんです。持ち帰り加工がない場合です。また、ストップとトーの両方の処理があるにもかかわらず、注文にどちらもない場合、注文線を引くとしたら、何を設定すればいいのでしょうか?テイクかストップか?

あわよくば

例:買いの場合:引き上げたらタップ、引き下げたらスル

 
pako:

あわよくば

例:買いの場合:引き上げたらタップ、引き下げたらスル

端末ではこのように動作します。そして、ストップをBuyのプロフィットゾーンに移動させること-これが今回の議論です。
 
Artyom Trishkin:
端末ではこのようになっています。そして、Buyストップをプロフィットゾーンに移動させること-それが、今回の議論です。
それは、端末のように作るということです
 
pako:
端末と同じように作れってことだよ。
端末のようにやるというのは、すでに言われていることです。今は、端末でどうしたらいいかということです。
 
Artyom Trishkin:
端末でのやり方は、すでに説明したとおりです。今は、端末でどうしたらいいかということです。
ロシア語で書いているようです
 
pako:
ロシア語で書いているつもりです。
同じ言葉で答えているのに...。;)
 

今朝、すっきりした頭で、解決策を見つけました。さらに、修正関数の余分なループを取り除きました。2つのバリエーションに対応した改造機能を作りました。

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);   
        }           
     }  
 }

2つ目の選択肢。

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が リセットされるExpert Advisorでは、これらの変数のリセットを追加して ください。また、EAにおける一部の変数名や修正関数名を修正しました。

感謝の気持ちを込めて、拍手を待っています。紳士は拍手して解散しましょう)。

 

第3の選択肢も考えてみました。SLやTPを持ち運ぶのが苦手な方向けです。SLとTPを設定するアルゴリズムは以下の通りです:注文を一度クリックして選択し(チケットを定義します)、次にSLを設定したいチャートポイント(通常はローカル価格の最小値と最大値を超えたポイントです)を一度クリックする必要があります。同時に、SLは選択されたポイントに設定され、TPはSLのKt倍離れたポイントに設定されます。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;
           }   
        }           
     }  
 }