Закрытие позиций. По сигналу индикатора. - страница 5

 
komposter:
rid:

Результат пока всё тот же! С последним вариантом закрывается только последняя открытая позиция.!

А теперь убираем return после OrderClose-а, и наблюдаем результат ;)

//----------------------------------------------------------------------
 // for (int v=0; v<OrdersTotal(); v++)               { 
  for ( int v = OrdersTotal() - 1; v >= 0; v -- )                  {       
      if (OrderSelect(v, SELECT_BY_POS, MODE_TRADES))               {           
        if (OrderSymbol()==Symbol()&& OrderMagicNumber()==Magic)     { 
//-----------------------------------------------------                  
if (OrderType() == OP_BUY) { 
      if( RVI_1>=Up_lim &&  RVI_0<Up_lim)     {
         OrderClose(OrderTicket(),OrderLots(),Bid,3,Green); // закрываем позицию
                // return(0); // выходим         
              }   }  
 //--------------------------------------------------------
if (OrderType() == OP_SELL) { 
      if((RVI_1_<=Low_lim) && (RVI_0_>Low_lim))    {
               OrderClose(OrderTicket(),OrderLots(),Ask,3,Green); // закрываем позицию
                // return(0); // выходим
              }   }  
 //-------------------------------------------------------                       
    }  // Symbol()  
  } // select
 } //total
} //Close_ 
 //****************************************************************************
Убрал, как велено. И случилось чудо. Закрываться стали все открытые позиции по сигналу индикатора! Но почему так?
 
rid:
komposter:
rid:

Результат пока всё тот же! С последним вариантом закрывается только последняя открытая позиция.!

А теперь убираем return после OrderClose-а, и наблюдаем результат ;)

//----------------------------------------------------------------------
 // for (int v=0; v<OrdersTotal(); v++)               { 
  for ( int v = OrdersTotal() - 1; v >= 0; v -- )                  {       
      if (OrderSelect(v, SELECT_BY_POS, MODE_TRADES))               {           
        if (OrderSymbol()==Symbol()&& OrderMagicNumber()==Magic)     { 
//-----------------------------------------------------                  
if (OrderType() == OP_BUY) { 
      if( RVI_1>=Up_lim &&  RVI_0<Up_lim)     {
         OrderClose(OrderTicket(),OrderLots(),Bid,3,Green); // закрываем позицию
                // return(0); // выходим         
              }   }  
 //--------------------------------------------------------
if (OrderType() == OP_SELL) { 
      if((RVI_1_<=Low_lim) && (RVI_0_>Low_lim))    {
               OrderClose(OrderTicket(),OrderLots(),Ask,3,Green); // закрываем позицию
                // return(0); // выходим
              }   }  
 //-------------------------------------------------------                       
    }  // Symbol()  
  } // select
 } //total
} //Close_ 
 //****************************************************************************
Убрал, как велено. И случилось чудо. Закрываться стали все открытые позиции по сигналу индикатора! Но почему так?
Твой return прерывал цикл обработки.
 
Понял. Благодарю всех, кто откликнулся!
 
KimIV:

Я обычно реализую такой функционал:

//+----------------------------------------------------------------------------+
//|  Управление позициями                                                      |
//+----------------------------------------------------------------------------+
void ManagePositions() {
  double sl=0, tp=0;
  int    ms[2];
 
  ArrayInitialize(ms, 0);
  GetTradeSignal(ms);
  if (ExistPositions("", -1, Magic)) {
    if (ms[1]>0) ClosePositions("", OP_BUY , Magic);
    if (ms[1]<0) ClosePositions("", OP_SELL, Magic);
  } else {
    if (ms[0]>0) {
      if (StopLoss>0) sl=Ask-StopLoss*Point; else sl=0;
      if (TakeProfit>0) tp=Ask+TakeProfit*Point; else tp=0;
      OpenPosition(OP_BUY, sl, tp, Magic);
    }
    if (ms[0]<0) {
      if (StopLoss>0) sl=Bid+StopLoss*Point; else sl=0;
      if (TakeProfit>0) tp=Bid-TakeProfit*Point; else tp=0;
      OpenPosition(OP_SELL, sl, tp, Magic);
    }
  }
}
Как видите, написаны функции, выполняющие вполне конкретные действия. А потом эти функции соединяются таким образом, чтобы реализовать нужную тактику работы с позициями.
Пож., Игорь, в двух словах , чуть подробнее опишите ваш функционал. Хочется вникнуть , а вследствие скромных знаний теряю мысль уже с самого начала.
 
rid писал (а):
Пож., Игорь, в двух словах , чуть подробнее опишите ваш функционал. Хочется вникнуть , а вследствие скромных знаний теряю мысль уже с самого начала.

Это был пример, выдернутый из работающего эксперта. Назначение функций:

  1. Функция GetTradeSignal() заполняет массив ms[] торговыми сигналами. В каждом эксперте начинка функции GetTradeSignal(), естественно, своя.
  2. Функция ExistPositions() возвращает флаг наличия позиции.
  3. Функция ClosePositions() закрывает одну или несколько позиций при наличии соответствующего сигнала в массиве ms[]. Перед закрытием проверяется наличие позиции условием if (ExistPositions("", -1, Magic)).
  4. Функция OpenPosition() открывает одну позицию по текущей цене при наличии соответствующего сигнала в массиве ms[]. Позиция может быть открыта только при отсутствии оной.

Тактика:

  1. Если есть позиции и есть сигнал на закрытие, то закрыть позиции.
  2. Если нет позиций и есть сигнал на открытие, то открыть позиции.

Видите, как всё просто? :-)

 
Да, спасибо. Попробую разобраться.
 

Всем привет! С наступающим рождеством!

Очередная проблема подошла вот. Полистал теор. часть, но выхода пока не нашёл. По ряду причин мне необходимо закрывать в советнике открытые позиции не стопами (стоплосс и тейкпрофит), а функцией . Сделал. Заработало! Однако...

При попытке вставить в эксперт библиотеку расчета лотов (B-lots) обнаружилось, что эксперт стал работать непонятно как! Если без ММ кривая баланса (после оптимизации) уверенно шла вверх с мизерной Просадкой, то после включения ММ - резкий слив! Более того! Даже если убрать из кода библиотеку B-lots, И просто увеличить размер лота с 0.1 до 0.2, то опять идет резкий слив. Даже при увеличении исходного депозита в неск. раз .... Т.е. не в библиотеке и не в размере депозита дело - просадка то, изначально мизерная... . В рынок вхожу вот так:

//---------------ПОКУПАЕМ ------------------------------------------
... ... ...
if (Long)    {  //выключатель вкл   
if (!ExpertOrder( MagicLong ))     {//если  нет открытых длинных позиций 
 
    //Lots=GetSizeLot(); 
    ticket = OrderSend(Symbol(),OP_BUY,Lots,Ask,3,0,0,"",MagicLong,0,Blue); 
    if(ticket<0){Print("Ошибка открытия ордера BUY #",GetLastError());return(0);}
              }
              }
Здесь все ясно и понятно. Далее закрываю позиции функцией OrderClose(. .. Вот таким образом:
for (int v=0; v<OrdersTotal(); v++)               { 
 // for ( int v = OrdersTotal() - 1; v >= 0; v -- ){      
      if (OrderSelect(v, SELECT_BY_POS, MODE_TRADES))  {           
        if (OrderSymbol()==Symbol() )                   { 
//-----------------------------------------------------             
if (ExpertOrder( MagicLong ))  {
  if(OrderProfit() > tp)   { OrderClose(OrderTicket(),OrderLots(),Bid,3,Green); return(0);}
  if(OrderProfit() <= -sl) { OrderClose(OrderTicket(),OrderLots(),Ask,3,Green); return(0);}
                               }
}}}
При заданном изначально лоте=0.1 конструкция работает нормально! При попытке изменить размер лота (увеличить) или при попытке включть библиотеку ММ - работа нарушается! Не могу разобраться, - почему? Вместо OrderLots() подставлял просто "Lots", но ничего не изменилось. ... Пож., подскажите.?
 
rid:
При заданном изначально лоте=0.1 конструкция работает нормально! При попытке изменить размер лота (увеличить) или при попытке включть библиотеку ММ - работа нарушается! Не могу разобраться, - почему? Вместо OrderLots() подставлял просто "Lots", но ничего не изменилось. ... Пож., подскажите.?
Надо смотреть чем отличаются действия эксперта.
Ордера открываются/закрываются в то же время что и раньше?
 

Нет. При увеличении лота с 0.1 до 0.2-х сделки начинают происходить чаще, более, чем в 2 раза ! При тех же внешних параметрах... Странно. Но вот не поленился! Сделал так:

Убрал закрытие позиций функцией OrderClose и предусмотрел нормальное закрытие по стоплоссу и тейкпрофиту в функции ticket=OrderSend(... ... ...) . В этом случае блок ММ заработал так , как ему и положено! Видно всё дело именно в функции

if(OrderProfit() > tp)    { OrderClose(OrderTicket(),OrderLots(),Ask,3,Green);  }
Может быть при увеличении лота нужно соответственно изменять значение "tp" ?
 
Будем тыкать пальцем в небо? ;)

Ошибка - в коде. Где - не знаю, т.к. даже кода нет. Призываем ясновидцев из соседней ветки ;)
Причина обращения: