Вы упускаете торговые возможности:
- Бесплатные приложения для трейдинга
- 8 000+ сигналов для копирования
- Экономические новости для анализа финансовых рынков
Регистрация
Вход
Вы принимаете политику сайта и условия использования
Если у вас нет учетной записи, зарегистрируйтесь
Лучший способ правильно установить стоплосс - это правильно продумать спред. Спред - это расстояние между Ask и Bid. Поэтому, когда вы добавляете стоплосс к ордеру на покупку, используя Bid - SL, он автоматически включает спред, и вам не нужно кодировать его, вы можете полностью игнорировать спред. Для сделки на продажу использование Ask + SL дает тот же эффект. Однако, будьте осторожны - в периоды низкого объема торгов спред становится больше, и вы можете оказаться с SL далеко от того места, где вы ожидаете его увидеть - поэтому вы можете добавить некоторый код для предотвращения добавления SL выше установленного размера спреда.
Теперь вопрос о спреде снят, следующая основная причина ошибки 130s заключается в том, что цены изменились, пока ваш советник еще выполнялся. Это может быть вызвано тем, что советнику требуется много времени для исполнения или сервер очень занят обслуживанием сделок, что задерживает исполнение советника. В результате один тик заставил советника начать выполнение, но другой тик наступил до завершения выполнения, и цены теперь недействительны.
В любом случае вам нужно обновлять цены с помощью RefreshRates: while (RefrshRates() == 1) Sleep(5); ------ или любое другое время ожидания.
В любом случае вам нужно обновить цены, используя RefreshRates: while (RefrshRates() == 1) Sleep(5); ------ или любое другое время ожидания.
AFAIK RefreshRates() не имеет никакого отношения к ошибке 130
RaptorUK, и я согласен, что использование MODE_ASK и т.д. устранит необходимость в RefreshRates(), но я предполагал, что как в примере кода shinobi .....
Я отправляю заказ, например:
int ticket = OrderSend(Symbol(), OP_BUY, position_size, Ask, SLIPPAGE, initial_stop, TAKEPROFIT, NULL, EXPERT_ID, 0, Green);
используется предопределенная переменная ASK и поэтому ask/bid, а также значение спреда могло измениться, что и привело к ошибке 130. В таком случае RefreshRates() можно было бы использовать непосредственно перед отправкой ордера.
RaptorUK, и я согласен, что использование MODE_ASK и т.д. устранит необходимость в RefreshRates(), но я предполагал, что как в примере кода шиноби .....
Я отправляю заказ, например:
int ticket = OrderSend(Symbol(), OP_BUY, position_size, Ask, SLIPPAGE, initial_stop, TAKEPROFIT, NULL, EXPERT_ID, 0, Green);
используется предопределенная переменная ASK и поэтому ask/bid, а также значение спреда могло измениться, что и привело к ошибке 130. В таком случае RefreshRates() можно было бы использовать непосредственно перед отправкой ордера.
Сейчас я немного занят, но как только у меня появится возможность, я попробую все ваши предложения, а затем напишу обобщающее сообщение для всех, кто может наткнуться на эту тему с такой же проблемой.
Спасибо, и берегите себя!
shinobi
int ticket = OrderSend(Symbol(), OP_BUY, position_size, Ask, SLIPPAGE, initial_stop, TAKEPROFIT, NULL, EXPERT_ID, 0, Green);
не говорит всего. Как вы вычисляете initial_stop - используя Bid?
Как вы вычисляете SLIPPAGE - с поправкой на 4/5-значных брокеров?
Мне пришлось сделать перерыв на некоторое время (переезд в новый город, новая работа).
Но теперь я хотел бы взяться за эту тему, и наконец найти решение для этой проклятой ошибки #130 stoploss.
Я благодарен за все ваши советы и постарался учесть все из них:
1: Спред.
2: Changing Market Rates
3: 4-5 Digits-Broker
Итак, я выполнил все рекомендации, но ошибка все еще сохраняется. Насколько я могу судить, она возникает так же часто, как и раньше, поэтому должна быть другая причина.
Вот недавний лог:
tickvalue: 12.50000000
pos size: 37.00000000
Ask/Bid 1262.00000000/1261.75000000
stoploss:12.59610000
position_size: 37
Spread 0.25000000
Error could not take long position. Error is: #130 invalid stops
Приведенная выше строка кода OrderSend была использована с записанными значениями, чтобы попытаться занять длинную позицию.
Есть ли у вас еще какие-нибудь идеи, что может быть причиной?
Спасибо!
shinobi
Является ли это ECN брокером?
У ECN брокеров вы должны открыть и ПОТОМ установить стопы.
чтобы устранить возможную причину неправильного количества цифр, я округлил стоплосс в соответствии с кодом WHRoeders:
Просто сделайте
extern double StopLoss = 50;
extern double TakeProfit = 50;
затем для покупок:
double SL=Bid - StopLoss *Point;
double TP=Bid + TakeProfit*Point;
int Ticket=OrderSend(Symbol(),0,1,Ask,2,SL,TP,"",12345);
if( Ticket<0) print("error="GetLastError()");
для продаж:
double SL=Ask + StopLoss*Point;
double TP=Ask - TakeProfit*Point;
int Ticket=OrderSend(Symbol(),1,1,Bid,2,SL,TP,"",12345);
if( Ticket<0) print("error="GetLastError()");
затем опубликуйте файл журнала, если он не работает.
SDC:
Я попробовал ваш код следующим образом:
Единственное отличие в том, что я заменил Point, Ask и Bid на MarketInfo, чтобы избежать проблемы RefreshRates, о которой говорили Raptor и BigAI.
Проблема сохраняется и на этом простом примере. Я все еще получаю
#ESZ1,M5: Открытая позиция
#ESZ1,M5: tickvalue: 12.50000000
#ESZ1,M5: размер позиции: 1.00000000
#ESZ1,M5: Ask/Bid 1244.50000000/1244.25000000
#ESZ1,M5: спред 0.25000000
#ESZ1,M5: SL: 1244.00000000
#ESZ1,M5: TP: 1245.00000000
#ESZ1,M5: error=130
Раптор:
В настоящее время я использую UWC-Trader с демо-счетом для тестирования.
Как упоминалось ранее, я торгую фьючерсами. Например, ESZ1 и FDXZ1.
WHRoeder:
Извините, я тоже не округляю. Замените "округлять" на "корректировать для 4/5-значных брокеров". Т.е. я просто применил ваш код.
Я также разместил OrderSend так, как я его использую в моем предыдущем ответе. И значения всех задействованных переменных. Я не уверен, какая другая часть кода была бы интересна.
Как показал мини-пример, предложенный SDC, ошибка может быть разложена до этого простого кода. Значит, она должна быть более фундаментальной.
Я не торгую металлами, поэтому округление не должно быть важным.
Я попробую следующее:
открытие (без стоплосса) и последующая модификация (установка стоплосса).
Еще раз спасибо за ваши мысли,
шиноби