Тренд старшего таймфрейма

 

Доброго времени суток.

Суть такова, что тренд определяется со старшего таймфрейма. Для определения тренда используются два сигнала: 1. Пересечение быстрой и медленной MA и 2. Пересечение MACD нулевой отметки. Смысл - в отсеивании ложных пересечений.

if (MAMainCurrentW<MASignalCurrentW && MACDMainCurrentW<0)
{
//---- открываем СЕЛЛ позицию
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);
}

Итак мы имеем тренд вниз на Weekly:

Далее ищем точки входа, допустим по Н4, по тем же услоиям т.е.: 1. Пересечение быстрой и медленной MA и 2. Пересечение MACD нулевой отметки, но только в направлении тренда Weekly. И вот какую бяку получаем:

На участке отмеченном стрелками не было продаж по условиям кода:

//---- если условия для продажи,
if (MAMainCurrentW<MASignalCurrentW && MACDMainCurrentW<0
&& MAMainCurrentH4<MASignalCurrentH4 && MACDMainCurrentH4<0)
{
//---- открываем СЕЛЛ позицию
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);
}

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

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

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

 

Возможно нужно задать вопрос по другому.

Подскажите, кто знает, как при задании условия открытия ордера обращаться не к текущему бару или несколько баров назад, а к действию, произошедшему ранее при стечении двух (или более) обстоятельств?

Может кому проще будет в самом коде пальцем ткнуть?

//+------------------------------------------------------------------+
//| GT |
//+------------------------------------------------------------------+

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

//+------------------------------------------------------------------+
//| |
//+------------------------------------------------------------------+
int start()
{
//Weekly data
double MAMainCurrentW=iMA(NULL,PERIOD_W1,13,0,MODE_SMA,PRICE_CLOSE,0);
double MASignalCurrentW=iMA(NULL,PERIOD_W1,21,0,MODE_SMA,PRICE_CLOSE,0);
double MACDMainCurrentW=iMACD(NULL,PERIOD_W1,12,26,9,PRICE_CLOSE,MODE_MAIN,0);
double MACDSignalCurrentW=iMACD(NULL,PERIOD_W1,12,26,9,PRICE_CLOSE,MODE_SIGNAL,0);
//H4 data
double MAMainCurrentH4=iMA(NULL,PERIOD_H4,13,0,MODE_SMA,PRICE_CLOSE,0);
double MASignalCurrentH4=iMA(NULL,PERIOD_H4,21,0,MODE_SMA,PRICE_CLOSE,0);
double MACDMainCurrentH4=iMACD(NULL,PERIOD_H4,12,26,9,PRICE_CLOSE,MODE_MAIN,0);
double MACDSignalCurrentH4=iMACD(NULL,PERIOD_H4,12,26,9,PRICE_CLOSE,MODE_SIGNAL,0);


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

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

//---- если условия для покупки,
if (MAMainCurrentW>MASignalCurrentW && MACDMainCurrentW>0
&& MAMainCurrentH4>MASignalCurrentH4 && MACDMainCurrentH4>0)
{
//---- открываем БАЙ позицию
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 (MAMainCurrentW<MASignalCurrentW && MACDMainCurrentW<0
&& MAMainCurrentH4<MASignalCurrentH4 && MACDMainCurrentH4<0)
{
//---- открываем СЕЛЛ позицию
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

 
Аффтор фёрст - сначала вы тыкните пальцем
т.е. поставьте в том месте где вам нужно такой комментарий: ЗДЕСЬ должно быт тот и то то, + вопрос - как это реализовать.
 

День добрый.

Наверное Korey прав и нужно спросить КАК это сделать с самого начала, без своих умозаключений.

Изначальная идея из учебника ТА - ищем тренд на старшем таймфрейме, а затем точки входа на младшем. Для поиска тренда используем пересечения основной и сигнальной МА Weekly и MACD Weekly с нулевой линией. Получаем программу:

//+------------------------------------------------------------------+
//| GT |
//+------------------------------------------------------------------+

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

//+------------------------------------------------------------------+
//| |
//+------------------------------------------------------------------+
int start()
{
//Weekly data
double MAMainCurrentW=iMA(NULL,PERIOD_W1,13,0,MODE_SMA,PRICE_CLOSE,0);
double MASignalCurrentW=iMA(NULL,PERIOD_W1,21,0,MODE_SMA,PRICE_CLOSE,0);
double MACDMainCurrentW=iMACD(NULL,PERIOD_W1,12,26,9,PRICE_CLOSE,MODE_MAIN,0);
double MACDSignalCurrentW=iMACD(NULL,PERIOD_W1,12,26,9,PRICE_CLOSE,MODE_SIGNAL,0);
//H4 data
double MAMainCurrentH4=iMA(NULL,PERIOD_H4,13,0,MODE_SMA,PRICE_CLOSE,0);
double MASignalCurrentH4=iMA(NULL,PERIOD_H4,21,0,MODE_SMA,PRICE_CLOSE,0);
double MACDMainCurrentH4=iMACD(NULL,PERIOD_H4,12,26,9,PRICE_CLOSE,MODE_MAIN,0);
double MACDSignalCurrentH4=iMACD(NULL,PERIOD_H4,12,26,9,PRICE_CLOSE,MODE_SIGNAL,0);


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

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

//---- если условия для покупки,
if (MAMainCurrentW>MASignalCurrentW && MACDMainCurrentW>0)
{
//---- открываем БАЙ позицию
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 (MAMainCurrentW<MASignalCurrentW && MACDMainCurrentW<0)
{
//---- открываем СЕЛЛ позицию
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

и её результат - опа "нашли " тренд:

Вопрос: как должен выглядеть код открытия позиций в период "тренда" weekly, от А до В, и условием открытия - основная МА Н4 пересекает сигнальную МА Н4 и MACD Н4 пересекает нулевую линию. Проблема с которой я столкнулся, что позиции не открываются в период С и D.

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

//+------------------------------------------------------------------+
//| |
//+------------------------------------------------------------------+
int start()
{
//Weekly data
double MAMainCurrentW=iMA(NULL,PERIOD_W1,13,0,MODE_SMA,PRICE_CLOSE,0);
double MASignalCurrentW=iMA(NULL,PERIOD_W1,21,0,MODE_SMA,PRICE_CLOSE,0);
double MACDMainCurrentW=iMACD(NULL,PERIOD_W1,12,26,9,PRICE_CLOSE,MODE_MAIN,0);
double MACDSignalCurrentW=iMACD(NULL,PERIOD_W1,12,26,9,PRICE_CLOSE,MODE_SIGNAL,0);
//H4 data
double MAMainCurrentH4=iMA(NULL,PERIOD_H4,13,0,MODE_SMA,PRICE_CLOSE,0);
double MASignalCurrentH4=iMA(NULL,PERIOD_H4,21,0,MODE_SMA,PRICE_CLOSE,0);
double MACDMainCurrentH4=iMACD(NULL,PERIOD_H4,12,26,9,PRICE_CLOSE,MODE_MAIN,0);
double MACDSignalCurrentH4=iMACD(NULL,PERIOD_H4,12,26,9,PRICE_CLOSE,MODE_SIGNAL,0);

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

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

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

//---- если условия для покупки,
            if (isWbuy)
               {
               //---- открываем БАЙ позицию
               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 (isWsell)
                  {
                  //---- открываем СЕЛЛ позицию
                  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

Тогда это вопрос относится к стилю программирования.
Большинство выложенных советников написаны безструктурно. Это как бы дань прошлому когда встроенные языки не были полными комиляторами.
т.е. код выписан последовательно без разбиения на функции,
и главное не используются логические переменные, условия проверяются по месту в виде громоздикх "формул".
такой стиль применялся еще в "древнем Риме".
и это же мешает реализовывать новые идеи, т.к. путает мышление - все в одну кучу.
Для перехода к структурному программировнаию
Первое что надо сделать - ввсе логические проверки цены оформить в виде булевских переменных.
голова прояснится и будет понятно куда и как вставлять условие от W1.
(замечание - логику проверки ордеров не трогаем)

=====после сбора логики в булевские перменные текст советника .
Видим:
1. авторская идея не реализована, т.к. недельные сигналы на открытие ордеров не влияют.
должно быть isWbuy&&ISBUY
2. имеются синтаксические ошибки: оператор continue пропускает все операторы до конца цикла. Это ошибка, здесь нужны скобки блока.

 

Во как! Особенно порадовало про "...стиль в "Древнем Риме". А в целом замечания приняты и на ус намотаны. Теперь, что мы имеем. У нас есть "тренд":

И хотим мы открыть позицию в направлении тренда 2002.09.29 (показано стрелочкой). Однако в этот день позиция, конечно, не откроется, а откроется она только 2002.11.10 по условиям кода:

Как так? Ведь на 2002.09.29 тренд вверх имеется! Условие открытия неправильное.

А должно быть по типу:

- запрос на 2002.09.29 - ответ тренда нет (не совпадают первое и второе условия (МА и MACD) для выявления тренда)

- смотрим бар перед этим - тоже нет

- бар перед этим - тоже нет

..........................................

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

Ха! Древнеримовский метод:

Прописать в начале double-ом штук надцать условий с разными сдвигами 0,1,2,3...относительно 1-го бара, а потом их все перебирать.

Посовременней мысль если не трудно.....плиз.

PS: Читал "Эксперты на основе популярных торговых систем и алхимия оптимизации торгового робота" - там примерно то, что в конечном итоге мне и нужно. А вот само определение тренда не одним, а двумя (тремя и более) индикаторами может быть рациональна?

 

Продолжаем:

- исправляем ошибки кода.
- собираем oкончательно все условия в одном месте.
- вставляем счетчик открытых ордеров.
получаем - как бы нижнюю часть советника в которую нет необходимости заглядывать (если отлажена)

- и далее работаем только с верзхней частью где условия.
замечание: условия я не проверял, а это как бы болванка.

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

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

int CountOpenBuy,CountOpenSell;
//Weekly data
double MAMainCurrentW=iMA(NULL,PERIOD_W1,13,0,MODE_SMA,PRICE_CLOSE,0);
double MASignalCurrentW=iMA(NULL,PERIOD_W1,21,0,MODE_SMA,PRICE_CLOSE,0);
double MACDMainCurrentW=iMACD(NULL,PERIOD_W1,12,26,9,PRICE_CLOSE,MODE_MAIN,0);
double MACDSignalCurrentW=iMACD(NULL,PERIOD_W1,12,26,9,PRICE_CLOSE,MODE_SIGNAL,0);
//H4 data
double MAMainCurrentH4=iMA(NULL,PERIOD_H4,13,0,MODE_SMA,PRICE_CLOSE,0);
double MASignalCurrentH4=iMA(NULL,PERIOD_H4,21,0,MODE_SMA,PRICE_CLOSE,0);
double MACDMainCurrentH4=iMACD(NULL,PERIOD_H4,12,26,9,PRICE_CLOSE,MODE_MAIN,0);
double MACDSignalCurrentH4=iMACD(NULL,PERIOD_H4,12,26,9,PRICE_CLOSE,MODE_SIGNAL,0);

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


bool openBuy=ISBUY; //здесь долно быть полное условие открытия && не закрытие
bool openSell=ISSELL;
bool closeBuy=ISSELL;//здесь должно быть полное условие закрытия
bool closeSell=ISBUY;

   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() ) 
           {
           if ( OrderMagicNumber() != Expert_ID ) 
            { 
            if ( OrderType() == OP_BUY )
               { CountOpenBuy+=1; // подсчитываем наши ордера бай
                     if (closeBuy) //---- закрываем позицию
                        {
                           if ( !OrderClose( OrderTicket(), OrderLots(), Bid, 0, Red ) )
                              {
                                 _GetLastError = GetLastError();
                                 Alert( "Ошибка OrderClose № ", _GetLastError );
                              }
                        }
               }
//---- если открыта СЕЛЛ-позиция,
               if ( OrderType() == OP_SELL )
                 {CountOpenSell+=1; //колво ордеров селл
               if (closeSell)//---- если условия закрытия СЕЛЛ,
                  {
                  //---- закрываем позицию
                  if ( !OrderClose( OrderTicket(), OrderLots(), Ask, 0, Red ) )
                        {
                        _GetLastError = GetLastError();
                        Alert( "Ошибка OrderClose № ", _GetLastError );
                        return(-1);
                        }
                     }
                  }
              
              
              }//magic
         }//symbol
      }//z
      
     //секция открытия ордеров 
      if(CountOpenBuy==0)
      {
      if(openBuy)
      {}
      
      }
      if(CountOpenSell==0)
      {     
      if(openSell)
      {}
      }
            
return(0);
}
 

Ликбез продолжается. Однако не приблизились к ответам на вопросы прошлого поста:

1.

"А должно быть по типу:

- запрос на 2002.09.29 - ответ тренда нет (не совпадают первое и второе условия (МА и MACD) для выявления тренда)

- смотрим бар перед этим - тоже нет

- бар перед этим - тоже нет

..........................................

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

Ха! Древнеримовский метод:

Прописать в начале double-ом штук надцать условий с разными сдвигами 0,1,2,3...относительно 1-го бара, а потом их все перебирать.

Посовременней мысль если не трудно.....плиз.

PS: Читал "Эксперты на основе популярных торговых систем и алхимия оптимизации торгового робота" - там примерно то, что в конечном итоге мне и нужно. А вот само определение тренда не одним, а двумя (тремя и более) индикаторами может быть рациональна?"

2.

Функции

//---- если позиция открыта не по текущему инструменту, пропускаем её
if ( OrderSymbol() != Symbol() ) continue; //ОШИБКА
//---- если MagicNumber не равен Expert_ID, пропускаем эту позицию
if ( OrderMagicNumber() != Expert_ID ) continue; //ОШИБКА
и до исправления работали стабильно позволяя разным советникам одновременно открывать лоты на разных валютных парах:

Ну да ладно - сказано люмний, значит люминий - пусть будут без continue и с фигурными скобками.

3.

И даже шаг назад. Код:

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

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

int CountOpenBuy,CountOpenSell;
//Weekly data
double MAMainCurrentW=iMA(NULL,PERIOD_W1,13,0,MODE_SMA,PRICE_CLOSE,0);
double MASignalCurrentW=iMA(NULL,PERIOD_W1,21,0,MODE_SMA,PRICE_CLOSE,0);
double MACDMainCurrentW=iMACD(NULL,PERIOD_W1,12,26,9,PRICE_CLOSE,MODE_MAIN,0);
double MACDSignalCurrentW=iMACD(NULL,PERIOD_W1,12,26,9,PRICE_CLOSE,MODE_SIGNAL,0);
//H4 data
double MAMainCurrentH4=iMA(NULL,PERIOD_H4,13,0,MODE_SMA,PRICE_CLOSE,0);
double MASignalCurrentH4=iMA(NULL,PERIOD_H4,21,0,MODE_SMA,PRICE_CLOSE,0);
double MACDMainCurrentH4=iMACD(NULL,PERIOD_H4,12,26,9,PRICE_CLOSE,MODE_MAIN,0);
double MACDSignalCurrentH4=iMACD(NULL,PERIOD_H4,12,26,9,PRICE_CLOSE,MODE_SIGNAL,0);

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


bool openBuy=isWbuy; //здесь долно быть полное условие открытия && не закрытие
bool openSell=isWsell;
bool closeBuy=ISBUY;//здесь должно быть полное условие закрытия
bool closeSell=ISSELL;

   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() ) 
           {
           if ( OrderMagicNumber() != Expert_ID ) 
            { 
            if ( OrderType() == OP_BUY )
               { CountOpenBuy+=1; // подсчитываем наши ордера бай
                     if (closeBuy) //---- закрываем позицию
                        {
                           if ( !OrderClose( OrderTicket(), OrderLots(), Bid, 0, Red ) )
                              {
                                 _GetLastError = GetLastError();
                                 Alert( "Ошибка OrderClose № ", _GetLastError );
                              }
                        }
               }
//---- если открыта СЕЛЛ-позиция,
               if ( OrderType() == OP_SELL )
                 {CountOpenSell+=1; //колво ордеров селл
               if (closeSell)//---- если условия закрытия СЕЛЛ,
                  {
                  //---- закрываем позицию
                  if ( !OrderClose( OrderTicket(), OrderLots(), Ask, 0, Red ) )
                        {
                        _GetLastError = GetLastError();
                        Alert( "Ошибка OrderClose № ", _GetLastError );
                        return(-1);
                        }
                     }
                  }
              
              
              }//magic
         }//symbol
      }//z
      
     //секция открытия ордеров 
      if(CountOpenBuy==0)
      {
      if(openBuy)
      {
      //---- открываем БАЙ позицию
               if ( OrderSend( Symbol(), OP_BUY, Lots, Ask, 0, 0, 0, "test", 
                  Expert_ID, 0, Blue ) < 0 )
                  {
                  _GetLastError = GetLastError();
                  Alert( "Ошибка OrderSend № ", _GetLastError );
                  return(-1);
                  }
                  return(0);
       }
      
      }
      if(CountOpenSell==0)
      {     
      if(openSell)
      {
      //---- открываем СЕЛЛ позицию
                  if ( OrderSend( Symbol(), OP_SELL, Lots, Bid, 0, 0, 0, "test", 
                     Expert_ID, 0, Green) < 0 )
                     {
                     _GetLastError = GetLastError();
                     Alert( "Ошибка OrderSend № ", _GetLastError );
                     return(-1);
                     }
                  return(0);
       }
      }
            
return(0);
}

выдаёт открытие позиций подряд на величину баланса и не закрытие их вообще.

 

чтобы решить главный вопрос нужно чтобы "ракета со старта ушла"
т.е. нужно чтобы советник правильно открывал и закрывал ордера, например по МА.

И только когда эта часть уверенно торгует и открывает не более одного ордера
двигаемся дальше - усложняем условия.
Иначе будет непонятно где исправлять))))

----

Итак, допустим советник работает по персечению МА - это тест.
- > Добавляем тренд со старшего тф
варианты
1. условие "в лоб" младший тф&& перeсечение старшего тф
здесь мы должны запоминать условие "пересечение старшего тф" в статической переменной или в глобальных и хранить его до следущего изменения.
2. условие по наклону = определяем наклон МА страшего тф.
3. условие по раскрытию - определяем угол между быстрой и медленной МА старшего тф.
4. взвешенное условие - в целеой функции суммируем с весами условия 2 и 3 + другие условия.

 

Что-то не моделируется ракета. Как раз после исправления

//---- если позиция открыта не по текущему инструменту, пропускаем её
if ( OrderSymbol() != Symbol() ) continue; //ОШИБКА

//---- если MagicNumber не равен Expert_ID, пропускаем эту позицию
if ( OrderMagicNumber() != Expert_ID ) continue; //ОШИБКА

на

//---- если позиция открыта не по текущему инструменту, пропускаем её
{if ( OrderSymbol() != Symbol() )
//---- если MagicNumber не равен Expert_ID, пропускаем эту позицию
{if ( OrderMagicNumber() != Expert_ID )

,,,,,,,,,,,,,,,,,,,,,,

}

}

и начинаются глюки с бесконтрольным открытием позиций.

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

//+------------------------------------------------------------------+
//| |
//+------------------------------------------------------------------+
int start()
{
//Weekly data
double MAMainCurrentW=iMA(NULL,PERIOD_W1,13,0,MODE_SMA,PRICE_CLOSE,0);
double MASignalCurrentW=iMA(NULL,PERIOD_W1,21,0,MODE_SMA,PRICE_CLOSE,0);
double MACDMainCurrentW=iMACD(NULL,PERIOD_W1,12,26,9,PRICE_CLOSE,MODE_MAIN,0);
double MACDSignalCurrentW=iMACD(NULL,PERIOD_W1,12,26,9,PRICE_CLOSE,MODE_SIGNAL,0);
//H4 data
double MAMainCurrentH4=iMA(NULL,PERIOD_H4,13,0,MODE_SMA,PRICE_CLOSE,0);
double MASignalCurrentH4=iMA(NULL,PERIOD_H4,21,0,MODE_SMA,PRICE_CLOSE,0);
double MACDMainCurrentH4=iMACD(NULL,PERIOD_H4,12,26,9,PRICE_CLOSE,MODE_MAIN,0);
double MACDSignalCurrentH4=iMACD(NULL,PERIOD_H4,12,26,9,PRICE_CLOSE,MODE_SIGNAL,0);

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

   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() )
            //---- если MagicNumber не равен Expert_ID, пропускаем эту позицию
            {if ( OrderMagicNumber() != Expert_ID )
//---- если открыта БАЙ-позиция,
            if ( OrderType() == OP_BUY )
               {
               //---- если условия закрытия БАЙ,
               if (ISBUY)
                  {
                  //---- закрываем позицию
               if ( !OrderClose( OrderTicket(), OrderLots(), Bid, 0, Red ) )
                     {
                        _GetLastError = GetLastError();
                        Alert( "Ошибка OrderClose № ", _GetLastError );
                        return(-1);
                     }
                  }
//---- если сигнал не изменился, выходим - пока рано открывать новую позицию
                  else
                     { return(0); }
               }
//---- если открыта СЕЛЛ-позиция,
               if ( OrderType() == OP_SELL )
                     {
               //---- если условия закрытия СЕЛЛ,
               if (ISSELL)
                  {
                  //---- закрываем позицию
                  if ( !OrderClose( OrderTicket(), OrderLots(), Ask, 0, Red ) )
                        {
                        _GetLastError = GetLastError();
                        Alert( "Ошибка OrderClose № ", _GetLastError );
                        return(-1);
                        }
                     }
//---- если сигнал не изменился, выходим - пока рано открывать новую позицию
else return(0);
}
}
}
}
//+------------------------------------------------------------------+
//| если выполнение дошло до этого места, значит открытой позиции нет
//| проверяем, есть ли возможность открыть позицию
//+------------------------------------------------------------------+

//---- если условия для покупки,
            if (isWbuy)
               {
               //---- открываем БАЙ позицию
               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 (isWsell)
                  {
                  //---- открываем СЕЛЛ позицию
                  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
 

извини слишком тоталитарно отнесся к коду.
Там же ! стояло то есть отрицание, значит правильно было.
Нужно было сопротивляться, отстаивать свой код))
а теперь с фигурными скобками, будет правильно если отрицание убрать,

{if ( OrderSymbol() != Symbol() )
            //---- если MagicNumber не равен Expert_ID, пропускаем эту позицию
            {if ( OrderMagicNumber() != Expert_ID )

убрать отрицание

P.S. С фигурными скобками лучше, т.к. по continue пропусчкалась проверка ордеров sell

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