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

 
goldtrader:

имхо во-первых, некорректно сравнивать вещественное Stochast_ и целое 75, во-вторых сравнивать правильнее их разность с нулём.

Думаю, в этой ситуации погрешность в 8-м знаке после запятой на результат не повлияет.
 

Очередная проблема встает с Блоком закрытия позиций. Вставил этот блок в свой любимый эксперт. Который открывает сделки только строго в направлении тренда (низкий поклон ему за это...)

Но в зависимости от силы тренда эксперт последовательно способен (и делает это!) открывать несколько сделок, - одну за другой!, - своего рода "антимартингейл". Именно здесь и нужен мне Блок закрытия позиций по сигналу индикатора. Но вот проблема!, - Когда и если открыто несколько пизиций по тренду и начинается коррекция против тренда, - то индикатор в Блоке закрытия дает сигнал - на закрытие. Как и мне нужно.

Однако, при этом, почему-то, закрываются вовсе не ВСЕ ОТКРЫТЫЕ позиции. А в основном, - только самая ранняя. Те же, что открылись позже не реагируют на сигнал закрытия, - а продолжают движение. И далее, - "история повторяется, как фарс"! С каждым сигналом закрытия, - закрывается только одна, - самая ранняя открытая позиция, а остальные продолжают движение! Лот всех позиций - постоянный.

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

Напоминаю код :

/********* Закрытие позиций ****************************************
if (AutoClose) {  
//----------------------------------------------------------------------
if (ExpertOrder(MagicLong)) {   //есть открытые ордера на покупку
      if(Stochast_1>=Up_lim && Stochast_0<Up_lim)     {
        OrderClose(OrderTicket(),OrderLots(),Bid,3,Green);//закрываем позицию
                 return(0); // выходим         
              }  }
 //--------------------------------------------------------
if (ExpertOrder(MagicShort)) {   //есть открытые ордера на продажу
      if(Stochast_1<=Low_lim && Stochast_0>Low_lim)    {
        OrderClose(OrderTicket(),OrderLots(),Ask,3,Green);//закрываем позицию
                 return(0); // выходим
              }  } 
 //-------------------------------------------------------                       
}  //if (AutoClose)
 
rid:

Очередная проблема встает с Блоком закрытия позиций...

А где цикл по OrdersTotal() ?
 
granit77:
А где цикл по OrdersTotal() ?
Он, даже если есть, от 0 до OrdersTotal()-1, а должен быть наоборот ;)
 

Нет, здесь нет этого. Ордера определяются - иначе:

//---------------------------------------------------------------------------------+
//---- Функция проверки наличия ордеров эксперта ----------------------------------+
//---------------------------------------------------------------------------------+
// false - ордеров данного эксперта нет;                                           |
// true  - есть ордера данного эксперта;                                           |
//---------------------------------------------------------------------------------+
bool ExpertOrder (int VersionID){
bool result=false;
int  _OrdersTotal=OrdersTotal();
if (_OrdersTotal>0) { for (int jk=0; jk<_OrdersTotal; jk++) {    
      if (OrderSelect(jk, SELECT_BY_POS, MODE_TRADES)) {
        if (OrderMagicNumber()==VersionID) 
          { result=true;  break; }//Найден ордер принадлежащий эксперту
        else  { result=false; } 
       } } } else { result=false; }  
//---------------------        
return(result);}

И такой вариант кода мне удобнее! Поскольку длинные и короткие позиции у меня - независимо друг от друга открываются.

//---------проверяем условие на покупку----------------------------
if (LONG) {     //если  "выключатель" включен
 if  ( ... ... ...      )
   {
  ticket=OrderSend(Symbol(),0,Lot,Ask,Slippage,Bid-SL*Point,
                                        Ask+TP*Point,NULL,MagicLong,0,CLR_NONE); 
 

Однако и при стандартном закрытии - всё равно такая же история. ...

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()==Magic)   { 
//-----------------------------------------------------                  
if (OrderType() == OP_BUY) { 
      if(Stochast_1>=Up_lim && Stochast_0<Up_lim)     {
         OrderClose(OrderTicket(),OrderLots(),Bid,3,Green); // закрываем позицию
                 return(0); // выходим         
              }       
             }  
 //--------------------------------------------------------
if (OrderType() == OP_SELL) { 
      if(Stochast_1<=Low_lim && Stochast_0>Low_lim)    {
               OrderClose(OrderTicket(),OrderLots(),Ask,3,Green); // закрываем позицию
                 return(0); // выходим       
              }       
             }  
 //-------------------------------------------------------                       
    }  // Symbol()  
  } // select
 } //total
} //Close_
 
rid:

Однако и при стандартном закрытии - всё равно такая же история. ...

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()==Magic)   { 
//-----------------------------------------------------                  
if (OrderType() == OP_BUY) { 
      if(Stochast_1>=Up_lim && Stochast_0<Up_lim)     {
         OrderClose(OrderTicket(),OrderLots(),Bid,3,Green); // закрываем позицию
                 return(0); // выходим         
              }       
             }  
 //--------------------------------------------------------
if (OrderType() == OP_SELL) { 
      if(Stochast_1<=Low_lim && Stochast_0>Low_lim)    {
               OrderClose(OrderTicket(),OrderLots(),Ask,3,Green); // закрываем позицию
                 return(0); // выходим       
              }       
             }  
 //-------------------------------------------------------                       
    }  // Symbol()  
  } // select
 } //total
} //Close_

А все таки, может попробовать делать цикл наоборот, от OrdersTotal до 0. Должно помочь.
 

А как это сделать? Напишите пож., если не очень обременительно. Вот кстати график - при вышепрведенном "стандартном": Всё тож самое - по сигналу индюка закрывается только одна позиция -

 
rid:

А как это сделать?

Если верить komposter'у и Vinin'у, то вместо:
for (int v=0; v<OrdersTotal(); v++)

написать:
for (int v=OrdersTotal()-1; v>0; v--)

У меня работает.
 
granit77:
rid:

А как это сделать?

Если верить komposter'у и Vinin'у, то вместо:
for (int v=0; v<OrdersTotal(); v++)

написать:
for (int v=OrdersTotal()-1; v>0; v--)

У меня работает.

Совершенно верно. Хотя у KimV есть скрипты и библиотеки  все это реализующие. Может стоит поискать.  И может быть на его форуме.