Советник с трейлингстопом не работает - страница 3

 
FMIC: Небольшой совет: не используйте "Ask" или "Bid" - вместо них используйте "OrderClosePrice()". Это значение реального времени, независимо от того, является ли ордер ордером на покупку или продажу.
Не в реальном времени.
  1. С Ask и Bid вы должны обновлять RefreshRates() после задержек, т.е. между несколькими вызовами сервера, после Sleep или длительного вычисления.
  2. Что касается OrderClosePrice, то он обновляется только при выборе ордера. Таким образом, после Sleep или длительного вычисления (или сохранения выбранного ордера между вызовами OnTick ) вы должны повторить выбор.
    OrderSelect(OrderTicket(), SELECT_BY_TICKET); // Refresh OrderClosePrice
 
WHRoeder:
Не реальное время.
  1. В Ask и Bid вы должны обновлять RefreshRates() после задержек, т.е. между несколькими вызовами сервера, после Sleep или длительного вычисления.
  2. Что касается OrderClosePrice, то он обновляется только при OrderSelect. Таким образом, после Sleep или длительного вычисления (или удержания выбранного ордера между вызовами OnTick ) вы должны повторно выбрать его.

Спасибо за информацию. Я не знал, что "OrderClosePrice()" буферизируется. Поэтому я полагаю, что ни "OrderClosePrice()", ни "Ask"/"Bid" не являются идеальным решением в реальном времени.

Однако, согласны ли вы, что "OrderClosePrice()" является лучшим общим решением, чем использование "Ask"/"Bid" после выполнения "OrderSelect()"?

А что касается решения для реального времени, если оно действительно необходимо, то я полагаю, что мы можем вернуться к альтернативным вариантам:

  • Повторный выбор ордера с помощью "OrderSelect()" (EDIT: забыл перечислить это в первоначальном сообщении, хотя вы указали на это)
  • "RefreshRate()" с "Ask"/"Bid"
  • "MarketInfo()" с "MODE_ASK"/"MODE_BID" (старый стиль MQL4)
  • "SymbolInfoDouble()" с "SYMBOL_ASK"/"SYMBOL_BID" (новый стиль MQL4+ и MQL5).
  • "SymbolInfoTick()" (который я уже использую в большинстве своих советников).
 
FMIC: Однако, согласны ли вы, что "OrderClosePrice()" является лучшим общим решением, чем использование "Ask"/"Bid" после выполнения "OrderSelect()"?
абсолютно.
 

Почему вы снова пытаетесь изобрести колесо?

Посмотрите здесь - вы найдете все, что вам нужно.

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

 

Спасибо всем за помощь. Я думаю, что теперь я решил проблему с ошибкой 130, но есть что-то серьезное в моей функции OrderSelect, что, скорее всего, является причиной того, что она только иногда изменяет некоторые ордера. Ниже приведен список того, что я распечатал. OrderTicket # совершенно неправильный. Этот номер тикета принадлежит сделке, открытой для EURAUD. Хотя я не включил все результаты, есть несколько пар, где номера OrderTicket не соответствуют паре в торговом терминале.

Не мог бы кто-нибудь взглянуть и сообщить мне, что не так с OrderSelect? Спасибо

2016.04.18 16:04:38.602 Trailing_v19 EURUSD,M15: ticket = 0 Я думаю, что ticket должен выводить то же значение, что и OrdersTotal, так что, похоже, мой счетчик не работает.

2016.04.18 16:04:38.602 Trailing_v19 EURUSD,M15: OrderSelect = true

2016.04.18 16:04:38.602 Trailing_v19 EURUSD,M15: OrdersTotal = 11

2016.04.18 16:04:38.202 Trailing_v19 EURUSD,M15: Selectbypos = 0

2016.04.18 16:04:38.202 Trailing_v19 EURUSD,M15: Selectbyticket = 1

2016.04.18 16:04:38.202 Trailing_v19 EURUSD,M15: OrderTicket = 50213357

extern int TrailingStart=12;
extern int TrailingStop=5;
double stoplevel=(MarketInfo(Symbol(),MODE_STOPLEVEL))/10;
int TS=TrailingStart-TrailingStop;
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
int init(){
   return(0);
  }
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
int deinit(){
   return(0);
  }
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
int start(){
   double Pip=Point*10;
   int ticket=0;
   if(TS<stoplevel) TrailingStart=(int)stoplevel+TrailingStop+2;
   
   Print("OrdersTotal = ",OrdersTotal());
   Print("OrderSelect = ",OrderSelect(OrderTicket(),SELECT_BY_TICKET));
   Print("ticket = ",ticket);                     
   Print("OrderTicket = ",OrderTicket());                     
   Print("Selectbyticket = ",SELECT_BY_TICKET);                     
   Print("Selectbypos = ",SELECT_BY_POS);                     
                        
   {for(int i=OrdersTotal()-1; i>=0; i--){ //I added more curly brackets{}
      if(OrderSelect(i,SELECT_BY_POS)){
      ticket++;{
         if(OrderSymbol()==_Symbol){
            if(OrderType()==OP_BUY){
               if(OrderSelect(OrderTicket(),SELECT_BY_TICKET)){
                  if((Bid-OrderOpenPrice())>(TrailingStart*Pip)){ //For now, I have changed back to Bid and Ask and will include OrderClosePrice() later on.
                     if(TrailingStop*Pip<Bid-(TrailingStop*Pip)){ //I have added TrailingStop*Pip before the '<'
                        if(OrderModify(OrderTicket(),OrderOpenPrice(),Bid-(TrailingStop*Pip),OrderTakeProfit(),Blue)) //I removed the !
                        return(0); //I replaced the Getlasterrror with a return value
                        RefreshRates();
                        }     
                    }  
                }     
            }  
            if(OrderType()==OP_SELL){
               if(OrderSelect(OrderTicket(),SELECT_BY_TICKET)){
                  if((OrderOpenPrice()-Ask)>(TrailingStart*Pip)){
                     if(TrailingStop*Pip>Ask+(TrailingStop*Pip)){
                        if(OrderModify(OrderTicket(),OrderOpenPrice(),Ask+(TrailingStop*Pip),OrderTakeProfit(),Red))
                        return(0);
                        RefreshRates();
                       }
                    }
                }  
            }
         }
      } 
   }
}  
  return(0);
}
//+------------------------------------------------------------------+



 

Привет всем. Спасибо за помощь. Я нашел ошибку и проблемы были решены. Поскольку я не использую стоплосс, значение OrderStopLoss() всегда равно 0. Это не проблема при модификации ордера на покупку, потому что 0 всегда меньше, чем Bid-TrailingStop*Pip. Но при модификации ордера на продажу 0 никогда не может быть больше, чем Ask+Trailingstop*Pip. Поэтому мне пришлось добавить or(|| OrderStopLoss()) в эту строку:

if(OrderType()==OP_SELL){
               if(OrderSelect(OrderTicket(),SELECT_BY_TICKET)){
                  if((OrderOpenPrice()-Ask)>(TrailingStart*Pip)){
                     if(OrderStopLoss()>Ask+(TrailingStop*Pip) || OrderStopLoss()==0){ //Added OrderStopLoss()==0
                        if(OrderModify(OrderTicket(),OrderOpenPrice(),Ask+(TrailingStop*Pip),OrderTakeProfit(),Red))
 
Trader3000 Этот номер тикета относится к сделке, открытой по EURAUD.
Отсутствует фильтрация в цикле OrderSelect. Symbol Doesn't equal Ordersymbol when another currency is added to another seperate chart .- Форум MQL4
 
WHRoeder:
Trader3000: Этот номер тикета относится к сделке, открытой мной по EURAUD.
Отсутствует фильтрация в цикле OrderSelect. Symbol Doesn't equal Ordersymbol when another currency is added to another seperate chart . - Форум MQL4

Спасибо большое за помощь. Да, определенно есть проблема с OrderSelect, потому что он работает только на некоторых графиках. Другая проблема в том, что я не могу включить MagicNumber, потому что сделки размещаются вручную. Я использовал часть кода, который я считаю релевантным, но я не могу заставить его компилироваться. Он показывает эту ошибку:

'MySelect' - функция может быть объявлена только в глобальной области видимости Trailing_v26.mq4 31 13

и строка 31 - вот эта:

bool    MySelect(int iWhat, int eSelect, int ePool=MODE_TRADES){

Вот весь советник:

#property strict;
extern int TrailingStart=10;
extern int TrailingStop=5;
double stoplevel=(MarketInfo(Symbol(),MODE_STOPLEVEL))/10;
int TS=TrailingStart-TrailingStop;
bool    MySelect(int iWhat, int eSelect, int ePool=MODE_TRADES);
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
int init(){
   if(TS<stoplevel){
      MessageBox("Please note: Your inputs for TrailingStart and/or TrailingStop cannot"+
                 "\nbe less than the minimum levels required by your broker and the"+
                 "\nTrailingStart has been increased automatically to "+StringConcatenate(stoplevel+TrailingStop)+" pips");
     } 
   return(0);
  }
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
int deinit(){
   return(0);
  }
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
int start(){
   double Pip=Point*10;
   if(TS<stoplevel) TrailingStart=(int)stoplevel+TrailingStop;
           
    bool    MySelect(int iWhat, int eSelect, int ePool=MODE_TRADES){
    if (!OrderSelect(iWhat, eSelect, ePool))     return (false);
    if (OrderSymbol()      != _Symbol)           return (false);
    if (ePool != MODE_HISTORY)                   return (true);
    return(OrderType() <= OP_SELL);
}
    for(int i = OrdersTotal()-1; i >= 0; i--)
    if (MySelect(i, SELECT_BY_POS)){

    for(int iPos=OrdersHistoryTotal()-1; iPos >= 0; iPos--)
    if (MySelect(iPos, SELECT_BY_POS, MODE_HISTORY)){
        int nextTkt = OrderTicket();
     
              if(OrderSelect(OrderTicket(),SELECT_BY_TICKET)){
                  if((Bid-OrderOpenPrice())>(TrailingStart*Pip)){
                     if(OrderStopLoss()<Bid-(TrailingStop*Pip)){
                        if(OrderModify(OrderTicket(),OrderOpenPrice(),Bid-(TrailingStop*Pip),OrderTakeProfit(),Blue))
                        Print("Buy = ",GetLastError());
                        return(0);
                        RefreshRates();
                        }     
                     }  
                  }     
               }
               if(OrderSelect(OrderTicket(),SELECT_BY_TICKET)){
                  if((OrderOpenPrice()-Ask)>(TrailingStart*Pip)){
                     if(OrderStopLoss()>Ask+(TrailingStop*Pip) || OrderStopLoss()==0){
                        if(OrderModify(OrderTicket(),OrderOpenPrice(),Ask+(TrailingStop*Pip),OrderTakeProfit(),Red))
                        Print("Sell = ",GetLastError());
                        return(0);
                        RefreshRates();
                        }
                     }
                  }  
               }
            
         
         
  return(0);
}
//+------------------------------------------------------------------+



 
Trader3000:

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

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

Почему? Вы хотите, чтобы ваш код не работал? Используйте пример и проверьте его сами!

 
Он думает, что может просто вырезать и вставить и ему не нужно учиться кодировать. Он даже не может исправить эту простую ошибку без просьбы:
'MySelect' - функция может быть объявлена только в глобальной области видимости Trailing_v26.mq4 31 13