[АРХИВ]Любой вопрос новичка, чтоб не захламлять форум. Профи, не проходите мимо. Без вас никуда - 5. - страница 190

 

Сергей Dubakin любезно предложил функцию CloseBy, но к сожалению, она не выполняет важное условие для меня, закрывать позицию с максимальным убытком противоположной позицией с максимальным профитом, а закрывает любые пары из попавшихся: 

 


avatar
19
 
Diubakin 25.02.2013 23:26 
borilunad:
Ув. профи! Где найти функцию СloseBy(), которая работает в ручном режиме? Хочу вставить в мой сов, чтобы можно было не вручную, а автоматически согласно условиям закрывать позицию с максимальным минусом противоположной с максимальным плюсом. В кодебэйс не нашёл. Спасибо!

 Попробуйте такой вариант:

bool LockOFF(int posit, int oppos, color arrow_color) {
double Result, PrevLoss, PrevProfit;
    int pos, orders_total, order_type, MaxProfitTicket, MaxLossTicket;
   bool Ans;

 MaxProfitTicket=-1; MaxLossTicket=-1;

 orders_total=OrdersTotal();
 for(pos=orders_total-1; pos>=0; pos--) {
  if(!OrderSelect(pos, SELECT_BY_POS, MODE_TRADES)) continue;
  if(OrderSymbol()!=Symbol() || OrderMagicNumber()!=EA_Magic) continue; // не наш ордер
  if(OrderType()>1) continue;
  Result=OrderProfit()+OrderSwap()+OrderCommission();
  if(Result<0.0 && (PrevLoss==0.0 || Result<PrevLoss)) {
   PrevLoss=Result; MaxLossTicket=OrderTicket(); order_type=OrderType(); } } // end of for

 if(MaxLossTicket==-1) return(false); // нет убыточной позиции
 if(order_type==OP_BUY) order_type=OP_SELL; else order_type=OP_BUY; 

 orders_total=OrdersTotal();
 for(pos=orders_total-1; pos>=0; pos--) {
  if(!OrderSelect(pos, SELECT_BY_POS, MODE_TRADES)) continue;
  if(OrderSymbol()!=Symbol() || OrderMagicNumber()!=EA_Magic) continue; // не наш ордер
  if(order_type!=OrderType()) continue;
  Result=OrderProfit()+OrderSwap()+OrderCommission();
  if(Result>0.0 && (PrevProfit==0.0 || Result>PrevProfit)) {
   PrevProfit=Result; MaxProfitTicket=OrderTicket(); } } // end of for

 if(MaxProfitTicket==-1) return(false); // нет противоположной прибыльной позиции

 Ans=OrderCloseBy(MaxLossTicket, MaxProfitTicket);
 if(!Ans) { Print("Ошибка при встречном закрытие"); return(false); }
 
 return(true); }

 

 Я сделал функции, определяющие макслосс GetMaxLoss() и макспрофит GetMaxProfit(), но никак не могу добиться, чтобы функция LockOFF() выбрала не любую попавшуюся пару, а указанную мною. Покажите, пожалуйста, в какое место воткнуть мои максимумы и, может, нужны ещё функции по определению тикета или индекса этих позиций, то это для меня не проблема, только вот, в какое место поставить всё это в эту LockOFF()?! Спасибо!

 
borilunad:

Сергей Dubakin любезно предложил функцию CloseBy, но к сожалению, она не выполняет важное условие для меня, закрывать позицию с максимальным убытком противоположной позицией с максимальным профитом, а закрывает любые пары из попавшихся.

Здравствуйте, ф-ция закрывает позицию с максимальным убытком противоположной позицией с максимальным профитом. Вот тестовый советник для тестера:

extern int EA_Magic=135; // внешняя переменная

int TimeNow, TimePrev, PrevType; // глобальные переменные

int start()
 {
  double Price,SL,TP;
     int Ticket;

  TimeNow=iTime(NULL,240,0);
  if(TimePrev==TimeNow) return(0);

  if(PrevType!=1) {
   Price=NormalizeDouble(Ask,Digits);    
   SL=NormalizeDouble(Price-300*Point,Digits);    
   TP=NormalizeDouble(Price+300*Point,Digits);
   Ticket=OrderSend(Symbol(),OP_BUY,0.1,Price,3,SL,TP,"",EA_Magic);
   if(Ticket!=-1) { TimePrev=TimeNow; PrevType=1; } }

  else if(PrevType!=-1) {
   Price=NormalizeDouble(Bid,Digits);    
   SL=NormalizeDouble(Price+300*Point,Digits);    
   TP=NormalizeDouble(Price-300*Point,Digits);
   Ticket=OrderSend(Symbol(),OP_SELL,0.1,Price,3,SL,TP,"",EA_Magic);
   if(Ticket!=-1) { TimePrev=TimeNow; PrevType=-1; } }

  if(Hour()==0 && TimePrev==TimeNow) LockOFF(EA_Magic);

  return(0);
 }

bool LockOFF(int EA_Magic) {
 double Result, PrevLoss, PrevProfit;
    int pos, orders_total, order_type, MaxProfitTicket, MaxLossTicket;
   bool Ans;

 MaxProfitTicket=-1; MaxLossTicket=-1;

 orders_total=OrdersTotal();
 for(pos=orders_total-1; pos>=0; pos--) {
  if(!OrderSelect(pos, SELECT_BY_POS, MODE_TRADES)) continue;
  if(OrderSymbol()!=Symbol() || OrderMagicNumber()!=EA_Magic) continue; // не наш ордер
  if(OrderType()>1) continue;
  Result=OrderProfit()+OrderSwap()+OrderCommission();
  if(Result<0.0 && (PrevLoss==0.0 || Result<PrevLoss)) {
   PrevLoss=Result; MaxLossTicket=OrderTicket(); order_type=OrderType(); } } // end of for

 if(MaxLossTicket==-1) return(false); // нет убыточной позиции
 if(order_type==OP_BUY) order_type=OP_SELL; else order_type=OP_BUY; 

 orders_total=OrdersTotal();
 for(pos=orders_total-1; pos>=0; pos--) {
  if(!OrderSelect(pos, SELECT_BY_POS, MODE_TRADES)) continue;
  if(OrderSymbol()!=Symbol() || OrderMagicNumber()!=EA_Magic) continue; // не наш ордер
  if(order_type!=OrderType()) continue;
  Result=OrderProfit()+OrderSwap()+OrderCommission();
  if(Result>0.0 && (PrevProfit==0.0 || Result>PrevProfit)) {
   PrevProfit=Result; MaxProfitTicket=OrderTicket(); } } // end of for

 if(MaxProfitTicket==-1) return(false); // нет противоположной прибыльной позиции

 Ans=OrderCloseBy(MaxLossTicket, MaxProfitTicket);
 if(!Ans) { Print("Ошибка при встречном закрытие!"); return(false); }
 
 return(true); }

 Открывает поочерёдно Buy и Sell позиции при появлении нового 4-х часового бара и делает одно встречное закрытие при открытие нового дня.

 
Diubakin:

Здравствуйте, ф-ция закрывает позицию с максимальным убытком противоположной позицией с максимальным профитом. Вот тестовый советник для тестера:

 Открывает поочерёдно Buy и Sell позиции при появлении нового 4-х часового бара и делает одно встречное закрытие при открытие нового дня.

 

Здравствуйте, Сергей! У меня другой алгоритм! В том-то и дело, что эта функция закрывает то, что есть, а мне нужно чтобы закрыла именно максимальные, а не любые! Ну ничего, добью сам, если никто не поможет! Ваш вариант годится только для тестера, потому добавил в шапке согласно правилам. Работает чётко без ошибок, но не выбирает максимальные! Всё равно, спасибо Вам за выручку!
 
alsu:

Все, теперь понял. Если цена на текущем баре дошла до Open[0] + 30, то открываемся. Если бар закончился, то Open[0] изменился, и уровень открытия смещается соответствено. В рынке должна быть только одна сделка, правильно?

Тогда так:

Отслеживать новый бар не надо, так как при его формировании система автоматически пропишет в Open[0] новое значение, а значит, и новый уровень рассчитается правильно. Обратите внимание, что сделка BUY открывается по текущей цене Ask, а закрывается (TP и SL) по Bid. Кроме того, необходимо нормализовать значения цен.


Большое спасибо за помощь.

Но открывает сделки в тестере  на каждой минутной свече.    инф. в этой ссылке   http://clip2net.com/s/2T98Y

А мне нужно  что бы открывала один ордер на  пятиминутной свече,но не на каждой.

А только если текущая пятиминутка будет > или = 30 пунктов .(от цены открытия до ее максимума)

Т.е открыть один рыночный ордер на тридцатом пункте от цены открытия нулевой=текущей пятиминутки.

А если текущая пятиминутка  от цены открытия до максимума меньше 30 пунктов,то рыночный ордер не открывать.

Т.е. ордеров будет немного , я посчитал в екселе, с 1999 года - чуть больше 3000 по евро доллару в обе стороны.

Переходим на следующую пятиминутку и если она,т.е. текущая пятиминутка  > или = 30 пунктов,то открываемся на тридцатом пункте,если меньше - переходим на следующую пятиминутку ...и так до конца графика.

Но вся фишка в том,- по приблизительным подсчетам ,большая часть пятиминуток ,которые > или = 30 пунктов гораздо чаще пролетают 15 пунктов чем закрываются по стопу в 30 п.Т.е.соотношение между ними таково,что в целом график баланса будет идти вверх.Хочу проверить эту идею на тестере.

У Вас в условии стоит - если нет открытых ордеров 

Но по моей системе могут образоваться две пятиминутки с вышеописанными параметрами подряд и если ордер от предыдущей пятиминутки не закроется - тогда на второй пятиминутки ордер не откроется.

А мне нужно,что бы один ордер  открывался на каждой пятиминутке с вышеописанными параметрами независимо от того есть или нет в торговле ордера.

 
if (OrdesTotal()==0 && Close[0]>=Price)  
 
alsu:

Все, теперь понял. Если цена на текущем баре дошла до Open[0] + 30, то открываемся. Если бар закончился, то Open[0] изменился, и уровень открытия смещается соответствено. В рынке должна быть только одна сделка, правильно?

Тогда так:

Отслеживать новый бар не надо, так как при его формировании система автоматически пропишет в Open[0] новое значение, а значит, и новый уровень рассчитается правильно. Обратите внимание, что сделка BUY открывается по текущей цене Ask, а закрывается (TP и SL) по Bid. Кроме того, необходимо нормализовать значения цен.


И еще у Вас вторым условием стоит  - если цена закрытия текущей пятиминутки >= цене открытия ордера.

Но по моему замыслу цена закрытия текущей пятиминутки может быть любая.главное - что бы ее High  был > или = 30 пунктов.


Close[0]>=Price

 
borilunad:
Здравствуйте, Сергей! У меня другой алгоритм! В том-то и дело, что эта функция закрывает то, что есть, а мне нужно чтобы закрыла именно максимальные, а не любые! Ну ничего, добью сам, если никто не поможет! Ваш вариант годится только для тестера, потому добавил в шапке согласно правилам. Работает чётко без ошибок, но не выбирает максимальные! Всё равно, спасибо Вам за выручку!

Как вам нужно? Та, что выкладывал, определяет самую убыточную позицию в валюте депозита(в деньгах), потом определяет самую прибыльную противоположную тоже в валюте депозита и делает встречное закрытие.

borilunad:

Я сделал функции, определяющие макслосс GetMaxLoss() и макспрофит GetMaxProfit(), но никак не могу добиться, чтобы функция LockOFF() выбрала не любую попавшуюся пару, а указанную мною. Покажите, пожалуйста, в какое место воткнуть мои максимумы и, может, нужны ещё функции по определению тикета или индекса этих позиций, то это для меня не проблема, только вот, в какое место поставить всё это в эту LockOFF()?! Спасибо!

В ф-ции всё это есть - определение макс убытка, макс профита, тикеты тоже определяются.

 
Diubakin:

Как вам нужно? Та, что выкладывал, определяет самую убыточную позицию в валюте депозита(в деньгах), потом определяет самую прибыльную противоположную тоже в валюте депозита и делает встречное закрытие.

В ф-ции всё это есть - определение макс убытка, макс профита, тикеты тоже определяются.

Вы ошибаетесь! Видать у Вас единственная пара противоположных позиций, а у меня может быть больше, потому вывел в комментах все данные и вижу, что закрывает не максиЛосс максиПрофитом, а любые, какие первые при переборе попадаются. А мои функции чётко показывают индексы позиций с максимальными Лоссом и Профитом. Осталось только дoбавить эти проверки в LockOFF()!
 
borilunad:
Вы ошибаетесь! Видать у Вас единственная пара противоположных позиций, а у меня может быть больше, потому вывел в комментах все данные и вижу, что закрывает не максиЛосс максиПрофитом, а любые, какие первые при переборе попадаются. А мои функции чётко показывают индексы позиций с максимальными Лоссом и Профитом. Осталось только дoбавить эти проверки в LockOFF()!
Вы тестовый советник для ф-ции в тестере смотрели? Закрывает именно макс. убыток с макс. профитом независимо от того сколько там ордеров - два или двадцать.
 
Vinin:

https://www.mql5.com/ru/code/7835 Только это индикатор. В советнике надо объекты использовать
Интересует именно советник, объекты - самому что ли свечу рисовать?
 
Diubakin:
Вы тестовый советник для ф-ции в тестере смотрели? Закрывает именно макс. убыток с макс. профитом независимо от того сколько там ордеров - два или двадцать.
Конечно, смотрел! Правда, у меня не больше трёх. Везде, в тестере в результатах и журнале, на демо тоже и на графике! Когда сделаю, покажу!
Причина обращения: