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

 
DomGilberto:
Ах да - понял! Кажется, я знаю, как это сделать - теперь возвращаемся к игре :)
 
int start()
   {
   if(IsNewCandle())
      {
      CheckForMaTrade();
      if(UseCandleTrail)AdjustTrail();
      }

   if(OpenOrdersThisPair(Symbol())>0)
      {
      if(UseMoveToBreakEven)MoveToBreakEven();
      if(UseTrailingStop)AdjustTrail();
      if(Use_MA_Trail)MA_Trail();
      CloseHalfOrder(); // If there is an order call this void - loop inside the void - "if(OrderType()!=OP_BUY)continue;"
      }
   }
Это сработает? Будет ли он проверять каждый тик с этого момента? (CloseHalfOrder() )

UPDATE BELOW - это действительно работает :)
 

Извините - я должен перестать задавать 101 вопрос до того, как опробую вещи :P

Да - это работает. Теперь у меня работает, когда он закрывается, как только приходит тик и цена бида >= указанной цены OrderClose :D

Отличный большой шаг в правильном направлении! Теперь нужно сделать так, чтобы он не закрывался наполовину каждый раз, когда цена возвращается к той самой цене, указанной в функции OrderClose :)

(Избавился и от этой надоедливой ошибки 1 OrderModify!) Хммм, я не могу придумать правильную логику для того, чтобы после того, как первая цель (1:1) выполнит свой ордер на закрытие, он ждал... Есть идеи? Номер OrderTicket() тот же самый... так что это не может быть таким образом? Я застрял на этой части сейчас :) после того, как у меня есть этот бит, он взломан довольно много :)

Я так благодарен вам за помощь!

 
DomGilberto:


Я так благодарен вам за помощь!

Не за что, я без проблем помогаю людям, которые слушают и рады попытаться помочь себе в первую очередь.
 
unbelievable 1 2 3 4 5 6 7 8 9 10 11 12

какая это огромная тема

Закрытие половины лотов.

надеюсь, вы сможете объяснить кому-то другому, как сделать то, что знаете вы

101 вопрос... кто хочет прочитать их все...

Для (Избавился и от этой надоедливой ошибки OrderModify error 1!)

Это происходит в большинстве случаев, если вы пытаетесь изменить сделку с уже установленными настройками.

 

Это так полезно, как только вы это поймете! Очевидно, благодаря вашему вкладу!

Последний момент, на котором я застрял, это то, что нужно сказать циклу, чтобы он перестал уменьшать наполовину открытый ордер по этой цене выхода OrderClose(), непрерывно? Честно говоря, я не могу понять логику? Он точно знает, КОГДА и ПО КАКОЙ цене частично закрывать ордер. Мне просто нужно сказать ему остановиться ПОСЛЕ того, как он уменьшил ордер наполовину один раз?

Проблема в том, что как только OrderClose() закроет половину открытой позиции, он все равно будет вызываться снова и снова, потому что "int start" вызывает "CloseHalfOrder()" каждый раз, когда открыт "OP_BUY"... Есть какие-нибудь мысли?

//+------------------------------------------------------------------+
//| expert start function                                            |
//+------------------------------------------------------------------+
int start()
{
   if(OrderType()==OP_BUY)
      {
      CloseHalfOrder();
      } 
} // ---// <<<<<<<<<<<<< I haven't bothered copying and pasting all of in start() functions. Just showing you how the "CloseHalfOrder" is being called...


//+--------------------------------------------------------------------------------------------------+
//| Close OP_BUY Half lots @ 1:1 Function                                                            |
//+--------------------------------------------------------------------------------------------------+
void CloseHalfOrder()
{   
   
   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=MathFloor(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_POS,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;
          }

      double FirstTarget_Buy=OrderOpenPrice()+(( OrderTakeProfit()-OrderOpenPrice())/2);
      Print("FirstTarget_Buy: ",DoubleToStr(FirstTarget_Buy,Digits));
      
      if(OrderMagicNumber()==MagicNumber)
         if(OrderSymbol()==Symbol())
            if(OrderLots()>minLot)
            {
            Print("Current Bid: ",DoubleToStr(Bid,Digits)," FirstTarget_Buy: ",DoubleToStr(FirstTarget_Buy,Digits));
            int HalfCloseTicket = OrderTicket();
            
            if(OrderType()==OP_BUY && Bid>=FirstTarget_Buy+(Point/2)) // Doesn't seem to even go further than this as I do not get an error from OrderClose?
               {
               Print("Bid >= FirstTarget_Buy - Current Bid: ",DoubleToStr(Bid,Digits)," FirstTarget_Buy: ",DoubleToStr(FirstTarget_Buy,Digits));
               bool Close_Half_Order_Buy=OrderClose(HalfCloseTicket,half,Bid,3,CLR_NONE);
               if(Close_Half_Order_Buy!=TRUE)Print("Close_Half_Order_Buy Last Error = ",GetLastError());
               if(Close_Half_Order_Buy==True)Print("First Target Closed: ", OrderLots());
               }
            }
         if(Close_Half_Order_Buy==True)
         {
         MoveToBreakEven(); // This is a void.
         EMA_Exit(); // This is another void being called on the basis I can get this loop above to just close the OP_BUY once...
         }    
     }
}
 
deVries:
unbelievable 1 2 3 4 5 6 7 8 9 10 11 12

какая это огромная тема

Закрытие половины лотов.

надеюсь, вы сможете объяснить кому-то другому, как сделать то, что знаете вы

101 вопрос... кто хочет прочитать их все...

Для (Избавился и от этой надоедливой ошибки OrderModify error 1!)

Это происходит в большинстве случаев, если вы пытаетесь изменить сделку с уже установленными настройками.


Приятель, я буду более чем счастлив написать тему, объясняющую простой и эффективный способ частичного закрытия открытого ордера - я застрял только с одним последним битом, а потом он работает как мята! Я соберу все это в одну краткую тему / поток для других, чтобы использовать? (не уверен, как мне это сделать?)

См. последнее сообщение выше - я почти сделал это, просто не могу понять логику, чтобы сказать циклу, чтобы ОСТАНОВИТЬ закрытие половинок по одной и той же цене выхода OrderClose() непрерывно?

Спасибо за подсказку по поводу ошибки 1 OrderModify тоже :)
 
DomGilberto:

Приятель, я буду более чем счастлив написать тему, объясняющую простой и эффективный способ частичного закрытия открытого ордера - я застрял только с одним последним битом, а потом он работает! Я соберу все это в одну краткую тему / поток для других, чтобы использовать? (не уверен, как мне это сделать?)

См. последнее сообщение выше - я почти сделал это, просто не могу понять логику, чтобы сказать циклу, чтобы он СТОП закрывал половинки по одной и той же цене выхода OrderClose() постоянно?

Спасибо за подсказку по поводу ошибки 1 OrderModify тоже :)

Почему бы сначала не перевести ваш тикет в безубыток, о чем вам уже говорили, а затем закрыть часть сделки .... if OrderLots() >= ........
 
deVries:

Почему бы сначала не перевести свой тикет в безубыток, о чем вам уже говорили, а затем закрыть часть сделки .... if OrderLots() >= ........

Из-за этого? Не имеет значения, если я сначала перейду в безубыток... Первым препятствием является эта часть, которую я не могу понять? Даже если я сначала перейду в безубыток, а потом закрою половину, это вызовет ЛЮБЫЕ открытые позиции снова и OrderClose() по той же цене снова вызовет "CloseHalfOrder();"?

int start()
   {
    
   if(OrderType()==OP_BUY)
      {
      CloseHalfOrder();
      } 
      
   }
 
DomGilberto:

Из-за этого? Неважно, если я сначала перейду на безубыточность... Первым препятствием является эта часть, которую я не могу понять? Даже если я сначала перейду в безубыток, а затем закрою половину, это вызовет ЛЮБЫЕ открытые позиции снова и OrderClose() по той же цене снова вызовет "CloseHalfOrder();"?


Вы переходите к BE и закрываете половину только в том случае, если SL еще не находится на BE.