閉じる問題、助けてください

 

皆さん、こんにちは。
構文が前より良くなっていることを願っています。先週から、Codersguruを読んでいます。

下のプログラムは、エラーはありませんが、コンパイラは1つだけの順序を記録します。しかし、私のコードはそれを閉じることはありません。
プログラムでは --- ticket=OrderSend(Symbol(),OP_BUY,Lots,Ask,Slippage,0,0,", Blue), I have not inserted stoploss or ", Blue), I have not inserted stoploss or ",", Blue), I have not inserted stoploss or ",", Blue).
ストップロスやテイクプロフィットを挿入していません。理由としては、StopLossの条件がすでにこのようにコーディングされているからです ---。
if(OrderTicket() == OrderOpenPrice() - (ATR*2))
{
オーダークローズ(OrderTicket(), OrderLots(), 3, Blue)
ということで、StopLossをもう一つ入れる必要はないですよね?TakeProfitについては
この他の問題が解決したら、それをコード化するつもりです。
それとも構文にまた問題があるのでしょうか?
私の問題が他の人の役に立ちますように。
乾杯

-----------------------------------------------------------------+
//|                                         Opening and Closeing.mq4 |
//|                                      Copyright © 2010, Ben banta |
//|                                        http://www.metaquotes.net |
//+------------------------------------------------------------------+
#property copyright "Copyright © 2010, Ben banta"
//+------------------------------------------------------+
//|                   Closing My Way                     |
//+------------------------------------------------------+



double ATR;
double Slippage = 3;
double StopLoss_Buy;
double StopLoss_Sell;
double Lots=0.4;
double MagicNumber;

int ticket;
int order;

//----------------- Closing Sell ---------------

int start() 
  {                                                          
    for(int index = OrdersTotal() -1; index >= 0; index--)                              
  {                                                               
    if (OrderSelect(index, SELECT_BY_TICKET)                    // existing orders
&&  OrderMagicNumber()  == MagicNumber                          // with my MN    
&&  OrderSymbol()       == Symbol())                            // with my symbol
  {                                                                                                                                                    
    if(OrderType() == OP_SELL)
    order = OrderTicket(); 
                       
    if(OrderTicket() == OrderOpenPrice() + (ATR*2))     // ATR*2 above Sell. Hard Stop
  {
      OrderClose(OrderTicket(),OrderLots(),3,Blue);   
      Print("Sell order closed with Hard Stop"); 
     }     
  else
  {
      Print("Error closing Sell Hard Stop", GetLastError()); 
   }   
//---------- Closeing Buy -------------
           
    if(OrderType() == OP_BUY) 
    order = OrderTicket(); 
    
    if(OrderTicket() == OrderOpenPrice() - (ATR*2))     // ATR*2 below Buy. Hard Stop
  {
      OrderClose(OrderTicket(),OrderLots(),3,Red); 
      Print("Buy order closed with Hard Stop");
     }     
  else 
  {
      Print("Error closing Buy Hard Stop", GetLastError());                                      
      return(0); 
    }                                              
  } 
}


//------------ Opening Buy -----------------

if(OrdersTotal() < 1)                                        // Checking for any working orders
   {                                   
     if (Ask > High[iHighest(NULL,0,MODE_HIGH,20, 1)])         // When this condition is true, 
                                                               // with no working orders  
   {                                                                                     
        ticket=OrderSend(Symbol(),OP_BUY,Lots,Ask,Slippage,0,0," ",0,0,Blue);
                                                               // Buy! Useing these parameters  
     if(ticket>0)
   { 
      if(OrderSelect(ticket,SELECT_BY_TICKET,MODE_TRADES))                                                       
      Print ("Buy Order Was a Big Success :" , OrderOpenPrice());
    }
  else
      Print ("Error Opening Buy Order :" , GetLastError()); 
      return(0);                                                  
  }  
                                                      
//--------------- Opening Sell ----------------
                                                                         
  if (Bid < Low[iLowest(NULL,0,MODE_LOW,20,1)])                //When this condition is true, 
                                                               //with no working orders
    {   
      ticket=OrderSend(Symbol(),OP_SELL,Lots,Bid,Slippage,0,0," ",0,0,Red);  
                                                               //Sell! Useing these parameters
   if(ticket>0)
     {     
       if(OrderSelect(ticket,SELECT_BY_TICKET,MODE_TRADES))                                                
       Print ("Sell Order Was a Big Success :" , OrderOpenPrice());
     }
    else
       Print ("Error Opening Sell Order :" ,GetLastError());
       return(0);
     }  
    return(0); 
  }
}
 
-----------------------------------------------------------------+
//|                                         Opening and Closeing.mq4 |
//|                                      Copyright © 2010, Ben banta |
//|                                        http://www.metaquotes.net |
//+------------------------------------------------------------------+
#property copyright "Copyright © 2010, Ben banta"
//+------------------------------------------------------+
//|                   Closing My Way                     |
//+------------------------------------------------------+



double ATR;
double Slippage = 3;
double StopLoss_Buy;
double StopLoss_Sell;
double Lots=0.4;
double MagicNumber;

int ticket;
int order;

//----------------- Closing Sell ---------------

int start() 
  {                                                          
    for(int index = OrdersTotal() -1; index >= 0; index--)                              
       {                                                               
        if (
           OrderSelect(index, SELECT_BY_TICKET)                    // existing orders
           &&  OrderMagicNumber()  == MagicNumber                  // with my MN    
           &&  OrderSymbol()       == Symbol()                     // with my symbol
           )                     
           {                                                                                                                                                    
            if(OrderType() == OP_SELL) order = OrderTicket(); 
                       
            if(OrderTicket() == OrderOpenPrice() + (ATR*2))     // ATR*2 above Sell. Hard Stop
              {
               OrderClose(OrderTicket(),OrderLots(),3,Blue);   
               Print("Sell order closed with Hard Stop"); 
              }     
              else
              {
               Print("Error closing Sell Hard Stop", GetLastError()); 
              } //ENDif (OrderTicket() == OrderOpenPrice() + (ATR*2))
                                 
                                                              //---------- Closeing Buy -------------
                     
              if(OrderType() == OP_BUY) order = OrderTicket(); 
               
              if(OrderTicket() == OrderOpenPrice() - (ATR*2))     // ATR*2 below Buy. Hard Stop
                {
                 OrderClose(OrderTicket(),OrderLots(),3,Red); 
                 Print("Buy order closed with Hard Stop");
                }     
                else 
                {
                 Print("Error closing Buy Hard Stop", GetLastError());                                      
                 return(0); 
                }//ENDif (OrderTicket() == OrderOpenPrice() - (ATR*2))                                              
           }//ENDIf ( OrderSelect(index, SELECT_BY_TICKET) etc
       }// END for loop               
                     
                             
                                        //------------ Opening Buy -----------------
                       
    if(OrdersTotal() < 1)                                        // Checking for any working orders
      {                                   
       if (Ask > High[iHighest(NULL,0,MODE_HIGH,20, 1)])         // When this condition is true, 
                                                               // with no working orders  
        {                                                                                     
         ticket=OrderSend(Symbol(),OP_BUY,Lots,Ask,Slippage,0,0," ",0,0,Blue);
                                                               // Buy! Useing these parameters  
         if(ticket>0)
           { 
            if(OrderSelect(ticket,SELECT_BY_TICKET,MODE_TRADES)) Print ("Buy Order Was a Big Success :" , OrderOpenPrice());
           }
           else
           Print ("Error Opening Buy Order :" , GetLastError()); //ENDif (ticket>0)
             
         return(0);                                                  
        }//ENDif (Ask > High[iHighest(NU... etc  
                                                      
                                                             //--------------- Opening Sell ----------------
                                                                         
       if (Bid < Low[iLowest(NULL,0,MODE_LOW,20,1)])                //When this condition is true, 
                                                                    //with no working orders
          {   
           ticket=OrderSend(Symbol(),OP_SELL,Lots,Bid,Slippage,0,0," ",0,0,Red);  
                                                               //Sell! Useing these parameters
           if(ticket>0)
             {     
              if(OrderSelect(ticket,SELECT_BY_TICKET,MODE_TRADES)) Print ("Sell Order Was a Big Success :" , OrderOpenPrice());
             }//ENDif (ticket>0)
             else
             Print ("Error Opening Sell Order :" ,GetLastError()); 
             //ENDif (OrderSelect(ticket,SELECT_BY_TICKET,MODE_TRADES))
                                 
           return(0);
          }//ENDif (Bid < Low[iLowest(NULL,0,MODE_LOW,20,1)])  
       return(0); 
      }//ENDif  (OrdersTotal() < 1)
}//ENDint start()
コードブロックが読みやすくなります。
 
if(OrderTicket() == OrderOpenPrice() - (ATR*2)) 
オーダーチケットは 非常に大きな整数(おそらく数十億、)で、オーダーのキーとなるものです。
OOP - 2ATRは価格です。
この2つが等しくなることはない
もし OrderClosePrice() == OOP-2ATR という意味なら、実数はほとんど等しく比較されない。
 if( OrderClosePrice() - OrderOpenPrice()-ATR*2 <= 0)//...

OrderSelect(index, SELECT_BY_TICKET)                    // existing orders
           &&  OrderMagicNumber()  == MagicNumber                  // with my MN    
           &&  OrderSymbol()       == Symbol() 
orderSendにマジックナンバーが設定されていない。
 
Ickyrus wrote>>
コードブロックが読みやすくなります。


はい、その通りです。試行錯誤と問い合わせのたびに、少しずつ勉強しています。きれいにしていただきありがとうございます。中括弧を適切な場所に置くことができたのは、ここ数日のことです。よりシンプルであればあるほど良い。
乾杯
 
WHRoeder wrote>>
オーダーチケットは非常に大きな整数(おそらく数十億、)で、オーダーのキーとなる。
OOP - 2ATRは価格です。
この2つが等しくなることはない
OrderClosePrice() == OOP-2ATR という意味なら、実数はほとんど等しく比較されない。

あなたのorderSendは魔法の数字を設定しない


こんにちは WHRoeder
ご指摘ありがとうございます。しかし、私はすぐにOOP -2ATRを理解していなかったと言わざるを得ない。
OOP = OrderOpenPriceです。それは最初、私の頭の上を通過しました。あなたの説明は全く正しいです。私は==記号にとらわれていました。OrderClosePrice()はOrderOpenPrice()から(ATR*2)を引いた値とはならないかもしれませんね。 それをキャッチしていただきありがとうございます。
ご指摘の件、理解できたかどうか確認させてください。ここで言い直します。 if(OrderClosePrice()-OOP()-ATR*2 <= 0)
これは、OCP=1.4361、OOP=1.4321、ATR=20と読み取れるようです(ここではアービタリーの数値を使っています)。ということは、式は次のようになります。
if (1.4321 - 1.4361 - (20*2) <= 0), 申し訳ないのですが、よく理解できません。
同じ数字を使って、式を並べ替えると、私の言いたいことがわかるかもしれません。しかし、これもプログラムに突っ込むとうまくいかなかった。
新しいアレンジはこんな感じです。

if (1.4361 >= 1.4321 + (20*2)) とします。

OCP >=OOP + ATR*2 のところで、制御が渡ります。
OrderClose (OrderTicket(), OrderLots(), etc.) に制御が移ります。

もう一つの観察は、OrderSend がマジックナンバーを設定しないことです。
この部分をプログラムから取り出して、 && OrderMagicNumber == MagicNumber とすることは可能でしょうか?
また、他の改善点があれば、教えてください。
乾杯
 

こんにちは、Aisさん
ご返答ありがとうございます。お元気でお過ごしでしょうか。
提案は今朝挿入されました。申し訳ありませんが、コンパイラは私がコーディングしたものが好きではありません。プログラムのどのステートメントが正しくないのかよくわかりません。提案の内容は問題ないと思います。プログラムを再投稿し、問題があると思われる部分にフラグを立てます。また、決済のための戦略も書いておきます。

売りポジションは、注文開始価格よりAtr*2だけ上でストップアウトします。例えば、OOPが1.4321、Atr =20、OCP = 1.4361のようにです。
そこで、式を次のようにコーディングしてみました。

if(OrderClosePrice >= OrderOpenPrice(), - (ATR*2)) とします。// 条件が満たされると、制御は...に移ります。
OrderClose (OrderTicket(), OrderLots(), OrderClosePrice(),Blue) ;

注:OrderSendステートメントにはStopLoss()やTakeProfit()は含まれていません。

皆様のご協力に感謝いたします。
乾杯
double ATR;
double Slippage = 3;
double StopLoss_Buy;
double StopLoss_Sell;
double Lots=0.4;
double MagicNumber;

int ticket;
int order;

//----------------- Closing Sell ---------------

int start() 
  {                                                          
    for(int index = OrdersTotal() -1; index >= 0; index--)                              
  {                                                               
    if (OrderSelect(index, SELECT_BY_TICKET)                  // existing orders
//&&  OrderMagicNumber()  == MagicNumber                      // with my MN    
&&  OrderSymbol()       == Symbol())                          // with my symbol
  {                                                                                                                                                    
    if(OrderType() == OP_SELL) order = OrderTicket(); 
//<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<                       
    if(OrderClosePrice() >= OrderOpenPrice() + (ATR*2)) // condition to be met,
                                                        // control then passes to...
  {                                                     
      OrderClose(OrderTicket(),OrderLots(),OrderClosePrice(),Blue); // OrderClose
//<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
      Print("Sell order closed with Hard Stop"); 
     }     
  else
  {
      Print("Error closing Sell Hard Stop", GetLastError()); 
   }   
//---------- Closeing Buy -------------
           
    if(OrderType() == OP_BUY)  order = OrderTicket(); 
    
    if(OrderClosePrice() <= OrderOpenPrice() - (ATR*2))        // ATR*2 below Buy. Hard Stop
  {
      OrderClose(OrderTicket(),OrderLots(),OrderClosePrice(),Red); 
      Print("Buy order closed with Hard Stop");
     }     
  else 
  {
      Print("Error closing Buy Hard Stop", GetLastError());                                      
      return(0); 
    }                                              
  } 
}


//------------ Opening Buy -----------------

if(OrdersTotal() < 1)                                        // Checking for any working orders
   {                                   
     if (Ask > High[iHighest(NULL,0,MODE_HIGH,20, 1)])         // When this condition is true, 
                                                               // with no working orders  
   {                                                                                     
        ticket=OrderSend(Symbol(),OP_BUY,Lots,Ask,Slippage,0,0," ",0,0,Blue);
                                                               // Buy! Useing these parameters  
     if(ticket>0)
   { 
      if(OrderSelect(ticket,SELECT_BY_TICKET,MODE_TRADES))                                                       
      Print ("Buy Order Was a Big Success :" , OrderOpenPrice());
    }
  else
      Print ("Error Opening Buy Order :" , GetLastError()); 
      return(0);                                                  
  }  
                                                      
//--------------- Opening Sell ----------------
                                                                         
  if (Bid < Low[iLowest(NULL,0,MODE_LOW,20,1)])                //When this condition is true, 
                                                               //with no working orders
    {   
      ticket=OrderSend(Symbol(),OP_SELL,Lots,Bid,Slippage,0,0," ",0,0,Red);  
                                                               //Sell! Useing these parameters
   if(ticket>0)
     {     
       if(OrderSelect(ticket,SELECT_BY_TICKET,MODE_TRADES))                                                
       Print ("Sell Order Was a Big Success :" , OrderOpenPrice());
     }
    else
       Print ("Error Opening Sell Order :" ,GetLastError());
       return(0);
     }  
    return(0); 
  }
}
 

こんにちは、ハックルベリーです。
あなたのプログラムを少しリスタイルしようと思っています。
とりあえず、さようなら。

 

なぜ "order = OrderTicket();" とし、orderclose() 関数でその値を使用しないのですか?
選択された注文が 変更される可能性は低いですが、肯定的に識別された注文の値を使用する方が安全ではないでしょうか?
-
OrderClose(OrderTicket(),OrderLots(),OrderClosePrice(),Blue);
OrderTicket() は現在選択されているチケットに なります - 私の学習段階では
OrderClose()を実行したときに、どのOrderticketが選択されているのかがわかりません。

//// 編集
実は、"order= OrderTicket() "が、前のIf文で特定したチケットであるかどうか、確信が持てません。

 
Ais wrote>>

こんにちは、ハックルベリーです。
あなたのプログラムを少しリスタイルしてみます。
とりあえず、さようなら
.


本当にありがとうございます。お返事お待ちしております。
乾杯
 
Ickyrus wrote>>

なぜ "order = OrderTicket();" とし、orderclose() 関数でその値を使用しないのですか?
選択された注文が変更される可能性は低いですが、肯定的に識別された注文の値を使用する方が安全ではないでしょうか?
-
OrderClose(OrderTicket(),OrderLots(),OrderClosePrice(),Blue);
OrderTicket() は現在選択されているチケットに なります - 私の学習段階では
OrderClose()を実行したときに、どのOrderticketが選択されているのかがわかりません。

//// 編集
実は、「order= OrderTicket()」が、直前のIf文で確認したチケットであるかどうかはわかりません。


こんにちは、Ickyrus
あなたの観察および提案に感謝します。あなたの時間は貴重なものです。
あなたの推論は完全に理にかなっています。私は、選択された順序に関しては、あなたほど確信していません。あなたの提案を試してみることにします。
ありがとうございました。
乾杯
理由: