Тренд старшего таймфрейма - страница 3

 
extern double Lots = 0.1;
extern int Expert_ID = 1;
extern int MaxOtkat=50;
extern double  porogMACD=0.6;
extern int PERIOD_Trend=PERIOD_D1;
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+

datetime TOpenBuy, TOpenSell;


double porog;
////

int init() { porog=NormalizeDouble(porogMACD*Point,Digits+2);}




int start()


{

int j;

bool ISBUY     =  false; //предустановка для поиска в цикле
bool ISSELL    =  false;

for(j=0;j<MaxOtkat;j++)

{
//Weekly data
double MAMainCurrentW=iMA(NULL,PERIOD_Trend,13,0,MODE_SMA,PRICE_CLOSE,j);
double MASignalCurrentW=iMA(NULL,PERIOD_Trend,21,0,MODE_SMA,PRICE_CLOSE,j);
double MACDMainCurrentW=iMACD(NULL,PERIOD_Trend,12,26,9,PRICE_CLOSE,MODE_MAIN,j);
double MACDSignalCurrentW=iMACD(NULL,PERIOD_Trend,12,26,9,PRICE_CLOSE,MODE_SIGNAL,j);
//H4 data

/*
double MAMainCurrentH4=iMA(NULL,PERIOD_H4,13,0,MODE_SMA,PRICE_CLOSE,j);
double MASignalCurrentH4=iMA(NULL,PERIOD_H4,21,0,MODE_SMA,PRICE_CLOSE,j);
double MACDMainCurrentH4=iMACD(NULL,PERIOD_H4,12,26,9,PRICE_CLOSE,MODE_MAIN,j);
double MACDSignalCurrentH4=iMACD(NULL,PERIOD_H4,12,26,9,PRICE_CLOSE,MODE_SIGNAL,j);
*/

bool MAtrendUp    =MAMainCurrentW>MASignalCurrentW;
bool MAtrendDn    =MAMainCurrentW<MASignalCurrentW;
bool MACDtrendUp  =MACDMainCurrentW>porog;
bool MACDtrendDn  =MACDMainCurrentW<-porog;

bool ISBUYCLOSE    =  MAtrendDn && MACDtrendDn;
bool ISSELLCLOSE   =  MAtrendUp && MACDtrendUp;


ISBUY     =  MAtrendUp && MACDtrendUp&&!ISBUYCLOSE;
ISSELL    =  MAtrendDn && MACDtrendDn&&!ISSELLCLOSE;

if(ISBUY==true) break;
if(ISSELL==true) break;
}






   int _GetLastError = 0, _OrdersTotal = OrdersTotal();
//---- перебираем все открытые позиции
      for ( int z = _OrdersTotal; z >0; z -- )
         {
            //---- если при выборе позиции возникла ошибка, переходим к следующей
         if ( !OrderSelect( z, SELECT_BY_POS ) )
            {
            _GetLastError = GetLastError();
            Print( "OrderSelect( ", z, ", SELECT_BY_POS ) - Error #", _GetLastError );
            continue;
            }

//---- если позиция открыта не по текущему инструменту, пропускаем её
            if ( OrderSymbol() != Symbol() ) continue; //ОШИБКА
            //---- если MagicNumber не равен Expert_ID, пропускаем эту позицию
            if ( OrderMagicNumber() != Expert_ID ) continue; //ОШИБКА
//---- если открыта БАЙ-позиция,
            if ( OrderType() == OP_BUY )
               {
               //---- если условия закрытия БАЙ,
               if (ISBUYCLOSE&&TOpenBuy!=Time[0])
                  {
                  
                  //---- закрываем позицию
               if ( !OrderClose( OrderTicket(), OrderLots(), Bid, 0, Red ) )
                     {
                        _GetLastError = GetLastError();
                        Alert( "Ошибка OrderClose № ", _GetLastError );
                        return(-1);
                     }
                  }
//---- если сигнал не изменился, выходим - пока рано открывать новую позицию
                  else
                     { return(0); }
               }
//---- если открыта СЕЛЛ-позиция,
               if ( OrderType() == OP_SELL )
                     {
               //---- если условия закрытия СЕЛЛ,
               if (ISSELLCLOSE&&TOpenSell!=Time[0])
                  {
                  //---- закрываем позицию
                  if ( !OrderClose( OrderTicket(), OrderLots(), Ask, 0, Red ) )
                        {
                        _GetLastError = GetLastError();
                        Alert( "Ошибка OrderClose № ", _GetLastError );
                        return(-1);
                        }
                     }
//---- если сигнал не изменился, выходим - пока рано открывать новую позицию
else return(0);
}
}

//+------------------------------------------------------------------+
//| если выполнение дошло до этого места, значит открытой позиции нет
//| проверяем, есть ли возможность открыть позицию
//+------------------------------------------------------------------+

//---- если условия для покупки,
            if (ISBUY)
               {
               //---- открываем БАЙ позицию
               if ( OrderSend( Symbol(), OP_BUY, Lots, Ask, 0, 0, 0, "MACD_test", 
                  Expert_ID, 0, Blue ) < 0 )
                  {
                  _GetLastError = GetLastError();
                  Alert( "Ошибка OrderSend № ", _GetLastError );
                  return(-1);
                  }
                  
                  TOpenBuy=Time[0];
                  return(0);
               }
//---- если условия для продажи,
               if (ISSELL)
                  {
                  //---- открываем СЕЛЛ позицию
                  if ( OrderSend( Symbol(), OP_SELL, Lots, Bid, 0, 0, 0, "MACD_test", 
                     Expert_ID, 0, Green) < 0 )
                     {
                     _GetLastError = GetLastError();
                     Alert( "Ошибка OrderSend № ", _GetLastError );
                     return(-1);
                     }
                  TOpenSell=Time[0];
                  return(0);
                  }
              
               return(0);
                  }

мельтешение типа "я из леса вышел и сразу зашел" введением порога не снимается.
==советник долбил по одному месту.
применяем метод "не закрывать на том же баре где открылись".

теперь число сделок реальное.
также исправлен цикл перебора OrderTotals() - поясняю если OrderTotals() дает ноль, то ордеров нет, значит нет ордера с позицией ==0;
иначе в логах будет мусор

 

М-да. Извините конечно, но эта такая фигня...

read 'Разработка торговых тактик для FOREX'

 
Mark33 писал (а) >>

М-да. Извините конечно, но эта такая фигня...

read 'Разработка торговых тактик для FOREX'

Стоит напомнить: великий русский писатель Лев Николaич Толстой...
прикалывался как из буковок складываются слова.
Шибко его сей процесс интересовал.