Si#
Si# личный блог
05 ноября 2014, 15:39

Стоп на уровне Хая/Лоя предыдущего бара

Это MQL4!

--------------------
Всем привет! 
Уже больше недели меня мучает один вопрос — как правильно выставить стопы. Перебрал уже больше десятка вариантов и никак :(
Постоянно фигурируют две ошибки:
 130 - Слишком близкие стопы или неправильно рассчитанные
4051 - Недопустимое значение параметра функции
----------------------

А всего то требуется выставить стоп на уровне Хая или Лоя предыдущего бара.
 

Мои варианты:
if(TrendDOWN() == True && OrderCloseTimeBool() != True && EMA_Filtr() == True)
               {
                if(UpWhite()   == True ||
                   UpBlack()   == True ||
                   PatternBuy_0() == True ||
                   PatternBuy_1() == True ||
                   PatternBuy_2() == True ||
                   PatternBuy_3() == True)
                  {
                   int Ticket = OrderSend(Symbol(),OP_BUY,Lots(),Ask,Slippage,0,0,"",Magic,0,Blue);
                   if(Ticket > 0 )
                     {
                     double SL_Buy = NormalizeDouble(Ask -((Ask-iLow(NULL,0,1))/Point),Digits);
                     bool mod = OrderModify(Ticket,OrderOpenPrice(),SL_Buy,0,0);
                     }
                  }
               }


Еще вариант в качестве функции:
double StopLossOP_BUY()
{
if(OrdersTotal()>0)
  {
   for(int i=0; i<OrdersTotal(); i++)
     {
      if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES))
        {
         if(OrderSymbol() == Symbol() && OrderMagicNumber() == Magic && OrderType() == OP_BUY)
           {
            double StopOP_BUY = NormalizeDouble(OrderOpenPrice(),Digits) -                 //цена открытия ордера
                               (NormalizeDouble(OrderOpenPrice()-iLow(NULL,0,1),Digits)+   //разница между ценой открытия ордера и Лоем предыдщей свечи
                                NormalizeDouble(MarketInfo(Symbol(),MODE_SPREAD)*Point,Digits));//спред
            
            return(NormalizeDouble(StopOP_BUY,Digits));  
           }
        }
     }//for
  }//if
  return(0);
}
 
Второй вариант, также в качестве функции:
double StopLossOP_BUY2()
{
if(OrdersTotal()>0)
  {
   for(int i=0; i<OrdersTotal(); i++)
     {
      if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES))
        {
         if(OrderSymbol() == Symbol() && OrderMagicNumber() == Magic && OrderType() == OP_BUY)
           {
            
            RefreshRates();
            double StopOP_BUY = NormalizeDouble(OrderOpenPrice(),Digits)-                       //цена открытия ордера
                               (NormalizeDouble(OrderOpenPrice()-iLow(NULL,0,1),Digits)+        //разница между ценой открытия ордера и Лоем предыдщей свечи
                                NormalizeDouble(MarketInfo(Symbol(),MODE_SPREAD)*Point,Digits));//спред
            
            if(StopOP_BUY >= NormalizeDouble(Ask - MarketInfo(Symbol(),MODE_STOPLEVEL)*Point,Digits))
              {
               RefreshRates();
               return(NormalizeDouble(Ask - MarketInfo(Symbol(),MODE_STOPLEVEL)*Point,Digits));
              }
            else
              {
               RefreshRates();
               return(NormalizeDouble(StopOP_BUY,Digits)); 
              }
           }
        }
     }//for
  }//if
  return(0);
}
 
Люди добрые, помогите чем можно :(
Или приведите свои примеры правильного выставления стопов на уровне Хая/Лоя предыдущего бара.
 
Я схожу с ума :)
 


Благодаря общему разуму и особенно помощи Twilight_reg73 нашел ошибку в коде!
Спасибо вам друзья! 
Ошибка заключалась в том, что всем стопам присваивалось одно и тоже значение! 

Стоп на уровне Хая/Лоя предыдущего бара 
36 Комментариев
  • Evgeniy
    05 ноября 2014, 15:54
    это алгоритм для МТ4?
      • Evgeniy
        05 ноября 2014, 16:01
        kreativ_25, я так понимаю робот трендовый, реверсный?
  • Marti
    05 ноября 2014, 16:05
    на мой взгляд зависит от конкретной ситуации, просто брать за уровень хая предыдущего бара это равносильно тому что на угад
  • А ты из России свалить не собираешься? Тогда — скажу.
      • kreativ_25, а Диму из Бреста уважаешь?
          • kreativ_25, добре. Я почти там же у него.

            Но в общем, я тебе скажу так, стратегически — стоп надо выставлять с учетом предыдущей волатильности. А в тактике написания программ и кодов я не силён.
  • Twilight_reg73
    05 ноября 2014, 16:09
    многие форекс брокеры недают ставить стопы ближе 12-15 пунктов по 4 знаку
      • Twilight_reg73
        05 ноября 2014, 16:14
        kreativ_25, Я знаю что 5ти знак просто я сказал что не дают стоп 15 по 4 знаку или 150 по 5тому.
        • Twilight_reg73
          05 ноября 2014, 16:26
          Twilight_reg73,
          NormalizeDouble(Ask -((Ask-iLow(NULL,0,1))/Point),Digits);

          пример Аск 1,54321 — (1,54321-1,54300 = 0.00021) 0.00021/1 (я всегда умножаю а вы почему то делите)
          • Twilight_reg73
            05 ноября 2014, 16:27
            sl=NormalizeDouble(StopLoss*_Point,_Digits); // Нормализуем значение для Стоп Лосса
            • Twilight_reg73
              05 ноября 2014, 16:31
              Там выше ошибки должно еще сказано быть примерно так
              На что при проверке мне выдает:

              2011.12.06 23:36:50 2010.01.06 16:19 Big Dog 1.01 EURUSD,M15: invalid lots amount for OrderSend function

              2011.12.06 23:36:50 2010.01.06 16:19 Big Dog 1.01 EURUSD,M15: OrderSend error 4051
              • Twilight_reg73
                05 ноября 2014, 16:35
                Так же в первом примере Вы не делаете Ордер Селект
                • Twilight_reg73
                  05 ноября 2014, 16:36
                  У меня функция модификации ордера

                  void EditOrder(int tic,double sl)
                  {while(!IsTradeAllowed()) Sleep(100);
                  if(OrderSelect(tic,SELECT_BY_TICKET))
                  if(!OrderModify(OrderTicket(),OrderOpenPrice(),sl,OrderTakeProfit(),0,CLR_NONE))
                  Print(«Ошибка редактирования ордера: »,GetLastError());
                  return;}
            • Twilight_reg73
              05 ноября 2014, 17:26
              kreativ_25, мой совет вынесите все в пtременные и смjтрите чему они равны через Print У Вас явная ошибка в расчетах стопа.
              • Twilight_reg73
                05 ноября 2014, 17:28
                В последнем прримере в Функции у вас нету модификации самого ордера. Все смешали в кучу и не в одном из приведенном примере не доведено до ума.
                  • Twilight_reg73
                    05 ноября 2014, 17:46
                    kreativ_25, Вы явно не видите свою ошибку. и не слушате, что Вам говорят другие. Удачи тогда в самостоятельном поиске.
            • Twilight_reg73
              05 ноября 2014, 23:20
              kreativ_25, 1,54321-21 получается минус отсюда и ошибка
              • Twilight_reg73
                05 ноября 2014, 23:21
                Говорю же вынесите все в переменные и проверяйте их Принтом.
  • Deamoniy Steslavovich
    05 ноября 2014, 17:01
    Ахахаххаах))))

    if (TrendDOWN() == True) {…

    Можно же просто:
    if (TrendDOWN()) {…
      • Deamoniy Steslavovich
        05 ноября 2014, 19:49
        kreativ_25, можно подробней про четкое предназначение? И что за контроль?
  • Twilight_reg73
    05 ноября 2014, 17:39
    ВОт Вам готовые функции

    forum.mql4.com/ru/38949

    Вам нужен эта функция
    forum.mql4.com/ru/38949#434193
  • Алексей
    05 ноября 2014, 22:35
    в первом варианте
    double
    SL_Buy = NormalizeDouble(Ask -((AskiLow(NULL,0,1))/Point),Digits);
    возвращает отрицательное значение…
    значение возвращаемое iLov можно и не нормализовать оно корректно.
  • RobotsForex.ru
    18 ноября 2014, 11:41
    Я бы все таки рекомендовал пользоваться готовыми и протестироваными торговыми системами, так как самостоятельное выставление, не всегда приносит желаемый результат.

Активные форумы
Что сейчас обсуждают

Старый дизайн
Старый
дизайн