[ВНИМАНИЕ, ТЕМА ЗАКРЫТА!] Любой вопрос новичка, чтоб не захламлять форум. Профи, не проходите мимо. Без вас никуда. - страница 842

 
у вас модификация ордера стоит в том же блоке, что и открытие, а его условие - нет ордеров. Получается, вы только открыли ордер, и сразу же пытаетесь его модифицировать - а профит-то 5 пп откуда возьмется?
 

Всем привет! Недавно заинтересовался скользящими средними. Нашёл некую комбинацию мувингов и условий для торговли, решил проверить мою ТС, профитная она или нет, если что оптимизировать её. Но советник написанный мною при тестировании не открывает сделки. Весь вечер мучился и не найдя решения решил спросить у вас, уважаемые программисты. Что бы понять, как работает советник кратко объясню мою ТС: на графике  EMA(13) и EMA(55), если бар пересёк EMA(13) и все последующие бары были выше/ниже EMA(13), то при соприкосновении цены с MA(13) открываем позицию в сторону в которой находились предыдущие бары(после пересечения + не менее 9 и не более 23). Тейк-профит 60 пунктов, стоп-лосс = EMA(55) плюс минус пять пунктов. Вот собственно вся стратегия. Для большей наглядности выложил пример:

 

А вот код советника:

//+------------------------------------------------------------------+
//|                                                          DWM.mq4 |
//|                                 Copyright © 2010, Bobkov Vasiliy |
//|                                          http://www.forex4you.ru |
//+------------------------------------------------------------------+
#property copyright "Copyright © 2010, Bobkov Vasiliy"
#property link      "http://mql4.com"
extern double Lot=0.1;
extern int FastMA=13;         //Быстрая МА
extern int SlowMA=54;         //МедленнаяМА
extern int TP=60;             //Тейк профит
extern int MinBars=8;         //Минимальное кол-во баров вне МА
extern int MaxBars=25;        //Максимальное кол-во баров вне МА
extern int slippage=3;        //Слипадж
extern int Magic=347586;      //Магическое число
extern int Space=10;          //Отступ от МА при тралле ордеров

//+------------------------------------------------------------------+
//| expert initialization function                                   |
//+------------------------------------------------------------------+
int init()
  {
//----
   
//----
   return(0);
  }
//+------------------------------------------------------------------+
//| expert deinitialization function                                 |
//+------------------------------------------------------------------+
int deinit()
  {
//----
   
//----
   return(0);
  }
//+------------------------------------------------------------------+
//| expert start function                                            |
//+------------------------------------------------------------------+
int start()
  {
//----
if (OrderCheck()==true)                                        //Проверяем, есть ли ордер...
   {                                                           //...если ордер есть...
   Trall();                                                    //Траллим
   return (0);
   }
else                                                           //...если нет открытых позиций то...
   {
   double FMA=MA(0);
   double SMA=iMA(NULL,0,SlowMA,0,MODE_EMA,PRICE_CLOSE,0);
   for (int x=1;;x++)                                          //Вычесляем сколько баров вне МА...
      {
      if (MA(x)<High[x]&& MA(x)>Low[x]) break;
      }
   if (Bid==FMA && x>MinBars && x<MaxBars)                     //Если условия выполняются, то...
      {
      if (FMA>SMA ) OrdOpen(0,SMA);                            //...открывем сделку на покупку
      if (FMA<SMA) OrdOpen(1,SMA);                             //...или на продажу
      }
   }   
//----
   return(0);
  }
//+------------------------------------------------------------------+

bool OrderCheck()                                              //Функция проверки позиций
   {
   for(int i=1;i<=OrdersTotal();i++)
      {
      if (OrderSelect(i,SELECT_BY_POS,MODE_TRADES))
         {
         if (OrderSymbol()==Symbol() && OrderMagicNumber()==Magic) return(true);
         }
      else
         Print("OrderSelect() вернул ошибку - ",GetLastError());
          
      }
    return(false);
   }

void OrdOpen(int type,double SO)                               //Функция открытия позиций
   {
   if (type==0) 
      {
      if (OrderSend(Symbol(),0,Lot,Ask,slippage,SO-Space*Point,Ask+TP*Point,NULL,Magic,0,Blue)==true) return;
      else Print("OrderSend() вернул ошибку - ",GetLastError());
      }
   else 
      {
      if (OrderSend(Symbol(),0,Lot,Bid,slippage,SO+Space*Point,Bid-TP*Point,NULL,Magic,0,Blue)==true) return;
      else Print("OrderSend() вернул ошибку - ",GetLastError());
      }
   return;
   }
   
void Trall()                                                    //Трейллинг стоп
   {
   if (OrderSelect(Magic,SELECT_BY_TICKET)==true)
      {
      double SL=iMA(NULL,0,SlowMA,0,MODE_EMA,PRICE_CLOSE,0);
      if (Bid<iMA(NULL,0,SlowMA,0,MODE_EMA,PRICE_CLOSE,0)) SL=SL+Space*Point;
      else SL=SL-Space*Point;
      if (OrderModify(OrderTicket(),OrderOpenPrice(),NormalizeDouble(SL,Digits),OrderTakeProfit(),0,Blue)==true) return;
      else Print("OrderModify() вернул ошибку - ",GetLastError());
      }
   return;
   }
double MA(int m)                                                  //Функция возвращающая значение МА
   {
   return(iMA(NULL,0,FastMA,m,MODE_EMA,PRICE_CLOSE,0));
   }

Если кто может помогите пожалуйста. Так же выкладываю сам советник

Файлы:
dwm.mq4  5 kb
 

В одном for-цикле может быть собрано множество функций для открытия, изменения, закрытия позиций и т.п.

Вот простой Пример:

            bool Ans=OrderModify(Ticket,Price,SL,TP,0);
            if (Ans==true) {
               Alert ("Ордер ",Text,Ticket," модифицирован:)");
               break;                           // Из цикла модифи.
            }

- Вопрос: правильно ли здесь использовать "break", а не "return"? Есть ли различие?

 
chief2000:

В одном for-цикле может быть собрано множество функций для открытия, изменения, закрытия позиций и т.п.

Вот простой Пример:

- Вопрос: правильно ли здесь использовать "break", а не "return"? Есть ли различие?

Из https://docs.mql4.com/ru/basis/operators/break:
"Оператор break прекращает выполнение ближайшего вложенного внешнего оператора switch, while или for. Управление передается оператору, следующему за заканчиваемым."

Из https://docs.mql4.com/ru/basis/operators/return:
"Оператор return прекращает выполнение текущей функции и возвращает управление вызвавшей программе."

Ответ: правильно здесь использовать "break".

 
abolk:

Из https://docs.mql4.com/ru/basis/operators/break:
"Оператор break прекращает выполнение ближайшего вложенного внешнего оператора switch, while или for. Управление передается оператору, следующему за заканчиваемым."

Из https://docs.mql4.com/ru/basis/operators/return:
"Оператор return прекращает выполнение текущей функции и возвращает управление вызвавшей программе."

Ответ: правильно здесь использовать "break".

Я в общем-то и сам использую break, но подумал что return означает смену тика (а break - нет).

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

необходимо использовать return. Верно?

Может я ошибаюсь, но хотелось бы разобраться.

 
chief2000:

Я в общем-то и сам использую break, но подумал что return означает смену тика (а break - нет).

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

необходимо использовать return. Верно?

Может я ошибаюсь, но хотелось бы разобраться.

Читаем в документации: "Оператор return прекращает выполнение текущей функции и возвращает управление вызвавшей программе."

Если текущая функция start(), то опять же читаем в документации:

https://docs.mql4.com/ru/runtime/start
"При поступлении новых котировок выполняется функция start() у присоединенных советников и пользовательских индикаторов. Если при поступлении новой котировки выполнялась функция start(), запущенная на предыдущей котировке, то пришедшая котировка будет проигнорирована советником. Все пришедшие во время выполнения программы новые котировки программой игнорируются до тех пор, пока не завершится очередное выполнение функции start(). После этого функция start() будет запущена только после прихода очередной новой котировки."

 
abolk:

Читаем в документации: "Оператор return прекращает выполнение текущей функции и возвращает управление вызвавшей программе."

Если текущая функция start(), то опять же читаем в документации:

https://docs.mql4.com/ru/runtime/start
"При поступлении новых котировок выполняется функция start() у присоединенных советников и пользовательских индикаторов. Если при поступлении новой котировки выполнялась функция start(), запущенная на предыдущей котировке, то пришедшая котировка будет проигнорирована советником. Все пришедшие во время выполнения программы новые котировки программой игнорируются до тех пор, пока не завершится очередное выполнение функции start(). После этого функция start() будет запущена только после прихода очередной новой котировки."

Лучше бы Вы своими словами написали.. Не понял что Вы имели в виду.

В тестере, если происходит завершение for при помощи break, а за ним следует какая-то другая функция, то она будет исполнена на том же тике. Но в реале за это время (пока модифицируется ордер) может смениться несколько тиков. Поэтому я думаю что return отражает более реальное поведение. Разве нет?

 
chief2000:

Лучше бы Вы своими словами написали.. Не понял что Вы имели в виду.

Если происходит завершение for при помощи break, а за ним следует какая-то другая функция, то она будет исполнена на том же тике. Но в реале за это время (пока модифицируется ордер) может смениться несколько тиков. Поэтому я думаю что return отражает более реальное поведение. Разве нет?


start() начинает работать с началом тика и её работа может к началу следующего тика и не завершится.

break завершает for, return завершает функцию. Если после for операторов нет, то разницы применения for и return для данного алгоритма нет.

НО каждый оператор имеет своё назначение. И нецелевое использование оператора - это как незаряженное ружьё.

Опять же, по алгоритму в цикле for, по каким то соображениям, нет необходимости продолжать выполнение функции, тогда можно использовать return.

Другими словами, если по алгоритму надо прервать цикл, то ставится break, даже, если после цикла всё равно завершается функция.

 
abolk:


start() начинает работать с началом тика и её работа может к началу следующего тика и не завершится.

break завершает for, return завершает функцию. Если после for операторов нет, то разницы применения for и return для данного алгоритма нет.

НО каждый оператор имеет своё назначение. И нецелевое использование оператора - это как незаряженное ружьё.

Опять же, по алгоритму в цикле for, по каким то соображениям, нет необходимости продолжать выполнение функции, тогда можно использовать return.

Другими словами, если по алгоритму надо прервать цикл, то ставится break, даже, если после цикла всё равно завершается функция.

Пришла мысль - поскольку все это затевалось только для тестера, то можно (там где надо) сделать следующее:

if(IsTesting()==true   ||   IsOptimization()==true) {
   return;
}

break;

Спасибо!

 
chief2000:

Пришла мысль - поскольку все это затевалось только для тестера, то можно (там где надо) сделать следующее:

Спасибо!


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