Блог им. kreativ_25

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

    • 05 ноября 2014, 15:39
    • |
    • Si#
  • Еще
Это 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 нашел ошибку в коде!
Спасибо вам друзья! 
Ошибка заключалась в том, что всем стопам присваивалось одно и тоже значение! 

Стоп на уровне Хая/Лоя предыдущего бара 
★2
36 комментариев
это алгоритм для МТ4?
avatar
Evgeniy, угу
avatar
kreativ_25, я так понимаю робот трендовый, реверсный?
avatar
Evgeniy, практически.
Контртрендовый на рабочем ТФ, но трендовый на вышестоящим ТФ.
Т.е. заявки открываются на 15 минутном ТФ, а определение тренда на часовике (H1)
avatar
на мой взгляд зависит от конкретной ситуации, просто брать за уровень хая предыдущего бара это равносильно тому что на угад
avatar
Marti, нее… здесь нет никакой угадайки — все четко формализовано.

просто затык именно выставлении стопов.

Можно конечно без проблем выставить фиксированный стоп, но это в моем случае не совсем подходит.
avatar
А ты из России свалить не собираешься? Тогда — скажу.
Вестников, я из Минска :)
Говори :))))
avatar
kreativ_25, а Диму из Бреста уважаешь?
Вестников, он у меня в ЧС :)
avatar
kreativ_25, добре. Я почти там же у него.

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

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

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
avatar
Так же в первом примере Вы не делаете Ордер Селект
avatar
У меня функция модификации ордера

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;}
avatar
Twilight_reg73, но в последнем примере я искал ордер через селект и проблема осталась! :(
avatar
Twilight_reg73, я делил чтобы получить целое число, а потом напрямую его использовать при модификации ордера.

Т.е. будто мы используем фиксированное значение для установления стопа при модификации ордера. Т.к. если прописать фиксированное значение (руками, обычное целое число) то проблем нет.

Но такой вариант не прошел…
avatar
kreativ_25, мой совет вынесите все в пtременные и смjтрите чему они равны через Print У Вас явная ошибка в расчетах стопа.
avatar
В последнем прримере в Функции у вас нету модификации самого ордера. Все смешали в кучу и не в одном из приведенном примере не доведено до ума.
avatar
Twilight_reg73, в последнем примере — это функция расчета значения стопа и, соответственно, его будем подставлять вместо стопа при модификации ордера
avatar
kreativ_25, Вы явно не видите свою ошибку. и не слушате, что Вам говорят другие. Удачи тогда в самостоятельном поиске.
avatar
Twilight_reg73, я делю для того чтобы получить целое число. В вашем примере это 0,00021/Point=0.00021/0.00001=21

Полученое целое число я хотел использовать в стандартной модификации ордера, которая работает при вводе фиксированного значения (не рассчетного — как в примере).
avatar
kreativ_25, 1,54321-21 получается минус отсюда и ошибка
avatar
Говорю же вынесите все в переменные и проверяйте их Принтом.
avatar
Twilight_reg73, блин…
Вы правы!
Сейчас принтовку сделаю.
Огромное спасибо Вам!
avatar
Ахахаххаах))))

if (TrendDOWN() == True) {…

Можно же просто:
if (TrendDOWN()) {…
avatar
Станислав Дорошин, в роботе много функций! и у каждой тру есть свое четкое предназначение — поэтому для контроля лучше явно указать — как бы это смешно не казалось! :)
avatar
kreativ_25, можно подробней про четкое предназначение? И что за контроль?
avatar
ВОт Вам готовые функции

forum.mql4.com/ru/38949

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

теги блога Si#

....все тэги



UPDONW
Новый дизайн