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

 


Итак (UPDATE!), в основном, я избавился от непрерывного закрытия "половины половины половины половины половины и т.д." на лотах, когда вызывается вторая функция OrderClose() (там, где синий оператор if - очевидно, это работает нормально!) - КАК бы то ни было, я НЕ хочу, чтобы эта функция вызывалась вообще, если ПЕРВАЯ функция OrderClose() не "True" и не была успешной. "Close_Half_Order_Buy==True" тоже не работает...

Буду рад чьей-нибудь помощи, чтобы довести дело до конца :)

( Я удалил много "Опечаток", для ясности в мясе кода).

//+--------------------------------------------------------------------------------------------------+
//| Close OP_BUY Half lots @ 1:1 Function                                                            |
//+--------------------------------------------------------------------------------------------------+
void CloseHalfOrder()
{   
   
   static datetime partclosedonce;
   static datetime partclosedtwice; 
   
   double minLot=MarketInfo(Symbol(),MODE_MINLOT);

   double lotStep=MarketInfo(Symbol(),MODE_LOTSTEP);

   double half=MathFloor(OrderLots()/2/lotStep)*lotStep;
   
   double EMA_Bar = iClose(NULL, PERIOD_H1, 1);
   double EMA_MA = iMA(Symbol(),60,21,0,1,0,0);

   
for(int c=OrdersTotal()-1; c>=0; c--)
      {
      if(OrderSelect(c,SELECT_BY_POS,MODE_TRADES)==true)

      double FirstTarget_Buy = OrderOpenPrice()+(( OrderTakeProfit()-OrderOpenPrice())/2);
      	Print("FirstTarget_Buy: ",DoubleToStr(FirstTarget_Buy,Digits));
      
      if(OrderMagicNumber()==MagicNumber)
         if(OrderSymbol()==Symbol())
            if(OrderLots()>minLot)
               if(OrderOpenTime() != partclosedonce)
            {
            
            if(OrderType()==OP_BUY && Bid >= FirstTarget_Buy+(Point/2)) 
               {
               bool Close_Half_Order_Buy=OrderClose(OrderTicket(),half,Bid,5,Blue);
               if(Close_Half_Order_Buy!=TRUE)Print("Close_Half_Order_Buy Last Error = ",GetLastError());
               }
            }
         
      if(Close_Half_Order_Buy==True && OrderOpenPrice() > OrderStopLoss())
         {
         MoveToBreakEven(); 
         }
          if(Close_Half_Order_Buy==True)
               {
               partclosedonce = OrderOpenTime();
               } 
      
      if(partclosedonce != partclosedtwice && OrderOpenTime() != partclosedtwice) // I dont want this to run UNLESS the first OrderClose() is successful.
         {
          if(OrderType()==OP_BUY && EMA_Bar < EMA_MA)
               {
               bool EMA_Buy_Close=OrderClose(OrderTicket(),half,Bid,5,CLR_NONE);
               if(EMA_Buy_Close!=TRUE)Print("EMA_Buy_Close Last Error = ",GetLastError());
               if(EMA_Buy_Close==True)partclosedtwice = OrderOpenTime();
               }     
          }        
     }
}


	          
 
Кто-нибудь?
 
DomGilberto:


Итак (ОБНОВЛЕНО!), в основном, я избавился от непрерывного закрытия "половины половины половины половины половины половины и т.д." на лотах, когда вызывается вторая функция OrderClose() (там, где синий оператор if - очевидно, это работает нормально!) - КАК бы то ни было, я НЕ хочу, чтобы эта функция вызывалась вообще, если ПЕРВАЯ функция OrderClose() не "True" и не была успешной. "Close_Half_Order_Buy==True" тоже не работает...

Буду рад чьей-либо помощи, чтобы закончить это :)

Следующий код компилируется (объявив переменную MagicNumber и закомментировав функцию MoveToBreakEven()), но не было проверено.

//+--------------------------------------------------------------------------------------------------+
//| Close OP_BUY Half lots @ 1:1 Function                                                            |
//+--------------------------------------------------------------------------------------------------+
void CloseHalfOrder() {
   static bool FirstBuyTarget_hit = false, SecondBuyTarget_hit = false;
   int ct = 0;
   double minLot = MarketInfo(Symbol(),MODE_MINLOT);
   double lotStep = MarketInfo(Symbol(),MODE_LOTSTEP);
   double EMA_Bar = iClose(NULL, PERIOD_H1, 1);
   double EMA_MA = iMA(Symbol(),60,21,0,1,0,0);
        
   for(int c = OrdersTotal() - 1; c >= 0; c--)
      if (OrderSelect(c,SELECT_BY_POS))
         if (OrderSymbol() == Symbol() && OrderType() <= OP_SELL)
            if (OrderMagicNumber() == MagicNumber) {
               double half=MathFloor(OrderLots()/2/lotStep)*lotStep;
               double FirstTarget_Buy = OrderOpenPrice() + ((OrderTakeProfit() - OrderOpenPrice()) / 2);
               Print ("FirstTarget_Buy: ", DoubleToStr(FirstTarget_Buy,Digits));
                                        
               ct++;
                                        
               if (!FirstBuyTarget_hit)
                  if (OrderType() == OP_BUY && Bid >= FirstTarget_Buy + (Point/2)) {
                     if (OrderClose(OrderTicket(),half,Bid,5,Blue)) {
                        MoveToBreakEven();
                        FirstBuyTarget_hit = true;
                        break;
                     }
                     else
                        Print("Close_Half_Order_Buy Last Error = ", GetLastError());
                  }
                                        
               if (FirstBuyTarget_hit && !SecondBuyTarget_hit) 
                  if (OrderType() == OP_BUY && EMA_Bar < EMA_MA) {
                     if (OrderClose(OrderTicket(),half,Bid,5,CLR_NONE))
                        SecondBuyTarget_hit = true;
                     else
                        Print("EMA_Buy_Close Last Error = ",GetLastError());                    
                  }

               break;
            }
   if (ct == 0) {
      FirstBuyTarget_hit = false;
      SecondBuyTarget_hit = false;
   }
}

Приведенный выше код предполагает, что на каждую валютную пару выставляется только один ордер.

 

Огромное спасибо за помощь! Я действительно ценю ее :)

Не могли бы вы помочь мне с последней вещью; в настоящее время у меня есть FIXED 1:2 цель тейк-профита (жесткий TP). На самом деле я хочу убрать ее из ордера. Однако, как вы можете видеть выше, соответствующие функции OrderClose() используют OrderTakeProfit(), чтобы вычислить, где функции OrderClose() должны закрыться.

Мой вопрос в том, есть ли способ сохранить цену OrderTakeProfit(), но вместо того, чтобы фиксировать ее в ордере, я хочу закрыть определенное количество лотов с помощью OrderClose() @ цена OrderTakeProfit()? Причина в том, что иногда у меня есть сделка, которая приносит огромную прибыль, но поскольку я зафиксировал OrderTakeProfit() в открытом ордере, все лоты закроются по ней, а я хочу только частично закрыть некоторые лоты по этой цене выхода. Я использую трейлинг-стоп для больших бегунов... Надеюсь, это имеет смысл?

Вот и все! Я закончил! Наконец-то!

UPDATE: Код выше - это хороший способ написать его. Я немного поигрался, но он не закрывается в правильном порядке. Он по-прежнему просто закрывает половину того, что пришло первым. Это похоже на то, что у меня было до использования статического datetime? Есть какие-нибудь мысли?

 
(чувствую, что исчерпал эту тему)

Я буквально задал 2 последних вопроса выше и все готово? Все, что мне нужно знать, это как я могу сохранить цену OrderTakeProfit(), чтобы, когда я изменю ее, я мог использовать именно эту цену для OrderClose()? Подойдет ли статическая двойка?
 
DomGilberto:

UPDATE: Код выше - это хороший способ написать его. Я немного поигрался, но он не закрывается в правильном порядке. Он по-прежнему закрывает половину того, что пришло первым. Это похоже на то, что у меня было до использования static datetime? Есть какие-нибудь мысли?

Опубликуйте любые изменения, которые вы внесли в приведенный выше код, и выложите записи журнала/журнала (или снимки экрана).

 
DomGilberto:

Огромное спасибо за помощь! Я действительно ценю ее :)

Не могли бы вы помочь мне с последней вещью; в настоящее время у меня есть FIXED 1:2 цель тейк-профита (жесткий TP). На самом деле я хочу убрать ее из ордера. Однако, как вы можете видеть выше, соответствующие функции OrderClose() используют OrderTakeProfit(), чтобы вычислить, где функции OrderClose() должны закрыться.

Мой вопрос в том, есть ли способ сохранить цену OrderTakeProfit(), но вместо того, чтобы фиксировать ее в ордере, я хочу закрыть определенное количество лотов с помощью OrderClose() @ цена OrderTakeProfit()? Причина в том, что иногда у меня есть сделка, которая приносит огромную прибыль, но поскольку я зафиксировал OrderTakeProfit() в открытом ордере, все лоты закроются по ней, а я хочу только частично закрыть некоторые лоты по этой цене выхода. Я использую трейлинг-стоп для больших бегунов... Надеюсь, это имеет смысл?

Вот и все! Я закончил! Наконец-то!

UPDATE: Код выше - это хороший способ написать его. Я немного поигрался, но он не закрывается в правильном порядке. Он по-прежнему просто закрывает половину того, что пришло первым. Это похоже на то, что у меня было до использования статического datetime? Есть какие-нибудь мысли?


Установите свой тейкпрофит на огромном уровне, и вы все еще можете использовать свои соответствующие функции OrderClose(), которые используют OrderTakeProfit() для расчета того, на каком уровне должны закрыться функции OrderClose(). только внесите изменения в расчет того,на каком уровне должны закрыться функции OrderClose()
 
deVries - буквально только что понял это сегодня утром... Начал вводить еще одну модификацию... а потом понял, что должен просто изменить ее прямо с момента размещения первого заказа...

13 - Я вообще ничего не менял. Он работает так же, как и код, который я разместил, но вы используете статический bool, а не статический datetime? Это единственное реальное различие, которое я смог увидеть, когда проводил обратный тест? Кроме этого, вторая функция OrderClose() со скользящей средней и закрытием ниже нее, она все равно закрывается, если эта функция приходит первой перед другой Orderclose()?
 
DomGilberto:

13 - Я не вносил в него никаких изменений. Он работает так же, как и код, который я разместил, но вы используете статический bool вместо статического datetime? Это единственное реальное различие, которое я смог увидеть, когда проводил обратный тест? Кроме того, вторая функция OrderClose() со скользящей средней и закрытием ниже нее, она все еще закрывается, если эта функция приходит первой перед другой Orderclose()?
Используя знак вопроса, я не уверен, спрашиваете ли вы меня или сообщаете мне выделенную часть. Если тестер показывает, что второе частичное закрытие произошло раньше первого, пожалуйста, опубликуйте свои торговые результаты из журнала/журнала, которые были созданы тестером стратегии, показывающие, что второе частичное закрытие (скользящая средняя) произошло раньше первого частичного закрытия.
 
Thirteen:
Используя знак вопроса, я не уверен, спрашиваете ли вы меня или сообщаете мне выделенную часть. Если тестер показывает, что второе частичное закрытие произошло раньше первого, пожалуйста, опубликуйте ваши торговые результаты из журнала/журнала, которые были созданы тестером стратегии, показывающие, что второе частичное закрытие (скользящая средняя) произошло раньше первого частичного закрытия.

Спасибо, что ответили мне, Тринадцатый - я выложу журнал позже сегодня :)

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