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

 
Arav007:


すみません、ちょっと混乱してきました。

if(iOpenOrders_Buy = 3)

ここで、開設した買い注文の合計が「3」であれば、コードは次の部分に進みます。

if(iOpenOrders_Buy > 0 )

もし、開設した買い注文の合計が'0'よりも大きければ、次の部分に進みます。

if(iOpenOrders_Buy == 3)

次に、もしオープンした買い注文の数が 3 であればBuyOrder_1 をオープンし、もし '2' であればBuyOrder_2 オープン し、そして BuyOrder_3 はオープンした買い注文の数が 1 である場合です。

私は正しいですか?

double dTakeProfitPrice_1=10;

double dTakeProfitPrice_2=20;

double dTakeProfitPrice_3=0;
double BuyOrder_1,.......,.......;
if (Buy Condition Met && iOpenOrders_Buy == 0)
{

iOpenOrders_Buy = 3;

{

if(iOpenOrders_Buy  > 0) // we have to open new Buy orders

{

if(iOpenOrders_Buy == 3)
         {
         BuyOrder_1=OrderSend(Symbol(), iOrderType_Buy, LotSize,OpenPrice,Slippage,dStopLossPrice,dTakeProfitPrice_1, "Buy Order",MagicNumber, 0,Blue);
         if(BuyOrder_1 > 0).......
         

         }
if(iOpenOrders_Buy == 2)
         {
         BuyOrder_2=OrderSend(Symbol(), iOrderType_Buy, LotSize,OpenPrice,Slippage,dStopLossPrice,dTakeProfitPrice_2, "Buy Order",MagicNumber, 0,Blue);
....



if(iOpenOrders_Buy == 1)
         {
         BuyOrder_3=OrderSend(Symbol(), iOrderType_Buy, LotSize,OpenPrice,Slippage,dStopLossPrice,dTakeProfitPrice_3, "Buy Order",MagicNumber, 0,Blue);
....
}

変更されたコードをもう一度見てください。
 
deVries:

あなたは正しいです変更されたコードにもう一度見て、これは大丈夫ですか?


そんなことはないだろう。

if (買い条件が成立 && iOpenOrders_Buy == 0)

これは、「買い条件が成立」していて、「開いている買い注文」がないことを意味していますね?

ということで、次の行、iOpenOrders_Buy = 3 に進みます

つまり、すでに3つの注文が開かれていることをEAに伝えているわけですね?

しかし、もし私がそこに買い注文がないことを知っていてコードを入力したのなら、なぜiOpenOrders_Buy = 3; を代入しているのでしょうか?

また、3つの取引のうち1つは実行され続け、最後の取引が終了したときに「新規」買い注文だけが開かれるようにすることが目標です。

ですから、次のようにしなければなりません。

if(iOpenOrders_Buy== 0) // 開いた買い注文がないので、新しい買い 注文を開く必要がある。


EAが買い条件を取得したら、異なる利食い 値で3つの取引を開始します。

そして、そのうちの2つの取引が(TPかSLのどちらかによって)いずれにせよ閉じられた場合、3つ目の取引は実行され続けるでしょう。

 double dTakeProfitPrice_1=10;

double dTakeProfitPrice_2=20;

double dTakeProfitPrice_3=0;

double BuyOrder_1,BuyOrder_2,BuyOrder_3;  

iMaxOrders=3; 

iOpenOrders_Buy = CntOrd(iOrderType_Buy,MagicNumber,Symbol());  //counting open buy orders. 

if (Buy Condition Met && iOpenOrders_Buy ==0) //Buy condition has met and there is no Open Buy Order

{ 

if(iOpenOrders_Buy < iMaxOrders) //This will Limit the desired number of orders; Though this is not necessary.

{

BuyOrder_1=OrderSend(Symbol(), iOrderType_Buy, LotSize,OpenPrice,Slippage,dStopLossPrice,dTakeProfitPrice_1, "Buy Order",MagicNumber, 0,Blue); 

//First order opened with TP1 

BuyOrder_2=OrderSend(Symbol(), iOrderType_Buy, LotSize,OpenPrice,Slippage,dStopLossPrice,dTakeProfitPrice_2, "Buy Order",MagicNumber, 0,Blue);

//Second order opened with TP2  

BuyOrder_3=OrderSend(Symbol(), iOrderType_Buy, LotSize,OpenPrice,Slippage,dStopLossPrice,dTakeProfitPrice_3, "Buy Order",MagicNumber, 0,Blue);

////Third order opened with TP3  

} 

} 

else{

print ("There is already a Running Order")

} 

これについてはどう思われますか?上記と同じようになるのでしょうか?

ご指摘の通りです。

 
Arav007:


そんなことはないだろう。


これについてはどう思われますか?上記と同じようになるのでしょうか?

回答

注文が成功しない場合、どのようなことが起こるのでしょうか。また、失敗した場合、どの取引を開始しなければならないかをどのように確認 するのでしょうか。

なぜiOpenOrders_Buy = 3; を代入しているのですか?

もしordersendが成功したら、3つの新しい取引を開始する必要があるため、iOpenOrders_Buyを新しい 値にします。

iOpenOrders_Buyが0になれば、3つの取引が成立します。

 
deVries:

注文が成功しなかった場合、どのようなことが起こるのでしょうか。また、注文が失敗した場合、どの取引を開始しなければならないかをどのように確認するのでしょうか。

なぜiOpenOrders_Buy = 3; を代入しているのですか?

もしordersendが成功したら、3つの新しい取引を開始しなければならないので、iOpenOrders_Buyを新しい 値にします。

iOpenOrders_Buy が 0 になれば、3つの取引が成立します。

int iLastError;

 for (count=iMaxOrders; count>0; count--)

{

if (count==3) {

 BuyOrder_1=OrderSend(Symbol(), iOrderType_Buy, LotSize,OpenPrice,Slippage,dStopLossPrice,dTakeProfitPrice_1, "Buy Order",MagicNumber, 0,Blue);

if (BuyOrder_1>0) //Checking if the order was opened or not

{ 

Print( "Buy Order 1 Opened successfully");

}

else {

 Print( "Order Sending Error");

iLastError = GetLastError();

iMaxOrders=3; //Setting iMaxOrders to 3 again thus it goes back and try to open that order again

} 

}

 if (count==2) {

 BuyOrder_2=OrderSend(Symbol(), iOrderType_Buy, LotSize,OpenPrice,Slippage,dStopLossPrice,dTakeProfitPrice_2, "Buy Order",MagicNumber, 0,Blue);

if (BuyOrder_2>0) {

Print( "Buy Order 2 Opened successfully");

}

else {

 Print( "Order Sending Error");

iLastError = GetLastError();

iMaxOrders=2;

}  

}

if (count==1) {

 BuyOrder_3=OrderSend(Symbol(), iOrderType_Buy, LotSize,OpenPrice,Slippage,dStopLossPrice,dTakeProfitPrice_3, "Buy Order",MagicNumber, 0,Blue);

if (BuyOrder_3>0) {

Print( "Buy Order 3 Opened successfully");

}

else {

 Print( "Order Sending Error");

iLastError = GetLastError();

iMaxOrders=1;

}  

}

} 

そうです、'Ordersend()' が注文を開くのに失敗することは大いにあり得ることです。

今、私はその理由を理解しました。

if(iOpenOrders_Buy > 0 ) // 新規の買い注文出さなければ ならない。

が使われている理由がわかりました。すでにiopendOrders=3としているので、それを検証することになります。

しかし、この後、iopendOrdersの値がどのように変化し続けるのかがわからなくなりました。

おそらく、私の頭脳の限界で、そのメカニズムを理解できなかったのだと思います。そこで、上記のような方法で、あなたのロジックを実装してみました。

これは、あなたが与えられたコードに参照したものですか?

よろしくお願いします。

 
Arav007:

はい、'Ordersend()'が注文を開くのに失敗することは大いにありえます。

今、私はその理由を理解しました。

if(iOpenOrders_Buy > 0 ) // 新規の買い注文 を出す必要があります。

が使われている理由がわかりました。すでにiopendOrders=3としているので、それを検証することになります。

しかし、この後、iopendOrdersの値がどのように変化し続けるのかがわからなくなりました。

おそらく、私の限られた頭脳では、そのメカニズムを理解することができなかったのでしょう。そこで、上記のような方法で、あなたのロジックを実装してみました。

これは、あなたが与えられたコードに参照したものですか?

よろしくお願いします。


if (BuyOrder_1>0) //Checking if the order was opened or not

{ 

Print( "Buy Order 1 Opened successfully");
count = count - 1;
}

 
deVries:



しかし、私は再び混乱している気にしないでください

もし

count=count-1;後

Print( "買い注文 1が正常に開きました。");

とすると、最初の買い注文が成立したら、countの値が1つ減るということです。

そこで、次の関数に入るときに、次の'if'条件を設定します。

if (count==2) {}

とすると、countの値は'2'になっています。[count=3-1=2]となります。

これは正しいのでしょうか?

 
Arav007:


しかし、私は再び混乱している気にしないでください

もし

count=count-1;後

Print( "Buy Order 1 Opened successfully") とします。

とすると、もし最初の買い注文が開かれたなら、countの値は1だけ減少します。

そこで、次の関数に入るときに、次の'if'条件を設定します。

if (count==2) {}

とすると、countの値は'2'になっています。[count=3-1=2]となります。

これは正しいのでしょうか?


試してみる......テストしてみる
 
deVries:

試しにやってみるか......テストしてみるか。


疲れて、これが結果です。

おそらく、「買いの前に売りの注文を閉じる」コードを適切な場所に配置できなかったのでしょう。そのため、本来のコードに反しているにもかかわらず、売りと買いが混在しています。

しかも、買い注文は全部で「4つ」。

失敗した :(

                double OpenPrice=Ask;

                double  dTakeProfitPrice_1,dTakeProfitPrice_2,dTakeProfitPrice_3;
                dStopLossPrice = NormalizeDouble(OpenPrice - StopLoss * dPip,Digits);
                dTakeProfitPrice_1 = NormalizeDouble(OpenPrice + TakeProfit_1 * dPip,Digits);
                dTakeProfitPrice_2 = NormalizeDouble(OpenPrice + TakeProfit_2 * dPip,Digits);
                dTakeProfitPrice_3 = NormalizeDouble(OpenPrice + TakeProfit_3 * dPip,Digits);
                
 for (int count=iMaxOrders; count>0; count--)

{

if (count==3) {

 BuyOrder_1=OrderSend(Symbol(), iOrderType_Buy, LotSize,OpenPrice,Slippage,dStopLossPrice,dTakeProfitPrice_1, "Buy Order",MagicNumber, 0,Blue);

if (BuyOrder_1>0) //Checking if the order was opened or not

{ 

sLog_CheckBuyConditions = sLog_CheckBuyConditions + sNL + "    Buy order 1 sent successfully. Ticket=" + BuyOrder_1;
                                iLastError = 0;
                                count = count - 1; 

}

else {

 iLastError = GetLastError();
                                
                                sLog_CheckBuyConditions = sLog_CheckBuyConditions + sNL + "    Error sending buy order 1. Error code=" + ErrorDescription(iLastError);

iMaxOrders=3; //Setting iMaxOrders to 3 again thus it goes back and try to open that order again

} 

}

 if (count==2) {

 BuyOrder_2=OrderSend(Symbol(), iOrderType_Buy, LotSize,OpenPrice,Slippage,dStopLossPrice,dTakeProfitPrice_2, "Buy Order",MagicNumber, 0,Blue);

if (BuyOrder_2>0) { 

sLog_CheckBuyConditions = sLog_CheckBuyConditions + sNL + "    Buy order 2 sent successfully. Ticket=" + BuyOrder_2;
                                iLastError = 0;
                                count = count - 1; 

}

else {

 iLastError = GetLastError();
                                
                                sLog_CheckBuyConditions = sLog_CheckBuyConditions + sNL + "    Error sending buy order 2. Error code=" + ErrorDescription(iLastError);

iMaxOrders=2; //Setting iMaxOrders to 2 again thus it goes back and try to open that order again

} 

}

if (count==1) {

 BuyOrder_3=OrderSend(Symbol(), iOrderType_Buy, LotSize,OpenPrice,Slippage,dStopLossPrice,dTakeProfitPrice_3, "Buy Order",MagicNumber, 0,Blue);

if (BuyOrder_3>0) {

sLog_CheckBuyConditions = sLog_CheckBuyConditions + sNL + "    Buy order 2 sent successfully. Ticket=" + BuyOrder_3;
                                iLastError = 0;
                                count = count - 1; 
}

else {

  iLastError = GetLastError();
                                
                                sLog_CheckBuyConditions = sLog_CheckBuyConditions + sNL + "    Error sending buy order 2. Error code=" + ErrorDescription(iLastError);

iMaxOrders=1; //Setting iMaxOrders to 1 again thus it goes back and try to open that order again

}  

}
 

おっと、iOpenOrders_Buy==0 を入れるのを忘れていました。

これでまたテスト。

 
double OpenPrice=Ask;

double  dTakeProfitPrice_1,dTakeProfitPrice_2,dTakeProfitPrice_3;
dStopLossPrice = NormalizeDouble(OpenPrice - StopLoss * dPip,Digits);
dTakeProfitPrice_1 = NormalizeDouble(OpenPrice + TakeProfit_1 * dPip,Digits);
dTakeProfitPrice_2 = NormalizeDouble(OpenPrice + TakeProfit_2 * dPip,Digits);
dTakeProfitPrice_3 = NormalizeDouble(OpenPrice + TakeProfit_3 * dPip,Digits);
                
//some condition
if(Ask>High[1] && OrdersTotal()<1)int count=3; //(int count=iMaxOrders; count>0; count--)
{
iLastError = 0;
   if (count==3) 
    {
    BuyOrder_1=OrderSend(Symbol(), iOrderType_Buy, LotSize,OpenPrice,Slippage,dStopLossPrice,dTakeProfitPrice_1, "Buy Order",MagicNumber, 0,Blue);
    if (BuyOrder_1>0) //Checking if the order was opened or not
      { 
      sLog_CheckBuyConditions = sLog_CheckBuyConditions + sNL + "    Buy order 1 sent successfully. Ticket=" + BuyOrder_1;
      count = count - 1; 
      }
     else {
          iLastError = GetLastError();                               
          sLog_CheckBuyConditions = sLog_CheckBuyConditions + sNL + "    Error sending buy order 1. Error code=" + ErrorDescription(iLastError);
          iMaxOrders=3; //Setting iMaxOrders to 3 again thus it goes back and try to open that order again
          } 
    }

   if (count==2) 
    {
    BuyOrder_2=OrderSend(Symbol(), iOrderType_Buy, LotSize,OpenPrice,Slippage,dStopLossPrice,dTakeProfitPrice_2, "Buy Order",MagicNumber, 0,Blue);
    if (BuyOrder_2>0) 
      { 
      sLog_CheckBuyConditions = sLog_CheckBuyConditions + sNL + "    Buy order 2 sent successfully. Ticket=" + BuyOrder_2;
      count = count - 1; 
      }
     else {
          iLastError = GetLastError();
          sLog_CheckBuyConditions = sLog_CheckBuyConditions + sNL + "    Error sending buy order 2. Error code=" + ErrorDescription(iLastError);
          iMaxOrders=2; //Setting iMaxOrders to 3 again thus it goes back and try to open that order again
          } 
    }

   if (count==1) 
    {
    BuyOrder_3=OrderSend(Symbol(), iOrderType_Buy, LotSize,OpenPrice,Slippage,dStopLossPrice,dTakeProfitPrice_3, "Buy Order",MagicNumber, 0,Blue);
    if (BuyOrder_3>0) 
      {
      sLog_CheckBuyConditions = sLog_CheckBuyConditions + sNL + "    Buy order 2 sent successfully. Ticket=" + BuyOrder_3;
      iLastError = 0;
      count = count - 1; 
      }
     else {
          iLastError = GetLastError();                               
          sLog_CheckBuyConditions = sLog_CheckBuyConditions + sNL + "    Error sending buy order 2. Error code=" + ErrorDescription(iLastError);
          iMaxOrders=1; //Setting iMaxOrders to 3 again thus it goes back and try to open that order again
          }
    }  
}    //all code in red not needed