半分の区画を閉鎖する。 - ページ 18

 


OK (UPDATE!) それで基本的に、私は2番目のOrderClose()が呼ばれたとき、ロットの「半分の半分の半分の半分など」の連続クローズを取り除きました(青一色のif文があるところ - 明らかにこれは大丈夫です!) - しかし、私は最初のOrderClose()関数が「True」で成功しない限り、これを全く呼び出したくありません。しかし、最初のOrderClose()関数が"True "で成功しない限り、これが全く呼ばれないようにしたい。"Close_Half_Order_Buy==True "も機能しない...。

これを完成させるために誰かの助けが欲しいです :)

( 私はコードの肉体を明確にするために、多くの "プリント "を削除しました。)

//+--------------------------------------------------------------------------------------------------+
//| Close OP_BUY Half lots @ 1:1 Function                                                            |
//+--------------------------------------------------------------------------------------------------+
void CloseHalfOrder()
{   
   
   static datetime partclosedonce;
   static datetime partclosedtwice; 
   
   double minLot=MarketInfo(Symbol(),MODE_MINLOT);

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

   double half=MathFloor(OrderLots()/2/lotStep)*lotStep;
   
   double EMA_Bar = iClose(NULL, PERIOD_H1, 1);
   double EMA_MA = iMA(Symbol(),60,21,0,1,0,0);

   
for(int c=OrdersTotal()-1; c>=0; c--)
      {
      if(OrderSelect(c,SELECT_BY_POS,MODE_TRADES)==true)

      double FirstTarget_Buy = OrderOpenPrice()+(( OrderTakeProfit()-OrderOpenPrice())/2);
      	Print("FirstTarget_Buy: ",DoubleToStr(FirstTarget_Buy,Digits));
      
      if(OrderMagicNumber()==MagicNumber)
         if(OrderSymbol()==Symbol())
            if(OrderLots()>minLot)
               if(OrderOpenTime() != partclosedonce)
            {
            
            if(OrderType()==OP_BUY && Bid >= FirstTarget_Buy+(Point/2)) 
               {
               bool Close_Half_Order_Buy=OrderClose(OrderTicket(),half,Bid,5,Blue);
               if(Close_Half_Order_Buy!=TRUE)Print("Close_Half_Order_Buy Last Error = ",GetLastError());
               }
            }
         
      if(Close_Half_Order_Buy==True && OrderOpenPrice() > OrderStopLoss())
         {
         MoveToBreakEven(); 
         }
          if(Close_Half_Order_Buy==True)
               {
               partclosedonce = OrderOpenTime();
               } 
      
      if(partclosedonce != partclosedtwice && OrderOpenTime() != partclosedtwice) // I dont want this to run UNLESS the first OrderClose() is successful.
         {
          if(OrderType()==OP_BUY && EMA_Bar < EMA_MA)
               {
               bool EMA_Buy_Close=OrderClose(OrderTicket(),half,Bid,5,CLR_NONE);
               if(EMA_Buy_Close!=TRUE)Print("EMA_Buy_Close Last Error = ",GetLastError());
               if(EMA_Buy_Close==True)partclosedtwice = OrderOpenTime();
               }     
          }        
     }
}


	          
 
誰か?
 
DomGilberto:


OK (UPDATE!) それで基本的に、私は2番目のOrderClose()が呼ばれたとき、ロットの「半分の半分など」の連続クローズを取り除きました(全青のif文があるところ - 明らかにこれは大丈夫です!) - しかし、私は最初のOrderClose()関数が「True」であり、かつ、「True」でなかった場合、この関数は全く呼ばれたくありません。しかし、最初のOrderClose()関数が "True "で成功しない限り、これが全く呼ばれないようにしたい。"Close_Half_Order_Buy==True "も機能しない...。

これを完成させるために誰かの助けが欲しいです :)

以下のコードは(MagicNumber変数を宣言し、MoveToBreakEven()関数をコメントアウトすることで)コンパイルされますが はなかった をテストしました。

//+--------------------------------------------------------------------------------------------------+
//| Close OP_BUY Half lots @ 1:1 Function                                                            |
//+--------------------------------------------------------------------------------------------------+
void CloseHalfOrder() {
   static bool FirstBuyTarget_hit = false, SecondBuyTarget_hit = false;
   int ct = 0;
   double minLot = MarketInfo(Symbol(),MODE_MINLOT);
   double lotStep = MarketInfo(Symbol(),MODE_LOTSTEP);
   double EMA_Bar = iClose(NULL, PERIOD_H1, 1);
   double EMA_MA = iMA(Symbol(),60,21,0,1,0,0);
        
   for(int c = OrdersTotal() - 1; c >= 0; c--)
      if (OrderSelect(c,SELECT_BY_POS))
         if (OrderSymbol() == Symbol() && OrderType() <= OP_SELL)
            if (OrderMagicNumber() == MagicNumber) {
               double half=MathFloor(OrderLots()/2/lotStep)*lotStep;
               double FirstTarget_Buy = OrderOpenPrice() + ((OrderTakeProfit() - OrderOpenPrice()) / 2);
               Print ("FirstTarget_Buy: ", DoubleToStr(FirstTarget_Buy,Digits));
                                        
               ct++;
                                        
               if (!FirstBuyTarget_hit)
                  if (OrderType() == OP_BUY && Bid >= FirstTarget_Buy + (Point/2)) {
                     if (OrderClose(OrderTicket(),half,Bid,5,Blue)) {
                        MoveToBreakEven();
                        FirstBuyTarget_hit = true;
                        break;
                     }
                     else
                        Print("Close_Half_Order_Buy Last Error = ", GetLastError());
                  }
                                        
               if (FirstBuyTarget_hit && !SecondBuyTarget_hit) 
                  if (OrderType() == OP_BUY && EMA_Bar < EMA_MA) {
                     if (OrderClose(OrderTicket(),half,Bid,5,CLR_NONE))
                        SecondBuyTarget_hit = true;
                     else
                        Print("EMA_Buy_Close Last Error = ",GetLastError());                    
                  }

               break;
            }
   if (ct == 0) {
      FirstBuyTarget_hit = false;
      SecondBuyTarget_hit = false;
   }
}

上記のコードは、1つの通貨ペ アに1つだけ注文を出すことを想定しています。

 

Omg 本当にありがとうございます。本当に感謝しています。)

現在、私は1:2のテイクプロフィットターゲット(ハードTP)を固定で持っています。実は、これを注文から外したいのです。しかし、上にあるように、関連するOrderClose()関数はOrderTakeProfit()を使って、OrderClose()関数がどこで閉じるべきかを計算しているようなのです。

質問ですが、OrderTakeProfit()の価格を保存しておき、それを注文に固定するのではなく、OrderClose()で設定したロット数をOrderTakeProfit()の価格で決済したいのですが、方法はあるのでしょうか?なぜかというと、時々、大きな利益を上げる取引があるのですが、OrderTakeProfit()がオープンオーダーで固定されているので、すべてのロットがそこで決済され、その終了価格でいくつかのロットだけを部分的に決済したいからです。大逃げの場合はトレーリングストップを使うのですが・・・。ご理解いただけたでしょうか?

以上です。私はこれで終わりです。最後に

UPDATE: 上のコードは、いい感じに書いてありますね。少し遊んでみましたが、正しい順序で閉じることができません。まだ、最初に来たものを半分だけ閉じています。これは、静的なdatetimeを使用する前に持っていたものと同じようなものです。何か考えがありますか?

 
(このスレッドを使い果たしたような気がする)

私は文字通り、上記の最後の2つの質問を持っており、これは完了したのですか?私が知る必要があるのは、私がそれを変更したときに、私はまだOrderClose()を行うためにその正確な価格を使用できるように、どのように私はOrderTakeProfit()価格を格納することができますか?静的なダブルは機能しますか?
 
DomGilberto:

UPDATE: 上のコードは、いい感じの書き方ですね。少し遊んでみたが、正しい順序で閉じることができない。まだ、最初に来たものに対して半分ずつ閉じるだけです。これは、静的なdatetimeを使用する前に持っていたものと同じようなものです。何かご意見はありますか?

上記のコードに加えた変更と、ログ/ジャーナル・エントリ(またはスクリーン・ショット)を投稿してください。

 
DomGilberto:

Omg 本当にありがとうございます。本当に感謝しています。)

現在、私は1:2のテイクプロフィットターゲット(ハードTP)を固定で持っています。実は、これを注文から外したいのです。しかし、上にあるように、関連するOrderClose()関数はOrderTakeProfit()を使って、OrderClose()関数がどこで閉じるべきかを計算しているようなのです。

質問ですが、OrderTakeProfit()の価格を保存しておき、それを注文に固定するのではなく、OrderClose()で設定したロット数をOrderTakeProfit()の価格で決済したいのですが、方法はあるのでしょうか。なぜかというと、時々、大きな利益を上げる取引があるのですが、OrderTakeProfit()がオープンオーダーで固定されているので、すべてのロットがそこで決済され、その終了価格でいくつかのロットだけを部分的に決済したいからです。大逃げの場合はトレーリングストップを使うのですが・・・。ご理解いただけたでしょうか?

以上です。私はこれで終わりです。最後に

UPDATE: 上のコードは、いい感じに書いてありますね。少し遊んでみましたが、正しい順序で閉じることができません。まだ、最初に来たものを半分だけ閉じています。これは、静的なdatetimeを使用する前に持っていたものと同じようなものです。何か考えがありますか?


テイクプロフィットを大きく設定すれば、 OrderTakeProfit()を使ってOrderClose()関数が 閉じるべき位置を計算している関連OrderClose()関数をまだ使用することができます。
 
deVries - 文字通り、今朝それがわかったんだ...。別のモディファイを入れ始めて...それから、最初の注文が入ったときから、すぐに変更すればいいことに気づいたんだ...。

サーティーン - 私は全く変更をしていません。私が投稿したコードと同じように動作しましたが、静的なdatetimeではなく、静的なboolを使用していますか?バックテストを実行したときに見えた本当の違いはこれだけです。その他、2つ目のOrderClose()関数で 移動平均とその下の終値がありますが、他のorderclose()の前にそれが先に来てもクローズするのでしょうか?
 
DomGilberto:

Thirteen - 私は全く変更していません。私が投稿したコードと同じように動作しましたが、静的なdatetimeとは対照的に静的なboolを使用していますか?バックテストを実行したときに見えた唯一の本当の違いはそれです。その他、2つ目のOrderClose()関数で移動平均とその下の終値がありますが、他のorderclose()の前にそれが先に来てもクローズするのでしょうか?
クエスチョンマークが使われているので、私に質問しているのか、ハイライトされた部分を教えているのかよくわかりません。 もしテスターが2回目の部分終値が1回目の部分終値より先に発生したことを示しているなら、ストラテジーテスターが 生成したログ/ジャーナルから、2回目の部分終値(移動平均線)が1回目の部分終値より先に 発生したことを示す取引結果を投稿してください。
 
Thirteen:
クエスチョンマークが使われているので、私に尋ねているのか、ハイライトされた部分を教えてくれているのか、よくわかりません。 もしテスターが2回目の部分終値が1回目の部分終値より先に発生したことを示しているなら、2回目の部分終値(移動平均)が1回目の部分終値より先に 発生したことを示すストラテジーテスターが生成したログ/ジャーナルからあなたのトレード結果を投稿してください。

Thirteenさん、お返事ありがとうございました!今日中にログをアップします。)