1

私は多くのことを試しましたが、以下のコードでは動作しません。

以下のコードのロジックのバリエーションを試しましたが、失敗し、実装する場所がわかりません。

if (  OrderSelect( OrdersHistoryTotal() - 1, SELECT_BY_POS, MODE_HISTORY ) )
{
      if (  OrderType() == OP_BUY )
      {
            if (  OrderClosePrice() >  OrderStopLoss() )      Print( "Hit TP" );
            else                                              Print( "Hit SL" );
      }
      else if (  OrderType() == OP_SELL )
           {
                 if (  OrderClosePrice() <  OrderStopLoss() ) Print( "Hit TP" );
                 else                                         Print( "Hit SL" );
           }
}  

また

Orderselect...

if (  MathAbs( OrderClosePrice()
             - OrderTakeProfit()
               ) > MathAbs( OrderClosePrice()
                          - OrderStopLoss()
                            )
      ) Print( "StopLoss" );

if (  MathAbs( OrderClosePrice()
             - OrderTakeProfit()
               ) < MathAbs( OrderClosePrice()
                          - OrderStopLoss()
                            )
      ) Print( "TakeProfit" );

これOrderSelect()は私にとって問題でしたので、どんな助けも大歓迎です。

以下は、私が追加しようとしている EA ですが、それをどこにどのように配置するかを知っているだけでも役に立ちます。

extern int      MagicNumber     = 10001;
extern double   Lots            =     0.01;
extern double   StopLoss        =     1;
extern double   TakeProfit      =     1;
extern int      TrailingStop    =     0;
extern int      Slippage        =     3;
//+------------------------------------------------------------------+
//    expert start function
//+------------------------------------------------------------------+
int start() // New-MQL4.56789 #strict uses another constructor:         int OnTick(){...}
{
  double MyPoint = Point;
  if (  Digits == 3
     || Digits == 5
     )  MyPoint = Point*10;

  double TheStopLoss    = 0;
  double TheTakeProfit  = 0;

  if ( TotalOrdersCount() == 0 )
  {
     int result = 0;
     if (  ( iMA( NULL, 0, 30, 0, MODE_SMA, PRICE_CLOSE, 1 ) <  iMA( NULL, 0, 200, 0, MODE_SMA, PRICE_CLOSE, 1 ) )
        && ( iMA( NULL, 0, 30, 0, MODE_SMA, PRICE_CLOSE, 0 ) >  iMA( NULL, 0, 200, 0, MODE_SMA, PRICE_CLOSE, 0 ) )
        ) // ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ Here is your open BUY rule
     {
        result = OrderSend( Symbol(),
                            OP_BUY,
                            Lots,
                            Ask,
                            Slippage,
                            0,
                            0,
                            "Buy",
                            MagicNumber,
                            0,
                            Blue
                            );
        if (  result >  0 )
        {
              TheStopLoss   = 0;
              TheTakeProfit = 0;

              if (  TakeProfit >  0 ) TheTakeProfit = Ask + TakeProfit * MyPoint;
              if (  StopLoss   >  0 ) TheStopLoss   = Ask - StopLoss   * MyPoint;

              OrderSelect( result, SELECT_BY_TICKET );
              OrderModify( OrderTicket(),
                           OrderOpenPrice(),
                           NormalizeDouble( TheStopLoss,   Digits ),
                           NormalizeDouble( TheTakeProfit, Digits ),
                           0,
                           Green
                           );
        }
        return(0);
     }
     if (  ( iMA( NULL, 0, 30, 0, MODE_SMA, PRICE_CLOSE, 1 ) >  iMA( NULL, 0, 200, 0, MODE_SMA, PRICE_CLOSE, 1 ) )
        && ( iMA( NULL, 0, 30, 0, MODE_SMA, PRICE_CLOSE, 0 ) <  iMA( NULL, 0, 200, 0, MODE_SMA, PRICE_CLOSE, 0 ) )
        ) // ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ Here is your open SELL rule
     {
        result = OrderSend( Symbol(),
                            OP_SELL,
                            Lots,
                            Bid,
                            Slippage,
                            0,
                            0,
                            "Sell",
                            MagicNumber,
                            0,
                            Red
                            );
        if (  result >  0 )
        {     
              TheStopLoss   = 0;
              TheTakeProfit = 0;

              if (  TakeProfit >  0 ) TheTakeProfit = Bid - TakeProfit * MyPoint;
              if (  StopLoss   >  0 ) TheStopLoss   = Bid + StopLoss   * MyPoint;

              OrderSelect( result, SELECT_BY_TICKET );
              OrderModify( OrderTicket(),
                           OrderOpenPrice(),
                           NormalizeDouble( TheStopLoss,   Digits ),
                           NormalizeDouble( TheTakeProfit, Digits ),
                           0,
                           Green
                           );
        }
        return(0);
     }
  }

  for ( int cnt = 0; cnt <  OrdersTotal(); cnt++ )
  {     
        OrderSelect( cnt, SELECT_BY_POS, MODE_TRADES );

        if (  OrderType()        <= OP_SELL
           && OrderSymbol()      == Symbol()
           && OrderMagicNumber() == MagicNumber
           )  
        {     
              if (  OrderType() == OP_BUY )
              {     
                    if (  TrailingStop >  0 )
                    {     
                          if (  Bid - OrderOpenPrice() >  MyPoint * TrailingStop )
                          {     
                                if (  OrderStopLoss()  <  Bid - MyPoint * TrailingStop )
                                {     
                                      OrderModify( OrderTicket(),
                                                   OrderOpenPrice(),
                                                   Bid - TrailingStop * MyPoint,
                                                   OrderTakeProfit(),
                                                   0,
                                                   Green
                                                   );
                                      return(0);
                                }
                          }
                    }
              }
              else 
              {     
                    if (  TrailingStop >  0 )
                    {     
                          if (  ( OrderOpenPrice() - Ask ) >  ( MyPoint * TrailingStop ) )
                          {     
                                if (  ( OrderStopLoss() >  ( Ask + MyPoint * TrailingStop ) )
                                   || ( OrderStopLoss() == 0 )
                                   )
                                {     
                                      OrderModify( OrderTicket(),
                                                   OrderOpenPrice(),
                                                   Ask + MyPoint * TrailingStop,
                                                   OrderTakeProfit(),
                                                   0,
                                                   Red
                                                   );
                                      return(0);
                                }
                          }
                    }
              }
        }
  }
  return(0);
}

int    TotalOrdersCount()
{      
       int result = 0;
       for (  int i = 0; i <  OrdersTotal(); i++ )
       {
           OrderSelect( i, SELECT_BY_POS, MODE_TRADES );

           if (  OrderMagicNumber() == MagicNumber ) result++;

       }
       return( result );
}
4

1 に答える 1

0

... open WHEN ...目標の重要な部分です

OrderSelect()「Open WHEN」パズルを解くのにあまり役に立ちません。db.POOLローカルホストの内部 DBMS が処理するレコード全体をクロールするだけMetaTrader Terminal 4です。これは、注文管理タスクのイベントを処理する方法としては遅く、非常に非効率的です。そのため、プロダクション グレードのシステムで任意にスキャンすることは避けてください。ここでは、そのような壊滅的なスキャンから、タスクに必要な重要な情報を取得することさえできないため、db.POOL最初に目標に焦点を当てましょう.


... WHAT ...目標の背後にあるアイデアですか?

これEAは、遅い 200 / 速い 30 単純移動平均クロスの学問的に自明なバリエーションです。

そこに、基礎となる SMA クロスオリジネート取引がそれぞれ終了に達したという条件で、追加の取引を開くという追加のアイデアを追加したいと思いますよね{ SL | TP }?

このような場合、ブローカーは通常、価格が事前に定義されたレベルに達したと仮定して、市場に参入する意志に関する記録を維持するようにブローカーに指示する、MetaTrader Server 4いわゆる未決注文を出すことができます。タイトルでリクエストしたとおりになります。そのようなレコードは、そのような値動きが発生するかどうかにかかわらず、保留中の注文{ SL | TP }と呼ばれる非アクティブな状態で待機しています.. .

利用規約については、ブローカーの契約を確認するか、カスタマー ケア担当者にお問い合わせください。いくつかの特別な制限が適用される場合があります ( a-priori を知っておくとよいでしょう)。


... WHERE ... コードを入れるには?

提供されたコードを再設計せずに (いくつかの小さなエラー/非効率性があります)、コードは次の場所に移動します。

    result = OrderSend( Symbol(),
                        OP_SELL,  // PRIMARY SELL <<<AT-MARKET>>>
                        Lots,
                        Bid,
                        Slippage,
                        0,
                        0,
                        "Sell",
                        MagicNumber,
                        0,
                        Red
                        );
    if (  result >  0 )
    {     
          TheStopLoss   = 0;
          TheTakeProfit = 0;

          if (  TakeProfit >  0 ) TheTakeProfit = Bid - TakeProfit * MyPoint;
          if (  StopLoss   >  0 ) TheStopLoss   = Bid + StopLoss   * MyPoint;

          OrderSelect( result, SELECT_BY_TICKET );

          OrderModify( OrderTicket(),
                       OrderOpenPrice(),
                       NormalizeDouble( TheStopLoss,   Digits ),
                       NormalizeDouble( TheTakeProfit, Digits ),
                       0,
                       Green
                       );
       // ---------------------------------------------------- HERE ADD
          OrderSend(   Symbol(),
                       OP_SELLSTOP,    // SELL-STOP PENDING ORDER ON SELL.TP
                       Lots,
                       NormalizeDouble( TheTakeProfit
                                      - MarketInfo( _Symbol, MODE_SPREAD ),
                                        Digits
                                        ),
                       Slippage,
                       0,              // SL: T.B.D.
                       0,              // TP: T.B.D.
                       "Sell on Sell.TP",
                       sTpMagicNumber, // avoid collisions with other logic
                       0,              // never expires
                       Red
                       );

          OrderSend(   Symbol(),
                       OP_BUYSTOP,    // BUY-STOP PENDING ORDER ON SELL.SL
                       Lots,
                       NormalizeDouble( TheStopLoss
                                      - MarketInfo( _Symbol, MODE_SPREAD ),
                                        Digits
                                        ),
                       Slippage,
                       0,              // SL: T.B.D.
                       0,              // TP: T.B.D.
                       "Buy on Sell.SL",
                       bSlMagicNumber, // avoid collisions with other logic
                       0,              // never expires
                       Red
                       );
    }

スプレッド調整は絶対的なものではありません。不安定な期間中、市場は誤ったスプレッド ボラティリティにさらされるからです。ここでも、ブローカーの利用規約が適用されるので、注意してください。

于 2016-05-16T12:53:34.600 に答える