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

 
DomGilberto:

MathFloor は、小数点以下を切り捨てて、最も近い全数にしますか?

MathFloor() はドキュメントに書かれていることを実行します ... "MathFloor 関数は、x 以下の最大の整数を表す数値を返します。"

DomGilberto です。


FirstTarget は "OrderClose()" 内のカスタム・パラメータとして意味があるのでしょうか?(引用されたコードを参照してください)

いいえ ... ... あなたはこれを持っています。

FirstTarget = OrderTakeProfit()-OrderOpenPrice()/2+OrderOpenPrice();

// meaning this

FirstTarget = OrderTakeProfit() - ( OrderOpenPrice() / 2 ) + OrderOpenPrice();

という意味でしょう.

FirstTarget = OrderOpenPrice() + ( ( OrderTakeProfit()-OrderOpenPrice() ) / 2 ) ;

括弧(とスペース)を使って、物事を明確に、曖昧にしないようにしましょう。

ドン・ジルベルト


あなたのコードは役に立たなかった - 申し訳ありません。

なぜ、それは間違っているのか、どのような方法で?

ドン・ジルベルト


カスタム変数を印刷することができますか?もしそうなら、ジャーナルに表示されないので、私のやり方が間違っているのでしょう。

はい、あなたは任意の変数を表示することができます.何をやっているのですか、コードを示してください。

 
 if(OpenOrdersThisPair(Symbol())==1 && OrderType() == OP_BUYSTOP)
   {
      OrderSelect(OrderTicket(),SELECT_BY_POS,MODE_TRADES); 
      
      double Lots=OrderLots(); 
      
      double FirstTarget_Buy = OrderOpenPrice() + ( ( OrderTakeProfit()-OrderOpenPrice() ) / 2 );{
         
         double minLot  = MarketInfo(Symbol(), MODE_MINLOT),
                lotStep = MarketInfo(Symbol(), MODE_LOTSTEP),
                half    = MathFloor(Lots/2/lotStep)*lotStep;
                
                if (half < minLot) half = Lots;
         
         half=Lots/2; 
         OrderClose(OrderTicket(),half,FirstTarget_Buy,3,DarkViolet);
         }
   } 
     
/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
   
   if(OpenOrdersThisPair(Symbol())==1 && OrderType() == OP_SELLSTOP)
    {
      OrderSelect(OrderTicket(),SELECT_BY_POS,MODE_TRADES);
      
      double FirstTarget_Sell = OrderOpenPrice() - ( ( OrderTakeProfit()-OrderOpenPrice() ) / 2 );{
       
       if (half < minLot) half = Lots;
       half=Lots/2;
       OrderClose(OrderTicket(),half,FirstTarget_Sell,3,DarkViolet); 
       }
    } 


カスタム変数の印刷についてですが、"FirstTarget_Buy "の場合、どのようにすればよいのでしょうか?

boolsとintsでそれを行う方法は理解しています(整数-1は失敗し、boolはtrueまたはfalse文です。

上記の "FirsTarget "式に光を当てていただき、ありがとうございます!すみません、私が言いたかったのは、あなたのコードは、私が数式をどのように組み立てるかを理解していないという意味で役に立たなかったということです...。OrderSelect "を呼び出せば、そのtickorderのロットサイズが何であるかがわかり、それを単純に分割できると思っていたのですが...本当に直感に反していますね。

完全にバカの一つ覚えで申し訳ないです。

 
DomGilberto:

完全な白痴のように見えて申し訳ありません。

そんなことはありません。自分の盲点を見つけて、それを明らかにすれば、なぜこんなに難しいと思ったのかがわかるはずです。

DomGilberto:

カスタム変数の印刷についてですが、"FirstTarget_Buy "の場合、どのようにすればいいのでしょうか?

boolsとintsでそれを行う方法は理解しています(整数-1は失敗し、boolは真か偽のステートメントです、簡単です)、しかし、カスタム変数に関数を割り当てるときにそれを行う方法を理解していないのですか?

このように ... 中括弧についてのコメントにも注目してください
 if(OpenOrdersThisPair(Symbol())==1 && OrderType() == OP_BUYSTOP)
   {
      OrderSelect(OrderTicket(),SELECT_BY_POS,MODE_TRADES); 
      
      double Lots=OrderLots(); 
      
      double FirstTarget_Buy = OrderOpenPrice() + ( ( OrderTakeProfit()-OrderOpenPrice() ) / 2 );

      Print("FirstTarget_Buy: ", DoubleToStr(FirstTarget_Buy, Digits) );   // prints FirstTarget_Buy with the same number of digits as the current symbol
         {                                                                                        // why this brace ?   
         
         double minLot  = MarketInfo(Symbol(), MODE_MINLOT),
                lotStep = MarketInfo(Symbol(), MODE_LOTSTEP),
                half    = MathFloor(Lots/2/lotStep)*lotStep;
                
                if (half < minLot) half = Lots;
         
         half=Lots/2; 
         OrderClose(OrderTicket(),half,FirstTarget_Buy,3,DarkViolet);
         }                                                               // why this brace ?  
   } 

ドムジルベルト

私は、あなたのコードが、私が式をまとめる方法を理解していないという意味で役に立たなかったと言いたかったのです...。OrderSelect」を呼び出せば、そのティックオーダーのロットサイズが何であるかを単純に確認でき、それを単純に分割できると思ったでしょう...。

単純に注文を選択して、OrderLots()を使って、2で割ればいいんです。私は、それが壊れたときに継続的に修正する必要がないように、私が予見できるすべてのケースのコードを書いています ... ...

あなたの位置のサイズが2.0ロットであるなら; 2で分けられるこれは1.0ロットであり、これは働く... ...

あなたのポジションサイズが0.3ロットである場合、これは2で割ると0.15ロットであり、これはMODE_LOTSTEPが0.1であれば無効なポジションサイズになります ... あなたは、このチェックと 調整をコーディングする必要があるので0.1または0.2 NOT 0.15を使用することができます。


あなたがここで持っているものは、すべてのケースで動作しません。

double Lots = OrderLots(); 
      

         
         half = Lots / 2; 
 

ああああああああああああああああああああああああああああああああああああああああああああああああああああああこの15-20分、あちこちにプリントを飛ばしていたのですが、どこで間違っているのかが分かってきました。私は基本的にPENDINGオーダーを選択しています...。しかし、それは保留中の注文なので、私がそれを選択した時点で、OrderLots, Stop and Targetが変更されている可能性がかなり高い。したがって、保留中の注文が発動する前に常に計算される方法と同期させるために、それをループに入れる必要がある。

あのくそダブルトストル :P - RaptorUKにぴったり!あなたの調整のおかげで、これが正しく計算されて いることがわかりました :)

好奇心からですが、どのような "if" ステートメントがトリガーされた注文だけを呼び出すのに有効でしょうか。現在、私は成行注文を開いたときに呼び出すようにしていますが、保留中の注文がトリガーされたときに呼び出す方法を見つけようとしているのです。

以下のコードと対応する "if "ステートメントは、単に開いている保留中の注文に呼び出されるようです。ただ、注文がトリガーされたことに基づいて、特定のカスタム関数(例えばvoid)に "行く "ための方法が必要ですか?(もしそれが意味をなすなら!)

私のために多くのことをクリアにしてくれてありがとうございます :)

int OpenOrdersThisPair(string pair)
{
   int total=0;
      for(int i=OrdersTotal()-1; i >= 0; i--)
         {
         OrderSelect(i,SELECT_BY_POS,MODE_TRADES);
         if(OrderSymbol()==pair) total++;
         }
         return (total);
}         

if(OpenOrdersThisPair(Symbol())>0)
 
DomGilberto:

ああああああああああああああああああああああああああああああああああああああああああああああああああああああこの15~20分で、プリントをあちこちに飛ばしたんですが、どこで間違っているのかわかってきました。

やり方が分かれば簡単

DomGilberto です。


好奇心からですが、どのような "if" ステートメントがトリガーされたオーダーだけを呼び出すのに有効なのでしょうか。現在、私は成行注文を開いたときに呼び出すようにしていますが、保留中の注文がトリガーされたときに呼び出す方法を見つけようとしているのです。

保留中の注文が トリガーされると、OP_BUYかOP_SELLになります、だから.

if(OrderType() == OP_BUY || OrderType() == OP_SELL)
   { 
   
   }

ゼロ割り算のエラーが出たときに、その箇所を探すのにスペースや空白を使うと、すべてのコメントではなく、割り算を見つけるのが簡単です。

 
ああ、もちろんです(顔面蒼白)

良いヒントですね〜!そうします。助けてくれてありがとうございます :)なんとか出来たらまた投稿します!
 
よし、戻ったぞ!...しかし、あまり良いニュースではありません - 私は運悪く、複数のコードのバリエーションを試してテストしています。これは、私が今いる場所です。

プリントに関する情報は何も得られないのでしょうか?ジャーナルには何も出てきません。これは、最初の "if "ステートメントで、OrderTypeが何も選択されていないためだと思われますが、どうでしょうか?このコードを見る限りでは、少なくとも大きく外れてはいないと思うのですが・・・?
if(OrderType() == OP_BUY ){
   
      for( int c=OrdersTotal()-1; c >=0; c-- )
      {
         if(OrderSelect(c,SELECT_BY_TICKET,MODE_TRADES)==true){
            Print("Order Ticker Number = ",OrderTicket());
            Print("Order Lots Open = ", OrderLots());
            } 
         else if(OrderSelect(c,SELECT_BY_TICKET,MODE_TRADES)==false){
            Print("Order Select returned the error of ", GetLastError());
            }
            if(OrderMagicNumber()==MagicNumber)
              if(OrderSymbol()==Symbol())
                if(OrderType()==OP_BUY)
                  if(OpenOrdersThisPair(Symbol())==1) 
                    //if( Bid == FirstTarget_Buy)            
         
         
         double FirstTarget_Buy = OrderOpenPrice() + ( ( OrderTakeProfit()-OrderOpenPrice() ) / 2 );{
            Print("FirstTarget_Buy: ", DoubleToStr( FirstTarget_Buy, Digits ));
            }
         
         double minLot  = MarketInfo(Symbol(), MODE_MINLOT);{
                Print("The minimum lots are: ", DoubleToStr( minLot, Digits ));
                }
                        
         double lotStep = MarketInfo(Symbol(), MODE_LOTSTEP);{
                Print("The Lotstep is: ", DoubleToStr( lotStep, Digits ));
                }
                
         double half    = MathCeil(OrderLots()/2/lotStep)*lotStep;{
                Print("The Lots to close is: ", DoubleToStr( half, Digits ));
                }

                bool Close_Half_Order = OrderClose(OrderTicket(),half,FirstTarget_Buy,3,CLR_NONE);
            if(Close_Half_Order!=TRUE)Print("Close_Half_Order Last Error = ", GetLastError());
      } 
   }
 
DomGilberto:
よし、戻ったぞ!...しかし、あまり良いニュースではありません - 私は運が悪いとコードの複数のバリエーションを試してテストしています。これは、私が今いる場所です。

プリントに関する情報は何も得られないのでしょうか?ジャーナルには何も出てきません。これは、最初の "if "ステートメントで、OrderTypeが何も選択されていないためだと思われますが、どうでしょうか?このコードを見る限りでは、少なくとも大きく外れてはいないと思うのですが・・・?

この操作を行う前に、どのように注文を選択しているのですか?

if(OrderType() == OP_BUY ){

まだ問題があります

      for( int c=OrdersTotal()-1; c >=0; c-- )
      {
         if(OrderSelect(c,SELECT_BY_TICKET,MODE_TRADES)==true){
            Print("Order Ticker Number = ",OrderTicket());
            Print("Order Lots Open = ", OrderLots());
            } 
         else if(OrderSelect(c,SELECT_BY_TICKET,MODE_TRADES)==false){
            Print("Order Select returned the error of ", GetLastError());  //  OrderSelect has failed,  why do you continue . . . 
            }
            if(OrderMagicNumber()==MagicNumber)                            //  . . . to this line ?
              if(OrderSymbol()==Symbol())
                if(OrderType()==OP_BUY)
                  if(OpenOrdersThisPair(Symbol())==1) 
                    //if( Bid == FirstTarget_Buy) 
 

なんでやねん ... ...

for( int c = OrdersTotal()-1; c >= 0; c-- )
   {
   if( OrderSelect(c, SELECT_BY_TICKET, MODE_TRADES) )
      {
      Print("Order Ticker Number = ",OrderTicket());
      Print("Order Lots Open = ", OrderLots());
      } 
   else 
      {
      Print("Order Select returned the error of ", GetLastError()); 
      continue;                                                        // try next order position in the loop
      }
   if(OrderMagicNumber() == MagicNumber)    
      if(OrderSymbol() == Symbol())
         if(OrderType() == OP_BUY)
            if(OpenOrdersThisPair(Symbol()) == 1) 
 
こんなルーキーエラーを出すなんて...。腹立たしいです。ええ、私はそれが今印刷され、順序を選択しました。これは、印刷の面で動作しているコードです - ロットはまだしかし、クローズアウトされていないのですか?私はまた、以下のジャーナルメッセージを貼り付けている。
  if(OrderSelect(OrdersTotal(),SELECT_BY_TICKET,MODE_TRADES)==true && OpenOrdersThisPair(Symbol())==1){
         
         double FirstTarget_Buy = OrderOpenPrice() + ( ( OrderTakeProfit()-OrderOpenPrice() ) / 2 );{
           Print("FirstTarget_Buy: ", DoubleToStr( FirstTarget_Buy, Digits ));
         }
         
         double minLot  = MarketInfo(Symbol(), MODE_MINLOT);{
                Print("The minimum lots are: ", DoubleToStr( minLot, Digits ));
                }
                        
         double lotStep = MarketInfo(Symbol(), MODE_LOTSTEP);{
                Print("The Lotstep is: ", DoubleToStr( lotStep, Digits ));
                }
                
         double half    = MathCeil(OrderLots()/2/lotStep)*lotStep;{
                Print("The Lots to close is: ", DoubleToStr( half, Digits ));
                }
      for( int c=OrdersTotal()-1; c >=0; c-- )
      {
         if(OrderSelect(c,SELECT_BY_TICKET,MODE_TRADES)==true){
            Print("Order Ticker Number = ",OrderTicket());
            Print("Order Lots Open = ", OrderLots());
            } 
         else{
           Print("Order Select returned the error of ", GetLastError()); // Order Select does not seem to want to work?
            continue;
            }
            if(OrderMagicNumber()==MagicNumber)
              if(OrderSymbol()==Symbol())
                if(OrderType()==OP_BUY)
                  if(OpenOrdersThisPair(Symbol())==1) 

                bool Close_Half_Order = OrderClose(OrderTicket(),half,FirstTarget_Buy,3,CLR_NONE);
            if(Close_Half_Order!=TRUE)Print("Close_Half_Order Last Error = ", GetLastError());
      } 
   }
2013.07.31 11:13:52	2013.02.01 16:00  trendfishing_play_ground EURUSD,H1: Order Select returned the error of 0    // Not sure what is going on here?		
2013.07.31 11:13:52	2013.02.01 16:00  trendfishing_play_ground EURUSD,H1: The Lots to close is: 0.09000           // This is the right calculation based 
                                                                                                                      // upon the total lots opened on a pending order - to half.
2013.07.31 11:13:52	2013.02.01 16:00  trendfishing_play_ground EURUSD,H1: The Lotstep is: 0.01000
2013.07.31 11:13:52	2013.02.01 16:00  trendfishing_play_ground EURUSD,H1: The minimum lots are: 0.01000
2013.07.31 11:13:52	2013.02.01 16:00  trendfishing_play_ground EURUSD,H1: FirstTarget_Buy: 1.37931                // This price is also correct.