Любые вопросы новичков по MQL4 и MQL5, помощь и обсуждение по алгоритмам и кодам - страница 528

 
Alexey Viktorov:

Только так

Спасибо, то что нужно!

 

Добрый день!

Подскажите пожалуйста по такому вопросу:

Выставляется отложенный ордер:

bool send1=OrderSend(Symbol(),OP_BUYSTOP,Lots,Price,3,SL,TP,NULL,MagicNumber,0,clrGreen);

А далее на него после открытия пытаюсь сделать трэйлинг:

 {
 for(int i=0; i<OrdersTotal(); i++) 
  {
  if(OrderSelect(i,SELECT_BY_POS))
  if(OrderSymbol()==Symbol()||OrderMagicNumber()==MagicNumber)
  if(OrderType()==OP_BUY)
   {
  if(TrailingStop>0)  
    {                 
  if(Bid-OrderOpenPrice()>TrailingStop)
     {
  if(OrderStopLoss()<Bid-TrailingStop)
      {
     OrderModify(OrderTicket(),OrderOpenPrice(),Bid-TrailingStop,OrderTakeProfit(),0,clrRed);
      }
     }
    }
   }
  }
 }

Ордер ведь после открытия становится OP_BUY? В чем подвох, почему трэйлинг в таком варианте не срабатывает?

 
YanSay:

Добрый день!

Подскажите пожалуйста по такому вопросу:

Выставляется отложенный ордер:

А далее на него после открытия пытаюсь сделать трэйлинг:

Ордер ведь после открытия становится OP_BUY? В чем подвох, почему трэйлинг в таком варианте не срабатывает?

100500 причин. 1-я очевидная что Bid-TrailngStop ненормализовано. Оно может быть ещё ближе стоплевел и тогда тоже опаньки.
 
YanSay:

Добрый день!

Подскажите пожалуйста по такому вопросу:

Выставляется отложенный ордер:

А далее на него после открытия пытаюсь сделать трэйлинг:

Ордер ведь после открытия становится OP_BUY? В чем подвох, почему трэйлинг в таком варианте не срабатывает?

TrailingStop в пунктах?  Умножать на Point надо тогда. 
 

Неправильно я вопрос задал, извините. Из контекста выдранный.

Специально для проверки трейлинга сделал код, сделки открываются, но трэйлинг не срабатывает, как только не крутил, в тупике(

//Вводные
#define MagicNumber 150
double SL=0;                        //Stop Loss
input int Trailing=100;             //Трэйлинг

//Код

void OnTick()
{
 if (OrdersTotal()==0)
 {
   if(TimeCurrent()>StrToTime("17:59")&&TimeCurrent()<StrToTime("18:01"))
  {
SL = Low[1]-Point; //Стоп лосс
bool send1=OrderSend (Symbol(), OP_BUY,1,Bid,30,SL,0,NULL,MagicNumber,0,clrNONE);
  }
 }
 if (OrdersTotal()>0)
   {
      for (int i=0; i<OrdersTotal (); i++)
    {
   bool select1=OrderSelect (i, SELECT_BY_POS);
   if (OrderMagicNumber() == MagicNumber && OrderSymbol () == Symbol())
     {
   if (OrderType()==OP_BUY)
      {
     if (NormalizeDouble(Ask-OrderStopLoss(),Digits)>NormalizeDouble(Trailing,Digits))
     bool modify1=OrderModify (OrderTicket(),0,Ask-Trailing,OrderTakeProfit(),0,CLR_NONE);
      }
     }
    }
   }
}
 
YanSay:

Неправильно я вопрос задал, извините. Из контекста выдранный.

Специально для проверки трейлинга сделал код, сделки открываются, но трэйлинг не срабатывает, как только не крутил, в тупике(

Ответил на ваш вопрос выше. 
 
Vladislav Andruschenko:
Ответил на ваш вопрос выше. 
Спасибо большое, помогло!
 
YanSay:
Спасибо большое, помогло!

У вас там ещё есть проблемы.

Цикл прямой, а должен быть обратным - при прямом будут пропускаться позиции после закрытия одной из них по тралу

Нет проверки на минимальную дистанцию установки стопов (StopLevel) - будут ошибки модификации если стоп окажется ближе к цене, чем минимально-разрешённая дистанция (не забывайте о плавающем спреде)

Может быть ещё что-то - глядел по диагонали - мимоходом, так как вам уже ответили.

ЗЫ. Поглядел ещё:

if (NormalizeDouble(Ask-OrderStopLoss(),Digits)>NormalizeDouble(Trailing,Digits))

вот такая проверка лишена самого смысла проверки с нормализацией, так как вы нормализовали оба значения, а при проверке результат опять не нормализован.

Нужно проверять нормализованную разницу двух double-значений. Вы же сравниваете два нормализованных значения.

 
Artyom Trishkin:

У вас там ещё есть проблемы.

Цикл прямой, а должен быть обратным - при прямом будут пропускаться позиции после закрытия одной из них по тралу

Нет проверки на минимальную дистанцию установки стопов (StopLevel) - будут ошибки модификации если стоп окажется ближе к цене, чем минимально-разрешённая дистанция (не забывайте о плавающем спреде)

Может быть ещё что-то - глядел по диагонали - мимоходом, так как вам уже ответили.

ЗЫ. Поглядел ещё:

вот такая проверка лишена самого смысла проверки с нормализацией, так как вы нормализовали оба значения, а при проверке результат опять не нормализован.

Нужно проверять нормализованную разницу двух double-значений. Вы же сравниваете два нормализованных значения.

Вот так?

for (int i = OrdersTotal() - 1; i >= 0; --i)
if (NormalizeDouble((Ask-OrderStopLoss()>Trailing*Point),Digits))
 
the size of local variables is too large (more than 512kb)
Что значит ошибка?


У меня функция с двумя объектами:

bool              CheckCandleOneRules(CCandlePropertiesBase *candle,
                                      CCandleRule *rule,
                                      int dir);

В одном из классов есть структура с более чем 4000 полей (в основном enums).

Что делать с этой ошибкой?