反対注文を開く - ページ 3

 
RaptorUK:

MagicNumberと 異なるマジックナンバーを持つ場合、EAが実行されているシンボル以外のシンボルの場合、OP_SELLLIMITやOP_BUYLIMITの場合などがあります。.また、OrderDelete()呼び出しからの戻り値をチェックする必要があります ... ...

なぜRefreshRates()を呼び出す必要があるのですか? それを取り除くという意味ではなく、なぜあなたがRefreshRates()を呼び出しているのかを説明してください?


関数の戻り値とは何ですか?どのように使用 するのですか?


こんにちは、RaptorUKです。

私が理解する限り、MagicNumberは同じで、OP_SELLSTOPとOP_BUYSTOPも同じです。

OrderDelete()の呼び出しは、残念ながら意味がわかりません......。

RefreshRates()は、クローズで問題が発生した後、そこに置いただけです。

今、リスボン(ポルトガル)にいます。

ルイス

 
luisneves:


こんにちは、RaptorUKです。

MagicNumberはOP_SELLSTOPとOP_BUYSTOPで同じものだと理解しています。

OrderDelete()の呼び出しについてですが、残念ながら意味がわかりません......。

OrderDelete()を呼び出すと(OrderDelete()関数を使って)値が返されます、それはbool値を返し、もしその値がtrueであればOrderDelete()は成功し、falseであればOrderDelete()は失敗します .戻り値をチェックして、それが偽の場合、Print() を使用してログにエラーを報告するか、Comment() または Alert() を使用して、問題があることを知り、それを調査することができるようにします。

もし私のコードであれば、エラー発生時にBid, Ask, FreezeLevel, StopLevelなどの情報を表示するよう、さらに変更を加えるでしょう。

void CloseAll()
   {
   int OrdType, GLError;
   
   RefreshRates();
                    
   for(int OrderPos = OrdersTotal()-1; OrderPos >= 0; OrderPos--)
      if( OrderSelect(OrderPos, SELECT_BY_POS, MODE_TRADES)
         && OrderMagicNumber() == MagicNumber 
         && OrderSymbol() == Symbol())
         {
         OrdType = OrderType();
         if(OrdType == OP_BUY || OrdType==OP_SELL)
            {
            if(!OrderClose(OrderTicket(), OrderLots(), OrderClosePrice(), UseSlippage, Yellow))
               GLError = GetLastError();
            }

         if(OrdType == OP_SELLSTOP || OrdType == OP_BUYSTOP || OrdType == OP_BUYLIMIT || OrdType == OP_SELLLIMIT)
            {
            if(!OrderDelete(OrderTicket())
               GLError = GetLastError();
            }

         if(GLError > 0) Print("Error Closing/Deleting Order, error # ", GLError, " for ticket: ", OrderTicket());         
         }
   } 
 
RaptorUK:

OrderDelete() を呼び出すと (OrderDelete() 関数を使用して)、値が返されます。値が true の場合は OrderDelete() が機能し、false の場合は OrderDelete() が失敗します。戻り値をチェックして、それが偽の場合、Print() を使用してログにエラーを報告するか、Comment() または Alert() を使用して、問題があることを知り、それを調査することができるようにします。

あなたのコードに基づいて、私はこれらの変更を行います。 もし私のコードであれば、エラー発生時に、Bid, Ask, FreezeLevel, StopLevelなどの情報を表示するようにさらに変更を加えます。


RaptorUKさん、こんにちは。

保留中の注文が削除されない理由は、利益確定がこの場合5pipsと低すぎたことに関係しています。私の混乱は、ストップロス、オープンプライス、フリーズゾーンからの利益確定 を行うルーチンを持っていた場合、なぜこれが機能しないのかという事実から来ています。OKですが、今は動作しています。

ところで、私は他のトリガーされた後、反対側の注文を閉じたい。そのために私はこの余分なコードを入れたが、(あなたは笑い始めることができます...)しかし、何も......。

何かいい方法はないでしょうか?

 while(IsTradeContextBusy()) Sleep(10);
                   RefreshRates();
         Ticket=OrderSend(Symbol(),OP_BUYSTOP,LotSize,BuyLevel,UseSlippage,BuyStopLoss,BuyTakeProfit,"Buy Stop Order",MagicNumber,0,Green);
         if(Ticket>0)
         
          int o=OrderType();
          if (o==OP_BUY)
          OrderDelete(OrderTicket());        
           {
            if(OrderSelect(Ticket,SELECT_BY_TICKET,MODE_TRADES)) Print("BUY Stop Order Opened : ",OrderOpenPrice());
           }
         //else Print("Error opening BUY Stop Order : ",GetLastError());
 
luisneves:


こんにちは、RaptorUKです。

1. 保留中の注文が削除されない理由は、利益確定がこの場合5pipsと低すぎたことに関係しています。私はストップロス、オープン価格と凍結ゾーンの外に利益を取るためにルーチンを持っていた場合、私の混乱は、なぜこれが動作していない事実から来るそれを10ピップに置くときdelete.My順序は、。OKですが、今は動いています。

2. ところで、私は反対側の注文が他のトリガーされたときに閉じたい。そのために私はこの余分なコードを入れたが、(あなたは笑い始めることができます...)しかし、何も...ない。

何かいい方法はないでしょうか?


1. ああ、だから、戻り値をチェックしたり、エラーコードを表示したりする必要があるんだ。

2. 注文がOP_BUYSTOPからOP_BUYに変わるのを待つ必要がありますが、時間がかかる場合があるので、確認し続ける必要があります。OP_BUYに変わったら、反対側の注文をクローズすることができ、そのためにはクローズする正しい注文を見つけなければなりません。

 

RaptorUkさん、こんにちは。

私はあなたが提供したリンクをたどったが、テーマはそれにもかかわらず、興味深い、私はその中に自分自身を緩めたので、多くの発散意見で長いanssです。

だから、私は反対側の保留を閉じるためにコードを導入し、再び何も、ヘルプを与えるジャーナルの何も見ることができません....私はここで何が欠けている.......

どんな光に感謝します....

ルイス

//Sell Pending Stop Loss & Take Profit Calculation     
     
   if(StopLoss>0)SellStopLoss=PendingSellPrice+(StopLoss*pt);
   if(TakeProfit>0)SellTakeProfit=PendingSellPrice-(TakeProfit*pt);
   
//Place Sell Pending Order
        
         while(IsTradeContextBusy()) Sleep(10);
                   RefreshRates();       
         Ticket=OrderSend(Symbol(),OP_SELLSTOP,LotSize,SellLevel,UseSlippage,SellStopLoss,SellTakeProfit,"Sell Stop Order",MagicNumber,0,Red);
         if(Ticket>0)OppositePendindDel();          
           {
            if(OrderSelect(Ticket,SELECT_BY_TICKET,MODE_TRADES)) Print("SELL Stop Order Opened : ",OrderOpenPrice());
           }
        //else Print("Error opening SELL Stop Order : ",GetLastError());
         } 
//+---------------------------------------------------------------------------+
int OppositePendindDel()
{
 int c,d,GLError;
 int e=OrdersTotal();
 
 for(c=e-1;c>=0;c--)
 {  
   OrderSelect(c,SELECT_BY_POS,MODE_TRADES);
   if(OrderType()==OP_BUY||OrderType()==OP_SELL)
   {
    for(d=e-1;d>=0;d--)
    {
     OrderSelect(d,SELECT_BY_POS,MODE_TRADES);
     
      if(OrderType()==OP_SELLSTOP)
     {
      if(!OrderDelete(OrderTicket()))
            GLError = GetLastError();
      
      return(1);
      }
      if(OrderType()==OP_BUYSTOP)
      {
       if(!OrderDelete(OrderTicket()))
             GLError = GetLastError();
       }
       if(GLError > 0) Print("Error Closing/Deleting Order, error # ", GLError, " for ticket: ", OrderTicket());
       return(1);
       }
      }
     }
    }
 
luisneves:

RaptorUkさん、こんにちは。

私はあなたが提供したリンクをたどったが、テーマはそれにもかかわらず、興味深い、私はその中に自分自身を緩めたので、多くの発散意見で長いanssです。

だから、私は反対側の保留を閉じるためにコードを導入し、再び何も、ヘルプを与えるジャーナルの何も見ることができないsoever...私はここで何が不足している....

RaptorUK です。

OP_BUYSTOPからOP_BUYに変わるのを待つ 必要があり、それには時間がかかるので、チェックし続ける 必要があります。

 
RaptorUK:



こんにちは、RaptorUK 。

しかし、今、いくつかの注文がダブルで来ています。つまり、eaは一度に一つの注文を出さなければならないのに、売りと買いを同時に出し、ロットサイズも同じにしているのです。私は狂い始めた....

どんなヘルプでも、お願いします!!!

ファイル:
 
luisneves:


こんにちは、RaptorUK 。

しかし、今、いくつかの注文がダブルで来ています。つまり、eaは一度に一つの注文を出さなければならないのに、売りと買いを同時に出し、ロットサイズも同じにしているのです。私は狂い始めた....

どなたか助けてください!!!!

あなたのコードを見ると、あなたが何をしようとしているのか、とても分かりにくいです。あなたのstart()関数は、あなたが各ティックで何をしようとしているのか見せてくれませんし、インデントのレイアウトに一貫性がありません。

GoToClose()という関数は何をするためのものですか?もし、それが何をすることになっているのかを説明するコメントを関数の最初に書いたなら、それが実際にそれがすることになっていることを行っているかどうかを見ることができます。関数、CloseAll(); を呼び出すことです。もしシンボルとマジックナンバーに 一致する単一の取引が いくらかの 利益を上げているなら、あるいは、もしシンボルとマジックナンバーに 7つ以上の取引があるなら。CloseAll()はSymbolと Magic Numberの取引のみをクローズするので、もし別のSymbolやMagic Numberの取引が7つあったとしても、GoToClose()はCloseAll()を呼び出し続け、何も起きないでしょう。


デモ口座 で手動で取引を行い、EAを実行した場合、EAは何もしません ... 取引を見ることはできますが、無視することはできず、それをカウントし、結果としてそれ自身の取引を行うこともなく、このオープン取引を閉じることもありません。 この状況でEAは何をすべきでしょうか? 別のEAが別のマジックナンバーで取引を行った場合はどうでしょう?

あなたは何をしようとしているのかを明確に把握する必要があります。フローとプロセスが明確になるようにstart()関数をコメントし、それぞれが何を意図しているのかが明確になるようにすべての関数をコメントします。 これを行ったとき、あなたの問題がどこにあるのかを理解できるかもしれません。

 
RaptorUK:

あなたのコードを見ると、あなたが何をしようとしているのか、とても分かりにくいです。あなたのstart()関数では、各ティックで何をしようとしているのかが分かりませんし、インデントのレイアウトも一定ではありません。

GoToClose()関数は何をするための関数なのでしょうか?もし、関数の最初に、それが何をすることになっているのかを記述したコメントを書いてくれれば、それが実際に意図したことを行っているかどうかを確認することができます。関数、CloseAll(); を呼び出すことです。もしシンボルとマジックナンバーに 一致する単一の取引が いくらかの 利益を上げているなら、あるいは、もしシンボルとマジックナンバーに 7つ以上の取引があるなら。CloseAll()はSymbolと Magic Numberの取引のみをクローズするので、もし別のSymbolやMagic Numberの取引が7つあったとしても、GoToClose()はCloseAll()を呼び出し続け、何も起きないでしょう。


デモ口座で手動で取引を行い、EAを実行した場合、EAは何もしません ... 取引を見ることはできますが、無視することはできず、それをカウントし、結果としてそれ自身の取引を行うこともなく、このオープン取引を閉じることもありません。 この状況でEAは何をすべきでしょうか? 別のEAが別のマジックナンバーで取引を行った場合はどうでしょうか?

何をしようとしているのか、明確に把握する必要があります。 start()関数をコメントして、フローとプロセスを明確にし、すべての関数をコメントして、それぞれが何をしようとしているのか明確にします。 これを行ったとき、あなたの問題がどこにあるのかよく理解できるかもしれません . . .


こんにちは、RaptorUKです。

ごちゃごちゃしてすみません。今のところ、この問題を除けば、EAは期待通りの動きをしているように思います。

EAは、前の注文がロットサイズを増やしてTakeProfitを取らないたびに、同じTakeProfit額で反対の注文を出すべきで、それはそうします。問題は、一度に一つの注文しか出せないのに、二つ以上出していることです。レポートを見てみると、注文6と7は両方とも売りで、注文7は買いのはずです。

さて、関数ごとにコードをまとめてみました。私はすべてのこれらの無効な呼び出しを持っている理由は、私は完全な作業独立したブロックを持っていると、ここで私はこれを手配するための問題を知っているオープンへ移動し、クローズへ移動すると言うだけの方法です私たちはオープン注文を持っていない場合、最初のオープンへ移動し、クローズに移動しない(私はこれに取り組む必要がある混乱しています。シンボルとマジックナンバーを使って、EAが自分の注文を処理するだけであることを保証しています。

主な戦略は次のとおりです(そして、ブロックはこの順序によってあります)。

1- 価格の上下に2つの注文を保留しています。価格がそのうちの1つをトリガーすると、反対側の保留が削除されます。これはうまくいっている。

2- もし価格がTakeProfitを選んだら、その注文は閉じられ、EAは再び2つの保留中の注文を入れて再開し、このプロセスが再び始まる。これは動作しています。

2- 価格がTakeProfitを選ばず、TakeProfitを下回ると跳ね返される場合(買い注文の場合)、反対側の売り注文が 同じTakeProfitで前者より大きいロット数で開かれるはずです。レポートでは、6と7の注文は両方とも売り注文で、7は買い注文であることがわかります。

3- 最後の注文が利益を得たら、すべてのオープンオーダーを閉じる必要があります。そして、このプロセスはゲインを開始します。

4-このピンポンでは、1つは、最大で7回で注文がTakeProfitを選ぶことを期待する必要があり、そうでない場合は、これらの注文が閉じている。

例えば、TakeProfitを2pipsにしたい場合、価格が3pipsになるのを待ち、2pipsのレベルにストップラインを設定します(break evenまたはminimum profit trailing stop)。もし価格が上昇したら(買いの場合)、ストップラインはそれに連動し、価格が1ピップス跳ね返ったら注文は終了し、利益が出ているのですべてのオープンオーダーはクローズされます。ここで私は、これが正しく動作することができるかどうかわからない。

ありがとうございます。

ルイス

ファイル:
 
luisneves:


こんにちは、RaptorUK。

ご迷惑をおかけしました。今のところ、この問題を除けば、EAは期待通りの動きをしているように見えます。

EAは、前の注文がTakeProfitを取らないたびに、ロットサイズを増やし、同じTakeProfit額で反対の注文を出すべきで、それは実行します。問題は、一度に一つの注文しか出してはいけないのに、二つ以上出していることです。レポートを見てみると、注文6と7は両方とも売りで、注文7は買いのはずです。

さて、関数ごとにコードをまとめてみました。私はすべてのこれらの無効な呼び出しを持っている理由は、私は完全な作業独立したブロックを持っていると、ここで私はこれを手配するための問題を知っているオープンへ移動し、クローズに移動すると言うだけの方法です私たちはオープン注文を持っていない場合、最初のオープンへ移動し、クローズに移動しない場合(私はこれに取り組む必要がある混乱している。シンボルとマジックナンバーを使って、EAが自分の注文を処理するだけであることを保証しています。

主な戦略は次のとおりです(そして、ブロックはこの順序によってあります)。

1- 価格の上下に2つの注文を保留しています。価格がそのうちの1つをトリガーすると、反対側の保留が削除されます。これはうまくいっている。

2- もし価格がTakeProfitを選んだら、その注文は閉じられ、EAは再び2つの保留中の注文を入れて再開し、このプロセスが再び始まる。これは動作しています。

2- 価格がTakeProfitを選ばず、TakeProfitを下回ると跳ね返される場合(買い注文の場合)、反対側の売り注文が同じTakeProfitで前者より大きいロット数で開かれるはずです。レポートでは、6と7の注文は両方とも売り注文で、7は買い注文であることがわかります。

3- 最後の注文が利益を得たら、すべてのオープンオーダーを閉じる必要があります。そして、このプロセスはゲインを開始します。

4-このピンポンでは、1つは、最大で7回で注文がTakeProfitを選ぶことを期待する必要がありますそうでない場合は、これらの注文が閉じています。

例えば、TakeProfitを2pipsにしたい場合、価格が3pipsになるのを待ち、2pipsのレベルにストップラインを設定します(break evenまたはminimum profit trailing stop)。もし価格が上昇したら(買いの場合)、ストップラインはそれに連動し、価格が1ピップス跳ね返ったら注文は終了し、利益が出ているのですべてのオープンオーダーはクローズされます。ここで私は、これが正しく動作することができるかどうかわからない。

ありがとうございます。

ルイス

OK、それはいくつかの注文を開くと間違っているものを見つけたと思います。私はコード(Negritoイタリック)でこれらを含める 必要がありました。

Open Opposite Order
 
   double  MartingaleBuyPrice = Ask+StopLevel;
   if(MartingaleBuyPrice<UpperStopLevel)MartingaleBuyPrice=UpperStopLevel+MinStop*pt;
   
   double MartingaleSellPrice= Bid-StopLevel;
   if(MartingaleSellPrice>LowerStopLevel)MartingaleSellPrice=LowerStopLevel-MinStop*pt;
   
   int Op;  
   
   for(int Counter = OrdersTotal()-1; Counter >= 0; Counter--)
      {
      if(OrderSelect(Counter,SELECT_BY_POS,MODE_TRADES))  
         {
         if(OrderSymbol() == Symbol()&& OrderMagicNumber() == MagicNumber)
            {
            Op = OrderType();

            if(Op == OP_BUY && ((OrderOpenPrice()-OrderClosePrice())/pt)> ReturnDist && SellTicket==0)
               {                
               Sell Ticket = OrderSend(Symbol(), OP_SELL, mlots, MartingaleSellPrice, UseSlippage, 0, 0, "Sell Order", MagicNumber, 0, Red);
               if(Sell Ticket > 0) 
                  {
                  Print("Opposite Sell order placed # ", SellTicket);
                  AddLimitsSell();
                  }
               else
                  {
                  Print("Order Send failed, error # ", GetLastError() );
                  }
               }
               
            if(Op == OP_SELL && (OrderClosePrice()-OrderOpenPrice()/pt)> ReturnDist && BuyTicket==0)
               {               
               Buy Ticket = OrderSend(Symbol(), OP_BUY, mlots, MartingaleBuyPrice, UseSlippage, 0, 0, "Buy Order", MagicNumber, 0, Green);
               if(Buy Ticket > 0)
                  {
                  Print("Opposite Buy order placed # ", BuyTicket);
                  AddLimitsBuy();
                  }
               else
                  {  
                  Print("Order Send failed, error # ", GetLastError());
                  }   
               }
            }
         }
      }
   }
//+------------------------------------------------------------------+  
void AddLimitsBuy()
                  {
                  OrderSelect(Buy Ticket,SELECT_BY_TICKET);
                  OpenPrice = OrderOpenPrice();
                  StopLevel = MarketInfo(Symbol(),MODE_STOPLEVEL)*Point;
                                       RefreshRates();  
                                      UpperStopLevel = Ask + StopLevel;
                                      LowerStopLevel = Bid - StopLevel;
                                      
                                      
                                      if(StopLoss > 0) BuyStopLoss   = OpenPrice - (StopLoss * pt);
                  if(TakeProfit > 0)BuyTakeProfit = OpenPrice + (TakeProfit * pt);
                                      
                                      if(BuyStopLoss > 0 && BuyStopLoss > LowerStopLevel) 
                                              {                                 
                                                    BuyStopLoss = LowerStopLevel - MinStop*pt;
                                              }
                                      
                                      if(BuyTakeProfit > 0 && BuyTakeProfit < UpperStopLevel) 
                                              {
                                                     BuyTakeProfit = UpperStopLevel + MinStop*pt;
                                              }

                                      if(IsTradeContextBusy())Sleep(10);        

                  if(BuyStopLoss > 0 || BuyTakeProfit > 0) 
                     {          
                      OrderModify(Ticket,OP_BUY,BuyStopLoss,BuyTakeProfit,0);                            
                     }
                    } 
//+------------------------------------------------------------------+
void AddLimitsSell()
                  {
                  OrderSelect(Sell Ticket,SELECT_BY_TICKET);                 
                  OpenPrice = OrderOpenPrice();
                  StopLevel = MarketInfo(Symbol(),MODE_STOPLEVEL)*Point;
                                      RefreshRates();   
                                      UpperStopLevel = Ask + StopLevel;
                                      LowerStopLevel = Bid - StopLevel;
                                      
                                      
                                      if(StopLoss > 0) SellStopLoss = OpenPrice + (StopLoss*pt);
                                      if(TakeProfit > 0) SellTakeProfit = OpenPrice - (TakeProfit*pt);
                                    
                                      if(SellStopLoss > 0 && SellStopLoss < UpperStopLevel) 
                                              {                                 
                                                    SellStopLoss = UpperStopLevel + MinStop*pt;
                                              }
                                      if(SellTakeProfit> 0 && SellTakeProfit > LowerStopLevel) 
                                              {
                                                    SellTakeProfit = LowerStopLevel - MinStop*pt;
                                              }
                                            
                                      if(IsTradeContextBusy()) Sleep(10);       

                  if(SellStopLoss > 0 || SellTakeProfit > 0) 
                    {           
                      OrderModify(Ticket,OP_SELL,SellStopLoss,SellTakeProfit,0);
                    }                    
                   }  


レポートファイルの欠落