Необходим простой код для советника (модифицировать два открытых ордера) - страница 2

 
kwng111:


Извините, kwng, ваше сообщение не похоже на решение для madmax3.

Вам не нужно модифицировать сделки в функции( ) под названием void CloseAll()
Также вы должны выбрать там OrderSymbol ( ) и OrderMagicNumber ( )

и в этой части программы

        }
        for (int i =1; i < OrdersTotal(); i++) {
    if(OrderSelect(i+1, SELECT_BY_POS, MODE_TRADES)) {
        OrderModify(OrderTicket(),OrderOpenPrice(),OrderStopLoss(),Ask+((TakeProfit+20)*Point),0,Blue);
    }
}

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

 

Вот измененный код всего советника:

//+------------------------------------------------------------------+
//|                                                  TimeBasedEA.mq4 |
//|                      Copyright © 2008, MetaQuotes Software Corp. |
//|                                       http://www.metaquotes.net/ |
//+------------------------------------------------------------------+
//changed by:       "forex4capital@yahoo.ca"
//changed again by: madmax3

// Time frame: M5 and higher

extern int     MagicNumber = 20080122;
extern double DistancefromAsk;
extern double DistancefromBid;
extern double  TakeProfit  = 28;
extern double  StopLoss    = 55;
extern double  Lots        = 0.1;
extern int     StartHour   = 2300;      // Open Trade time
extern bool    OpenBuy     = true;
extern bool    OpenSell    = true;
extern int     NumBuys     = 1;
extern int     NumSells    = 1;
extern int     Slippage    = 2;

//+------------------------------------------------------------------+
//|                        S T A R T                                 |
//+------------------------------------------------------------------+
int start()
  {
   int cnt, ticket, total;
      if (TimeDayOfWeek(TimeCurrent())==5 && TimeCurrent()>=StrToTime("22:59")) { CloseAll(); return(0); }
   int ct;
//-------------------------------------+
   if(Bars<100)
     {
      Print("bars less than 100");
      return(0);  
     }
//-------------------------------------+

//-------------------------------------+
   if(TakeProfit<10)
     {
      Print("TakeProfit less than 10");
      return(0);  // check TakeProfit
     }
//-------------------------------------+

   ct = Hour() * 100 + Minute();
   total=OrdersTotal();
   if(total<1) 
     {
      // no opened orders identified
      if(AccountFreeMargin()<(1000*Lots))
        {
         Print("We have no money. Free Margin = ", AccountFreeMargin());
         return(0);  
        }
      // check for long position (BUY) possibility
      if(ct == StartHour && Close[1]>Open[1] && OpenBuy)
      //if(ct == StartHour && High[1]<Open[0] && OpenBuy)
        {
         for ( cnt = 0; cnt < NumBuys; cnt++)
         {
           ticket=OrderSend(Symbol(),OP_BUYSTOP,Lots,Ask+(DistancefromAsk*Point),Slippage,Bid-(StopLoss*Point),Ask+(TakeProfit*Point),"",MagicNumber,TimeCurrent()+39600,CLR_NONE);
           ticket=OrderSend(Symbol(),OP_SELLSTOP,Lots,Bid-(DistancefromBid*Point),Slippage,Ask+(StopLoss*Point),Bid-(TakeProfit*Point),"",MagicNumber,TimeCurrent()+39600,CLR_NONE); 
           if(ticket>0)
           {
            if(OrderSelect(ticket,SELECT_BY_TICKET,MODE_TRADES)) Print("BUY order opened : ",OrderOpenPrice());
           }

          
           else Print("Error opening BUY order : ",GetLastError()); 
           

         }
         return; 
        }
      // check for short position (SELL) possibility
      if(ct == StartHour && Close[1]<Open[1] && OpenSell)
      //if(ct == StartHour && Low[1]>Open[0] && OpenSell)
        {
         for ( cnt = 0; cnt < NumSells; cnt++)
         {
           ticket=OrderSend(Symbol(),OP_SELLSTOP,Lots,Bid-(DistancefromAsk*Point),Slippage,Ask+(StopLoss*Point),Bid-(TakeProfit*Point),"",MagicNumber,TimeCurrent()+39600,CLR_NONE);
           ticket=OrderSend(Symbol(),OP_BUYSTOP,Lots,Ask+(DistancefromBid*Point),Slippage,Bid-(StopLoss*Point),Ask+(TakeProfit*Point),"",MagicNumber,TimeCurrent()+39600,CLR_NONE);
           if(ticket>0)
           {
            if(OrderSelect(ticket,SELECT_BY_TICKET,MODE_TRADES)) Print("SELL order opened : ",OrderOpenPrice());
           }
           else Print("Error opening SELL order : ",GetLastError());
         } 
         return; 
        
    
}

     }
 
     for(int iPos = OrdersTotal()-1; iPos >= 0 ; iPos--) if (
        OrderSelect(iPos, SELECT_BY_POS)                    // Only my orders w/
    &&  OrderMagicNumber()  == MagicNumber                 // my magic number
    &&  OrderSymbol()       == "EURUSD"                // and my pair.
    ){OrderModify(OrderTicket(),OrderOpenPrice(),OrderStopLoss(),Ask+((TakeProfit+20)*Point),0,Blue);
      if (!OrderSelect(iPos, SELECT_BY_POS))
   Alert("OrderSelect failed: ", GetLastError());}


   return(0);
  }
  
  
  
  void CloseAll()
{
   for(int cnt=OrdersTotal()-1;cnt>=0;cnt--)
   {
      OrderSelect(cnt, SELECT_BY_POS, MODE_TRADES);
      if (OrderMagicNumber()!=MagicNumber) continue;
         
      //
      //
      //
      //
      //
         
      if (OrderType()==OP_BUY || OrderType()==OP_SELL)
      {
         for(int c=0; c<3; c++)
         {
            RefreshRates();
            if (OrderType()==OP_BUY)
                  { double cp = Bid;}  
            else  {        cp = Ask;}
               
            OrderClose(OrderTicket(),OrderLots(),cp,0,Yellow);
               int err=GetLastError();
               if(err==4 || err==136 || err==137 || err==138 || err==146)
               {
                  Sleep(5000); continue;
               }  
               break;                     
         }
         break;
      }
   }





}

// the end.

Функция CloseAll() предназначена для закрытия сделок в определенное время, если они продолжаются так долго.

Эта часть кода является пересмотренной частью того, что я пытаюсь понять:
(как вы можете видеть, MagicNumber и Symbol присутствуют, однако только отложенные ордера все еще модифицируются)

     for(int iPos = OrdersTotal()-1; iPos >= 0 ; iPos--) if (
        OrderSelect(iPos, SELECT_BY_POS)                    // Only my orders w/
    &&  OrderMagicNumber()  == MagicNumber                 // my magic number
    &&  OrderSymbol()       == "EURUSD"                // and my pair.
    ){OrderModify(OrderTicket(),OrderOpenPrice(),OrderStopLoss(),Ask+((TakeProfit+20)*Point),0,Blue);
      if (!OrderSelect(iPos, SELECT_BY_POS))
   Alert("OrderSelect failed: ", GetLastError());}
 
deVries:
        }
        for (int i =1; i < OrdersTotal(); i++) {
    if(OrderSelect(i+1, SELECT_BY_POS, MODE_TRADES)) {
        OrderModify(OrderTicket(),OrderOpenPrice(),OrderStopLoss(),Ask+((TakeProfit+20)*Point),0,Blue);
    }
}

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

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

Если вы не собираетесь потрудиться прочитать сообщения и исправить свой код, мы не собираемся потрудиться попытаться помочь вам.

 
WHRoeder:

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

Если вы не потрудитесь прочитать сообщения и исправить свой код, мы не потрудимся помочь вам.


Я сделал оба вышеупомянутых пункта, вы обращаетесь не к тому человеку, как мне кажется. Я оригинальный автор, а не deVries, и я изменил код на такой (как было опубликовано ранее):

   for(int iPos = OrdersTotal()-1; iPos >= 0 ; iPos--) if (
        OrderSelect(iPos, SELECT_BY_POS)                    // Only my orders w/
    &&  OrderMagicNumber()  == MagicNumber                 // my magic number
    &&  OrderSymbol()       == "EURUSD"                // and my pair.
    ){OrderModify(OrderTicket(),OrderOpenPrice(),OrderStopLoss(),Ask+((TakeProfit+20)*Point),0,Blue);
      if (!OrderSelect(iPos, SELECT_BY_POS))
   Alert("OrderSelect failed: ", GetLastError());}

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

 
madmax3:


Я сделал оба вышеупомянутых пункта, но вы обращаетесь не к тому человеку, как мне кажется. Я оригинальный плакат, а не deVries, и я изменил код на этот (как было опубликовано ранее):

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

Итак, вам нужно просмотреть все открытые ордера, проверить символ и MagicNumber, как указано выше... но вам также нужно проверить OrderType() <=OP_SELL... подсчитать ордера, которые совпадают, если их 2... то снова просмотреть цикл и OrderModify().

Единственный способ научиться - прочитать документацию по каждой функции и понять, как они работают. ... например, OrderType().

 

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

     for(int iPos = OrdersTotal()-1; iPos >= 1 ; iPos--) if (
        OrderSelect(iPos, SELECT_BY_POS)                    // Only my orders w/
    &&  OrderMagicNumber()  == MagicNumber                 // my magic number
    &&  OrderSymbol()       == "EURUSD"                // and my pair.
    && (OrderType() <= OP_SELL)
    
    ){OrderModify(OrderTicket(),OrderOpenPrice(),OrderStopLoss(),Ask+((TakeProfit+20)*Point),0,Blue);
    
   if (OrderSelect(iPos, SELECT_BY_POS))
    if (OrderType() <= OP_BUY)
      if (!OrderSelect(iPos, SELECT_BY_POS))
      {OrderModify(OrderTicket(),OrderOpenPrice(),OrderStopLoss(),Ask+((TakeProfit-20)*Point),0,Blue);}
      if (!OrderSelect(iPos, SELECT_BY_POS))
   Alert("OrderSelect failed: ", GetLastError());}


   return(0);
  }
     for(int iPos = OrdersTotal()-1; iPos >= 1 ; iPos--) if (
        OrderSelect(iPos, SELECT_BY_POS)                    // Only my orders w/
    &&  OrderMagicNumber()  == MagicNumber                 // my magic number
    &&  OrderSymbol()       == "EURUSD"                // and my pair.
    && (OrderType() <= OP_SELL)
    && (OrderType() <=OP_BUY)
    ){OrderModify(OrderTicket(),OrderOpenPrice(),OrderStopLoss(),Ask+((TakeProfit+20)*Point),0,Blue);}
    
   if  (OrderSelect(iPos-1, SELECT_BY_POS))
    {OrderModify(OrderTicket(),OrderOpenPrice(),OrderStopLoss(),Ask+((TakeProfit-20)*Point),0,Blue);



   return(0);
  }}

Есть предложения, что мне делать? Я прочитал всю документацию.

 
В чем разница до изменения заказа и после его изменения? Что меняется?
 

Сначала устанавливаются два ордера, затем один из них (продажа в данном случае, когда я тестировал конкретную дату) исполняется. Позже в течение дня исполняется второй ордер (который все еще там), и эта сделка - покупка.
Продажа - это ордер 1, а покупка - ордер 2. У покупки (ордер 2) TakeProfit изменяется на 16,3 пункта (я не уверен, почему он не добавляет 20 пунктов), затем TakeProfit увеличивается на 0,2 пункта в ту же минуту, и это продолжается, TakeProfit постоянно изменяется в течение дня, иногда увеличивается, иногда уменьшается, не уверен, почему это происходит.

Edit: Я думаю, что 16,3 пункта и дальнейшие изменения также зависят от спреда?

 
Хорошо, мы можем вернуться к началу.... Я знаю, что вы пытаетесь изменить два ордера ... но что именно вы пытаетесь сделать ? хвост SL ? что-то еще ? чего вы пытаетесь достичь ?
 
madmax3 2012.03.09 15:06
WHRoeder:

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

Если вы не потрудитесь прочитать посты и исправить свой код, мы не потрудимся попытаться вам помочь.


Я сделал оба вышеупомянутых пункта, вы обращаетесь не к тому человеку, как мне кажется.

Я имел в виду ваш непосредственно предыдущий пост.

madmax3 2012.03.09 14:52
Вот пересмотренный код для всего советника:
   total=OrdersTotal();
   if(total<1) 
Который все еще показывает проблемы, о которых я говорил.
Причина обращения: