Проблемы с закрытием, пожалуйста, помогите

 

Привет всем
Надеюсь, что синтаксис стал лучше, чем раньше. В течение последней недели я читаю Codersguru.

Программа ниже, хотя и не имеет ошибок, компилятор регистрирует только один порядок. Но мой код не закрывает его.
Программа утверждает --- ticket=OrderSend(Symbol(),OP_BUY,Lots,Ask,Slippage,0,0," ",Blue), я
я не вставил стоплосс или тейкпрофит, как вы можете видеть. Причина, есть условие StopLoss уже закодированное как таковое ---.
if(OrderTicket() == OrderOpenPrice() - (ATR*2))
{
OrderClose(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)) 
Order ticket - очень большое целое число (возможно, в миллиардах), ключ к заказу.
OOP - 2ATR - это цена.
Эти два показателя НИКОГДА не будут равны
если вы имели в виду 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 >>
Order ticket - очень большое целое число (возможно, в миллиардах), ключ к заказу.
OOP - 2ATR - это цена.
Эти два показателя НИКОГДА не будут равны
если вы имели в виду 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() и т.д.

Другое ваше замечание заключалось в том, что 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().

//// Редактировать
На самом деле я не уверен, что "order= OrderTicket()" - это тот билет, который вы определили в предыдущем выражении If.

 
Ais wrote >>

Hello Huckleberry,
Я собираюсь немного переделать вашу программу.
Пока


Большое спасибо. Я буду ждать вашего ответа.
Будь здоров
 
Ickyrus wrote >>

Зачем делать "order = OrderTicket(); " и не использовать это значение в функции orderclose()?
Хотя вероятность того, что выбранный ордер изменился, не будет ли безопаснее использовать положительно идентифицированное значение ордера?
-
OrderClose(OrderTicket(),OrderLots(),OrderClosePrice(),Blue);
OrderTicket() будет текущим выбранным билетом - на данном этапе моего обучения
Я не могу сказать, какой билет выбран, когда вы делаете OrderClose().

//// Редактировать
На самом деле я не уверен, что "order= OrderTicket()" - это тот билет, который вы определили в предыдущем выражении If.


Привет, Иккирус
Спасибо за ваше наблюдение и предложение. Ваше время очень ценно.
Ваши рассуждения имеют смысл. Я не более уверен, чем вы, в том, что касается выбранного порядка. Я попробую воспользоваться вашим предложением.
Еще раз спасибо.
Спасибо
Причина обращения: