複数ペアを使用した場合のEAクラッシュ...

 
まず最初に、Raptorさんが以前この問題を私に提起したことは知っていますが、あなたがそれを書いた場所を覚えていませんし、さらに重要なことは、私がどこで間違っているのかを理解していないことです。

私の知る限りでは、対応するペアに付けられたEAが常にそのペアのみで動作するように正しく書いていたのですが。現在、GBPCADとGBPUSDがうまくいっていないようで、GBPCADのストップロスの計算がGBPUSDのペアで 行われたと思い込んでいるようです...ですから、保留中の注文が発生すると、ストップロスはGBPCAD値からケーブルにちらつきます...

magicnumber==1234を使用しています。

何かご指摘や、私が馬鹿にしている部分があれば、遠慮なく強調してください :(

//+-------------------------------------------------------------------------------------+
//| Order Buy Function                                                                  |
//+-------------------------------------------------------------------------------------+   

//Place a pending buystop if no orders exists.. pending or otherwise.
if(direction==0)
{ 
      double btp=buy_takeprofit_price;
      
      double Min_Lot = MarketInfo(Symbol(),MODE_MINLOT);

      double Lot_Step = MarketInfo(Symbol(),MODE_LOTSTEP);

      double BuyLotSize =(RiskedAmount/(pips_to_bsl/pips))/10;
      double Lots = NormalizeDouble(BuyLotSize,2);
      LotSize = MathFloor(Lots/Lot_Step)*Lot_Step;

  
      static double Stored_BuyPrice;

      if(OpenOrdersThisPair(Symbol())==0)
         {
         int BuyTicketOrder= OrderSend(Symbol(),OP_BUYSTOP,LotSize,buyPrice,3,BuyStopPrice,btp,NULL,MagicNumber,0,Green);  >>>>// I am not sure if its this part? There is no way for this first OrderSend to tell what pair it is?
         if(BuyTicketOrder == -1)Print("First Buy Order Last Error = ",GetLastError());
         } 

///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////



      for(int b=OrdersTotal()-1; b>=0; b--)
         {
         if(!OrderSelect(b,SELECT_BY_POS,MODE_TRADES))continue;
           
         if(OrderType()==OP_BUYSTOP) 
            if(OrderMagicNumber()==MagicNumber)
               if(OrderSymbol()==Symbol()) 
                   if(OrderStopLoss()<iMA(NULL,60,MA_Period,0,1,0,0)-ATR)
                        {
                        Stored_BuyPrice = OrderOpenPrice();
                        DeleteOrder = OrderDelete(OrderTicket());
                        }

         if(OpenOrdersThisPair(Symbol())==0 && DeleteOrder==True)// If there are no open orders = place a new order.
            {
            int NewBuyOrder = OrderSend(Symbol(),OP_BUYSTOP,LotSize,Stored_BuyPrice,3,BuyStopPrice,btp,NULL,MagicNumber,0,Green);
            if(NewBuyOrder == -1)Print("New Buy Order Last Error = ",GetLastError());
            }
      }
} 
 
DomGilberto:
まず最初に、私はRaptorが以前にこの問題を私に提起したことを知っていますが、私はあなたがそれを書いた場所を覚えていない、そしてさらに重要なことは、私がどこで間違っているのかを理解することです。

私の知る限りでは、対応するペアに付けられたEAが常にそのペアのみで動作できるように正しく書いていました。現在、GBPCADとGBPUSDがうまくいっていないようで、GBPCADのストップロスの計算がGBPUSDのペアで行われたと思い込んでいるようです...ですから、保留中の注文が発生すると、ストップロスはGBPCAD値からケーブルにちらつきます...

magicnumber==1234を使用しています。

何かご指摘や、私が馬鹿にしている部分があれば、遠慮なく強調してください :(

あなたの問題は明確ですが、中括弧のインデントと条件の使い方によって、少し見えにくくなることがあります。...あなたはこうしています。

      for(int b=OrdersTotal()-1; b>=0; b--)
         {
         if(!OrderSelect(b,SELECT_BY_POS,MODE_TRADES))continue;
           
         if(OrderType()==OP_BUYSTOP) 
            if(OrderMagicNumber()==MagicNumber)
               if(OrderSymbol()==Symbol())                                  // if the symbol matches do . . . 
                   if(OrderStopLoss()<iMA(NULL,60,MA_Period,0,1,0,0)-ATR)   //  . . . .  this
                        {
                        Stored_BuyPrice = OrderOpenPrice();                 // and this
                        DeleteOrder = OrderDelete(OrderTicket());           // and this
                        }

         if(OpenOrdersThisPair(Symbol())==0 && DeleteOrder==True)// If there are no open orders = place a new order.   //  this happens even if the symbol didn't match . . .
            {
            int NewBuyOrder = OrderSend(Symbol(),OP_BUYSTOP,LotSize,Stored_BuyPrice,3,BuyStopPrice,btp,NULL,MagicNumber,0,Green);
            if(NewBuyOrder == -1)Print("New Buy Order Last Error = ",GetLastError());
            }
      }

私は、あなたが言いたかったのは、これだと思います ... ...

     for(int b=OrdersTotal()-1; b>=0; b--)
         {
         if(!OrderSelect(b, SELECT_BY_POS, MODE_TRADES)) continue;
           
         if( OrderType() == OP_BUYSTOP &&
            OrderMagicNumber() == MagicNumber &&
            OrderSymbol() == Symbol() )        
            {
            if(OrderStopLoss() < iMA(NULL, 60, MA_Period, 0, 1, 0, 0) - ATR)  
               {
               Stored_BuyPrice = OrderOpenPrice();   
               DeleteOrder = OrderDelete(OrderTicket()); 
               }

            if(OpenOrdersThisPair(Symbol()) == 0 && DeleteOrder)  // If there are no open orders = place a new order. 
               {
               int NewBuyOrder = OrderSend(Symbol(), OP_BUYSTOP, LotSize, Stored_BuyPrice, 3, BuyStopPrice, btp, NULL, MagicNumber, 0, Green);
               if(NewBuyOrder == -1) Print("New Buy Order Last Error = ", GetLastError());
               }
            }
         }
 
ああ、なるほど、そんな小さなことを見逃していたのですね。また、最初の OrderSend()関数が 呼ばれたとき、私はそこで何か間違ったことをしているのでしょうか?というのも、その時点でどのペアにordersendを送るべきかを知っているかどうか、論理的に考えたいからです。馬鹿な質問かもしれませんが、私はその部分で何か間違ったことをしていないですよね?BuyTicketOrder "送信関数の部分?

私のためにそのビットをスポッティングしていただきありがとうございます:)
 
DomGilberto:
ああ、なるほど、そんな小さなことを見逃していたのですね。また、最初の OrderSend()関数が呼ばれたとき、私はそこで何か間違ったことをしているのでしょうか?というのも、その時点でどのペアにordersendを送るべきかを知っているかどうか、論理的に考えたいからです。馬鹿な質問かもしれませんが、私はその部分で何か間違ったことをしていないですよね?BuyTicketOrder "送信関数の部分?

その部分を発見してくれてありがとうございます。)
Symbol()はEAが動作しているチャートのシンボルです ... 間違えようがありません。
 
//+----------------------------------------------------------------------------------------------------------------------------------------+  
//Moving Average Trailing Stop Function
//+----------------------------------------------------------------------------------------------------------------------------------------+   
void MA_Trail()

  {

   double ATR = iATR(NULL,60,14,1);
   double MA = iMA(NULL,60,MA_Period,0,1,0,1);
   
   double BuyStopPriceMath = MA - ATR;
   double SellStopPriceMath = MA + ATR;
   
   double BuyStopPrice = NormalizeDouble(BuyStopPriceMath,5);
   double SellStopPrice = NormalizeDouble(SellStopPriceMath,5);

//buy order section - This is where the stop will trail based upon a fixed point value stated on the EA. It will trail with price.
   for(int b=OrdersTotal()-1; b>=0; b--)
     {
      if(OrderSelect(b,SELECT_BY_POS,MODE_TRADES))
         if(OrderMagicNumber()==MagicNumber)
            if(OrderSymbol()==Symbol())
               if(OrderType()==OP_BUY)
               {
                 if(OrderStopLoss() > BuyStopPrice)break; 
                  if(OrderStopLoss() < BuyStopPrice)
                    bool BuyModify = OrderModify(OrderTicket(),OrderOpenPrice(),BuyStopPrice,OrderTakeProfit(),0,CLR_NONE);
                    if(BuyModify < 0)Print(" Buy Trailing Stop Failed: ", GetLastError());
               }     

     }
//sell order section - This is where the stop will trail based upon a fixed point value stated on the EA. It will trail with price.     
   for(int s=OrdersTotal()-1; s>=0; s--)
     {
      if(OrderSelect(s,SELECT_BY_POS,MODE_TRADES))
         if(OrderMagicNumber()==MagicNumber)
            if(OrderSymbol()==Symbol())
               if(OrderType()==OP_SELL)
               {
                 if(OrderStopLoss() < SellStopPrice)break; 
                   if(OrderStopLoss() > SellStopPrice)
                    bool SellModify = OrderModify(OrderTicket(),OrderOpenPrice(),SellStopPrice,OrderTakeProfit(),0,CLR_NONE);
                    if(SellModify < 0)Print(" Sell Trailing Stop Failed: ", GetLastError());
               }   
     }

  }
OK - これが問題を引き起こしていたのだと思います。私はちょうどこの部分のコードを更新しました、そしてそれは今、ケーブルからGBPCAD価格へのすべてのティックで フリックを停止しているようです...1時間ごとの終値で更新されるまで、1つの終値で止まっています...それで確認します。

これで大丈夫そうでしょうか?また、私はこれらの部分的な注文のクローズを持っているので、私はおそらく "OrderSymbol()==Symbol() "に対して正しい位置に中括弧があることを再確認する必要があると仮定します?)
 
if(OpenOrdersThisPair(Symbol()) == 0
何回これを呼び出すのでしょうか?すべての注文に対して(あなたのコード)? 現在のチャート上の すべての注文の保留に対して(RaptorUKのコード)? それとも、保留を保存して削除した後に一度だけですか?
 
DomGilberto:
OK - 私はこれが問題を引き起こしていたものだと思います。私はちょうどこの部分のコードを更新しました、そしてそれは今、ケーブルからGBPCAD価格まですべてのティックでフリックを停止しているようです...1時間ごとの終値で更新されるまで、1つのストップ・プライスで止まっています...それで確認します。これで大丈夫そうでしょうか?また、私はこれらの部分的な注文のクローズを持っているので、私はおそらく "OrderSymbol()==Symbol() "に対して正しい位置に中括弧があることを再確認する必要があると仮定します?)

でも、中括弧とインデントには一貫性を持たせるようにしましょう。

ループは2つ必要なく、1つで十分です。

//+----------------------------------------------------------------------------------------------------------------------------------------+  
//Moving Average Trailing Stop Function
//+----------------------------------------------------------------------------------------------------------------------------------------+   
void MA_Trail()

  {

   double ATR = iATR(NULL,60,14,1);
   double MA = iMA(NULL,60,MA_Period,0,1,0,1);
   
   double BuyStopPriceMath = MA - ATR;
   double SellStopPriceMath = MA + ATR;
   
   double BuyStopPrice = NormalizeDouble(BuyStopPriceMath,5);
   double SellStopPrice = NormalizeDouble(SellStopPriceMath,5);

   for(int b=OrdersTotal()-1; b>=0; b--)
     {
      if(OrderSelect(b,SELECT_BY_POS,MODE_TRADES))
         if(OrderMagicNumber()==MagicNumber)
            if(OrderSymbol()==Symbol())
               {
               //buy order section - This is where the stop will trail based 
               // upon a fixed point value stated on the EA. It will trail with price.
               if(OrderType()==OP_BUY)
                  {
                  if(OrderStopLoss() > BuyStopPrice) break; 
                  if(OrderStopLoss() < BuyStopPrice)
                     bool BuyModify = OrderModify(OrderTicket(),OrderOpenPrice(),BuyStopPrice,OrderTakeProfit(),0,CLR_NONE);
                   if(!BuyModify)Print(" Buy Trailing Stop Failed: ", GetLastError());
                   }     

               // sell order section - This is where the stop will trail based 
               // upon a fixed point value stated on the EA. It will trail with price.     
               if(OrderType()==OP_SELL)
                  {
                  if(OrderStopLoss() < SellStopPrice) break; 
                  if(OrderStopLoss() > SellStopPrice)
                     bool SellModify = OrderModify(OrderTicket(),OrderOpenPrice(),SellStopPrice,OrderTakeProfit(),0,CLR_NONE);
                  if(!SellModify)Print(" Sell Trailing Stop Failed: ", GetLastError());
                  }
               }   
     }

OrderModify()はintではなくbool、trueかfalseを返します ... だからSellModifyは決して0より小さくはなりません ... ...私は昨日、ForexFactory で同じことをタイプしました。

 

注文が削除されるたびに、私は保留中の注文を1時間ごとに削除し、同じパラメータで、または該当する場合は、新しいストップ、ターゲット、ロットサイズに基づいて、新しい注文を開きたい"if(OrderStopLoss() < iMA(NULL, 60, MA_Period, 0, 1, 0, 0)" 。) - ATR)"

新しい保留中の注文(削除後)のために保存する必要がある唯一のものは、その特定のセットアップの最初のエントリ価格です。(Stored_BuyPrice = OrderOpenPrice();)


上記のコードの最初の部分は、私が投稿しようとしていた別のスレッドに関連しているので、面白いです。同じような質問で新しいトピックを投稿するよりも、私はここで質問します、もしそれがOKなら?下のリンクをチェックしてみてください。私が抱えている問題を説明する2分間のビデオで、解決するのが難しいことがわかります。

私はたくさんのコードを書きましたが、それは私が修復しなければならない非効率なケースであることに今気づき始めています。

ビデオ: http://screencast.com/t/4nl8AaH8Sag

もし私が限られた量のコードを提供するだけで、これを本当にあいまいにしているなら、私はいくつかのより多くのアップを貼り付けます?

 
Raptorさん、ありがとうございます。私のコードはぐちゃぐちゃだったので、少し時間をかけてきれいにしました。上に挙げた例のようにPrintsを使 おうとするような素人のミスです(笑)。
 
DomGilberto:

注文が削除されるたびに、私は保留中の注文を1時間ごとに削除し、同じパラメータで、または該当する場合は、新しいストップ、ターゲット、ロットサイズに基づいて、新しい注文を開きたい"if(OrderStopLoss() < iMA(NULL, 60, MA_Period, 0, 1, 0, 0)" 。) - ATR)"

新しい保留中の注文(削除後)のために保存する必要がある唯一のものは、その特定のセットアップの最初のエントリ価格です。(Stored_BuyPrice = OrderOpenPrice();)


上記のコードの最初の部分は、私が投稿しようとしていた別のスレッドに関連しているので、面白いです。同じような質問で新しいトピックを投稿するよりも、私はここで質問します、もしそれがOKなら?下のリンクをチェックしてみてください。私が抱えている問題を説明する2分間のビデオで、解決するのが難しいことがわかります。

私はたくさんのコードを書きましたが、それは私が修復しなければならない非効率なケースであることに今気づき始めています。

ビデオ: http://screencast.com/t/4nl8AaH8Sag

もし私が限られた量のコードを提供するだけで、これを本当にあいまいにしているなら、私はいくつかのより多くのアップを貼り付けます?

もし私が誤解していたら訂正してください......しかし、ビデオの中のほとんどのバーで、あなたは21本EMAまでプルバックしなかった。
 
ってな感じです。私はD1、4Hr、そして最後に1Hrを見て、MAが(他のフィルターの負荷の中で)ばらばらになるようにします - 一度それらがすべて並ぶと、H1では、任意のバーが21 EMAに1回引き戻すまで待ちます、そしてそこからそれは高値を超えて60 EMA-ATRの下に停止するように注文を配置することになります。

21本EMAへのプルバックは一度だけです。そこから、21本EMAへのプルバックを探すのを止めます。しかし、このソフトがすべきことは、現在開いているペンディング注文が、毎時のクローズ後にロット、ストップ、テイクプロフィットを 正確に更新しているかどうかを確認することです。しかし、なぜ完璧に動作し、H1終値ごとに保留中の注文が更新されるときとされないときがあるのか、私には理解できないのです。保留中の注文が更新される理由は、""if(OrderStopLoss() < iMA(NULL, 60, MA_Period, 0, 1, 0, 0)" "です。) - ATR)".

もしそれが真でなければ、更新されません。しかし、それが真であっても、注文を削除して新しい値で新しい注文を出すことはないでしょう?上記のコードで、ビデオに関連する何かを見ることができるかどうかは分かりませんが?(あなたが修正した最初のコード).希望thats明確な?
理由: