Проблема с общим количеством открытых ордеров - страница 2

 

Да, вы должны повторно выбрать ордер.

   int buy_ticket=0;
   total=0;
   for(i = OrdersTotal()-1; i >= 0 ; i--)
   if ( OrderSelect(i, SELECT_BY_POS)                
    &&  OrderMagicNumber()  == magicNumber            
    &&  OrderSymbol()       == Symbol())
    {             
      total++;
      if(OrderType()==OP_BUY)
         buy_ticket=OrderTicket();
    }
    
   if(buy_ticket>0 && OrderSelect(buy_ticket,SELECT_BY_TICKET))
     {
     //Do stuff
     }

В приведенном выше коде вы создаете новую переменную для хранения номера билета, затем вы можете выбрать сделку по номеру билета

 
GumRai:

Да, вы должны повторно выбрать ордер.

В приведенном выше коде вы создаете новую переменную для хранения номера билета, затем вы можете выбрать сделку по номеру билета

Awesome!!!!!! Спасибо большое за это. После многих недель все работает. Я многому научился. Спасибо всем!!!
 
Trader3000:
Awesome!!!!!! Спасибо большое за это. После многих недель все работает. Я многому научился. Спасибо всем!!!

Извините, но я заговорил слишком рано. Трейлингстоп срабатывает только иногда, поэтому я думаю, что код все еще где-то сломан. Вот весь советник. Кто-нибудь, пожалуйста, проверьте и дайте мне знать, если вы заметите ошибку. Спасибо.

#define  magicNumber  12345

// Kicks in when position reaches at least TrailingStop pips of profit.

extern string Label_Trailingstart = "Pip threshold to activate Trailing stop";
extern double TrailingStart = 10;
extern string Label_Trailingstop = "Pips trailing behind";
extern double TrailingStop = 5;

//Set it to some value above 0 to activate Hedge
extern double Hedge = 10;
extern double Multiplier = 3;

extern string Label_StopLoss = "Set StopLoss of original trade";
extern double StopLoss = 11;

extern string Label_Stoploss1 = "Set Stoploss of Hedge trade";
extern string Label_Stoploss2 = "Value should be less than 'Hedge'";
extern string Label_Stoploss3 = "otherwise a second Hedge trade will open";
extern double Stoploss = 9;

extern string Label_Percentage = "Lotsize percentage of Equity";
extern double Percentage = 1;
extern double Lotsize = 0.01;

int i, result, total;
double stoplevel;

int init()
{
   stoplevel=(MarketInfo(Symbol(),MODE_STOPLEVEL))/10;  // get broker's stoplevel
   if(StopLoss<=stoplevel) StopLoss=stoplevel;     // we compare our StopLoss with
   if(Stoploss<=stoplevel) Stoploss=stoplevel;     // stoplevel and adjust it when error occured
   if(TrailingStop<=stoplevel) TrailingStart=stoplevel+TrailingStop;  // we compared our TakeProfit
                                                       // as we compared our StopLoss
   if ((StopLoss || Stoploss || TrailingStop) < stoplevel)
   {
   MessageBox("Please note: If your inputs for StopLoss, Stoploss"+
              "\nand/or TrailingStop are below the minimum levels"+
              "\nrequired by your broker, they will automatically"+ 
              "\nbe increased to "+StringConcatenate(stoplevel)); 
   }                                                             
   return(0);
}
 
int deinit()
{
   return(0);
}
 
int start()
{ 
   //double Lots = NormalizeDouble(AccountEquity()*Percentage*Lotsize/100, 2);
   
  int buy_ticket=0;
  int sell_ticket=0;
   total=0;
   for(i = OrdersTotal()-1; i >= 0 ; i--)
   if ( OrderSelect(i, SELECT_BY_POS)                
    &&  OrderMagicNumber()  == magicNumber            
    &&  OrderSymbol()       == Symbol())
    {             
      total++;
      if(OrderType()==OP_BUY)
         buy_ticket=OrderTicket();
      if(OrderType()==OP_SELL)
         sell_ticket=OrderTicket();   
    }
          if(total==0 && Close[1]>Close[2])
           {
              result=OrderSend(Symbol(), OP_BUY, 0.01, Ask, 3, Ask - StopLoss*Point*10, 0, "Original", magicNumber, 0, Blue);
              Print("Error setting Original order: ",GetLastError());     
           }
           
     if (buy_ticket>0 && OrderSelect(buy_ticket,SELECT_BY_TICKET) && OrderType() == OP_BUY) 
       {
        if (Bid - OrderOpenPrice() > NormalizeDouble(TrailingStart *Point*10,Digits))
         {
           if (OrderStopLoss() < Bid - NormalizeDouble(TrailingStop *Point*10,Digits))
           {
              if (OrderModify(OrderTicket(), OrderOpenPrice(), Bid - NormalizeDouble(TrailingStop *Point*10,Digits),
              OrderTakeProfit(), Blue)) 
              Print("Error setting Buy trailing stop: ",GetLastError()); 
           }
         }
            else if (OrderOpenPrice() > Bid + NormalizeDouble(Hedge*Point*10,Digits))
            if(total == 1)
            {
            result=OrderSend(Symbol(), OP_SELL, NormalizeDouble(OrderLots() * Multiplier, 2), Bid, 3,
            Bid + Stoploss*Point*10, 0, "Hedge", magicNumber, 0, Blue);
            Print("Error setting Sell Hedge: ", GetLastError());
            }
       }
     else if (sell_ticket>0 && OrderSelect(buy_ticket,SELECT_BY_TICKET) && OrderType() == OP_SELL)
       {
        if (OrderOpenPrice() - Ask > NormalizeDouble(TrailingStart *Point*10,Digits)) 
         {
          if (OrderStopLoss() > Ask + NormalizeDouble(TrailingStop *Point*10,Digits))
           {
              if (OrderModify(OrderTicket(), OrderOpenPrice(), Ask + NormalizeDouble(TrailingStop *Point*10,Digits),
              OrderTakeProfit(), Red))
              Print("Error setting Sell trailing stop: ",GetLastError()); 
           }
              }
                 else if (OrderOpenPrice() < Ask - NormalizeDouble(Hedge*Point*10,Digits))
            if(total == 1)
            { 
            result=OrderSend(Symbol(), OP_BUY, NormalizeDouble(OrderLots() * Multiplier, 2), Ask, 3,
            Ask - Stoploss*Point*10, 0, "Hedge", magicNumber, 0, Red);
            Print("Error setting Buy Hedge: ", GetLastError());
            }  
            }
    return(0);
}
 
  if (buy_ticket>0 && OrderSelect(buy_ticket,SELECT_BY_TICKET) && OrderType() == OP_BUY) 
       {
        //Code
       }
     else if (sell_ticket>0 && OrderSelect(buy_ticket,SELECT_BY_TICKET) && OrderType() == OP_SELL)
       {
        //If there is an open buy order code here will not be executed
        //The else is not necessary
       }

,

 
GumRai:

,

Большое спасибо, что указали на это. Я исправил ошибку, и теперь все работает. У меня еще один вопрос. Я пытаюсь сделать так, чтобы сообщение появлялось, когда мой стоплосс меньше, чем STOP_LEVEL брокера, но оно появляется даже тогда, когда он больше. Я пытался поместить его в раздел 'start', а не в раздел 'init', но и там оно не работает. Кто-нибудь, пожалуйста, посмотрите и дайте мне знать, что не так. Спасибо.

int init()
{
   stoplevel=(MarketInfo(Symbol(),MODE_STOPLEVEL))/10;  // get broker's stoplevel
   if(StopLoss<=stoplevel) StopLoss=stoplevel;     // we compare our StopLoss with
   if(Stoploss<=stoplevel) Stoploss=stoplevel;     // stoplevel and adjust it when error occured
   if(TrailingStop<=stoplevel) TrailingStart=stoplevel+TrailingStop;  // we compared our TakeProfit
                                                       // as we compared our StopLoss
   if ((StopLoss || Stoploss || TrailingStop) < stoplevel)
   {
   MessageBox("Please note: If your inputs for StopLoss, Stoploss"+
              "\nand/or TrailingStop are below the minimum levels"+
              "\nrequired by your broker, they will automatically"+ 
              "\nbe increased to "+StringConcatenate(stoplevel)); 
   }                                                             
   return(0);
}
 
   if ((StopLoss || Stoploss || TrailingStop) < stoplevel)

не имеет смысла

Вы имеете в виду?

   if ((StopLoss  < stoplevel || TrailingStop) < stoplevel)
 
GumRai:

не имеет смысла

Вы имеете в виду?

Еще раз спасибо. Проблема решена :)
 

Привет всем, я снова столкнулся с проблемой. Это очень странно, и я не могу понять, почему это происходит. Как я упоминал выше, советник работал нормально, но теперь я просто хочу перейти от этого

result=OrderSend(Symbol(), OP_BUY, 0.01, Ask, 3, Ask - StopLoss*Point*10, 0, "Original", magicNumber, 0, Blue);

на

result=OrderSend(Symbol(), OP_BUY, 0.01, Ask, 3, 0, 0, "Original", magicNumber, 0, Blue);

Я не трогаю ничего другого, но после этого простого изменения ни трейлинг-стоп, ни хедж не срабатывают. Это странно. Полный код приведен выше

 
Как можно отследить остановку, если у вас ее нет.
 

Спасибо за ваш ответ, но я не понимаю. Код для трейлинг-стопа находится здесь

{
        if (Bid - OrderOpenPrice() > NormalizeDouble(TrailingStart *Point*10,Digits))
         {
           if (OrderStopLoss() < Bid - NormalizeDouble(TrailingStop *Point*10,Digits))
           {
              if (OrderModify(OrderTicket(), OrderOpenPrice(), Bid - NormalizeDouble(TrailingStop *Point*10,Digits),
              OrderTakeProfit(), Blue)) 

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

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