Закрытие половинных участков. - страница 3

 
DomGilberto:

Округляет ли MathFloor десятичные знаки до ближайшего ЦЕЛОГО числа?

MathFloor() делает то, что написано в документации... "Функция MathFloor возвращает числовое значение, представляющее наибольшее целое число, которое меньше или равно x".

ДомЖильберто:


Имеет ли смысл использовать FirstTarget как пользовательский параметр в "OrderClose()" - Если предположить, что "sizeClose" был правильным? (см. процитированный код)

Нет... у вас есть это:

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 - это истинное или ложное утверждение - легко.), но я не понимаю, как это сделать, когда вы присваиваете функции пользовательской переменной?

Спасибо, что пролили свет на формулу "FirsTarget" выше! Извините, я хотел сказать, что ваш код не помог в том смысле, что я не понимаю, как составить формулу... Я нахожу это действительно контр-интуитивным - можно было бы подумать, что вызов "OrderSelect" позволит вам просто увидеть, какой размер лота был на этом тиковом ордере... и затем просто разделить его...

Извините, что показался полным идиотом!

 
DomGilberto:

Извините, что показался полным идиотом!

Вовсе нет, вам просто нужно найти свое слепое пятно и просветить его, как только вы это сделаете, вы удивитесь, почему вам было так трудно, все легко, когда вы знаете как.

DomGilberto:

Что касается печати пользовательских переменных, как бы я сделал это для "FirstTarget_Buy"?

Я собираюсь потратить время на то, чтобы просмотреть весь мой код и распечатать много - я понимаю, как это сделать с bools и ints (integer -1 fail, а bool это true или false statement - легко.), но я не понимаю, как это сделать, когда вы присваиваете функции пользовательской переменной?

Вот так... также обратите внимание на комментарий о фигурных скобках
 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.0 лота; это деленное на два будет 1.0 лот, и это будет работать...

Если размер вашей позиции 0.3 лота; это деление на два будет 0.15 лота, и это будет недопустимый размер позиции, если MODE_LOTSTEP равен 0.1 ... вы можете использовать 0.1 или 0.2 НЕ 0.15, поэтому вам нужно закодировать эту проверку и настройку.


То, что у вас есть здесь, не будет работать во всех случаях ...

double Lots = OrderLots(); 
      

         
         half = Lots / 2; 
 

Ахххх! Я только что провел последние 15-20 минут, размазывая отпечатки по всему месту - я начинаю понимать, где я ошибаюсь. По сути, я выбираю отложенный заказ... НО, поскольку это отложенный ордер, в тот момент, когда я его выбираю, есть большая вероятность, что OrderLots, стоп и цели изменились, поэтому мне нужно поместить его в цикл, чтобы он синхронизировался с тем, как мои отложенные ордера постоянно рассчитываются до их срабатывания.

Этот чертов doubletostr :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)
   { 
   
   }

Один совет - используйте больше пробелов ... когда вы получаете ошибку деления на ноль и хотите найти, где это происходит, легко искать пробел/пробел и просто найти ваши деления вместо всех ваших комментариев ... поэтому я использую пробелы вокруг = + - / % и т.д.

 
Ах, конечно (facepalm!)

Хороший совет - я так и сделаю! Спасибо за помощь :) Я отпишусь, если у меня получится!
 
Хорошо, я вернулся! ... Не очень хорошие новости - я пробовал и тестировал множество вариаций кода безрезультатно. Вот на чем я сейчас остановился.

Я не получаю никакой информации относительно отпечатков? Абсолютно ничего не появляется в журнале. Я предполагаю, что это происходит потому, что ничего не выбирается в качестве OrderType прямо из первого оператора "if"? Из того, что я вижу здесь в коде, я бы подумал, что я не далеко ушел, по крайней мере...?
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:
Хорошо, я вернулся! ... Но новости не очень хорошие - я пробовал и тестировал множество вариантов кода, но безуспешно. Вот на чем я сейчас остановился.

Я не получаю никакой информации об отпечатках? Абсолютно ничего не появляется в журнале. Я предполагаю, что это происходит потому, что ничего не выбирается в качестве OrderType прямо из первого оператора "if"? Из того, что я вижу здесь в коде, я бы подумал, что я не далеко ушел, по крайней мере...?

Как вы выбираете заказ перед тем, как сделать это?

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.


Причина обращения: