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

 

Было и так у меня "<=", но значения Стохастика меняются оч. сильно с каждым даже тиком, - там в значении после запятой ещё четыре знака, т.е. на одном тике значения могут изменится от (например) 75.0003 до 74.0900.

А уж по ценам открытия и подавно.../Так что знак"=" можно без опасения пропустить. Но конечно, чтоб не думалось - пожалуй , сделаю.

 
Посмотрел эксперта - вроде бы все правильно. Проверить не смог - нет индикатора.
Попробуйте добавить Print перед OrderClose и посмотреть появляется ли сигнал закрытия.
 

Сделал. Добавил. Нет, .....ъ! Не появляется в журнале Надпись о закрытиии.

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

Не пойму ничего! Вставил этот блок в другой советник. И в третий. ... . Но ситуация не изменилась! Не закрываются позиции. Хотя редко-редко (один-два раза на истории =1год ) и промелькнет зелёный треугольничек закрытия на визуальном графике. Но не должно так быть! Позиции, судя по коду, должны закрываться, как у швейной машинке челнок!

B закачке - индикатор NOnLagMA

Файлы:
 

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

ticket=OrderSend(Symbol(),0,Lots,Ask,Slippage,Bid-SL_long*Point,Ask+TP_long*Point, NULL,MagicNum, 0,CLR_NONE);

И придеться с этим как то иначе бороться.

 
rid:

Не пойму ничего!

Блок закрытия позиций стоял внутри уловия "if (OrdersTotal() == 0)"
ВнимательнЕЕ надо ;)

Вот ф-ция start() проверочного варианта (без СЛ и ТП, с правильными сообщениями и без ненужного слипа):
int start()
  {
 
 if(Time[0] <= prevtime) 
       return(0);
 prevtime = Time[0];
  if (UseTrailing) TrailPositions();   
//----
   double NLg_Signal_0 =iCustom(NULL,0,"NonLagMA_v5",0,NLg_Signal,1,0,0,0,0,0,0); 
   double NLg_Signal_1 =iCustom(NULL,0,"NonLagMA_v5",0,NLg_Signal,1,0,0,0,0,0,1); 
   double NLg_long0    =iCustom(NULL,0,"NonLagMA_v5",0,NLg_buy,0,0,0,0,DV_buy,0,0);
   double NLg_short0   =iCustom(NULL,0,"NonLagMA_v5",0,NLg_sell,0,0,0,0,DV_sell,0,0);
 
  if (OrdersTotal()   == 0)//если нет открытых позиций
  { 
//---------проверяем условие на покупку-----------------      
       if   ( 
              (NLg_Signal_1<=NLg_long0)  &&
              (NLg_Signal_0>NLg_long0)  )
       { 
              ticket=OrderSend(Symbol(),OP_BUY,Lots,Ask,Slippage,0.0,0.0, NULL,MagicNum,0,CLR_NONE);
              if(ticket < 0)  { Print("Ошибка #", GetLastError(), " при открытии ордера BUY" ); prevtime = Time[1]; }
       }
    //---------проверяем условие на продажу----------------- 
         if  (   
              (NLg_Signal_1>=NLg_short0)  &&
              (NLg_Signal_0<NLg_short0)  )
       { 
              ticket=OrderSend(Symbol(),OP_SELL,Lots,Bid,Slippage,0.0,0.0, NULL,MagicNum,0,CLR_NONE);
              if(ticket < 0)  { Print("Ошибка #", GetLastError(), " при открытии ордера SELL" ); prevtime = Time[1]; }
       }
   }
//------------------------------------------------------------------
//********* Закрытие позиций ****************************************
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_ 
 //****************************************************************************   
   return(0);
      }



Но я на вашем месте не использовал бы этого эксперта на реальном счету. Его надо привести в порядок, или в "боевую готовность", если угодно ;)
 

Да, конечно. Благодарю вас за помощь! Ваше замечание о своей ошибке понял.

И принял к сведению ваши рекомендации. До реальной торговли ещё далеко...

p.s/ Всё заработало.... ! Да ещё как!

 
Прибыль при таком закрытии, понятно, не увеличивается. Но вот просадка..... Зачастую Снижается существенно.
 
komposter:
Код не смотрел.
Но одно исправил бы точно: вместо "if(Stochast_1>75 && Stochast_0<75)" сделал бы "if(Stochast_1>75 && Stochast_0<=75)".

А не лучше было бы: так: if(Stochast_1-75.0>0 && Stochast_0-75.0<=0) дабы избежать ненужных преобразований типов int и double.
 
А каким образом мы при этом избегаем ненужные int и double. ? Не соображу никак.  Тем более, что есть резон вместо чисел ввести в внешние параметры - extern int Up_lim = 80; extern int Low_lim = 20;
 
rid:
А каким образом мы при этом избегаем ненужные int и double. ? Не соображу никак. Тем более, что есть резон вместо чисел ввести в внешние параметры - extern int Up_lim = 80; extern int Low_lim = 20;

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

'Сравнение вещественных чисел'

Причина обращения: