Проверка открытости свечи - страница 4

 
GumRai:

Небольшое изменение, так как он проверял закрытие ордера, когда его не было.

Согласно коду, нет причин для открытия продажи сразу после закрытия покупки.

Условия для выхода из покупки не совпадают с условиями для открытия продажи.

Помните, что поскольку вы проверяете только открытие свечи, Close[0] будет значением заявки первого тика, полученного для свечи.

Привет, GumRai,

Я хотел спросить, не могли бы вы помочь мне немного больше с моим кодом? Если бы вы могли просто сказать мне, какие коды я должен рассмотреть, я попробую сначала закодировать его самостоятельно, а затем просто вернусь с любыми вопросами.

Я хочу, чтобы после того, как сделка заключена, она ставила стоп-лосс, скажем, на 50 пунктов (что она и делает сейчас). Однако, как только цена продвинется на 60 пунктов в направлении сделки, он переводит SL в безубыток, и далее становится трейлинг-стопом на расстоянии 70 пунктов от сделки.

Как мне поступить в этом случае? Как всегда, любая помощь будет высоко оценена.

 

Для безубытка я всегда передвигаю SL на безубыток + 1 пункт, как минимум. Это позволяет избежать возможных проблем при сравнении удвоений при последующих проверках.

Это просто случай проверки 2 условий (для покупки)

OrderOpenPrice()>OrderStopLoss()

и

OrderClosePrice()-OrderOpenPrice>=BreakEvenPoints*Point

затем изменить ордер так, чтобы SL был ценой открытия +1 пункт или любой суммой, которую вы решите зафиксировать.

Для продажи условия противоположные, но вы также должны написать код для учета того, что SL изначально равен 0.

OrderOpenPrice()>OrderStopLoss() || OrderStopLoss()==0 
 
GumRai:

Для безубытка я всегда сдвигаю SL на безубыток + 1 пункт, как минимум. Это позволяет избежать возможных проблем при сравнении удвоений при последующих проверках.

Это просто случай проверки 2 условий (для покупки)

и

затем изменить ордер так, чтобы SL был ценой открытия +1 пункт или любой суммой, которую вы решите зафиксировать.

Для продажи условия противоположные, но вы также должны написать код для учета того, что SL изначально равен 0.

Большое спасибо. На самом деле, я добавлю достаточно пунктов, чтобы это только (приблизительно) покрыло стоимость брокера для торговли.

Что касается второй строки... почему я должен использовать цену закрытия ордера-цену открытия ордера? Я не совсем понял этот код. Разве я не должен использовать Bid-OrderOpenPrice, так как это позволит отследить, насколько изменилась цена?

Я хотя бы приблизился к тому, что я делаю здесь ниже?

 if(BuyTicket==-1)
        {
         if((iOpen(NULL,0,1)<PreviousSlow && PreviousPriceClose>=PreviousSlow && Bid>=(PreviousSlow+PipsBeforeEntry*Pips)) )
           {
            BuyTicket=OrderSend(Symbol(),OP_BUY,LotSize,Ask,Slippage,Ask-(StopLoss*Pips),0,"Main Entry EA",MagicNumber,0,clrLimeGreen);
           }
           if(OrderOpenPrice()>OrderStopLoss())
               if(Bid-OrderOpenPrice>=(BuyTicket+(Commission*LotSize)))
                  OrderModify(BuyTicket,NULL,Bid-(50*Point),NULL,NULL,clrNONE);
        }

Я объявил комиссию выше как экстерн. И вместо этого я использовал Bid.

Редактировать:

Итак, я полагаю (основываясь на том, что я нашел ниже), что код, который я разместил выше, неверен? Я нашел следующее в книге/справке по MQL4... Похоже, что это просто трейлинг-стоп, тогда как мне нужен сначала безубыточный стоп, а затем трейлинг-стоп. Как мне это изменить?

 int TrailingStop = 50;
               //--- modifies Stop Loss price for buy order 
            if(TrailingStop>0)
               {
               OrderSelect(BuyTicket,SELECT_BY_TICKET);
                if(Bid-OrderOpenPrice()>Point*TrailingStop)
                {
                if(OrderStopLoss()<Bid-Point*TrailingStop)
                  {
                  bool res =OrderModify(BuyTicket,OrderOpenPrice(),NormalizeDouble(Bid-Point*TrailingStop,Digits),OrderTakeProfit(),0,clrNONE);
                   if(!res)
                        Print("Error in OrderModify. Error code=",GetLastError());
                     else
                        Print("Order modified successfully.");
                    }
                 }
                 }
 
 if(BuyTicket==-1)
        {
         if((iOpen(NULL,0,1)<PreviousSlow && PreviousPriceClose>=PreviousSlow && Bid>=(PreviousSlow+PipsBeforeEntry*Pips)) )
           {
            BuyTicket=OrderSend(Symbol(),OP_BUY,LotSize,Ask,Slippage,Ask-(StopLoss*Pips),0,"Main Entry EA",MagicNumber,0,clrLimeGreen);
           }
           if(OrderOpenPrice()>OrderStopLoss())
               if(Bid-OrderOpenPrice>=(BuyTicket+(Commission*LotSize)))
                  OrderModify(BuyTicket,NULL,Bid-(50*Point),NULL,NULL,clrNONE);
        }

Весь ваш блок кода обусловлен тем, что BuyTicket==-1.

Если ордер открыт, то BuyTicket не будет = -1, поэтому никаких проверок на переход к BE не будет сделано, пока сделка открыта.

if(Bid-OrderOpenPrice>=(BuyTicket+(Commission*LotSize)))

Какое отношение имеет номер билета к цене?

Вы должны выбрать ордер перед использованием OrderOpenPrice().

OrderClosePrice() - это Bid на момент выбора ордера на покупку, ask на продажу (пока ордер еще открыт).

 
SharkWaters:

Итак, я полагаю (основываясь на том, что я нашел ниже), что код, который я разместил выше, неверен? Я нашел следующее в книге/справке по MQL4... Похоже, что это просто трейлинг-стоп, тогда как мне нужен сначала безубыточный стоп, а затем трейлинг-стоп. Как я могу изменить это?

  int BreakEvenPoints=50;
  double BE_Decimal=BreakEvenPoints*Point;
//--- modifies Stop Loss price for buy order 
  if(BreakEvenPoints>0)
  {
   OrderSelect(BuyTicket,SELECT_BY_TICKET);
   if(Bid-OrderOpenPrice()>BE_Decimal)
     {
      if(OrderStopLoss()<OrderOpenPrice())
        {
         bool res=OrderModify(BuyTicket,OrderOpenPrice(),NormalizeDouble(OrderOpenPrice()+Point,Digits),
                              OrderTakeProfit(),0,clrNONE);
         if(!res)
            Print("Error in OrderModify to BE. Error code=",GetLastError());
         else
            Print("Order modified to BE successfully.");
        }
     }
  }
Попробуйте следующее
 
GumRai:
Попробуйте это

Спасибо за баллы! Я внес необходимые изменения. Когда я компилирую, появляется предупреждение, что "возвращаемое значение 'OrderSelect' должно быть проверено". Это, как ни странно, приводит к тому, что срабатывает только одна покупка, а затем для остальных снова код ошибки 4108. Sell работает нормально (я не вносил в него никаких изменений).

Вот весь раздел кода покупки, на случай, если я делаю что-то не так - но этого не должно быть, так как я добавил только этот код в середине. Остальное было как раньше, что работало отлично. Что я делаю не так?

int start()
  {
   static datetime bar_time=0;
   if(bar_time!=Time[0])
     {
      bar_time=Time[0];
      double PreviousSlow=iMA(NULL,0,SlowMa,SlowMaShift,SlowMaMethod,SlowMaAppliedTo,1);
      double PreviousSlow2=iMA(NULL,0,SlowMa,SlowMaShift,SlowMaMethod,SlowMaAppliedTo,2);
      double PreviousPriceClose=iClose(NULL,0,1);   //You can just use Close[1]
      double PreviousPriceClose2=iClose(NULL,0,2);
      if(BuyTicket==-1)
        {
         if((iOpen(NULL,0,1)<PreviousSlow && PreviousPriceClose>=PreviousSlow && Bid>=(PreviousSlow+PipsBeforeEntry*Pips)) )
           {
            BuyTicket=OrderSend(Symbol(),OP_BUY,LotSize,Ask,Slippage,Ask-(StopLoss*Pips),0,"Main Entry EA",MagicNumber,0,clrLimeGreen);
               }
           }
   //Stop Order Modify for buy starts here
         int BreakEvenPoints=50;
         double BE_Decimal=BreakEvenPoints*Point;
         
         if(BreakEvenPoints>0)
              {
               OrderSelect(BuyTicket,SELECT_BY_TICKET);
               if(Bid-OrderOpenPrice()>BE_Decimal)
                 {
                  if(OrderStopLoss()<OrderOpenPrice())
                    {
                     bool res=OrderModify(BuyTicket,OrderOpenPrice(),NormalizeDouble(OrderOpenPrice()+Point,Digits),OrderTakeProfit(),0,clrNONE);
                     if(!res)
                        Print("Error in OrderModify to BE. Error code=",GetLastError());
                     else
                        Print("Order modified to BE successfully.");
                    }
                 }
              }
      else
      if(OrderSelect(BuyTicket,SELECT_BY_TICKET))
        {
         if(OrderCloseTime()==0)
           {
            if(Close[0]<PreviousSlow)
              {
               bool CloseTicket=OrderClose(BuyTicket,LotSize,Bid,Slippage,clrPink);
               if(CloseTicket)
                  BuyTicket=-1;
              }
           }
         else
            BuyTicket=-1; //Order has closed so reset variable
        }
        

Обновление:

Погуглил еще немного и изменил его на следующий:

int BreakEvenPoints=50;
         double BE_Decimal=BreakEvenPoints*Point;
         
         if(BreakEvenPoints>0)
              {
               if (OrderSelect(BuyTicket,SELECT_BY_TICKET))
               {
               if(Bid-OrderOpenPrice()>BE_Decimal)
                 {
                  if(OrderStopLoss()<OrderOpenPrice())
                    {
                     bool res=OrderModify(BuyTicket,OrderOpenPrice(),NormalizeDouble(OrderOpenPrice()+10*Point,Digits),OrderTakeProfit(),0,clrNONE);
                     if(!res)
                        Print("Error in OrderModify to BE. Error code=",GetLastError());
                     else
                        Print("Order modified to BE successfully.");
                    }
                  }  
                 }
              }


Это устраняет ошибку, возникающую при нажатии на кнопку компиляции. Но это все еще создает ошибку OrderModify 4108 в журнале.

 

Весь ваш код содержится в условии if

 if(bar_time!=Time[0])  

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

 

Когда BuyTicket == -1, вы пытаетесь выбрать заказ с номером билета -1, а его, конечно, не существует.

Проверьте, что BuyTicket>0, прежде чем пытаться выбрать ордер

 
GumRai:

Весь ваш код содержится в условии if

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


Спасибо, что указали на это.

Итак, для этого я создал дополнительную скобку сверху, сразу после Start, как:

int start() 
{
{

, затем закрыл одну скобку (которая завершала весь разделif(bar_time!=Time[0])), а затем поместил код в конец, за которым последовал return (0); и конечная скобка, чтобы закрыть start().

Никаких ошибок, ни в коде, ни в журнале бэктестов, но он взял только одну сделку на покупку и все - и ту тоже, которую он закрыл прямо на открытии, хотя цена не сдвинулась выше с открытия - не говоря уже о продвижении на 50 пунктов.

Думаю, это может быть связано с тем, что BuyTicket == -1, о чем вы упомянули. Но я, честно говоря, понятия не имею, как это изменить. Я ввел эту штуку с -1, основываясь на ваших рекомендациях для начального кода - который работал фантастически. Но как мнепроверить, что BuyTicket>0 перед попыткой выбрать заказ?

 
SharkWaters:

Но как мнепроверить, что BuyTicket>0, прежде чем пытаться выбрать заказ?

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

Я не могу писать для вас код понемногу.