- [ВНИМАНИЕ, ТЕМА ЗАКРЫТА!] Любой вопрос новичка, чтоб не захламлять форум. Профи, не проходите мимо. Без вас никуда.
- Индикаторы: Energy_Market_01
- Общая ошибка
ERR_REQUOTE | 138 | Новые цены |
Обычно возникает на быстрых рынках
ага так оно и есть, вот я испрашиваю как сделать что бы он все равно пытался сделать ордер пока не сделает ?
ага так оно и есть, вот я испрашиваю как сделать что бы он все равно пытался сделать ордер пока не сделает ?
вообще может пригодится :)
//---------- Копировать -----------------//
//+------------------------------------------------------------------+
double iif( bool condition, double ifTrue, double ifFalse )
{
if( condition ) return( ifTrue );
return( ifFalse );
}
//+------------------------------------------------------------------+
int orderDirection(int type, int revers)
{
int res = 0;
if(type == OP_BUY || type == OP_SELLLIMIT || type == OP_BUYSTOP)
res = 1;
if(type == OP_SELL || type == OP_BUYLIMIT || type == OP_SELLSTOP)
res = -1;
//если реверс = 1, то это для выставления ордера, если = -1 то для
//расчета стопов и тейков
if(type == OP_BUYLIMIT || type == OP_SELLLIMIT)
res = res * revers;
//return( 1 - 2 * ( OrderType() % 2 ) );
return(res);
}
//+-------------------------------------------------------------------+
//выставляет ордер
//на входе: переменные для открытия ордера
//на выходе - тикет открытого ордера или -1 если ордер
//не может быть открыт
//+-------------------------------------------------------------------+
int OpenOrder(string _symbol,int _cmd, double _volume, double _price, int _sleepage, double _stoploss, double _takeprofit, string _comment, int _magic, int _exp, string fn = "")
{
/*
symbol - Наименование финансового инструмента, с которым проводится торговая операция.
cmd - Торговая операция. Может быть любым из значений торговых операций.
volume - Количество лотов.
price - Цена открытия.
slippage - Максимально допустимое отклонение цены для рыночных ордеров (ордеров на покупку или продажу).
stoploss - Цена закрытия позиции при достижении уровня убыточности (0 в случае отсутствия уровня убыточности).
takeprofit - Цена закрытия позиции при достижении уровня прибыльности (0 в случае отсутствия уровня прибыльности).
comment - Текст комментария ордера. Последняя часть комментария может быть изменена торговым сервером.
magic - Магическое число ордера. Может использоваться как определяемый пользователем идентификатор.
expiration - Срок истечения отложенного ордера.
arrow_color - Цвет открывающей стрелки на графике. Если параметр отсутствует или его значение равно CLR_NONE, то открывающая стрелка не отображается на графике.
если price == 0 тогда открываем по текущей цене
*/
int res = -1;
int countOfTry = 5;
int nTry = 0;
int sltpLevel = MarketInfo(Symbol(),MODE_STOPLEVEL);
while(res < 0 && nTry <= countOfTry && !IsStopped() && IsTradeAllowed())
{
if(!IsExpertEnabled()) break;
while(IsTradeContextBusy())
{
Sleep(3000);
}
RefreshRates();
if (_price == 0){
_price = iif(orderDirection(_cmd,1)>0,MarketInfo(Symbol(),MODE_ASK),MarketInfo(Symbol(),MODE_BID));
}
if(_price > 0 ){
if(_cmd == OP_BUYSTOP || _cmd == OP_SELLLIMIT){
if(_price < (MarketInfo(Symbol(),MODE_ASK) + sltpLevel * Point)){
Print("================== cant open ", "ot = ",_cmd, " op = ",_price);
return(-1);
}
}
//***
if(_cmd == OP_SELLSTOP || _cmd == OP_BUYLIMIT){
if(_price > (MarketInfo(Symbol(),MODE_BID) - sltpLevel * Point)){
Print("================== cant open ", "ot = ",_cmd, " op = ",_price);
return(-1);
}
}
}
//нормализуем все переменные зависящие от цены
_price = NormalizeDouble(_price, Digits);
_stoploss = NormalizeDouble(_stoploss, Digits);
_takeprofit = NormalizeDouble(_takeprofit, Digits);
res = OrderSend(_symbol,_cmd,_volume,_price,_sleepage,_stoploss,_takeprofit,_comment,_magic,_exp,CLR_NONE);
Print(StringConcatenate("OpenOrder = ",res));
if(res > -1)
return(res);
//---
int err = GetLastError();
if(err > 0)
{
if(err == 4109){
Print("TRADE IS DISABLED!!!!");
return(-1);
}
if(err == 4051)
break;
//logInfo(_price);
if(err == 148){
Print("BROCKER MAX ORDERS!!!!!");
return(-1);
}
if(err == 130){
Print(StringConcatenate("sl = ",_stoploss," tp = ",_takeprofit));
return(-1);
}
Print("OpenOrder",StringConcatenate("OrderSendError, fn = ",fn),err);
Print(StringConcatenate("Price = ",_price," cmd = ",_cmd, " bid = ", Bid, " ask = ", Ask));
}
nTry++;
}
return(res);
}
//---------- Копировать -----------------//
пусть тупо долбится пока не вернется тикет больше 0
о санек не подскажеш как это сделать ?
у меня вот так стоит что подправить ?
void CLOSEORDER(string ord) { for (int i=0; i<OrdersTotal(); i++) { if (OrderSelect(i,SELECT_BY_POS,MODE_TRADES)==true) { if (OrderSymbol()!=Symbol()) continue; if (OrderType()==OP_BUY && ord=="Buy") OrderClose(OrderTicket(),OrderLots(),NormalizeDouble(Bid,Digits),30,CLR_NONE); if (OrderType()==OP_SELL && ord=="Sell") OrderClose(OrderTicket(),OrderLots(),NormalizeDouble(Ask,Digits),30,CLR_NONE); } } }
int res=-1; while(res < 0 ) { RefreshRates(); res=OrderSend(); Sleep(3000); }
у меня вот так стоит что подправить ?
![MQL5 - Язык торговых стратегий для клиентского терминала MetaTrader 5](https://c.mql5.com/i/registerlandings/logo-2.png)
- Бесплатные приложения для трейдинга
- 8 000+ сигналов для копирования
- Экономические новости для анализа финансовых рынков
Вы принимаете политику сайта и условия использования