Что я прописал не так? - страница 2

 

Доброе утро!

Подскажите пожалуйста.

например у меня открыты 5 позиции в buy и  5 позиции в sell.

поступил сигнал  buy - чтобы 5 позиции закрылись 

а 5 позиции sell - ждали своего сигнала.

прописал так - не работает

//+------------------------------------------------------------------+
//| Check for long position closing                                  |
//+------------------------------------------------------------------+
bool CSampleExpert::CheckForClose(void)
  {
   bool res=false;
//--- refresh rates
   if(!m_symbol.RefreshRates())
      return(false);
//--- refresh indicators
   if(BarsCalculated(m_handle_macd)<2)
      return(false);
   if(CopyBuffer(m_handle_macd,MAIN_LINE,0,2,m_buff_MACD_main)    !=2 ||
      CopyBuffer(m_handle_macd,SIGNAL_LINE,0,2,m_buff_MACD_signal)!=2)
      return(false);
//   m_indicators.Refresh();
//--- to simplify the coding and speed up access
//--- data are put into internal variables
   m_macd_current   =m_buff_MACD_main[0];
   m_macd_previous  =m_buff_MACD_main[1];
   m_signal_current =m_buff_MACD_signal[0];
   m_signal_previous=m_buff_MACD_signal[1];
//--- positions already selected before
   bool MacdUp,MacdDn;
   bool signalBUY=false;
   bool signalSELL=false;
   long type=PositionGetInteger(POSITION_TYPE);

   for(int i=PositionsTotal()-1;i>=0;i--) // returns the number of current positions
      if(m_position.SelectByIndex(i))     // selects the position by index for further access to its properties
         if(m_position.Symbol()==m_symbol.Name() && m_position.Magic()==MACD_MAGIC)
           {
            MacdUp=m_macd_current<m_macd_previous;
            //---
            MacdDn=m_signal_current<m_signal_previous;
            //--- check for long position (SELL) possibility
            if(type==(long)POSITION_TYPE_SELL && (InpMacd && MacdDn))
               signalSELL=true;
            //--- check for short position (BUY) possibility
            if(type==(long)POSITION_TYPE_BUY && (InpMacd && MacdUp))
               signalBUY=true;
            //--- additional checking
            if(signalSELL)
              {
               if(TerminalInfoInteger(TERMINAL_TRADE_ALLOWED) && Bars(_Symbol,_Period)>100)
                  ClosePositions(POSITION_TYPE_SELL);
              }
            //--- additional checking
            if(signalBUY)
              {
               if(TerminalInfoInteger(TERMINAL_TRADE_ALLOWED) && Bars(_Symbol,_Period)>100)
                  ClosePositions(POSITION_TYPE_BUY);
              }
            //---
            res=true;
           }
//--- result
   return(res);
  }
//+------------------------------------------------------------------+
позицции открываю в ручную - а по индикатору что бы закрыть позицци 
Файлы:
hand_resting.mq5  128 kb
2.mq5  17 kb
 
Aleksandr Klapatyuk:

Доброе утро!

Подскажите пожалуйста.

например у меня открыты 5 позиции в buy и  5 позиции в sell.

поступил сигнал  buy - чтобы 5 позиции закрылись 

а 5 позиции sell - ждали своего сигнала.

прописал так - не работает

позицции открываю в ручную - а по индикатору что бы закрыть позицци 

1. Вы перед циклом делаете

   long type=PositionGetInteger(POSITION_TYPE);

   for(int i=PositionsTotal()-1;i>=0;i--) // returns the number of current positions

что это? К чему это привязать?

Это неправильно.

2. Очень нежелательно из цикла передавать выполнение на частичное удаление позиций (передача управления в ClosePositions).

3. Необходимо сменить логику работы советника: отделить мухи от котлет (отделить сигналы с индикатора с закрытием пачки однотипных позиций).

 
Vladimir Karputov:

Вы перед циклом делаете

что это? К чему это привязать?

Это неправильно.

думал что будет перебирать открытые позиции

 
Vladimir Karputov:

1. Вы перед циклом делаете

что это? К чему это привязать?

Это неправильно.

2. Очень нежелательно из цикла передавать выполнение на частичное удаление позиций (передача управления в ClosePositions).

3. Необходимо сменить логику работы советника: отделить мухи от котлет (отделить сигналы с индикатора с закрытием пачки однотипных позиций).

Так то в автоматическом с одной позицией работает.

а вот если открывать ещё и в ручную нет.

 

Например как делаю я (на примере MACD Opening and Closing Conditions)

в SearchTradingSignals() получаю сигнал на закрытие или BUY позиций или SELL позиций

   if(count_buys>0)
     {
      if(macd_main[0]>0.0)
         if(macd_main[0]<macd_signal[0])
            if(macd_main[1]>macd_signal[1])
               if(macd_main[0]>ExtMACDCloseLevel)
                  ExtNeedCloseBuy=true;
     }
   if(count_sells>0)
     {
      if(macd_main[0]<0.0)
         if(macd_main[0]>macd_signal[0])
            if(macd_main[1]<macd_signal[1])
               if(MathAbs(macd_main[0])>ExtMACDCloseLevel)
                  ExtNeedCloseSell=true;
     }


после этого (уже в OnTick()) в самом начале процедуры проверяю - есть ли сигнал на закрытие и если есть - закрываю пачку однотипных позиций

//+------------------------------------------------------------------+
//| Expert tick function                                             |
//+------------------------------------------------------------------+
void OnTick()
  {
   if(ExtNeedCloseBuy || ExtNeedCloseSell)
     {
      int count_buys = 0;  double volume_buys   = 0.0;   double volume_biggest_buys = 0.0;
      int count_sells= 0;  double volume_sells  = 0.0;   double volume_biggest_sells= 0.0;
      CalculateAllPositions(count_buys,volume_buys,volume_biggest_buys,
                            count_sells,volume_sells,volume_biggest_sells);
      if(ExtNeedCloseBuy)
        {
         if(count_buys>0)
           {
            double level;
            if(FreezeStopsLevels(level))
               ClosePositions(POSITION_TYPE_BUY,level);
            return;
           }
         else
            ExtNeedCloseBuy=false;
        }
      if(ExtNeedCloseSell)
        {
         if(count_sells>0)
           {
            double level;
            if(FreezeStopsLevels(level))
               ClosePositions(POSITION_TYPE_SELL,level);
            return;
           }
         else
            ExtNeedCloseSell=false;
        }
     }
 
Vladimir Karputov:

Например как делаю я (на примере MACD Opening and Closing Conditions)

в SearchTradingSignals() получаю сигнал на закрытие или BUY позиций или SELL позиций


после этого (уже в OnTick()) в самом начале процедуры проверяю - есть ли сигнал на закрытие и если есть - закрываю пачку однотипных позиций

Спасибо! буду сейчас переделывать. Хорошего вам дня! 

 
Aleksandr Klapatyuk:

Спасибо! буду сейчас переделывать. Хорошего вам дня! 

Можете взять целиком -

  • только во входных параметрах ставьте свой magic (в Вашем случае "0" - чтобы советник мог закрывать позиции открытые вручную) 
  • возможно перепишите условие сигналов на закрытие
  • удалите сигналы на ОТКРЫТИЕ новых позиций:

//+------------------------------------------------------------------+
//| Search trading signals                                           |
//+------------------------------------------------------------------+
bool SearchTradingSignals(void)
  {
   double ma[],macd_main[],macd_signal[];
   ArraySetAsSeries(ma,true);
   ArraySetAsSeries(macd_main,true);
   ArraySetAsSeries(macd_signal,true);
   int start_pos=0,count=3;
   if(!iGetArray(handle_iMA,0,start_pos,count,ma) || 
      !iGetArray(handle_iMACD,MAIN_LINE,start_pos,count,macd_main) || 
      !iGetArray(handle_iMACD,SIGNAL_LINE,start_pos,count,macd_signal))
     {
      return(false);
     }
//--- try to close position (position's)
   int count_buys = 0;  double volume_buys   = 0.0;   double volume_biggest_buys = 0.0;
   int count_sells= 0;  double volume_sells  = 0.0;   double volume_biggest_sells= 0.0;
   CalculateAllPositions(count_buys,volume_buys,volume_biggest_buys,
                         count_sells,volume_sells,volume_biggest_sells);
   if(count_buys>0)
     {
      if(macd_main[0]>0.0)
         if(macd_main[0]<macd_signal[0])
            if(macd_main[1]>macd_signal[1])
               if(macd_main[0]>ExtMACDCloseLevel)
                  ExtNeedCloseBuy=true;
     }
   if(count_sells>0)
     {
      if(macd_main[0]<0.0)
         if(macd_main[0]>macd_signal[0])
            if(macd_main[1]<macd_signal[1])
               if(MathAbs(macd_main[0])>ExtMACDCloseLevel)
                  ExtNeedCloseSell=true;
     }
/*
//--- check for position possibility
   int size_need_position=ArraySize(SNeedPosition);
   if(macd_main[0]<0.0)
      if(macd_main[0]>macd_signal[0])
         if(macd_main[1]<macd_signal[1])
            if(MathAbs(macd_main[0])>ExtMACDOpenLevel)
               if(ma[0]>ma[1])
                 {
                  ArrayResize(SNeedPosition,size_need_position+1);
                  SNeedPosition[size_need_position].pos_type=POSITION_TYPE_BUY;
                  return(true);
                 }
   if(macd_main[0]>0.0)
      if(macd_main[0]<macd_signal[0])
         if(macd_main[1]>macd_signal[1])
            if(macd_main[0]>ExtMACDOpenLevel)
               if(ma[0]<ma[1])
                 {
                  ArrayResize(SNeedPosition,size_need_position+1);
                  SNeedPosition[size_need_position].pos_type=POSITION_TYPE_SELL;
                  return(true);
                 }
*/
//---
   return(true);
  }
  • раз не будет открытия новых позиций - можно удалить всю логику связанную с открытием позиций
Совершение сделок - Торговые операции - MetaTrader 5
Совершение сделок - Торговые операции - MetaTrader 5
  • www.metatrader5.com
Торговая деятельность в платформе связана с формированием и отсылкой рыночных и отложенных ордеров для исполнения брокером, а также с управлением текущими позициями путем их модификации или закрытия. Платформа позволяет удобно просматривать торговую историю на счете, настраивать оповещения о событиях на рынке и многое другое. Открытие позиций...
 
Vladimir Karputov:

Можете взять целиком -

  • только во входных параметрах ставьте свой magic (в Вашем случае "0" - чтобы советник мог закрывать позиции открытые вручную) 
  • возможно перепишите условие сигналов на закрытие
  • удалите сигналы на ОТКРЫТИЕ новых позиций:

Спасибочко вам большое. время теперь сэкономлю.

 

Владимир. Огромное вам Спасибо!

Всё заработало! С помощью ваших кодов.

я немного изменил

//+------------------------------------------------------------------+
//| Check for long position closing                                  |
//+------------------------------------------------------------------+
bool CSampleExpert::CheckForClose(void)
  {
   bool res=false;
//--- refresh rates
   if(!m_symbol.RefreshRates())
      return(false);
//--- refresh indicators
   if(BarsCalculated(m_handle_macd)<2)
      return(false);
   if(CopyBuffer(m_handle_macd,MAIN_LINE,0,2,m_buff_MACD_main)    !=2 ||
      CopyBuffer(m_handle_macd,SIGNAL_LINE,0,2,m_buff_MACD_signal)!=2)
      return(false);
//   m_indicators.Refresh();
//--- to simplify the coding and speed up access
//--- data are put into internal variables
   m_macd_current   =m_buff_MACD_main[0];
   m_macd_previous  =m_buff_MACD_main[1];
   m_signal_current =m_buff_MACD_signal[0];
   m_signal_previous=m_buff_MACD_signal[1];
//--- positions already selected before
   bool MacdUp,MacdDn;
//--- try to close position (position's)
   int count_buys = 0;  double volume_buys   = 0.0;   double volume_biggest_buys = 0.0;
   int count_sells= 0;  double volume_sells  = 0.0;   double volume_biggest_sells= 0.0;
   CalculateAllPositions(count_buys,volume_buys,volume_biggest_buys,
                         count_sells,volume_sells,volume_biggest_sells);

   MacdUp=m_macd_current<m_macd_previous;
//---
   MacdDn=m_signal_current<m_signal_previous;

//--- check for long position (SELL) possibility
   if(count_sells>0)
     {
      if(MacdDn)
         ExtNeedCloseSell=true;
     }
//--- check for short position (BUY) possibility
   if(count_buys>0)
     {
      if(MacdUp)
         ExtNeedCloseBuy=true;
     }
//---
   if(ExtNeedCloseBuy || ExtNeedCloseSell)
     {
      if(ExtNeedCloseBuy)
        {
         if(count_buys>0)
           {
            double level;
            if(FreezeStopsLevels(level))
               ClosePositions(POSITION_TYPE_BUY,level);
            return(true);
           }
         else
            ExtNeedCloseBuy=false;
        }
      if(ExtNeedCloseSell)
        {
         if(count_sells>0)
           {
            double level;
            if(FreezeStopsLevels(level))
               ClosePositions(POSITION_TYPE_SELL,level);
            return(true);
           }
         else
            ExtNeedCloseSell=false;
        }
     }
//---
   res=true;
//--- result
   return(res);
  }
//+------------------------------------------------------------------+


 

 

почти добился- правда закрывает всё и buy и sell

закрывает всё

Файлы:
2.mq5  17 kb