Нормализуй SL1, TP1, OP1
niko1312:
Нормализуй SL1, TP1, OP1
Нормализуй SL1, TP1, OP1
Я всё что можно уже нормализовал. Фокус в том, что при ОДИНАКОВОМ КОДЕ ордер на селл открывается, а на бай - выдаёт ошибку 130. Вот какая ерунда (
concord99:
Я всё что можно уже нормализовал. Фокус в том, что при ОДИНАКОВОМ КОДЕ ордер на селл открывается, а на бай - выдаёт ошибку 130. Вот какая ерунда (
Я всё что можно уже нормализовал. Фокус в том, что при ОДИНАКОВОМ КОДЕ ордер на селл открывается, а на бай - выдаёт ошибку 130. Вот какая ерунда (
Ещё раз глянь в "требования и ограничения торговых операций". Не исключаю причину в этом. Код не смотрел.
concord99:
Я всё что можно уже нормализовал. Фокус в том, что при ОДИНАКОВОМ КОДЕ ордер на селл открывается, а на бай - выдаёт ошибку 130. Вот какая ерунда (
Я всё что можно уже нормализовал. Фокус в том, что при ОДИНАКОВОМ КОДЕ ордер на селл открывается, а на бай - выдаёт ошибку 130. Вот какая ерунда (
В коде нет никакой нормализации, но дело не только в этом. Делить на целое число а) не всегда безопасно; б) долго.
Предлагаю: а) заменить деление на 10**n умножением на 10**-n; б) нормализовать результат NormalizeDouble(x,Digits)
Элементарная ошибка, Close[0] используется терминалом для построения графика.
Для торговли применяйте
OP1 = MarketInfo(Symbol(), MODE_ASK); для покупок и
OP1 = MarketInfo(Symbol(), MODE_BID); для продаж
Для отложенных ордеров надо добавлять еще и STOPLEVEL.
Вот поправил только не проверял 130 ошибка не правильные стопы ... Вероятно у вас слишком маленький стоп лоссif(Close[1]>My_100EMA) { if(OrdersTotal()==0) { // OP1=MathFloor(Close[0]*100)/100; // это что то новенькое сначала разделить потом умножить (выражение не имеет смысла) OP1 = NormalizeDouble(Ask,Digits); // приемлемое значение цены SL1=NormalizeDouble(OP1-StopLoss*Point,Digits); // Получаем цену стоп лосса TP1=NormalizeDouble(OP1+T_P*Point,Digits);// Получаем цену тейк профита PendBuyTicket1 = OrderSend(Symbol(),OP_BUYSTOP,LotSize,OP1,UseSlippage,SL1,TP1,"Pending Buy Order 1",MagicNumber,0,Black); // тут правильно if (PendBuyTicket1>0)Print("PendBuyTicket1 =",PendBuyTicket1);else Print(GetLastError()); } } else //Sell order { if(OrdersTotal()==0) { OP1=NormalizeDouble(Bid,Digits); // приемлемое значение цены SL1=NormalizeDouble(OP1+StopLoss*Point,Digits); // Получаем цену стоп лосса TP1=NormalizeDouble(OP1-T_P*Point,Digits); // Получаем цену тейк профита PendSellTicket1 = OrderSend(Symbol(),OP_SELLSTOP,LotSize,OP1,UseSlippage,SL1,TP1,"Pending Sell Order 1",MagicNumber,0,Black); if (PendBuyTicket1>0)Print("PendBuyTicket1 =",PendBuyTicket1);else Print(GetLastError()); } }
Думаю, дело вот в чём:
Отложенные ордера могут открываться только при определённом соотношении текущей и заявленной цены.
Специфичный (мягко говоря) способ определения заявленной цены делает её почти всегда ниже текущей. В этих условиях бай-стоп открыться не может.
Отложенные ордера могут открываться только при определённом соотношении текущей и заявленной цены.
Специфичный (мягко говоря) способ определения заявленной цены делает её почти всегда ниже текущей. В этих условиях бай-стоп открыться не может.
Делюсь со всеми гарантированным средством от ошибки 130:
StopLevel = MarketInfo(Symbol(),MODE_STOPLEVEL)*Point; FreezeLevel = MarketInfo(Symbol(),MODE_FREEZELEVEL)*Point; double dist = MathMax(MathMax(NormalizeDouble(Dist*Point,Digits),spread),MathMax(StopLevel,FreezeLevel));//для отложек double prev = MathMax(MathMax(NormalizeDouble(Prev*Point,Digits),spread),MathMax(StopLevel,FreezeLevel));//для модифи и другого
Всем спасибо!
VOLDEMAR:
Большое Вам спасибо! Именно Ваши корректировки изменили ситуацию в лучшую сторону!
Вы упускаете торговые возможности:
- Бесплатные приложения для трейдинга
- 8 000+ сигналов для копирования
- Экономические новости для анализа финансовых рынков
Регистрация
Вход
Вы принимаете политику сайта и условия использования
Если у вас нет учетной записи, зарегистрируйтесь
Просьба, посмотрите свежим взглядом код. Не могу понять, почему Sell ордер открывается, а Buy выдаёт ошибку 130. Ведь условия аналогичные и код одинаковый.
Заранее благодарен за возможную помощь.
//Buy order
if(Close[1]>My_100EMA)
{
if(OrdersTotal()==0)
{
OP1=MathFloor(Close[0]*100)/100;
SL1=OP1-StopLoss/10000;
TP1=OP1+T_P/10000;
PendBuyTicket1 = OrderSend(Symbol(),OP_BUYSTOP,LotSize,OP1,UseSlippage,SL1,TP1,"Pending Buy Order 1",MagicNumber,0,Black);
Print("PendBuyTicket1 =",PendBuyTicket1);
}
}
//Sell order
else
{
if(OrdersTotal()==0)
{
OP1=MathFloor(Close[0]*100)/100;
SL1=OP1+StopLoss/10000;
TP1=OP1-T_P/10000;
PendSellTicket1 = OrderSend(Symbol(),OP_SELLSTOP,LotSize,OP1,UseSlippage,SL1,TP1,"Pending Sell Order 1",MagicNumber,0,Black);
Print("PendSellTicket1 =",PendSellTicket1);
}
}