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

 
DomGilberto:

もし60EMAがOrderStopLossより高ければ、保留中の注文を閉じ、新しいSL(60EMAの後ろにある)で新しい注文を開き、1:2の報酬を得るために利益を調整し、ポイントでのストップと私のリスクプロファイル(例えば2%)に関連してロットを変更することになるのです。

このすべてが行われているとき、OrderSend内の「LotSize」カスタム変数である「Current Lots」は動作しますが、サーバーが受け取るには正しくないロットサイズを送信しています? 0.18215」ですか?この質問は、「"OrderType==OP_BUY "を呼び出すことができないのは、これが原因ではないか?

あなたはそれを修正し、すでに持っているのと同じ方法でロットサイズを検証する必要があります ... あなたがすでに持っているコードに基づいてそれを行うために別の関数を コード化することもできます ... 例えば。

double ValidateLots(double PositionSize)
   {
   double LotStep, MinLot;

   LotStep = MarketInfo(Symbol(), MODE_LOTSTEP);
   MinLot  = MarketInfo(Symbol(), MODE_MINLOT);
   
   return( MathFloor(PositionSize / LotStep) * LotStep);
   }


OrderSend() で LotSize を使う代わりに ValidateLots(LotSize)

これがあなたの問題を引き起こしているかどうかは疑問ですが ... ...

 
うーん、そうですね、ちょっと試してみました。サーバーが0.00(小数点以下2桁)しか許容しないので、注文はそのまま送信されるようです。だから、残りの桁はほとんど関係ないんだ。

というわけで、残りの桁はほとんど関係ありません。というわけで、この問題から抜け出せずにいます(笑)。

なぜこれが問題なのか、「OP_BUY」を選択することができないのかがわかりません...。このトピックを使い果たしたかもしれませんが、何か最後の一刺しがあれば、本当にありがたいです。
if (direction==0){ <<<//--Buy--// This gets called upon if all the set-up is apparent.
      
      double bsl=buy_stop_price;
      double btp=buy_takeprofit_price;
      LotSize = (RiskedAmount/(pips_to_bsl/pips))/10; //--// (in process of changing at the moment)
      
      if(OpenOrdersThisPair(Symbol())==0)  //--//<--- No order open = then open one...
      {
      int BuyTicketOrder = OrderSend(Symbol(),OP_BUYSTOP,LotSize,buyPrice,3,bsl,btp,NULL,MagicNumber,0,Green); //--//<-- This is the first Order to be placed.
      }
      
         if(OrderStopLoss()<iMA(NULL,0,MA_Period,0,1,0,0)-MA_PadAmount*pips) //--//<<-- This will 99% of the time be true and the order above will be cancelled and looped in the "for" until the order is triggered.
         {
         
               for(int b=OrdersTotal()-1; b >=0; b--) 
                  {
    
                     if(OrderSelect(b,SELECT_BY_POS,MODE_TRADES)==true)
                     {
                     Print(" Stop loss value for the order is ", OrderStopLoss());
                     }
    
                     else if(OrderSelect(b,SELECT_BY_POS,MODE_TRADES)==false)
                     {
                     Print(" OrderSelect failed error code is ",GetLastError());
                     }
                     if(OrderMagicNumber()==MagicNumber)
                        if(OrderSymbol()==Symbol())
                           if(OrderType()==OP_BUYSTOP)
                              if(OrderStopLoss()<iMA(NULL,0,MA_Period,0,1,0,0)-MA_PadAmount*pips)
                                //if(OpenOrdersThisPair(Symbol())==1)
                                 { 
                                 DeleteOrder = OrderDelete(OrderTicket());
                                 if(DeleteOrder!=TRUE)Print("Buy Delete Order Last Error = ", GetLastError());
                                 }
                                  
                                 if(OpenOrdersThisPair(Symbol())==0)//<<-- If there are no open orders = place a new order.
                                  { 
                                  int NewBuyOrder = OrderSend(Symbol(),OP_BUYSTOP,LotSize,buyPrice,3,bsl,btp,NULL,MagicNumber,0,Green); 
                                  if(NewBuyOrder == -1)Print("New Buy Order Last Error = ", GetLastError());
                                  if(NewBuyOrder > 0)Print("NEW BUY ORDER:- Lots to open: ", DoubleToStr(LotSize, Digits), " Entry Price: ", DoubleToStr(buyPrice, Digits), 
                                  " Buy Stop Loss: ", DoubleToStr(bsl, Digits), " Buy Take Profit: ", DoubleToStr(btp, Digits), " Magic Number is: ", DoubleToStr(MagicNumber, Digits));  
                                  } 
                  }
             } 
       }
 
DomGilberto:
うーん、そうですね、ちょっと試してみました。サーバーが0.00(小数点以下2桁)しか許容しないので、注文はそのまま送信されるようです。だから、残りの桁はほとんど関係ないんだ。

というわけで、残りの桁はほとんど関係ありません。というわけで、この問題から抜け出せずにいます(笑)。

なぜこれが問題なのか、「OP_BUY」を選択することができないのかがわかりません...。このトピックを使い果たしたかもしれませんが、何か最後の一刺しがあれば、本当にありがたいです。

私はあなたがあなたのコードをすべて表示する必要があると思います。. .

いくつか問題があるようですね。

      int BuyTicketOrder = OrderSend(Symbol(),OP_BUYSTOP,LotSize,buyPrice,3,bsl,btp,NULL,MagicNumber,0,Green); //--//<-- This is the first Order to be placed.
      }
       //  where are you checking the return value from the OrderSend() and reporting errors ?

         if(OrderStopLoss()<iMA(NULL,0,MA_Period,0,1,0,0)-MA_PadAmount*pips)    //  where is the OrderSelect() ?
 
すべてのコードがここに収まらない?私はpastebinにそれを置くが?

-http://pastebin.com/eaY1wKbN

シンタックスについては申し訳ありません - すべてを見るのは少し難しいですが、彼らはMQL4を持っていないのですか?だから、C++の下に置いてください。
 
DomGilberto:
すべてのコードは、ここに収まらないのだろうか?私はpastebinにそれを置くが?

-http://pastebin.com/eaY1wKbN

シンタックスについては申し訳ありません - すべてを見るのは少し難しいですが、彼らはMQL4を持っていないのですか?だから、C++の下に置いてください。

問題なし ... ...

これを行うとき ... ...

//+--------------------------------------------------------------------------------------------------+
//| Close OP_BUY Half lots @ 1:1 Function                                                            |
//+--------------------------------------------------------------------------------------------------+

   if(OrderSelect(OrderTicket(),SELECT_BY_TICKET,MODE_TRADES)==true && OpenOrdersThisPair(Symbol())==1 && OrderType()==OP_BUY)
     {

... ... どの注文が既に 選択されていますか? それは保留中の注文ですか? 既に選択されている注文がなければ、OrderTicket()が失敗した場合、OrderSelect()は失敗します。 このコードは本当に必要ですか? 後で、注文を選択し、そのシンボルとマジックナンバーとタイプをチェックするループがあります ... ...

これも修正する必要があります。

         if(OrderMagicNumber()==MagicNumber)
            if(OrderSymbol()==Symbol())

               Print("Current Bid: ",DoubleToStr(Bid,Digits)," FirstTarget_Buy: ",DoubleToStr(FirstTarget_Buy,Digits));

         if(OrderType()==OP_BUY && Bid>=FirstTarget_Buy+(Point/2)) // Doesn't seem to even go further than this as I do not get an error from OrderClose?
           {
            Print("Bid >= FirstTarget_Buy - Current Bid: ",DoubleToStr(Bid,Digits)," FirstTarget_Buy: ",DoubleToStr(FirstTarget_Buy,Digits));
            bool Close_Half_Order_Buy=OrderClose(OrderTicket(),half,Bid,3,CLR_NONE);
            if(Close_Half_Order_Buy!=TRUE)Print("Close_Half_Order_Buy Last Error = ",GetLastError());
           }

... 中括弧を追加 .... .

         if(OrderMagicNumber()==MagicNumber)
            if(OrderSymbol()==Symbol())
               {
               Print("Current Bid: ",DoubleToStr(Bid,Digits)," FirstTarget_Buy: ",DoubleToStr(FirstTarget_Buy,Digits));

               if(OrderType()==OP_BUY && Bid>=FirstTarget_Buy+(Point/2)) // Doesn't seem to even go further than this as I do not get an error from OrderClose?
                 {
                 Print("Bid >= FirstTarget_Buy - Current Bid: ",DoubleToStr(Bid,Digits)," FirstTarget_Buy: ",DoubleToStr(FirstTarget_Buy,Digits));
                 bool Close_Half_Order_Buy=OrderClose(OrderTicket(),half,Bid,3,CLR_NONE);
                 if(Close_Half_Order_Buy!=TRUE)Print("Close_Half_Order_Buy Last Error = ",GetLastError());
                 }
              }
 

OK - 何が行われ、何がポイントなのかを少し明確にするために、さらにプリントアウトしてみました。以下にそれを貼り付けます。

Order Select for closing:-...」という行は、上で質問されている「Close OP_BUY Half Lots @ 1:1 Function」のところで選択されているものです。この選択された時点でチケット番号が違うようなのですが?この部分が「if」文にないときに残りを出力するようなので、「...&& OrderType()==OP_BUY」の部分を削除して出していたのですが...。これで少しは分かりやすくなったでしょうか?

"First Buy Order Placed:-"は、最初のOrderSend関数が 最初に通過しているところです。
"Checking Buy Order:-"は、MAがOrderStopLoss()以上であれば、保留中の注文を削除して再オープンするためのforループ内のものです。
"NEW BUY ORDER:-"は、そのforループの中で発注される新しい注文です。
"Order Select for closing:-..." - 既に上で述べたように、これはロットの半分をクローズするために選択されている部分です。

これらの部分を追加しただけなので、わかりにくかったらごめんなさい。)

2013.08.02 13:33:57  2013.02.01 15:00  trendfishing_play_ground EURUSD,H1: Current Bid: 1.35972 FirstTarget_Buy: 1.37931
2013.08.02 13:33:57  2013.02.01 15:00  trendfishing_play_ground EURUSD,H1: FirstTarget_Buy: 1.37931 // This is the price where half the lots will close.
2013.08.02 13:33:57  2013.02.01 15:00  trendfishing_play_ground EURUSD,H1: Order Lots Open = 0.18
2013.08.02 13:33:57  2013.02.01 15:00  trendfishing_play_ground EURUSD,H1: Order Ticker Number = 9
2013.08.02 13:33:57  2013.02.01 15:00  trendfishing_play_ground EURUSD,H1: The Lots to close is: 0.09000
2013.08.02 13:33:57  2013.02.01 15:00  trendfishing_play_ground EURUSD,H1: The Lotstep is: 0.01000
2013.08.02 13:33:57  2013.02.01 15:00  trendfishing_play_ground EURUSD,H1: The minimum lots are: 0.01000
2013.08.02 13:33:57  2013.02.01 15:00  trendfishing_play_ground EURUSD,H1: Order Select for closing:- Lots open: 0.18 Entry Price: 1.3679 Buy Stop Loss: 1.3565 Buy Take Profit: 1.3907 Magic Number is: 1234 Order Ticket Number: 9
2013.08.02 13:33:57  2013.02.01 15:00  trendfishing_play_ground EURUSD,H1: NEW BUY ORDER:- Lots to open: 0.18215 Entry Price: 1.36790 Buy Stop Loss: 1.35649 Buy Take Profit: 1.39072 Magic Number is: 1234.00000 Order Ticket Number: 8
2013.08.02 13:33:57  2013.02.01 15:00  trendfishing_play_ground EURUSD,H1: open #9 buy stop 0.18 EURUSD at 1.36790 sl: 1.35649 tp: 1.39072 ok
2013.08.02 13:33:57  2013.02.01 15:00  trendfishing_play_ground EURUSD,H1: delete #8 buy stop 0.18 EURUSD at 1.36790 sl: 1.35649 tp: 1.39072 ok
2013.08.02 13:33:57  2013.02.01 15:00  trendfishing_play_ground EURUSD,H1: Checking Buy Order:- Lots to open: 0.18 Entry Price: 1.3679 Buy Stop Loss: 1.3565 Buy Take Profit: 1.3907 Magic Number is: 1234 Order Ticket Number: 8
2013.08.02 13:33:57  2013.02.01 15:00  trendfishing_play_ground EURUSD,H1: First Buy Order placed:- Lots to open: 0.18215 Entry Price: 1.36790 Buy Stop Loss: 1.35649 Buy Take Profit: 1.39072 Magic Number is: 1234.00000 Order Ticket Number: 7
 
DomGilberto:

OK - 何が行われ、何がポイントなのかを少し明確にするために、さらにプリントアウトしてみました。以下にそれを貼り付けます。

Order Select for closing:-...」という行は、上で質問されている「Close OP_BUY Half Lots @ 1:1 Function」のところで選択されているものです。この選択された時点でチケット番号が違うようなのですが?この部分が「if」文にないときに残りを出力するようなので、「...&& OrderType()==OP_BUY」の部分を削除して出していたのですが...。これで少しは分かりやすくなったでしょうか?

"First Buy Order Placed:-"は、最初のOrderSend関数が最初に通過しているところです。
"Checking Buy Order:-"は、MAがOrderStopLoss()以上であれば、保留中の注文を削除して再オープンするためのforループ内のものです。
"NEW BUY ORDER:-"は、そのforループの中で発注される新しい注文です。
"Order Select for closing:-..." - 既に上で述べたように、これはロットの半分をクローズするために選択されている部分です。

これらの部分を追加しただけなので、わかりにくかったらごめんなさい。)


添付されたものを試してみてください ... ... あなたがやろうとしていることについての私の最良の推測です ... ....
ファイル:
dom.mq4  24 kb
 

ああ、すごい。ありがとう。それは正しい方向への大きな一歩です。forループの中だから、半値と半値と半値@をクローズアウトしたいんだと思うんだけど...。一度だけでなく?それだけでなく、それは価格≧私が望む終了価格にすぐに半分を閉じないようです、代わりにそれを超えて、そして価格が私が望む終了価格に低いスイングバックすると、それはその後閉じます - 奇妙な...私を助けるためにあなたの忍耐に感謝しますあなたの時間に非常に感謝しています!


UPDATE: また、ストラテジーテスターを 実行する前にエキスパートのプロパティ(extern int)を変更すると、クローズハーフが全く機能しないことがわかりました。クローズハーフに影響を与えるものは、「MA_PadAmount」これは、ストップロスにパッドとして何ポイント追加したいか、ピップでトレースします。「OrderPrice_PadAmount」は、注文のエントリ価格にパッドとして何ピップ追加できるか指定します。

 
DomGilberto:
ああ、すごい。ありがとう。それは正しい方向への大きな一歩です。forループの中だから、半分と半分と半分の値段でクローズアウトしたいんだと思うんだけど...。一度だけでなく?それだけでなく、それは価格≧私が望む終了価格にすぐに半分を閉じないようです、代わりにそれを超えて、そして価格が私が望む終了価格に低いスイングバックすると、それはその後閉じます - 奇妙な...私を助けるためにあなたの忍耐に感謝しますあなたの時間のために非常に感謝しています!
それはforループではありません、それはちょうどそれが半分が既に閉じられたことを知る方法がありませんです...あなたはそれを処理するためにどのように計画しましたか?
 
はい - 文字通り、forループを削除 したときにそれがわかりました。もし、最初に選択されたときからOrderTicket番号を追跡し、OrderCloseがその役割を終えてtrueを返したら、OrderTicket番号でこれを確認することができ、それらは異なるということは正しいですか? - したがって、ループを中断して、別の新しい順序が来るのを待ちます。

どう書けばいいのかよくわからないのですが、大体この線で合っていますか?