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

 

Добрый вечер! Встала проблема.

Мне нужно закрыть позицию. По сигналу индикатора. Кроме того. Нужно, чтобы позиция так же могла закрыться и по стоплоссу или по тейкпрофиту. (На тот случай, если сигнал индикатора сильно запоздает. - Часто и такое бывает) Я открываю позиции :

if                    (... ... ...  )         
   {
  ticket=OrderSend(Symbol(),0,Lot,Ask,Slippage,Bid-SL*Point,Ask+TP*Point,
                                               NULL,MAGIC ,0,CLR_NONE);

В дальнейшем, чтобы закрыть открытые позиции я предусматриваю:

for (int v=0; v<OrdersTotal(); v++)                          {       
      if (OrderSelect(v, SELECT_BY_POS, MODE_TRADES))             {           
        if (OrderSymbol()==Symbol()) && OrderMagicNumber()==MAGIC)   { 
//-----------------------------------------------------                  
if (OrderType() == OP_BUY)                   { 
      if (Stochast_1>75 &&  Stochast_0<75)     {
                   OrderClose(OrderTicket(),OrderLots(),Ask,3,Green); 
                 return(0); // выходим
                }       
               }   
 //--------------------------------------------------------
if (OrderType() == OP_SELL) { ... .... ....

Однако, позиции всё равно закрываются только по стоплоссу или тейкпрофиту. (за оч. редким - единичным исключением!)

Хотя по индикатору на графике видно - что почти все открытые позиции должны закрываться именно по сигналу индикатора. Пож. подскажите, - где здесь может быть ошибка... ?

 

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

//+----------------------------------------------------------------------------+
//|  Управление позициями                                                      |
//+----------------------------------------------------------------------------+
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);
    }
  }
}
Как видите, написаны функции, выполняющие вполне конкретные действия. А потом эти функции соединяются таким образом, чтобы реализовать нужную тактику работы с позициями.
 
наверно что-то со Stochast_1, Stochast_0, все остальное нормально
 
Благодарю, KIM IV. Попробую разобраться.
 
Integer:
наверно что-то со Stochast_1, Stochast_0, все остальное нормально


Да нет..... Со стохастиками - всё в порядке. (работа по ценам открытия)

double Stochast_0 =iStochastic(NULL,0,Stochastic_period,3,3,MODE_SMA,0,MODE_MAIN,0);
double Stochast_1 =iStochastic(NULL,0,Stochastic_period,3,3,MODE_SMA,0,MODE_MAIN,1);
 
Бай закрывается бидом. В данном случае закрытие срабатывает только в случае, если в потоке последних котировок случайно окажется котировка,  отличающаяся от указанной на спред. Если такая котировка ещё не успела (по старости) уйти из списка котировок, рассматриваемых брокером, то у приказа на закрытие есть шанс быть исполненным.
 

Я вас правильно понял? Позиция Бай должна закрываться

OrderClose(OrderTicket(),OrderLots(),Bid,3,Green);

А позиция Селл должна закрываться:

OrderClose(OrderTicket(),OrderLots(),Ask,3,Green);  ?
 
rid:

Я вас правильно понял?

В целом правильно.

 
Точно! Проблема в Ask
 

Всё равно не хотят позиции закрываться по стохастику! Оформил всё чин-чином! Во внешние параметры вставил выключатель. В конце кода - отдельно блок закрытия позиций! Закрытие предусмотрел зеленым треугольничком.

Тактика простая - пересечение быстрой МА границ канала, образованного медленными МА с отклонением вверх и вниз. Код простейший . Советник В закачке - ниже.

хотел выложить весь код - не принимет сервер! - пишет больше допустимого
//********* Закрытие позиций ****************************************
if (AutoClose) {  
//----переменные для закрытия позиций ----
double Stochast_0 =iStochastic(NULL,0,Stochastic_period,3,3,MODE_SMA,0,MODE_MAIN,0);
double Stochast_1 =iStochastic(NULL,0,Stochastic_period,3,3,MODE_SMA,0,MODE_MAIN,1);
//----------------------------------------------------------------------
  for (int v=0; v<OrdersTotal(); v++)                             {       
      if (OrderSelect(v, SELECT_BY_POS, MODE_TRADES))               {           
        if (OrderSymbol()==Symbol()&& OrderMagicNumber()==MagicNum)   { 
//-----------------------------------------------------                  
if (OrderType() == OP_BUY) { 
      if(Stochast_1>75 && Stochast_0<75)     {
           OrderClose(OrderTicket(),OrderLots(),Bid,3,Green); // закрываем позицию
                 return(0); // выходим
                }       
     }  
 //--------------------------------------------------------
if (OrderType() == OP_SELL) { 
      if(Stochast_1<25 && Stochast_0>25)    {
                 OrderClose(OrderTicket(),OrderLots(),Ask,3,Green); // закрываем позицию
                 return(0); // выходим
                }       
     }  
 //-------------------------------------------------------                       
    }  // Symbol()  
  } // select
 } //total
} //Close_

Мож. кто глянет? И подскажет в чём дело....

Возможно, при открытии ордеров неточно поставлены биги и аски? Всегда с этим путался :

ticket=OrderSend(Symbol(),... ....
Файлы:
 
Код не смотрел.
Но одно исправил бы точно: вместо "if(Stochast_1>75 && Stochast_0<75)" сделал бы "if(Stochast_1>75 && Stochast_0<=75)".
Причина обращения: