トレーリングストップとトレーリングプロフィット - ページ 5

 
Arav007:


3番目のトレードのTP= 108.536 [ このTPはこのような距離に設定したので、TPがないように動作します] 。

さて、私の要求通り、価格が7ピップ[103.603]の利益になった時、第1トレードと第2トレードのストップロスは1ピップ[103.543]になり

1番目と2番目のトレードのストップロスは1ピップの利益[103.543]となり、3番目のトレードのストップロスは103.386のままとなります。

下の画像のようになります。

1番目のGBPUSDの注文は10pipsの利益で決済されました。

2番目の注文はまだ実行中で、SLは移動されました。

3番目の取引では、SLが移動されましたが、これは望ましくないことです。

BuyOrder_3=OrderSend(Symbol(), iOrderType_Buy, LotSize,OpenPrice,Slippage,dStopLossPrice,0, "Buy Order",MagicNumber, 0,Blue);//tp 0
 
deVries:


ありがとうございます。これはもう一つの方法で、No TPを設定するための実に良い方法です。

しかし、SLはどうでしょうか?VariableOrder Ticketの 方法を使わずに、どうすればいいのでしょうか?

リーダース

 
if(OrdersTotal()>0){
 

for(cnt=OrdersTotal()-1;cnt>=0;cnt--){
        
        if(!OrderSelect(cnt, SELECT_BY_POS, MODE_TRADES)) continue;
        if(OrderSymbol() == Symbol() && OrderMagicNumber() ==  MagicNumber){
                
        
                sl     = OrderStopLoss(); // Stop Loss. 
                tStopLoss = NormalizeDouble(OrderStopLoss(), Digits); // Stop Loss. 
                
                if(OrderType()==OP_BUY){

if (OrdersTotal()==3){

if (cnt==1){

Fixed Stop Loss

}

else{

Trailing Stop Loss

}

}    // end of  if (OrdersTotal()==3)

else{    // Looking for 2nd option                           

if (OrdersTotal()==2){                           // 10 pips TP trade can be closed already

if(cnt== 0){

Fixed Stop Loss

}

else{

Trailing Stop Loss

}

}  // End of  if (OrdersTotal()==2)

}  // End of  else

 

これってどうなんでしょう?ストップロスの 部分はこれでいいのでしょうか?

 
Arav007:

これってどうなんでしょう?ストップロスの部分はこれでいいのでしょうか?


いいえ、間違っています。

でも、もっと嫌なのは、読み方です。

読みにくいコーディングです。

空白行は必要ないこれはあなたと同じ です

このようにすることができますか?

if(OrdersTotal()>0)
   {
   for(cnt=OrdersTotal()-1;cnt>=0;cnt--)
     {
     if(!OrderSelect(cnt, SELECT_BY_POS, MODE_TRADES)) continue;
     if(OrderSymbol() == Symbol() && OrderMagicNumber() ==  MagicNumber)
        {
        sl     = OrderStopLoss(); // Stop Loss. 
        tStopLoss = NormalizeDouble(OrderStopLoss(), Digits); // Stop Loss. 
        if(OrderType()==OP_BUY)
           {
           if (OrdersTotal()==3) 
              {
              if (cnt==1)
                 {
                 Fixed Stop Loss     
                 }
               else{
                   Trailing Stop Loss
                   }
              }    // end of  if (OrdersTotal()==3)
           else{    // Looking for 2nd option                           
               if (OrdersTotal()==2)
                 {                           // 10 pips TP trade can be closed already
                 if(cnt== 0)
                   {
                   Fixed Stop Loss
                   }
                   else{
                       Trailing Stop Loss
                       }
                 }  // End of  if (OrdersTotal()==2)
   }  // End of  else

空行がない

どこからが'{'で、どこからが'}'なのかがわかりやすい。

20以上の取引がある場合、ループの中で使用できないことがありますif (OrdersTotal()== )

またはif(cnt==

なぜこのオーダーループを使うのか

このorderloopは全ての取引を1つずつ実行するためです。

コード化しなければならないのは BreakEven です。

FixedStop Lossは 何をしているのですか?

 
deVries:


いいえ、そうではありません。

しかし、私がもっと嫌いなのは、どのように読まなければならないかです。

読みにくいコーディングです。

空白行は必要ありませんこれはあなたと同じ です

このようにすることができますか?

空行がない

どこからが'{'で、どこからが'}'なのかがわかりやすい。

20以上の取引がある場合、ループの中で使用できないことがありますif (OrdersTotal()== )

またはif(cnt==

なぜこのオーダーループを使うのか

このorderloopは全ての取引を1つずつ実行するためです。

コード化しなければならないのは BreakEven です。

Fixed Stop Lossは何をしてるんだ?


すみません、実は空行の方がしっくりくるんです。とにかく、ここにコードを書きながら追っていきます。

OrdersTotal()は、EAが接続されているペアの注文「だけ」を取得するのだと思っていました。

しかし、これはおそらくすべての注文を取得し、その後、関連するペアの注文を他の注文と区別するのでしょう。

を区別しています。

if(OrderSymbol() == Symbol() && OrderMagicNumber() == MagicNumber)

ってな感じでしょうか?

FixedStop Lossという のは、「最初の」ストップロスが移動しないことを指しています。

ご指摘ありがとうございます。

 
deVries:


コードを書くスタイルを変えよう!

不要な空行


意見が 分かれるところですが、一般的には コーディング時に(論理的な場所に)空行を使用するのは良い習慣とされています。いずれにせよ、他の人がこの ような方法でコーディングしていることを指摘するほどのことではありません。

ApacheやLinux Kernelのソースコード(2つの非常に協力的なOpenプロジェクト)を見れば、たくさんの空行があるのがわかるでしょう。


apache ウェブサーバ。

AP_DECLARE_NONSTD(const char *) ap_set_string_slot(cmd_parms *cmd,
                                                   void *struct_ptr,
                                                   const char *arg)
{
    int offset = (int)(long)cmd->info;

    *(const char **)((char *)struct_ptr + offset) = arg;

    return NULL;
}

LINUX KERNEL。


static int jz4740_musb_init(struct musb *musb)
{
 musb->xceiv = usb_get_phy(USB_PHY_TYPE_USB2);
 if (!musb->xceiv) {
 pr_err("HS UDC: no transceiver configured\n");
 return -ENODEV;
 }

 /* Silicon does not implement ConfigData register.
 * Set dyn_fifo to avoid reading EP config from hardware.
 */
 musb->dyn_fifo = true;

 musb->isr = jz4740_musb_interrupt;

 return 0;
} 
 
Arav007:


空行が快適な場合もありますが、記述した行の後に空行を入れるのはNGです。

また、中括弧の位置は、コードをより読みやすくします。


MACDを 例にとると

   for(cnt=0;cnt<total;cnt++)
     {
      OrderSelect(cnt,SELECT_BY_POS,MODE_TRADES);
      if(OrderType()<=OP_SELL &&   // check for opened position 
         OrderSymbol()==Symbol())  // check for symbol
        {
         //--- long position is opened
         if(OrderType()==OP_BUY)
           {

            //--- check for trailing stop
            if(TrailingStop>0)
              {
               if(Bid-OrderOpenPrice()>Point*TrailingStop)
                 {
                  if(OrderStopLoss()<Bid-Point*TrailingStop)
                    {
                     //--- modify order and exit
                     OrderModify(OrderTicket(),OrderOpenPrice(),Bid-Point*TrailingStop,OrderTakeProfit(),0,Green);
                     return;
                    }
                 }
              }
           }
         else // go to short position
           {

            //--- check for trailing stop
            if(TrailingStop>0)
              {
               if((OrderOpenPrice()-Ask)>(Point*TrailingStop))
                 {
                  if((OrderStopLoss()>(Ask+Point*TrailingStop)) || (OrderStopLoss()==0))
                    {
                     //--- modify order and exit
                     OrderModify(OrderTicket(),OrderOpenPrice(),Ask+Point*TrailingStop,OrderTakeProfit(),0,Red);
                     return;
                    }
                 }
              }
           }
        }
     }

さて、通貨チャートと注文の開始価格を比較する方法はお分かりいただけたでしょうか。

というようなことをしなければならないのですが...。

 
ydrol:

意見が 分かれるところですが、一般的には コーディング時に(論理的な場所に)空行を使用するのは良い習慣とされています。いずれにせよ、他の人がこのような 方法でコーディングしていることを指摘するほどのことではありません。

ApacheやLinux Kernelのソースコード(2つの非常に協力的なOpenプロジェクト)を見れば、たくさんの空行があるのがわかるでしょう。


apache web server:

LINUX KERNELです。

ポイントは、書かれた行がすべて空行 であることです。

大きなコードを読むのは難しく、コードを読むために上下にスクロールし 続けることになります。

また、{ }を配置するロジックがない場合、バグを見つけるのはさらに難しくなります。

 
deVries:


MACDの例として使用するために

通貨チャートと注文の価格を比較する方法がわかりましたね。

というようなことをしなければなりません。


こんな価格比較関数があるんです。

OrderSend()で選択された注文の'Comment'をSelected order's Magic Numberのように比較するにはどうしたらいいですか?

OrderComment()が選択された注文のコメントと一致するかどうかを検証したい場合とか?

SellOrder=OrderSend(Symbol(), iOrderType_Sell, LotSize,OpenPrice,Slippage,dStopLossPrice,dTakeProfitPrice, "Sell Order",MagicNumber, 0,Red) のようになります。

このように比較することができます。

OrderComment()=="Sell Order" // ?

また、OrderSend()関数の コメントを次のように定義することができます。

文字列 comment_sell="Sell Order";

SellOrder=OrderSend(Symbol(), iOrderType_Sell, LotSize,OpenPrice,Slippage,dStopLossPrice,dTakeProfitPrice, comment_sell ,MagicNumber, 0,Red);

そして、比較します。

if (OrderComment()=="comment_sell")// ?

を比較します。

 
Arav007:


このような価格比較機能があります。

OrderSend()の選択された注文の'Comment'をSelected order's Magic Numberと同様に比較するにはどうしたらよいでしょうか?

例えば、OrderComment()が選択された注文のコメントと一致するかどうかを検証したい場合は?

SellOrder=OrderSend(Symbol(), iOrderType_Sell, LotSize,OpenPrice,Slippage,dStopLossPrice,dTakeProfitPrice, "Sell Order",MagicNumber, 0,Red) のようになります。

このように比較することができます。

OrderComment()=="Sell Order" // ?

また、OrderSend()関数のコメントを次のように定義することができます。

文字列 comment_sell="Sell Order";

SellOrder=OrderSend(Symbol(), iOrderType_Sell, LotSize,OpenPrice,Slippage,dStopLossPrice,dTakeProfitPrice, comment_sell ,MagicNumber, 0,Red);

そして、比較します。

if (OrderComment()=="comment_sell")// ?

と比較します。


OrderCommentはブローカーによって上書きされる可能性があります。

ということです。さて、私の要求通り、価格が7pip [103.603]の利益になったとき、1番目と2番目のトレードのストップロスは、1pipの利益[103.603]になります。

1番目と2番目のトレードのストップロスは1ピップの利益[103.543]になり、3番目のトレードのストップロスは103.386のままです。

extern int BreakEven = 7 とする。

         if(OrderType()==OP_BUY)
           {

            //--- check for BreakEven
            if(BreakEven>0)
              {
               if(Bid-OrderOpenPrice()>Point(*10)*BreakEven)
                 {
                  if(OrderStopLoss()<OrderOpenPrice())
                    {
                     //--- modify order
                     if(OrderTakeProfit()>Point)OrderModify(OrderTicket(),OrderOpenPrice(),OrderOpenPrice()+Point(*10),OrderTakeProfit(),0,Green);
                    }
                 }
              }
           }

(* 10 ) 5桁のブローカーで補正してpipvalueを取得します。