[Архив!] Любой вопрос новичка, чтоб не захламлять форум. Профи, не проходите мимо. Без вас никуда - 2. - страница 240

 
artmedia70:
И это все отличия, что смогли увидеть?
все, что увидел, т.к. остальные не смотрел, не удобно читать серый код
 
artmedia70:

Может так нужно? :

//===================================================================================
double CalculateProfit() 
{
   double ld_ret_0 = 0;
   for (int cnt = 0; cnt < OrdersTotal(); cnt++) {
      if (OrderSelect(cnt, SELECT_BY_POS, MODE_TRADES)) {
         if (OrderSymbol()!=Symbol())           continue;
         if (OrderType()>1)                     continue;
         if (OrderMagicNumber()==MagicNumber || 
             OrderMagicNumber() == LMagN)       ld_ret_0 += OrderProfit();
         }
      else if (!OrderSelect(cnt, SELECT_BY_POS, MODE_TRADES)) {
         Print ("Func: CalculateProfit(), Select Order Error = ", GetLastError());
         break;
         }
      }
   return (ld_ret_0);
}
//===================================================================================



Все работает отлично!!!!!!!!!!!
 

я правильно понимаю, что если в тестере оптимизировать три параметра bool, то он прогонит все 9 комбинаций их значений? т.е.

1) bool1=true, bool2=true, bool3=true,
2) bool1=true, bool2=true, bool3=false,
3) bool1=true, bool2=false, bool3=true,
4) bool1=true, bool2=false, bool3=false и т.д
 
eddy:

я правильно понимаю, что если в тестере оптимизировать три параметра bool, то он прогонит все 9 комбинаций их значений?...

Мне кажется, bool нельзя прогнать шагами при оптимизации. Я беру вместо него int и гоняю от 0 до 1.
 

ну без шагов. или там обязательно шаг надо ставить? я думал можно просто вставить bool и он прогонит варианты с true и с false.

ещё не пользовался оптимизацией никогда, вот знакомлюсь с темой

 
Попробуйте. У меня не получилось.
 
daytrader19:

Уважаемые коллеги, в плане MQL-программирования я ещё полный "чайник", начал изучать эту тему совсем недавно. Но уже начал писать свой первый советник, по крайней мере, пытаться.

На 182-й странице данного топика я изложил торговые критерии, по которым должен торговать этот советник. Пожалуйста, посмотрите, что там написано (последний пост на странице). Я уже недели три бьюсь и никак не могу написать тут часть кода, которая отвечает за торговые критерии. Главу в учебнике, посвященную этой теме я читал, но в данном конкретном случае мне это не помогло.

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

//+-------------------------------------------------------------------------------------+
//| Расчет значений технических индикаторов с формированием сигналов для позиций        |
//+-------------------------------------------------------------------------------------+
void GetSignal()
{
 Signal = 0;
// - 1 - == Получение значений индикаторов ==============================================
 double SAR = iSAR(Symbol(), 0, SARStep, SARMaximum, 0);
 double EnvUp = iEnvelopes(Symbol(), 0, EnvPeriod, EnvMethod, EnvShift, EnvPrice,
 EnvDeviation, MODE_UPPER, 1);
 double EnvDn = iEnvelopes(Symbol(), 0, EnvPeriod, EnvMethod, EnvShift, EnvPrice,
 EnvDeviation, MODE_LOWER, 1);
 double StochM = iStochastic(Symbol(), 0, StochK, StochD, StochSlowing, StochMethod,
 StochPrice, MODE_MAIN, 1);
 double StochS = iStochastic(Symbol(), 0, StochK, StochD, StochSlowing, StochMethod,
 StochPrice, MODE_SIGNAL, 1);
// - 1 - == Окончание блока =============================================================

// - 2 - == Генерация сигнала ===========================================================
 if (SAR < Low[1])
   {
    Signal = 3;                                                          // Закрытие SELL
    if (StochM > StochS && StochM >= 80 && StochS >= 80 && High[1] >= EnvUp && SAR < Open[1])
      Signal = 1;                                                         // Открытие BUY
   }   
 
 if (SAR > High[1])
   {
    Signal = 4;                                                           // Закрытие BUY
    if (StochM < StochS && StochM <= 20 && StochS <= 20 && Low[1] <= EnvDn && SAR > Open[1])
      Signal = 2;                                                        // Открытие SELL
   }   
// - 2 - == Окончание блока =============================================================
}

Я знаю, что код весь кривой, косой, и вообще позиции bay и sell перепутаны местами. Но это единственный вариант кода, когда Стохастик и Энвелопес торгуют совместно, не игнорируя друг друга. В тоже время, сигналы Параболика почему-то вообще не учитываются при торговле. В-общем, прошу не ругать меня сильно за такое "черезжопавство", я прекрасно понимаю, что код не правильный.

Помогите мне, пожалуйста, исправить код советника. У меня хронически не получается. Уже получилось реализовать парочку стратегий попроще (Мувинги + Моментум; Мувинги + RSI), но вот с этой никак не получается. Очень прошу помочь. Перепишите, пожалуйста, неправильные строки, чтобы советник торговал по тем правилам, что я описал на 182-й странице. Очень нужно.

P.S.: Код советника полностью выкладывать не стал, поскольку я использовал готовые MQL-шаблоны.

Кажется, я понял, в чём была моя главная (может она и не единственная) ошибка. Все условия в моих торговых критериях объедены логическим "и". На сколько я понимаю, это означает, что все условия должны выполняться одновременно. А по правилам системы это неправильно, сигналы Энвелопеса и Стохастика должны быть синхронными – это да. А вот Параболик должен подтверждать открытие сделки после получения сигналов от Энвелопеса и Стохастика. Бывает даже такое (и это вполне нормально), что он может выдавать подтверждение после 5-10 баров.

Вопрос: как это "после" заложить в коде? Если это возможно покажите, пожалуйста, на примере моего кода.
Очень прошу помочь. Я уже просто запарился с этими торговыми критериями.
 
eddy:

я правильно понимаю, что если в тестере оптимизировать три параметра bool, то он прогонит все 9 комбинаций их значений? т.е.


Два в третьей степени всегда было восемь :-)
 
daytrader19:

Кажется, я понял, в чём была моя главная (может она и не единственная) ошибка. Все условия в моих торговых критериях объедены логическим "и". На сколько я понимаю, это означает, что все условия должны выполняться одновременно. А по правилам системы это неправильно, сигналы Энвелопеса и Стохастика должны быть синхронными – это да. А вот Параболик должен подтверждать открытие сделки после получения сигналов от Энвелопеса и Стохастика. Бывает даже такое (и это вполне нормально), что он может выдавать подтверждение после 5-10 баров.

Вопрос: как это "после" заложить в коде? Если это возможно покажите, пожалуйста, на примере моего кода.
Очень прошу помочь. Я уже просто запарился с этими торговыми критериями.


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

Все согласно описанию со 182 странички.

bool Buy_signal=false, Sell_signal=false; // эту строку разместить в глобальные переменные эксперта!!!!!!!!!!

//+-------------------------------------------------------------------------------------+
//| Расчет значений технических индикаторов с формированием сигналов для позиций        |
//+-------------------------------------------------------------------------------------+
void GetSignal()
{
 Signal = 0;
// - 1 - == Получение значений индикаторов ==============================================
 double SAR = iSAR(Symbol(), 0, SARStep, SARMaximum, 1);                            // тут тоже правки в коде - вместо "0"-го используем первый бар 
 double EnvUp = iEnvelopes(Symbol(), 0, EnvPeriod, EnvMethod, EnvShift, EnvPrice,
 EnvDeviation, MODE_UPPER, 1);
 double EnvDn = iEnvelopes(Symbol(), 0, EnvPeriod, EnvMethod, EnvShift, EnvPrice,
 EnvDeviation, MODE_LOWER, 1);
 double StochM1 = iStochastic(Symbol(), 0, StochK, StochD, StochSlowing, StochMethod,
 StochPrice, MODE_MAIN, 1);
 double StochS1 = iStochastic(Symbol(), 0, StochK, StochD, StochSlowing, StochMethod,
 StochPrice, MODE_SIGNAL, 1);
 double StochM2 = iStochastic(Symbol(), 0, StochK, StochD, StochSlowing, StochMethod,
 StochPrice, MODE_MAIN, 2);
 double StochS2 = iStochastic(Symbol(), 0, StochK, StochD, StochSlowing, StochMethod,
 StochPrice, MODE_SIGNAL, 2);

// - 1 - == Окончание блока =============================================================

// - 2 - == Генерация сигнала ===========================================================
   if (SAR > High[1]) {Buy_signal=false; Sell_signal=false;                                 // сбрасываем флаги условий открытия по стохастику и энвелопсу 
                       Signal = 4;}                                                         // Закрытие BUY

   if (SAR < Low[1])  {Buy_signal=false; Sell_signal=false;

                       Signal = 3;}                                                         // Закрытие Sell

    
   if ( StochM2 < StochS2 && StochM1 > StochS1 &&  StochM1 <= 20 && Low[1] <= EnvDn)        // ставим флаги условий открытия по стохастику и энвелопсу в лонг 
       { 
          Buy_signal=true;
          Sell_signal=false;
        }          
    if (SAR < Low [1] && Buy_signal==true &&  Sell_signal==false) 
         Signal = 1;                                                         // Открытие BUY
      
 
     
   if ( StochM2 > StochS2 && StochM1 < StochS1 &&  StochM1 >= 80 && High[1] >= EnvUp)        // ставим флаги условий открытия по стохастику и энвелопсу в шорт
       { 
          Buy_signal=false;
          Sell_signal=true;
        }          
    if (SAR > High [1] && Buy_signal==false &&  Sell_signal==true) 
          Signal = 2;                                                        // Открытие SELL
      
// - 2 - == Окончание блока =============================================================
}
 
Roger:

Два в третьей степени всегда было восемь :-)

Красивое замечание :-)))
Причина обращения: