Любой вопрос новичка, чтоб не захламлять форум. Профи, не проходите мимо. Без вас никуда - 6. - страница 451

 
//+------------------------------------------------------------------+
//| удаления и/или закрытие ордера, с фильтрацией его по объему |
//---------------------------------------------------------------------
#property show_inputs
//--------------------------------------------------------------------
extern double MinLot = 0.01; //минимальный лот который удаляем/закываем
extern double MaxLot = 0.1; //максимальный лот который удаляем/закываем
extern bool Buy = false; //удалять/закрывать направление buy ордеров
extern bool Sell = false; //удалять/закрывать направление sell ордеров
extern bool pending = true; //удалить отложенные ордера
extern bool market = true ; //закрыть рыночные позиции
extern int slippage = 2; //проскальзывание цены при закрытии рыночных позиций
//--------------------------------------------------------------------
int start()
{
double SL,TP;
string txt=StringConcatenate("Скрипт удаления или закрытие ордера, старт ",TimeToStr(TimeCurrent(),TIME_DATE|TIME_SECONDS));
RefreshRates();

bool error=true;
int Error,OT,Ticket,nn;
double OOP,OL;
while(true)
{
for (int j = OrdersTotal()-1; j >= 0; j--)
{
if (OrderSelect(j, SELECT_BY_POS))
{
if ((OrderSymbol() == Symbol()))
{
OL = OrderLots();
if (OL<MinLot || OL>MaxLot) continue;
OT = OrderType();
if (!market && OT<2) continue;
if (!pending && OT>1) continue;
Ticket = OrderTicket();
OOP = OrderOpenPrice();
if (OT==OP_BUY)
{
error=OrderClose(Ticket,OrderLots(),NormalizeDouble(Bid,Digits),slippage,Red);
if (error) txt = StringConcatenate(txt,"\nЗакрыт ордер BUY ",Ticket);
else txt = StringConcatenate(txt,"\nОшибка закрытия ",GetLastError());
}
if (OT==OP_SELL)
{
error=OrderClose(Ticket,OrderLots(),NormalizeDouble(Ask,Digits),slippage,Blue);
if (error) txt = StringConcatenate(txt,"\nЗакрыт ордер SELL ",Ticket);
else txt = StringConcatenate(txt,"\nОшибка ",GetLastError()," закрытия ",Ticket);
}
if (OT>1)
{
error=OrderDelete(Ticket);
if (error) txt = StringConcatenate(txt,"\nУдален ордер ",StrOrdersType(OT)," ",Ticket);
else txt = StringConcatenate(txt,"\nОшибка ",GetLastError()," удаления ",StrOrdersType(OT)," ",Ticket);
}
if (!error)
{
Error = GetLastError();
if (Error<2) continue;
if (Error==129)
{ Comment("Неправильная цена ",TimeToStr(TimeCurrent(),TIME_SECONDS));
Sleep(5000);
RefreshRates();
continue;
}
if (Error==146)
{
j++;
if (IsTradeContextBusy()) Sleep(2000);
continue;
}
Comment("Ошибка ",Error," закрытия ордера N ",OrderTicket(),
" ",TimeToStr(TimeCurrent(),TIME_SECONDS));
}
}
}
}
int n=0;
for (j = 0; j < OrdersTotal(); j++)
{
if (OrderSelect(j, SELECT_BY_POS))
{
if (OrderSymbol() == Symbol())
{
OL = OrderLots();
if (OL<MinLot || OL>MaxLot) continue;
OT = OrderType();
if (!market && OT<2) continue;
if (!pending && OT>1) continue;
n++;
}
}
}
if (n==0) break;
nn++;
if (nn>10) {Comment("Не удалось закрыть все сделки, осталось еще ",n);break;}
Sleep(1000);
RefreshRates();
}
Comment(txt,"\nСкрипт закончил свою работу ",TimeToStr(TimeCurrent(),TIME_DATE|TIME_SECONDS));
return(0);
}
//--------------------------------------------------------------------
string StrOrdersType(int t)
{
if (t==OP_BUY) return("Buy");
if (t==OP_SELL) return("Sell");
if (t==OP_BUYLIMIT) return("BuyLimit");
if (t==OP_SELLLIMIT) return("SellLimit");
if (t==OP_BUYSTOP) return("BuyStop");
if (t==OP_SELLSTOP) return("SellStop");
}

//--------------------------------------------------------------------

Вот этот скрипт закрывает по размеру лота пару на которую ставиться . что куда добавить или поменять чтобы он закрывал все открытые ордера по всем парам по размеру лота . отложки меня не интересуют.

 
Витёк, пользуйся кнопкой SRC для вставки кода! Кому нужно копаться в нечитабельной портянке?!
 
pu6ka:
Да, цены Ask не видны, но они есть :)
В визуализаторе можно нажать на паузу, и в свойствах графика выбрать "Показывать линию Ask", и продолжить тестирование. А штатно график цены в МТ4 строится по Bid.

а от чего зависит качество тестирования и как его повысить к максимальному?
 
Zver4991:

а от чего зависит качество тестирования и как его повысить к максимальному?
Честно говоря, не знаю. Пока не нужно было, поищите по сайту
 

Уважаемые специалисты.
Подскажите пожалуйста, как можно открыть сетку отложенных ордеров без использования циклов?
Если не сложно, покажите хотя бы приблизительный пример такого кода,
с возможностью изменения шага и размера лота у каждого последующего ордера сетки.

 
Forexman77:
Ставлю строки

вместо int Ticket; выходят ошибки:

'=' - left square parenthesis expected for array('=' - Левая квадратная скобка, ожидаемое для массива)

'>' - left square parenthesis expected for array ('=' - Левая квадратная скобка, ожидаемое для массива)

'>' - unexpected token('>' - Непредвиденный маркер)

')' - assignment expected(')' - Назначение ожидается )

'continue' - 'break' or 'continue' used within some cycle only('продолжать' - 'перерыв' или 'продолжать' используется в некоторых цикла только )

и много еще чего.


Значит, где-то еще используется Ticket в старом варианте. Надо зачищать код...
 
1mql:

Уважаемые специалисты.
Подскажите пожалуйста, как можно открыть сетку отложенных ордеров без использования циклов?
Если не сложно, покажите хотя бы приблизительный пример такого кода,
с возможностью изменения шага и размера лота у каждого последующего ордера сетки.

Да, собственно, также, как и в цикле... только без цикла. Вы покажите, как в цикле открываете, да объясните нам, почему не хотите использовать циклы, а то непонятно, что вы хотите по сути получить.
 
borilunad:
Витёк, пользуйся кнопкой SRC для вставки кода! Кому нужно копаться в нечитабельной портянке?!

//+------------------------------------------------------------------+
//| удаления и/или закрытие ордера, с фильтрацией его по объему |
//---------------------------------------------------------------------
#property show_inputs
//--------------------------------------------------------------------
extern double MinLot = 0.01; //минимальный лот который удаляем/закываем
extern double MaxLot = 0.1; //максимальный лот который удаляем/закываем
extern bool Buy = false; //удалять/закрывать направление buy ордеров
extern bool Sell = false; //удалять/закрывать направление sell ордеров
extern bool pending = true; //удалить отложенные ордера
extern bool market = true ; //закрыть рыночные позиции
extern int slippage = 2; //проскальзывание цены при закрытии рыночных позиций
//--------------------------------------------------------------------
int start()
{
double SL,TP;
string txt=StringConcatenate("Скрипт удаления или закрытие ордера, старт ",TimeToStr(TimeCurrent(),TIME_DATE|TIME_SECONDS));
RefreshRates();

bool error=true;
int Error,OT,Ticket,nn;
double OOP,OL;
while(true)
{
for (int j = OrdersTotal()-1; j >= 0; j--)
{
if (OrderSelect(j, SELECT_BY_POS))
{
if ((OrderSymbol() == Symbol()))
{
OL = OrderLots();
if (OL<MinLot || OL>MaxLot) continue;
OT = OrderType();
if (!market && OT<2) continue;
if (!pending && OT>1) continue;
Ticket = OrderTicket();
OOP = OrderOpenPrice();
if (OT==OP_BUY)
{
error=OrderClose(Ticket,OrderLots(),NormalizeDouble(Bid,Digits),slippage,Red);
if (error) txt = StringConcatenate(txt,"\nЗакрыт ордер BUY ",Ticket);
else txt = StringConcatenate(txt,"\nОшибка закрытия ",GetLastError());
}
if (OT==OP_SELL)
{
error=OrderClose(Ticket,OrderLots(),NormalizeDouble(Ask,Digits),slippage,Blue);
if (error) txt = StringConcatenate(txt,"\nЗакрыт ордер SELL ",Ticket);
else txt = StringConcatenate(txt,"\nОшибка ",GetLastError()," закрытия ",Ticket);
}
if (OT>1)
{
error=OrderDelete(Ticket);
if (error) txt = StringConcatenate(txt,"\nУдален ордер ",StrOrdersType(OT)," ",Ticket);
else txt = StringConcatenate(txt,"\nОшибка ",GetLastError()," удаления ",StrOrdersType(OT)," ",Ticket);
}
if (!error)
{
Error = GetLastError();
if (Error<2) continue;
if (Error==129)
{ Comment("Неправильная цена ",TimeToStr(TimeCurrent(),TIME_SECONDS));
Sleep(5000);
RefreshRates();
continue;
}
if (Error==146)
{
j++;
if (IsTradeContextBusy()) Sleep(2000);
continue;
}
Comment("Ошибка ",Error," закрытия ордера N ",OrderTicket(),
" ",TimeToStr(TimeCurrent(),TIME_SECONDS));
}
}
}
}
int n=0;
for (j = 0; j < OrdersTotal(); j++)
{
if (OrderSelect(j, SELECT_BY_POS))
{
if (OrderSymbol() == Symbol())
{
OL = OrderLots();
if (OL<MinLot || OL>MaxLot) continue;
OT = OrderType();
if (!market && OT<2) continue;
if (!pending && OT>1) continue;
n++;
}
}
}
if (n==0) break;
nn++;
if (nn>10) {Comment("Не удалось закрыть все сделки, осталось еще ",n);break;}
Sleep(1000);
RefreshRates();
}
Comment(txt,"\nСкрипт закончил свою работу ",TimeToStr(TimeCurrent(),TIME_DATE|TIME_SECONDS));
return(0);
}
//--------------------------------------------------------------------
string StrOrdersType(int t)
{
if (t==OP_BUY) return("Buy");
if (t==OP_SELL) return("Sell");
if (t==OP_BUYLIMIT) return("BuyLimit");
if (t==OP_SELLLIMIT) return("SellLimit");
if (t==OP_BUYSTOP) return("BuyStop");
if (t==OP_SELLSTOP) return("SellStop");
}
//--------------------------------------------------------------------

Вот этот скрипт закрывает по размеру лота пару на которую ставиться . что куда добавить или поменять чтобы он закрывал все открытые ордера по всем парам по размеру лота . отложки меня не интересуют.

 
Vitek2010:

Вот этот скрипт закрывает по размеру лота пару на которую ставиться . что куда добавить или поменять чтобы он закрывал все открытые ордера по всем парам по размеру лота . отложки меня не интересуют.

Ниже последнего экстерна:
extern int slippage = 2; //проскальзывание цены при закрытии рыночных позиций

вставь еще один:
extern bool total_symb = true; //по всем парам

а каждую из строк:
if ((OrderSymbol() == Symbol()))
и
if (OrderSymbol() == Symbol())

замени этой:
if (OrderSymbol() == Symbol() || total_symb)

теоретически должно работать, проверь.

 
Вопрос такой возник,можно ли написать советник или скрипт,который бы по достижению например в день 2% убытка закрывал бы все сделки ?
Причина обращения: