2

注文を変更しようとしていますが、注文の変更中にエラーが発生しました!、エラー #130. ECN ブローカーを使用しているため、ストップロス/テイクプロフィットを設定するために注文を変更する必要があります。私が間違っていることは何ですか?

int digits = MarketInfo( Symbol(), MODE_DIGITS );
if (      digits == 2 || digits == 3 ) pipdigits = 0.01;
else if ( digits == 4 || digits == 5 ) pipdigits = 0.0001;

selltakeprofit = Ask + ( takeprofit * pipdigits );
sellstoploss   = Ask - ( stoploss   * pipdigits );

ticket = OrderSend( Symbol(), OP_SELL, lotsize, Ask, 100, 0, 0, 0, 0, 0, CLR_NONE );
if ( ticket < 0 )
    {
       Print( "venda Order send failed with error #", GetLastError() );
       Print( "stop loss = ",                         sellstoploss );
     }
else
    {
       Print( "Order send sucesso!!" );
       Print( "Balance = ",                           AccountBalance() );
       Print( "Equity = ",                            AccountEquity() );

       bool res = OrderModify( ticket, 0, sellstoploss, selltakeprofit, 0 );

       if ( res == false )
         {
             Print( "Error modifying order!, error#", GetLastError() );
             Print( "sellstoploss ",                  sellstoploss );
             Print( "selltakeprofit ",                selltakeprofit );
             Print( "StopLevel ",                     StopLevel );
             Print( "Ask ",                           Ask );
          }
      else
        {
             Print( "Order modified successfully" );
         }
     }
4

5 に答える 5

3

OrderModify()呼び出しは、1 つではなく 2 つの制約と衝突する可能性があります

MODE_STOPLEVEL1 つ目は些細なことですが、SL/TP をブローカーが定義した距離よりも近づけることはできません 。

2 つ目はあまり目立たないもので、変更することはできません。TP } ブローカーが定義した凍結距離がそれぞれの XTO 価格 (eXecute-Trade-Operation 価格、{ AskShort.SL & Short.TP の場合 | BidLong.TP & Long.SL の場合})によって訪問された場合

MarketInfo( Symbol(), MODE_STOPLEVEL ) // returns a min allowed distance [pts]

MarketInfo( Symbol(), MODE_FREEZELEVEL ) // returns a freezing distance [pts]

OrderSend()一部の ECN/STP アカウント タイプでは制限される場合があります

STP/ECN システムに設定されたもう 1 つの非常に一般的な条件 (ブローカーの社内リスク管理ポリシーによって導入された) は、TP/SL をすぐに設定することは許可されていませんが、OrderSend()これらを空白のままにし、肯定的な確認があったOrderSend()場合に送信する必要があるというものです。OrderModify()特定の OrderTicketNumber が TP および/または SL 価格レベルを事後追加するための個別の指示

MetaQuotes NormalizeDouble()Inc. がこれを必須事項として公開しているため、いつでも可能なプラクティスについては、ここでは個別にコメントしていません。


推奨される実践

ブローカーの利用規約を注意深く確認し、あなたのタイプの取引口座に適用されるブローカー側のポリシーの完全な組み合わせについて、アカウント マネージャーに相談してください。

于 2014-12-13T18:55:51.187 に答える
2

エラー #130 はERR_INVALID_STOPS.

最も可能性の高い問題は、

a)入力しているストップロス レベルが注文始値に近すぎます。これは、

MarketInfo( Symbol(), MODE_STOPLEVEL ) // returns a min allowed distance [pts]

そうしないと

b)でストップロス レベルを正規化していないためNormalizeDouble()

買い注文の例については、以下を参照してください。あなたの例では、つまり売り注文の場合、あなたが持っているように売値ではなく買値で注文を開く必要があることに注意してください。また、ストップロスとテイクプロフィットは通常、ビッド価格に対して計算されることに注意してください。ビッドはチャートに表示されるものなので、残念ながらスプレッドの損失を大目に見る必要があります。

その他の小さな問題は、 の最後のパラメーターに色を入力しないことですOrderModify()。とは異なりOrderSend()、これらは関数定義でデフォルトで初期化されないため、実際に渡す必要があります。

//--- get minimum stop level
   double minstoplevel = MarketInfo( Symbol(), MODE_STOPLEVEL );
   Print( "Minimum Stop Level=", minstoplevel, " points" );
   double price = Ask;
//--- calculated SL and TP prices must be normalized
   double stoploss   = NormalizeDouble( Bid - minstoplevel * Point, Digits );
   double takeprofit = NormalizeDouble( Bid + minstoplevel * Point, Digits );
//--- place market order to buy 1 lot
   int ticket = OrderSend( Symbol(), OP_BUY, 1, price, 3, stoploss, takeprofit, "My order", 16384, 0, clrGreen );
于 2014-12-03T08:43:06.487 に答える
1

買い取引を実行するとき、あなたの価格は でありAsk、あなたのストップロスとテイクプロフィットは反対の取引への参照ですBid

stoplossこの単純なルールを使用すると、購入時に次のようtakeprofitになります。

   double stoploss   = NormalizeDouble( Bid - minstoplevel * Point, Digits );
   double takeprofit = NormalizeDouble( Bid + minstoplevel * Point, Digits );

   int    ticket     = OrderSend( Symbol(),
                                  OP_BUY,
                                  lots,
                                  price,
                                  slippage,
                                  stoploss,
                                  takeprofit
                                  );

逆に、あなたが売るとき:

   double stoploss   = NormalizeDouble( Ask + minstoplevel * Point, Digits );    
   double takeprofit = NormalizeDouble( Ask - minstoplevel * Point, Digits );

   int    ticket     = OrderSend( Symbol(),
                                  OP_SELL,
                                  lots,
                                  price,
                                  slippage,
                                  stoploss,
                                  takeprofit
                                  );
于 2016-11-25T11:58:41.450 に答える