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

 

Не пропускалась и я показывал. Четыре ордера открылись одновременно на разных парах с разными эксперт ай ди. Два бай и два селл.

И вообще вопрос зачем менять код если он работает?

 

Да и кстати Korey я уже много объяснял, что хочу увидеть. Я вообще понятно это сделал или косноязычно?

 
hope писал (а) >>

т.е. быстрая МА Weekly в тот период была выше медленой МА Weekly, что запрещало продажу по Н4 и согласно кода всё правильно, НО .

Теперь попробую сформулировать вопрос: КАК ДОЛЖЕН ВЫГЛЯДЕТЬ КОД ТРЕНДА weekly В УСЛОВИИ ПРОДАЖИ, ЧТОБЫ ВХОД ПО Н4 ОСУЩЕСТВЛЯЛСЯ НА ВСЁМ ПРОТЯЖЕНИИ ТРЕНДА?

т.е. можно ли закодировать тренд weekly, что ВОТ - ОН ЕСТЬ и на всём его протяжении Н4 должно продаваться?


получается - два варианта
-либо вход только по W1 = так и реализовано в советнике
-либо когда W1 и Н4 совпадают. ... этого в светнике сейчас нет.

из сигналов которые недельные

bool ISBUY     =  MAMainCurrentW<MASignalCurrentW && MACDMainCurrentW<0;
bool ISSELL    =  MAMainCurrentW>MASignalCurrentW && MACDMainCurrentW>0;
bool isWbuy    =  MAMainCurrentW>MASignalCurrentW && MACDMainCurrentW>0;// недельный бай
bool isWsell   =  MAMainCurrentW<MASignalCurrentW && MACDMainCurrentW<0;//sell of Week
получаем ситгналы W1&&H4
bool buyWH4     =  ISBUY &&  MAMainCurrentH4<MASignalCurrent4 && MACDMainCurrentH4<0;
 

Я потрясён. Я не понят. Я балбес который не может довести до людей словами, что он хочет. Куда уж тогда пытаться объяснить это машине програмным кодом.

Давай оставим в покое второй вариант с W1 и H4 - помоги хоть с первым, только W1.

Предположим у нас сегодня на календаре 2002.02.29 и я хочу открыть позицию. Запускаю советник (тот который у нас сейчас - только W1). Позиция не откроется. Не соответствуют условия: MACD>0, а МА мэйн < МА сигнальной. В этот момент советник должен начать проверять бары назад - до 2002.09.29 на совпадение условий для открытия - либо MACD<0 и МА мэйн < МА сигнальной тогда 2002.09.29 у нас откроется селл позиция, либо MACD>0 и МА мэйн > МА сигнальной и 2002.09.29 откроется бай позиция (что впрочем и должно произойти).

 

Пересечение существует только на одном баре, и его можно искать назад,
для этого при старте советника один раз ищем назад, а потом обновляем по текущему бару.

--
Однако, у вас используется условие выше/ниже, в отличие от пересечения это условие соблюдается на длинном отрезке, зачем искать назад?

 

"для этого при старте советника один раз ищем назад, а потом обновляем по текущему бару." - не понял фразу

Мне не нужно пересечение. Нужно совпадение двух условий, двух индикаторов. В частности использовать МА для фильтрации MACD и наоборот.

Вообще, Вам понятен смысл:

"Предположим у нас сегодня на календаре 2002.02.29 и я хочу открыть позицию. Запускаю советник (тот который у нас сейчас - только W1). Позиция не откроется. Не соответствуют условия: MACD>0, а МА мэйн < МА сигнальной. В этот момент советник должен начать проверять бары назад - до 2002.09.29 на совпадение условий для открытия - либо MACD<0 и МА мэйн < МА сигнальной тогда 2002.09.29 у нас откроется селл позиция, либо MACD>0 и МА мэйн > МА сигнальной и 2002.09.29 откроется бай позиция (что впрочем и должно произойти)."

?????

 

Сейчас:
условия для открытия бай были N баров назад. На нулевом баре условие не выполняются, сигналы вразхдрай, т.е. нельзя открывать
Вы хотите, два этапа:
1 . проверитьна 0 баре,
2 если на нулевом баре нельзя, (обнаружен раздрай), вернуться назад чтобы найти условие и все таки войти.

Это логически эквивалентно циклу назад от нуля на эн баров
выходим из цикла по первому найденному условию

extern int MaxOtkat=5;
      
      ......
      
      int j;
      
bool ISBUY     =  false; //предустановка для поиска в цикле
bool ISSELL    =  false;

      
      for(j=0;j<MaxOtkat; j++)
      {
double MAMainCurrentW=iMA(NULL,PERIOD_W1,13,0,MODE_SMA,PRICE_CLOSE,j);
double MASignalCurrentW=iMA(NULL,PERIOD_W1,21,0,MODE_SMA,PRICE_CLOSE,j);
double MACDMainCurrentW=iMACD(NULL,PERIOD_W1,12,26,9,PRICE_CLOSE,MODE_MAIN,j);
double MACDSignalCurrentW=iMACD(NULL,PERIOD_W1,12,26,9,PRICE_CLOSE,MODE_SIGNAL,j);
ISBUY     =  MAMainCurrentW<MASignalCurrentW && MACDMainCurrentW<0;
ISSELL    =  MAMainCurrentW>MASignalCurrentW && MACDMainCurrentW>0;

      if(ISBIY==true) break;
      if(ISSELL==true) break;
     }
    
    //здесь получаем один из входов за   MaxOtkat баров назад.
    // j = бару на котором найдено условие
    // проверятьотдельно нулевой бар ненужно, так как он проверятся в цикле.
 

Ура! Это то, что было нужно. Почти. Проявился побочный эффект.

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

double MAMainCurrentW=iMA(NULL,PERIOD_W1,13,0,MODE_SMA,PRICE_CLOSE,1);
double MASignalCurrentW=iMA(NULL,PERIOD_W1,21,0,MODE_SMA,PRICE_CLOSE,2);

double MACDMainCurrentW=iMACD(NULL,PERIOD_W1,12,26,9,PRICE_CLOSE,MODE_MAIN,1);
double MACDSignalCurrentW=iMACD(NULL,PERIOD_W1,12,26,9,PRICE_CLOSE,MODE_SIGNAL,2);

как можно решить ситуацию теперь, когда определение бара стало "плавающим"?

double MAMainCurrentW=iMA(NULL,PERIOD_W1,13,0,MODE_SMA,PRICE_CLOSE,j);
double MASignalCurrentW=iMA(NULL,PERIOD_W1,21,0,MODE_SMA,PRICE_CLOSE,j);
double MACDMainCurrentW=iMACD(NULL,PERIOD_W1,12,26,9,PRICE_CLOSE,MODE_MAIN,j);
double MACDSignalCurrentW=iMACD(NULL,PERIOD_W1,12,26,9,PRICE_CLOSE,MODE_SIGNAL,j);

 

И полный код

extern double Lots = 0.1;
extern int Expert_ID = 1;
extern int MaxOtkat=50;

//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
int start()


{

int j;

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

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

{
//Weekly data
double MAMainCurrentW=iMA(NULL,PERIOD_W1,13,0,MODE_SMA,PRICE_CLOSE,j);
double MASignalCurrentW=iMA(NULL,PERIOD_W1,21,0,MODE_SMA,PRICE_CLOSE,j);
double MACDMainCurrentW=iMACD(NULL,PERIOD_W1,12,26,9,PRICE_CLOSE,MODE_MAIN,j);
double MACDSignalCurrentW=iMACD(NULL,PERIOD_W1,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);

ISBUY     =  MAMainCurrentW>MASignalCurrentW && MACDMainCurrentW>0;
ISSELL    =  MAMainCurrentW<MASignalCurrentW && MACDMainCurrentW<0;
bool ISBUYCLOSE    =  MAMainCurrentW<MASignalCurrentW && MACDMainCurrentW<0;
bool ISSELLCLOSE   =  MAMainCurrentW>MASignalCurrentW && MACDMainCurrentW>0;

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

   int _GetLastError = 0, _OrdersTotal = OrdersTotal();
//---- перебираем все открытые позиции
      for ( int z = _OrdersTotal-1 ; 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)
                  {
                  //---- закрываем позицию
               if ( !OrderClose( OrderTicket(), OrderLots(), Bid, 0, Red ) )
                     {
                        _GetLastError = GetLastError();
                        Alert( "Ошибка OrderClose № ", _GetLastError );
                        return(-1);
                     }
                  }
//---- если сигнал не изменился, выходим - пока рано открывать новую позицию
                  else
                     { return(0); }
               }
//---- если открыта СЕЛЛ-позиция,
               if ( OrderType() == OP_SELL )
                     {
               //---- если условия закрытия СЕЛЛ,
               if (ISSELLCLOSE)
                  {
                  //---- закрываем позицию
                  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);
                  }
                  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);
                     }
                  return(0);
                  }
               return(0);
                  }
//the end
 

на нулевом баре индикатор бьется возле какого то значения и вызывает многократное срабатывание.
традиционный способ - ввeдение пороговго значения.
условие индиктаор больше нуля a> 0+porog
условие индиктаор меньше нуля a< 0-porog
внутри порога - ни кому и ни чему

--

без порога у нас логика либо вверх либо вниз
за счет введенеия порога получаем зону нечувствительности выше и ниже нуля
=== логика либо вверх, либо нет ничего либо вниз
MACD привязан к Digits инструмента.
порог можно задать так:

extern double  porogMACD=0.6;
double porog;
////

int init() { porog=NormalizeDouble(porogMACD*Point,Digits+2);}
........
ISBUY     =  MAMainCurrentW>MASignalCurrentW && MACDMainCurrentW>porog;
ISSELL    =  MAMainCurrentW<MASignalCurrentW && MACDMainCurrentW<-porog;
bool ISBUYCLOSE    =  MAMainCurrentW<MASignalCurrentW && MACDMainCurrentW<-porog;
bool ISSELLCLOSE   =  MAMainCurrentW>MASignalCurrentW && MACDMainCurrentW>porog;

......

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