//+----------------------------------------------------------------------------+ //| Сопровождение позиции простым тралом | //| Параметры: | //| sy - наименование инструмента ("" - текущий символ) | //| op - операция (-1 - любая позиция) | //| mn - MagicNumber (-1 - любой магик) | //+----------------------------------------------------------------------------+ void TrailingPositions(string sy="", int op=-1, int mn=-1) { int i, k = OrdersTotal(), er = 0; double pBid, pAsk, pp, SL, new_SL, TP, new_TP, current_TrailingStop; if (sy=="") sy=Symbol(); for (i=0; i<k; i++) { if (OrderSelect(i, SELECT_BY_POS, MODE_TRADES)) { if (OrderSymbol()==sy && (op < 0 || OrderType() == op)) { if (mn < 0 || OrderMagicNumber() == mn) { SL = OrderStopLoss(); TP = OrderTakeProfit(); new_SL = SL; new_TP = TP; current_TrailingStop = MathMax(MarketInfo(Symbol(), MODE_STOPLEVEL), TrailingStop); if (OrderType()==OP_BUY) { if (!OnlyProfitTrailing || (Bid - OrderOpenPrice()) > current_TrailingStop * Point) { if (OrderStopLoss() < Bid - (current_TrailingStop + TrailingStep - 1) * Point || OrderStopLoss() == 0) new_SL = Bid - current_TrailingStop * Point; } if (TakeProfit !=0 && UseShiftTP && (OrderTakeProfit() - Bid) < TakeProfit * Point) new_TP = Bid + TakeProfit * Point; if (new_SL != SL || new_TP != TP) { if (ShowDebugInfo) Print("***1 SL=", SL, ", new_SL=", new_SL, ", TP=", TP, ", new_TP=", new_TP, ", current_TrailingStop=", current_TrailingStop, ", стоп лвл=", MarketInfo(Symbol(), MODE_STOPLEVEL), ", фриз лвл=", MarketInfo(Symbol(), MODE_FREEZELEVEL)); OrderModify(OrderTicket(), OrderOpenPrice(), new_SL, new_TP, 0, CLR_NONE); er = GetLastError(); if (er != 0) { Print("Ошибка № ", er, ": ''", ErrorDescription(er), "'' при трале BUY ордера. ", "OrderTicket()=", OrderTicket(), ", new_SL=", new_SL, ", new_TP=", new_TP, ", STOPLEVEL=", MarketInfo(Symbol(), MODE_STOPLEVEL), ", MODE_FREEZELEVEL=", MathRound(MarketInfo(Symbol(), MODE_FREEZELEVEL))); } } } if (OrderType()==OP_SELL) { if (!OnlyProfitTrailing || OrderOpenPrice() - Ask > current_TrailingStop * Point) { if (OrderStopLoss() > Ask + (current_TrailingStop + TrailingStep - 1) * Point || OrderStopLoss() == 0) new_SL = Ask + current_TrailingStop * Point; } if (TakeProfit !=0 && UseShiftTP && (Ask - OrderTakeProfit()) < TakeProfit * Point) new_TP = Ask - TakeProfit * Point; if (new_SL != SL || new_TP != TP) { if (ShowDebugInfo) Print("***2 SL=", SL, ", new_SL=", new_SL, ", TP=", TP, ", new_TP=", new_TP, ", current_TrailingStop=", current_TrailingStop, ", стоп лвл=", MarketInfo(Symbol(), MODE_STOPLEVEL), ", фриз лвл=", MarketInfo(Symbol(), MODE_FREEZELEVEL)); OrderModify(OrderTicket(), OrderOpenPrice(), new_SL, new_TP, 0, CLR_NONE); er = GetLastError(); if (er != 0) { Print("Ошибка № ", er, ": ''", ErrorDescription(er), "'' при трале SELL ордера. ", "OrderTicket()=", OrderTicket(), ", new_SL=", new_SL, ", new_TP=", new_TP, ", STOPLEVEL=", MarketInfo(Symbol(), MODE_STOPLEVEL), ", MODE_FREEZELEVEL=", MathRound(MarketInfo(Symbol(), MODE_FREEZELEVEL))); } } } } } } } }этот код работает правильно, думаю дело в current_TrailingStop = MathMax(MarketInfo(Symbol(), MODE_STOPLEVEL), TrailingStop);
этот код работает правильно, думаю дело в current_TrailingStop = MathMax(MarketInfo(Symbol(), MODE_STOPLEVEL), TrailingStop);
Думаю что дело не в этом, поскольку в начале кода я делаю проверку
//+------------------------------------------------------------------+ //| ПРОВЕРКА УСТАНОВОК ПОЛЬЗОВАТЕЛЯ | //+------------------------------------------------------------------+ //если меньше min значения, утанавливаем min допустимые double StopLevel = MarketInfo(Symbol(),MODE_STOPLEVEL); double Min_Lot = MarketInfo(Symbol(),MODE_MINLOT); double Max_Lot = MarketInfo(Symbol(),MODE_MAXLOT); if(_Loss < StopLevel && _Loss !=0) _Loss = StopLevel + slippage; if(_Profit < StopLevel && _Profit !=0) _Profit = StopLevel + slippage; if(_Tral < StopLevel && _Tral !=0) _Tral = StopLevel + slippage; if( _Tral_New < StopLevel && _Tral_New !=0) _Tral_New = StopLevel + slippage; if( _Lot < Min_Lot) _Lot = Min_Lot; if( _Lot > Max_Lot) _Lot = Max_Lot; //+------------------------------------------------------------------+
Дело в движении цены и в тиках. Если у Вас хороший интернет, а на рынке штиль. Вариантов море:
1.Стоп уровень трала у Вас впритык на минимальный уровень(+проскальзывание, наверно 1 или 2 по стандарту) Првоерка - приказ серверу - получение ответа. это занимает порой больше минуты, а цена в это время изменилась. поэтому вылазиит 130 ошибка.
2.
Tral
он у Вас на Поинт не умножается, по крайней мере я не нашел где он умножается на Point,стало быть он в целом числе?
3. Сложный у Вас трал какой-то, это специальный трал для двух тикетов?
Думаю что дело не в этом, поскольку в начале кода я делаю проверку
у некоторых ДЦ, во время сильных движений цены увеличивают минимальный стоп, выводите в лог информацию об ошибках и уровне допустимых стопов
Дело в движении цены и в тиках. Если у Вас хороший интернет, а на рынке штиль. Вариантов море:
1.Стоп уровень трала у Вас впритык на минимальный уровень(+проскальзывание, наверно 1 или 2 по стандарту) Првоерка - приказ серверу - получение ответа. это занимает порой больше минуты, а цена в это время изменилась. поэтому вылазиит 130 ошибка.
2.
он у Вас на Поинт не умножается, по крайней мере я не нашел где он умножается на Point,стало быть он в целом числе?
3. Сложный у Вас трал какой-то, это специальный трал для двух тикетов?
1. Да, интернет не очень. Но я в значение трала закладываю ещё Slipp
2. У меня вначале, вместо Point, стоит проверка
switch(Digits) { case 2: k = 0.01; break; case 4: k = 0.0001; break; case 5: k = 0.00001; break; default: break; } Profit = _Profit * k; Loss = _Loss * k; Tral = _Tral * k; Lot = _Lot;3. Да, конкретно для одного из двух тикетов, который в данный момент активен.
Условие неверное:
if(OrderOpenPrice() - Ask >= Tral && Ask < Last_Tral_SELL)
сравнивать нужно нормализованную цену будущего стопа с текущим стопом ордера
Параметр неверный:
NormalizeDouble(Ask,Digits) + Tral
здесь должна быть нормализованная цена будущего стопа
- Бесплатные приложения для трейдинга
- 8 000+ сигналов для копирования
- Экономические новости для анализа финансовых рынков
Вы принимаете политику сайта и условия использования
Уважаемые господа, вот код трала. Почему-то часто выдаёт ошибку "НЕПРАВИЛЬНЫЕ СТОПЫ". Однако после нескольких ошибок срабатывает (впрочем, может сработать и сразу). Подскажите, в чём причина или где ошибка.