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

 
IgorM:

оператор for без параметра? - смысл? вечные циклы пишутся не так, и второе есть переменные глобальные для советника - не для терминала, они описываются в самом начале кода до всех функций и функции start() в том числе, как у Вас написано - при каждом тике вызовется функция start() Вы flagchange = false; а потом пытаетесь этот флаг сравнить с прошлым состоянием, но его состояние всегда будет false

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


Vinin
А с какой целью советник зациклен?

То-есть функция start() выполняется при каждом тике? Тогда цикл и вправду не нужен.

 

MarkTrade:

 То-есть функция start() выполняется при каждом тике? Тогда цикл и вправду не нужен. 

https://book.mql4.com/ru/programm/special
 

Интересно девки пляшут... встали хором и поют...

Тестировал-тестировал, на основании полученных результатов добавлял/изменял функции/условия/данные, добился более-менее неплохих результатов по прибыльности и просадкам... без оптимизации. Перезагрузил всю историю и начался слив, нет - Слив, даже нет - Большой Слив...

Если до перезагрузки истории котировок (у меня была до тестирования предварительно загружена вся история по EURUSD, так, на всякий случай перезагрузил её, да с 2010 года почему-то ошибки были в качестве моделирования...)... так вот, до перезагрузки истории советник спокойно, ну почти спокойно выдерживал различные бэк-, форвард-тесты, удачно торговал на трёхлетней истории, а сразу после перезагрузки котировок начал выдавать конкретные просадки по два-три раза в месяц и не вытягивает больше двух-трёх месяцев с начала теста... Условий никаких не менял, только саму историю...

Получается, что на сервере история переписывается? Как испокон веков в СССР?

А смысл тогда во всём этом???

 
artmedia70:

Интересно девки пляшут... встали хором и поют...

Тестировал-тестировал, на основании полученных результатов добавлял/изменял функции/условия/данные, добился более-менее неплохих результатов по прибыльности и просадкам... без оптимизации. Перезагрузил всю историю и начался слив, нет - Слив, даже нет - Большой Слив...

Если до перезагрузки истории котировок (у меня была до тестирования предварительно загружена вся история по EURUSD, так, на всякий случай перезагрузил её, да с 2010 года почему-то ошибки были в качестве моделирования...)... так вот, до перезагрузки истории советник спокойно, ну почти спокойно выдерживал различные бэк-, форвард-тесты, удачно торговал на трёхлетней истории, а сразу после перезагрузки котировок начал выдавать конкретные просадки по два-три раза в месяц и не вытягивает больше двух-трёх месяцев с начала теста... Условий никаких не менял, только саму историю...

Получается, что на сервере история переписывается? Как испокон веков в СССР?

А смысл тогда во всём этом???

Ничего не переписывается - на своих Советниках проверял множество раз - в равных условиях результаты идентичны.Если ваш МТ до сих пор не отключен от сервера то самое время это сделать (и больше не подключать без надобности) - при каждом запуске тестера или оптимизации МТ получает спред (и т.д.) с сервера. Значит, когда спред 1 пипс все будет супер-замечательно, но если в другой раз он увеличится до 4-5 - Советник вероятно начнет сливать. Естественно, лучше оптимизировать при худших условиях, т.к. они более вероятны в реальной торговле.

 

Вот немного переделал.

глобальные переменные (в самом начале, под #property link )
bool flagchange = false;
bool PrevFlag = false;
bool flag = false; 

int start()
  {
   //---вход в позицию
   //int    spread=MarketInfo("EURUSD",MODE_SPREAD);
   int Slippage = 3;
   int i = 0;
   double lt = getLots() ; // минимальный лот
   RefreshRates();
   int total = OrdersTotal();   
   int ticket = -1;
      flag = GetEma();
        if (PrevFlag != flag) // проверим, сигнал ема изменился?
         {flagchange = true;      // изменился!
         PrevFlag = flag;}
        else flagchange = false;
        if (flagchange == True)
         {       
           int Total=OrdersTotal(); // есть открытые позиции?
           if(Total>0)
            {
              for(i=Total-1; i>=0; i--) 
              {
                if(OrderSelect(i, SELECT_BY_POS, MODE_TRADES)==true) 
                  {
                    if(OrderType()==OP_BUY || OrderType()==OP_SELL) // Только Buy и Sell
                     {
                       if(OrderType()==OP_BUY) 
                         bool Result=OrderClose(OrderTicket(),OrderLots(),Bid,Slippage,CLR_NONE);
                       else
                         Result=OrderClose(OrderTicket(),OrderLots(),Ask,Slippage,CLR_NONE);
                     if(Result!=true) 
                        {          
                          Print("LastError = ",GetLastError()); 
                         }              
                      }
                   }
                else 
                   if (flag ==true) OrderSend(Symbol(),OP_BUY,lt,Ask,Slippage,Bid - sl * Point,0,"Buy",888,0,Blue);
                   else OrderSend(Symbol(),OP_SELL,lt,Bid,Slippage,Ask + sl * Point,0,"Seel",888,0,Red);
              }
           }                                            
        }
     
   return(0);
  }
      //////////////////////////////////////////////////////
  bool GetEma() {
  //----Получим значение EMA1
      int ma1= iMA(Symbol(),PERIOD_H1,ema1,0,1,6,0);
  //----Получим значение EMA2   
      int ma2= iMA("",PERIOD_H1,ema2,0,1,6,0); 
      if (ma1>ma2) return (True);
      else return (False);}
   /////////////////////////////////////////////////////  
         // посчитаем разтер лота
   double getLots() 
        {
                double minlot = MarketInfo(Symbol(), MODE_MINLOT);
                 int round = MathAbs(MathLog(minlot) / MathLog(10.0)) + 0.5;
                 double lot = minlot;
//---- select lot size
                 lot = NormalizeDouble(AccountFreeMargin() * Risk / 1000.0, round);
                 if (AccountFreeMargin() < lot * MarketInfo(Symbol(), MODE_MARGINREQUIRED)) 
                        {
                                lot = NormalizeDouble(AccountFreeMargin() / MarketInfo(Symbol(), MODE_MARGINREQUIRED), round);
                        }
                 if(lot < minlot) lot = minlot;
                 double maxlot = MarketInfo(Symbol(), MODE_MAXLOT);
                 if(lot > maxlot) lot = maxlot;
//---- return lot size
   return(lot);
        }

Все равно не торгует :(

 
chief2000:

Ничего не переписывается - на своих Советниках проверял множество раз - в равных условиях результаты идентичны.Если ваш МТ до сих пор не отключен от сервера то самое время это сделать (и больше не подключать без надобности) - при каждом запуске тестера или оптимизации МТ получает спред (и т.д.) с сервера. Значит, когда спред 1 пипс все будет супер-замечательно, но если в другой раз он увеличится до 4-5 - Советник вероятно начнет сливать. Естественно, лучше оптимизировать при худших условиях, т.к. они более вероятны в реальной торговле.

Это-то всё ясно и давно понятно... НО сегодня суббота... Разве может сегодня меняться спред? Нет... Он сейчас наверное минимальный, т.е. лучшие условия... Ан-нет... Даже при любом спреде советник хорошо торговал... до перезагрузки истории.
 
artmedia70:
Это-то всё ясно и давно понятно... НО сегодня суббота... Разве может сегодня меняться спред? Нет... Он сейчас наверное минимальный, т.е. лучшие условия... Ан-нет... Даже при любом спреде советник хорошо торговал... до перезагрузки истории.
ну вот а если посмотреть ход торговли на графике, что изменилось?
 
Techno:
ну вот а если посмотреть ход торговли на графике, что изменилось?
Просадка эквити выросла многократно... Получается, что условий для открытия позиций стало больше. Он реально открывает больше позиций...
 
MarkTrade:

Вот немного переделал.

Все равно не торгует :(

наверно где то ошибка в условиях / логике
ввиду того что MetaEditor не имеет отладчика я делаю так:

добавьте в конце кода

Comment( "flag= ", flag, " PrevFlag=", PrevFlag, ......);

 return(0);

}

и в режиме визуализации в тестере на небольшой скорости посмотрите что у Вас изменяется, а что нет 

 
artmedia70:
Просадка эквити выросла многократно... Получается, что условий для открытия позиций стало больше. Он реально открывает больше позиций...
я имею в виду не график теста, а чарт котировок, примерно, какие изменения в открытиях, закрытиях?
Причина обращения: