Trailingstop EAが動作しない。

 

こんにちは、皆さん。 私のEAを正しく動作させることができません。 私は同時に10ペア/チャートでそれを実行しています。 2つの問題があるようです。

1.トレーリングストップがほとんど発動しません。 時々発動しますが、問題は私のOrderSelectにあると思いますが、解決できません。

2.時々エラー130が 出ますが、私のSL/TPがどうして無効なのかわかりません。 印刷している値はすべてのペアでstoplevelを超えています。 そしてエラー130が出ても、実際には何も問題がないかのように注文が修正されることがあります。

このEAを見て、何が問題なのかを教えていただけませんか?

#property strict;
extern string Label_TrailingStart="Pip threshold to activate TrailingStop";
extern int TrailingStart=11;
extern string Label_TrailingStop="Pips trailing behind";
extern int TrailingStop=5;
double stoplevel=(MarketInfo(Symbol(),MODE_STOPLEVEL))/10;
int TS=TrailingStart-TrailingStop-1;
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
int init(){
   if(TS<stoplevel){
      MessageBox("Please note: Your inputs for TrailingStart and/or TrailingStop cannot"+
                 "\nbe less than the minimum levels required by your broker and the"+
                 "\nTrailingStart has been increased automatically to "+StringConcatenate(stoplevel+TrailingStop+1)+" Pips");
     }
   return(0);
  }
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
int deinit(){
   return(0);
  }
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
int start(){
   double Pip=Point*10;
   if(TS<stoplevel) TrailingStart=(int)stoplevel+TrailingStop+1;
   
   Print("stoplevel = ",stoplevel);
   Print("TrailingStart = ",TrailingStart);
   Print("TrailingStop = ",TrailingStop);
   Print("TS = ",TS);
   
   for(int i=OrdersTotal()-1; i>=0; i--)
      if(OrderSelect(i,SELECT_BY_POS)){
         if(OrderSymbol()!=Symbol()) continue;{
            if(OrderType()==OP_BUY){
               if(OrderSelect(OrderTicket(),SELECT_BY_TICKET)){
                  if(Bid-OrderOpenPrice()>TrailingStart*Pip){
                     if(OrderStopLoss()<Bid-TrailingStop*Pip){
                        RefreshRates();
                        if(!OrderModify(OrderTicket(),OrderOpenPrice(),Bid-TrailingStop*Pip,OrderTakeProfit(),Blue))
                        Print("Buy = ",GetLastError());
                        Print("Bid = ",Bid);
                        Print("Bid-TrailingStop*Pip = ",Bid-TrailingStop*Pip);
                        Print("TrailingStart*Pip = ",TrailingStart*Pip);
                        }     
                    }  
                }     
            }  
            if(OrderType()==OP_SELL){
               if(OrderSelect(OrderTicket(),SELECT_BY_TICKET)){
                  if(OrderOpenPrice()-Ask>TrailingStart*Pip){
                     if(OrderStopLoss()>Ask+TrailingStop*Pip){
                        RefreshRates();
                        if(!OrderModify(OrderTicket(),OrderOpenPrice(),Ask+TrailingStop*Pip,OrderTakeProfit(),Red))
                        Print("Sell = ",GetLastError());
                        Print("Ask = ",Ask);
                        Print("Ask+TrailingStop*Pip = ",Ask+TrailingStop*Pip);
                        Print("TrailingStart*Pip = ",TrailingStart*Pip);
                        }
                    }
                }  
            }
         }
      }   
  return(0);
}
//+------------------------------------------------------------------+
 
  1. 括弧が抜けているため、いくつかのコードブロックがズレていますね。バランスはとれていますが、"for "ブロックの先頭や "if "ブロックのいくつかで欠落しています。
  2. if(OrderSymbol()!=Symbol()) continue;{」という 行は非常に怪しく、コードの流れがどうあるべきかがわかりにくくなっています。if(OrderSymbol()==_Symbol) {」に すればいいのです。"Symbol()"の代わりに、"_Symbol"でもOKです。
  3. "Ask"や "Bid"ではなく、"OrderClosePrice()"を使用する。
  4. 比較をするときは括弧をつけると読みやすくなるし、順序も保証される。例えば、「if(Bid-OrderOpenPrice()>TrailingStart*Pip)」の代わりに「if( ( OrderClosePrice()- OrderOpenPrice() ) > ( TrailingStart * Pip ) ) 」を使ってください。
  5. 買いと売りの両方のコードブロックを、両方を処理する単一のコードブロックに統合してみてください。そうすれば、デバッグのためのコードが少なくなり、将来的に読みやすく、修正しやすくなります。

PS!NB!また、Ordersにマジックナンバーを使用してください。

PS!また、130のエラーの原因となるスリッページを考慮することを忘れないでください。StopLevelの最小値だけでは十分ではありません。現在のスプレッドの倍率を加えるなど、起こりうるスリッページを考慮して少し大きめに設定しましょう。また、ブローカーによってFreezeLevelが設定されている可能性もあります

 
FMIC:
  1. 括弧が抜けているため、いくつかのコードブロックがズレていますね。バランスは取れているものの、"for "ブロックの先頭や "if "ブロックのいくつかで欠落しています。
  2. if(OrderSymbol()!=Symbol()) continue;{」という 行は非常に怪しく、コードの流れがどうあるべきかがわかりにくくなっています。
    if(OrderSymbol()==_Symbol) {」に すればいいのです。"Symbol()"の代わりに、"_Symbol"でもOKです。
  3. Ask」や「Bid」ではなく、「OrderClosePrice()」を使用してください。
  4. 比較をするときに括弧をつけると、読みやすくなるし、順番も保証される。
    例えば、"if(Bid-OrderOpenPrice()>TrailingStart*Pip)" の代わりに"if( ( OrderClosePrice()- OrderOpenPrice() ) > ( TrailingStart * Pip ) )" を使用することができます。
  5. BuyとSellの両方のコードブロックを統合して、両方を処理する単一のコードブロックにしてみてください。そうすれば、デバッグのためのコードが少なくなり、将来的に読みやすく、修正しやすくなります。

PS!NB!注文にマジックナンバーを使用することもできます。

PS!130の誤差の原因となるスリッページを考慮することも忘れずに。StopLevelの最小値だけでは十分ではありません。現在のスプレッドの倍率を加えるなど、起こりうるスリッページを考慮して少し大きめに設定しましょう。また、ブローカーによってFreezeLevelが設定されている場合もありますよ。

この度は、ご返信いただきありがとうございました。

1.1では、括弧()を追加するよう提案され、4で提案されたようにしました。 しかし、"for "の最初に括弧()を追加する方法がわかりません。 これは、中括弧{}のことでしょうか、説明していただけますか?

2.私は_Symbolに変更しましたが、私の知識を向上させるために、Symbol()より_Symbolを使うことの利点/長所を説明していただけませんでしょうか?

3.AsksとBidを全てOrderClosePrice()に変更しましたが、これのメリット・長所を教えていただけませんか?

4.こんなことをやってみました

5.もっと簡略化できないか試してみます。

6.手入力なので、MagicNumbersは使えないと理解していますが、違うのでしょうか?

7.スリッページを考慮する方法がわかりません。 どこで、どのように追加するのか教えてください。 OrderModifyでは、以下のパラメータしか使用できません。

bool  OrderModify(
   int        ticket,      // ticket
   double     price,       // price
   double     stoploss,    // stop loss
   double     takeprofit,  // take profit
   datetime   expiration,  // expiration
   color      arrow_color  // color
   );

8.私のコードでは、すでに最小ストプレベルに1ピップ(10ポイント)追加しています。

9.すべてのペアのFreezelevelを出力しましたが、すべて0.0でしたので、問題はなさそうです。

10.エラー130と エラー1が出ても、EAが動くときは注文を修正して決済しています。 つまり、この結果のように、注文も同時に修正されているのでエラーが出るのです。 まるでパートタイム問題のようです。

2016.04.15 13:11:06.183 Trailing_v18 USDCAD,M15: modify #50202284 buy 0.01 USDCAD at 1.28477 sl: 1.28598 tp: 0.00000 ok

2016.04.15 13:11:05.860 Trailing_v18 USDCAD,M15: 買い = 130

2016.04.15 13:10:58.939 Trailing_v18 USDCAD,M15: modify #50202284 buy 0.01 USDCAD at 1.28477 sl: 1.28597 tp: 0.00000 ok

2016.04.15 13:10:57.835 Trailing_v18 USDCAD,M15: modify #50202284 buy 0.01 USDCAD at 1.28477 sl: 1.28596 tp: 0.00000 ok

2016.04.15 13:10:56.974 Trailing_v18 USDCAD,M15: 買い = 130

2016.04.15 13:10:56.531 Trailing_v18 USDCAD,M15:買い=130

2016.04.15 13:10:56.263 Trailing_v18 USDCAD,M15: modify #50202284 buy 0.01 USDCAD at 1.28477 sl: 1.28590 tp: 0.00000 ok

2016.04.15 13:10:54.318 Trailing_v18 USDCAD,M15: modify #50202284 buy 0.01 USDCAD at 1.28477 sl: 1.28582 tp: 0.00000 ok

2016.04.15 13:10:53.175 Trailing_v18 USDCAD,M15: modify #50202284 buy 0.01 USDCAD at 1.28477 sl: 1.28581 tp: 0.00000 ok

2016.04.15 13:10:52.879 Trailing_v18 USDCAD,M15: modify #50202284 buy 0.01 USDCAD at 1.28477 sl: 1.28577 tp: 0.00000 ok

2016.04.15 13:10:51.810 Trailing_v18 USDCAD,M15: 買い = 130

2016.04.15 13:10:51.085 Trailing_v18 USDCAD,M15: modify #50202284 buy 0.01 USDCAD at 1.28477 sl: 1.28575 tp: 0.00000 ok

2016.04.15 13:10:50.744 Trailing_v18 USDCAD,M15: 買い = 130

2016.04.15 13:10:50.020 Trailing_v18 USDCAD,M15:買い=1

2016.04.15 13:10:50.020 Trailing_v18 USDCAD,M15: modify #50202284 buy 0.01 USDCAD at 1.28477 sl: 1.28571 tp: 0.00000 ok

Trailingstopが明らかにstoplevelを上回っている(10pips/100ポイント差)にもかかわらず、エラー130が発生する例をもう一つ紹介します。

2016.04.15 14:15:03.432 Trailing_v18 EURAUD,M15: Buy error = 130

2016.04.15 14:15:03.432 Trailing_v18 EURAUD,M15: TS = 20

2016.04.15 14:15:03.432 Trailing_v18 EURAUD,M15: TrailingStop = 5

2016.04.15 14:15:03.432 Trailing_v18 EURAUD,M15: TrailingStart = 25

2016.04.15 14:15:03.432 Trailing_v18 EURAUD,M15: stoplevel = 10.0



 

あなたが行った更新を含む最も新しいコードを提供してください。そうでなければ、私はあなたが行った最近の変更について、それが正しいかどうかコメントすることができません。

  1. すみません、中括弧のことです。それを直さないと、失敗し続けることになります。これは、すべてのポイントの中で最も重要です。
  2. a) このポイントは、「_Symbol」がメインではなく、「!=」と「continue」がポイントです。
    b) 「_Symbol」は変数なので速く実行されますが、「Symbol()」は関数呼び出しとして実行されるので遅くなります。
  3. OrderClosePrice() は、注文の現在の終値です。まだ開いている場合は、注文の種類 に応じて、自動的にBidまたはAskを報告します。この関数については、ドキュメントをお読みください。
  4. OK!あなたが行ったコードの変更を見てみましょう。
  5. OK!あなたが行ったコードの変更を見てみましょう。
  6. はい、手動取引の場合、マジックナンバーは0です。しかし、あなたのコードでは、マジックナンバーを「extern」または「input」として定義し、デフォルトとして「0」を割り当て、そしてあなたのコードでその変数を使用します。そうすれば、そのEAを他の場面で使ったり、他のEAでコードを再利用したりすることが簡単にできます。
  7. スリッページを考慮する方法は説明しました。TrailStop > ( StopLevel + ( CurrentSpread * Factor ) )」でFactorが少なくとも「1.0」(理想は「1.5」または「2.0」、それでも過剰なスリッページによるエラー130が出るようならそれ以上)であることを確認することです。
  8. スプレッドはSymbolによって異なり、特にニュースイベント時や時間外など流動性が低い時には常に変化しているため、10ポイントあればスプレッドを考慮できるという保証はありません。
  9. OK!FreezeLevel "を使用しないのであれば、それはそれで問題ありませんが、別のブローカー(それがあるかもしれません)でそれを使用する場合、EAがまだ動作するように、あなたのコードでそれに対応することを提案します。
  10. 分析できるように、変更を加えた新しいコードを供給してください。
 
FMIC:

あなたが行った更新を含む最も新しいコードを提供してください。そうでなければ、私はあなたが行った最近の変更について、それが正しいかどうかコメントすることができません。

  1. すみません、中括弧のことです。それを直さないと、失敗し続けることになります。これは、すべてのポイントの中で最も重要です。
  2. a) このポイントは、「_Symbol」がメインではなく、「!=」と「continue」がメインです。
    b) 「_Symbol」は変数なので速く実行されますが、「Symbol()」は関数呼び出しとして実行されるので遅くなります。
  3. OrderClosePrice() は、注文の現在の終値です。まだ開いている場合は、注文の種類に応じて、自動的にBidまたはAskを報告します。この関数については、ドキュメントをお読みください。
  4. OK!あなたが行ったコードの変更を見てみましょう。
  5. OK!あなたが行ったコードの変更を見てみましょう。
  6. はい、手動取引の場合、マジックナンバーは0です。しかし、あなたのコードでは、マジックナンバーを「extern」または「input」として定義し、デフォルトとして「0」を割り当て、そしてあなたのコードでその変数を使用します。そうすれば、そのEAを他の場面で使ったり、他のEAでコードを再利用したりすることが簡単にできます。
  7. スリッページを考慮する方法は説明しました。TrailStop > ( StopLevel + ( CurrentSpread * Factor ) )」でFactorが少なくとも「1.0」(理想は「1.5」または「2.0」、それでも過剰なスリッページによるエラー130が出るようならそれ以上)であることを確認することです。
  8. スプレッドはSymbolによって異なり、特にニュースイベント時や時間外など流動性が低い時には常に変化しているため、10ポイントあればスプレッドを考慮できるという保証はありません。
  9. OK!FreezeLevel "を使用しないのであれば、それはOKですが、別のブローカー(それがあるかもしれない)でそれを使用する場合、EAがまだ動作するように、あなたのコードでそれに対応することを提案します。
  10. 分析できるように、変更を加えた新しいコードを供給してください。


上記のアドバイスと提案をすべて調べてみます。 とりあえず、これが最新のコードです。 また、この行に間違いを見つけたと思います。

#property strict;
extern string Label_TrailingStart="Pip threshold to activate TrailingStop";
extern int TrailingStart=12;
extern int TrailingStop=5;
double stoplevel=(MarketInfo(Symbol(),MODE_STOPLEVEL))/10;
int TS=TrailingStart-TrailingStop;
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
int init(){
   if(TS<stoplevel){
      MessageBox("Please note: Your inputs for TrailingStart and/or TrailingStop cannot"+
                 "\nbe less than the minimum levels required by your broker and the"+
                 "\nTrailingStart has been increased automatically to "+StringConcatenate(stoplevel+TrailingStop+2)+" Pips");
     } 
   return(0);
  }
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
int deinit(){
   return(0);
  }
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
int start(){
   double Pip=Point*10;
   int ticket=0;
   if(TS<stoplevel) TrailingStart=(int)stoplevel+TrailingStop+2;
   
   /*Print("stoplevel = ",stoplevel);
   Print("TrailingStart = ",TrailingStart);
   Print("TrailingStop = ",TrailingStop);
   Print("TS = ",TS);
   Print("Buy error = ",GetLastError());
                        Print("OrderOpenPrice = ",OrderOpenPrice());
                        Print("OrderClosePrice()-OrderOpenPrice()>TrailingStart*Pip = ",
                        OrderClosePrice()-OrderOpenPrice()>TrailingStart*Pip);
                        Print("OrderClosePrice-TrailingStop*Pip = ",OrderClosePrice()-TrailingStop*Pip);
                        Print("TrailingStart*Pip = ",TrailingStart*Pip);
                        Print("TrailingStop*Pip = ",TrailingStop*Pip);
                        Print("OrderClosePrice = ",OrderClosePrice());
                        Print("OrderStopLoss = ",OrderStopLoss());
                        Print("OrderSymbol = ",OrderSymbol());
                        Print("OrdersTotal = ",OrdersTotal());
                        Print("OrderSelect = ",OrderSelect(OrderTicket(),SELECT_BY_TICKET));
                        Print("ticket = ",ticket);
                        Print("OrderTicket = ",OrderTicket());
                        Print("Selectbyticket = ",SELECT_BY_TICKET);
                        Print("Selectbypos = ",SELECT_BY_POS);
                        Print("Ask = ",Ask);
                        Print("OrderModify = ",OrderModify(OrderTicket(),OrderOpenPrice(),OrderClosePrice()-(TrailingStop*Pip),
                        OrderTakeProfit(),Blue));*/
   
   for(int i=OrdersTotal()-1; i>=0; i--)
      if(OrderSelect(i,SELECT_BY_POS)){
      ticket++;
         if(OrderSymbol()==_Symbol){
            if(OrderType()==OP_BUY){
               if(OrderSelect(OrderTicket(),SELECT_BY_TICKET)){
                  if((OrderClosePrice()-OrderOpenPrice())>(TrailingStart*Pip)){
                     if(TrailingStop<OrderClosePrice()-(TrailingStop*Pip)){
                        RefreshRates();
                        if(!OrderModify(OrderTicket(),OrderOpenPrice(),OrderClosePrice()-(TrailingStop*Pip),OrderTakeProfit(),Blue))
                        Print("Buy error = ",GetLastError());
                        }     
                    }  
                }     
            }  
            if(OrderType()==OP_SELL){
               if(OrderSelect(OrderTicket(),SELECT_BY_TICKET)){
                  if((OrderOpenPrice()-OrderClosePrice())>(TrailingStart*Pip)){
                     if(TrailingStop>OrderClosePrice()+(TrailingStop*Pip)){
                        RefreshRates();
                        if(!OrderModify(OrderTicket(),OrderOpenPrice(),OrderClosePrice()+(TrailingStop*Pip),OrderTakeProfit(),Red))
                        Print("Sell error = ",GetLastError());
                        /*Print("Ask = ",Ask);
                        Print("Ask+TrailingStop*Pip = ",Ask+TrailingStop*Pip);
                        Print("TrailingStart*Pip = ",TrailingStart*Pip);*/
                        }
                    }
                }  
            }
         }
      }   
  return(0);
}
//+------------------------------------------------------------------+

私が行ったかなり大きな変更は、以下の1行目を2行目に変更したことです。 ストップロスにゼロより高い値があるはずだからです。

 if(OrderStopLoss()<OrderClosePrice()-(TrailingStop*Pip)){
if(TrailingStop<OrderClosePrice()-(TrailingStop*Pip)){
 

次のコード例は、あなたのコードに対する可能な解決策/代替案として役立ちます。ただし、このコードはテストもデバッグもされていない(コンパイルのみ)ので、あくまで「擬似」コードとしてお使いください。

#property strict

extern double
   dblTrailStartPips = 11.0,  // Trailing Start (Pips)
   dblTrailStopPips  = 5.0,   // Trailing Stop (Pips)
   dblPipMultiplier  = 10.0,  // Pips to Points Multiplier
   dblSpreadFactor   = 2.0;   // Spread Factor for Slippage Compensation
   
extern int
   intMagicNumber    = 0;     // Magic Number (0 for Manual Orders)
   
double
   dblTickSizeDelta,          // Size of a Tick (Delta)
   dblStopLevelDelta,         // Market Stop Level (Delta)
   dblTrailStartDelta,        // Trailing Start (Delta)
   dblTrailStopDelta;         // Trailing Stop (Delta)

// Initialisation
int OnInit()
{
   dblTickSizeDelta   = MarketInfo( _Symbol, MODE_TICKSIZE );
   dblStopLevelDelta  = MarketInfo( _Symbol, MODE_STOPLEVEL ) * _Point;
   dblTrailStartDelta = dblTrailStartPips * dblPipMultiplier  * _Point;
   dblTrailStopDelta  = dblTrailStopPips  * dblPipMultiplier  * _Point;
   
   return( INIT_SUCCEEDED );
}

// Process Tick Event
void OnTick()
{
   double
      dblSpreadDelta  = Ask - Bid,
      dblMinStopDelta = dblStopLevelDelta + ( dblSpreadDelta * dblSpreadFactor ),
      dblTrailDelta   = ( dblTrailStopDelta > dblMinStopDelta ) ? dblTrailStopDelta : dblMinStopDelta;
   
   for( int i = OrdersTotal() - 1; i >= 0; i-- )
   {
      if( OrderSelect( i, SELECT_BY_POS, MODE_TRADES ) )
      {
         if( ( OrderSymbol() == _Symbol ) && ( OrderMagicNumber() == intMagicNumber ) )
         {
            int intDirection = 0;
            switch( OrderType() )
            {
               case OP_BUY:  intDirection = +1; break;
               case OP_SELL: intDirection = -1; break;
               default:                         continue;
            }
            
            double
               dblOpenPrice  = OrderOpenPrice(),
               dblCloseDelta = ( OrderClosePrice() - dblOpenPrice ) * intDirection;
               
            if( dblCloseDelta > dblTrailStartDelta )
            {
               double
                  dblStopLossPrice = OrderStopLoss(),
                  dblStopLossDelta = ( dblStopLossPrice  - dblOpenPrice ) * intDirection,
                  dblTrailingDelta = dblCloseDelta - dblTrailDelta;
               
               if( ( dblTrailingDelta > dblStopLossDelta ) || ( dblStopLossPrice == 0 ) )
               {
                  double dblStopLoss = round( ( dblOpenPrice + ( dblTrailingDelta * intDirection ) ) / dblTickSizeDelta ) * dblTickSizeDelta;
                  if( dblStopLoss != dblStopLossPrice )
                  {
                     if( !OrderModify( OrderTicket(), dblOpenPrice, dblStopLoss, OrderTakeProfit(), OrderExpiration() ) )
                     {
                        Print( "Order Modification Failed with Error: ", GetLastError() );
                     }
                  }
               }
            }
         }
      }
   }
}
 

このTrader3000を試してみてください

このコードとあなたが既に持っているものを比較してください...それは非常に似ていて、私は何年もそれを使用しており、それは爆弾のように動作しています...

//+------------------------------+
//| TRAILING STOP Function       |
//+------------------------------+
void Trailing_Stop_Function()
{
bool Ticket_TS_Long;
   for(int iTS_Long = OrdersTotal() - 1; iTS_Long >= 0 ; iTS_Long --)  
   {
      
      if(OrderSelect(iTS_Long,SELECT_BY_POS,MODE_TRADES) == true
      && OrderSymbol() == Symbol()
      && OrderType() == OP_BUY
      && OrderMagicNumber() == MagicNumberLong
      && Trailing_Stop_In_Pips > 0
      && Bid - OrderOpenPrice() > Trail_After_Pips_Profit*PipMultiplier
      && OrderStopLoss() < Bid - (Trailing_Stop_In_Pips*PipMultiplier))
      {
      Ticket_TS_Long = (OrderModify(OrderTicket(),OrderOpenPrice(),Bid - (Trailing_Stop_In_Pips*PipMultiplier),NULL,0,Green));
         if (Ticket_TS_Long != true)
         {
         Print("TS-Order Modify Error ",GetLastError());
         }
      }
    } 
bool Ticket_TS_Short;
   for(int iTS_Short = OrdersTotal() - 1; iTS_Short >= 0 ; iTS_Short --)  
   {
      
   if(OrderSelect(iTS_Short,SELECT_BY_POS,MODE_TRADES) == true
      && OrderSymbol() == Symbol()
      && OrderType() == OP_SELL
      && OrderMagicNumber() == MagicNumberShort
      && Trailing_Stop_In_Pips > 0
      && OrderOpenPrice() - Ask > Trail_After_Pips_Profit*PipMultiplier
      && OrderStopLoss() > Ask + (Trailing_Stop_In_Pips*PipMultiplier))
      {
      Ticket_TS_Short = (OrderModify(OrderTicket(),OrderOpenPrice(),Ask + (Trailing_Stop_In_Pips*PipMultiplier),NULL,0,Green));
         if (Ticket_TS_Short != true)
         {
         Print("TS-Order Modify Error ",GetLastError());
         }
      }
   }
}

Trail_After_Pips_Profitは、ユーザーが入力する外部ダブル変数です...そして

PipMultiplierは通貨の小数点以下の 値を計算する簡単な関数です...

もしMagicNumbersを使わないのであれば、その基準は削除してください....

これで、どんなチャートでも、どんな注文でもトレールできる......というか、「できる」はずだ。

私は訂正しますが、これでうまくいきます。

//+------------------------------------------+
//| Check for 5 Digits - Pipmultiplier       |
//+------------------------------------------+
   
   if(Digits==5||Digits==3) 
   {
   PipMultiplier = 10*Point;
   }
   else if(Digits==2) 
   {
   PipMultiplier = 100*Point;
   }
   
   else
   {
   PipMultiplier = Point;
   }
   

FMICさんの助けには感心します...。ナイスワン

 

Mike.T:

お助けFMICに感激です...。素敵なもの

ありがとうございます。

アドバイスですが、"Ask "や "Bid "は使わないで、"OrderClosePrice() "を使ってください。これは、買い注文か売り 注文かに関係なく、リアルタイムの値です。
 

@Mike.T: PipMulytiplierのコードに何か違和感があるようです。

else if(Digits==2) 
{
   PipMultiplier = 100*Point;
}

それは正しくないようです。なぜ2桁のシンボルに対して100倍するのですか?全く乗算されないはずです。4桁のシンボルと同じ条件であるべきです。

例えば、こんな感じです。USD/JPYの価格が108.65から108.77になった場合、それは12ピップの増加であり、1200ピップではありません!
 
FMIC:

ありがとうございました。

アドバイス:「Ask」や「Bid」を使わずに、「OrderClosePrice()」を使ってください。これは、売り買いに関係なく、リアルタイムの値です。

ありがとうございます...それは知りませんでした...それで...(このスレッドをハイジャックせずに)....BidやAskではなく、OrderClosePrice()を使った方がいいのでしょうか......?
 
Mike.T:
Thanx...それは知らなかった...だから...。(このスレッドをハイジャックすることなく)・・・。BidやAskの代わりにOrderClosePrice()を使えばいいのか......?
はい!そうです。この例で示したように、買いと売りの両方のロジックを1つのコードブロックに統合することができます。
理由: