[ARCHIVE] フォーラムを散らかさないように、どんなルーキーでも質問してください。プロフェッショナルは、通り過ぎないでください。Nowhere without you - 3. - ページ 465

 

すべて正常に選択されているのですが、エラーがおかしいのでテスターで調べてもわかりません。

ロット0.3をクローズし、ロット0.7を同時に売ったと書かれています。テスターで取引の一部が決済されるのは、こういうことなのでしょうか。そのようなボリュームがどこから来るのかわかりません。エキスパートアドバイザーにはそのようなボリュームに関する情報はありません。

   for(Counter1=0;Counter1<OrdersTotal();Counter1++)
     {
     if(OrderSelect(Counter1,SELECT_BY_POS,MODE_TRADES) == false) break;
     if(OrderSymbol() == Symbol() && OrderMagicNumber() == MagicNumber)
       {
       if(OrderType() == OP_BUY)
         {
         
         BuyOpened = 1;
         if((Bid - OrderOpenPrice()) / Point >= TrailingLevel1 && (Bid - OrderOpenPrice()) / Point < TrailingLevel2)
           {
           // Перенести в безубыток
           }
         }
       if(OrderType() == OP_SELL)
         {
         TrailingPrice1 = OrderOpenPrice() - TrailingLevel1*Point;
         MyOrderStopLoss1 = NormalizeDouble(OrderStopLoss(),4);
         MyOrderStopLoss1 = OrderOpenPrice() - BreakEven*Point;
         SellOpened = 1;
         if((OrderOpenPrice() - Ask) / Point >= TrailingLevel1 && (OrderOpenPrice() - Ask) / Point < TrailingLevel2 && OrderStopLoss() != MyOrderStopLoss1)
           {
           ClosingLot = OrderLots() / 100 * ClosingPercent;
           ClosingLot = NormalizeDouble(ClosingLot,3);
           OrderClose(OrderTicket(),ClosingLot,Ask,Slippage,Yellow);
           OrderModify(OrderTicket(),OrderOpenPrice(),OrderOpenPrice() - BreakEven*Point,OrderTakeProfit(),OrderExpiration(),Black);
           }
         }
       }
     }
 
sss2019:

すべて正常に選択されているのですが、エラーがおかしいのでテスターで調べてもわかりません。

ロット0.3をクローズし、ロット0.7を同時に売ったと書かれています。テスターで取引の一部が決済されるのは、こういうことなのでしょうか。また、取引の一部が決済され、0.16、0.24、0.12とオープンする場合、どこからそのようなボリュームが出てくるのか分かりません。エキスパートアドバイザーにはそのようなボリュームはありません。

はい、このようにクローズの一部が表示されます。


2つ質問があります。

1)次に閉じるべきでないものをどのように知るか?

次のティックでは,この関数の条件が再び満たされます。

2) 私の記憶違いでなければ、部分閉鎖後にオーダーチケットが変更される、つまり

OrderClose(OrderTicket(),ClosingLot,Ask,Slippage,Yellow);
           OrderModify(OrderTicket(),OrderOpenPrice(),OrderOpenPrice() - BreakEven*Point,OrderTakeProfit(),OrderExpiration(),Black);
           

2行目に変更はありません


3)そして忘れてはならないのがノーマライゼーション...。

 
ilunga:

はい、このようにパーツを閉じた状態で表示されます。


の2つの質問をすぐにしました。

1)これ以上閉じる必要がないとどうしてわかるのですか?

この関数では,次のティックの条件が再び満たされます。

2) 私の記憶違いでなければ、部分閉鎖後にオーダーチケットが変更される、つまり

2行目に変更はありません


3)そして忘れてはならないのが、ノーマライゼーション...。


チケットは本当に変わるのか?それが、すべてのエラーの原因になっているのでしょう。では、なぜ手動で注文を変更しても、チケットは変更されないのでしょうか?チケットが変わるかどうか、はっきりさせたいんです。
 


本当に変わりました、ありがとうございました
 
通貨ペアから価格を取得してさらに作業を行う場合、例えば最小値から取得した価格を正規化してストップロスに 設定する必要があると聞いたのですが、本当でしょうか?
 
sss2019:
通貨ペアから価格を取得する場合、例えば安値から取得し、ストップロスまで正規化する必要があると聞いたのですが、本当でしょうか? 。

はい、しかし、Ordersend/OrderModify/...にセットした瞬間の正規化ということです。これらの機能の前に、操作することができます。
 
sergeev:

しかし、正規化はOrdersend/OrderModify/...での置換の瞬間に行われることを意味します。これらの機能の前に、操作することができますし、操作を行うことができます

何桁まで正規化すればいいのでしょうか?デフォルトでは、価格は小数点以下4桁のようで、5桁の価格値でも、少なくともLow[0]とHigh[0]は常に小数点以下4桁しかなく、Alertで出力したり、Printで 出力してみたりしてみました。
 
sss2019:

何桁まで正規化すればいいのでしょうか?デフォルトでは5桁の値でも小数点以下4桁のようで、少なくともLow[0]とHigh[0]は常に小数点以下4桁しかなく、AlertやPrintで出力しようとしたのですが。

デフォルトでは、Digits 価格は小数点の後に数字があります。

とAlert、Printはデフォルトで4つしか出力されません。詳細は、文字列DoubleToStr( double value, int digits) を使用してください。

 

そして、このようにトレーリングストップを実行するのを助けます。売り注文

         if((OrderOpenPrice() - Ask) / Point > Trailing) //Если прибыль в пунктах больше чем уровень трейлинг стопа
           {
           NewStopLoss = Ask + TrailingLevel2*Point;
           double NewStopLoss2 = 9999;
           if(NewStopLoss2 > NewStopLoss)
             {
             NewStopLoss2 = NewStopLoss;
             }
           OrderModify(OrderTicket(),OrderOpenPrice(),NewStopLoss2,OrderTakeProfit(),OrderExpiration(),Black);
           }

問題は、ストップロスは順張りしかできないはずなのに、私の注文では逆張りもされていることです。

________________________________

質問が消えてしまいました、すみません。

 
sss2019:

そして、このようにトレーリングストップを実行するのを助けます。売り注文

問題は、ストップロスは前方にしか移動しないはずなのに、後方にも移動させていることです。

double NewStopLoss2 = 9999;
           if(NewStopLoss2 > NewStopLoss)
             {
             NewStopLoss2 = NewStopLoss;
             }

と同じです。

NewStopLoss2 = NewStopLoss;