1

成行注文を変更して、ポジションが 100 ピップスになったときにポジションが損益分岐点になるようにしようとしています。StopLevelsこれは、私のブローカーの約 20 ~ 30 ピップの原因でもあります。for(){...}「ループ」関数を介してパラメータをチェックします

MagicNumber、チャートの時間枠番号です (つまり240、=4H、60=1H) 価格を設定しませんTakeProfit&最初は価格を設定しませんStopLoss

取引の利益が 100 ピップ (プラス ストップレベル) に達したとき、始値に等しくなるようにEAa を追加していません。SL利益ポイントは130ポイントを優に超えます。

私のコードはOP_SELL注文のために以下にあります - どんな助けでも大歓迎です. よろしく、 トッド

/*Global Declarations*/
double   pnlPoints;
double   price, sl, tp;
double   point;
int      stopLevel;
int      breakeven;
double   newSL; 

/*Local  Declaratons*/
pnlPoints            =  0;
point                =       MarketInfo( Symbol(), MODE_POINT );
stopLevel            =  int( MarketInfo( Symbol(), MODE_STOPLEVEL )
                           + MarketInfo( Symbol(), MODE_SPREAD )
                             );
sl                   =  NormalizeDouble( OrderStopLoss(), Digits );
tp                   =  OrderTakeProfit();
breakeven            =  100;


   for( int s = OrdersTotal() - 1; s >= 0; s-- )
   {    if ( (  OrderSelect( s, SELECT_BY_POS, MODE_TRADES ) ) == true )
                price = MarketInfo( Symbol(), MODE_ASK );

        newSL     =  NormalizeDouble( OrderOpenPrice(), Digits );
        pnlPoints = ( OrderOpenPrice() - price ) / point;

        if (                          OP_SELL   == OrderType()               )
              if (                    Period()  == OrderMagicNumber()        )
                    if (              stopLevel <  ( newSL - price ) / point )
                          if (        breakeven <  pnlPoints                 )
                                if (  newSL     != sl                        )

                                      ModSell = OrderModify( OrderTicket(),
                                                             OrderOpenPrice(),
                                                             newSL,
                                                             tp,
                                                             buycolor
                                                             );
                                else if (  ModBuy == false )
                                     {     Print( "OrderModify failed with error #",
                                                   GetLastError()
                                                   );
                                     }
   }
4

2 に答える 2

0

とりあえずコードを
リファインしてセルフデバッグ・トレースコード
を追加

OrderModify()自己デバッグ/ジャーナリングPrint( StringFormat( ... ) )を使用して、実際の呼び出しで使用されたすべての指示された値OrderModify()と、リモート実行 ( { server-side | StrategyTester } ) で報告された問題を文書化した後。

現在のコードはそのような自己診断に入らModSellず、まったく検査されModBuyず、不確実な条件でのみ検査されます / (for(){...}の後の部分へのコード実行パスの将来の訪問で偶然にnewSL == sl偶然にも会った)


次に、割り当てられた値を確認しますtp

上記のように、

/*Local  Declarations*/
...
tp                   =  OrderTakeProfit();

これにより、 this (本質的に不確実な値再利用することは、誰にもわかりませんが、決定するポインターを設定した最後の値であり、 thisのどのレコードから誤って読み取られるか ( レコードが存在する場合)という合理的な疑いが生じますin already )レコード全体をトラバースすると、次の一連の呼び出しでテイクプロフィット価格を適切に設定するための条件が満たされません。OrderSelect()db.Pooldb.PoolOrderTakeProfit()db.Poolfor(){...}db.PoolOrderModify()

これが根本的な原因、または有効なブローカー準拠のOrderModify()値に対する未処理の例外の原因のようです。

于 2016-04-20T12:17:52.340 に答える