[Arquivo!] Qualquer pergunta de novato, de modo a não desorganizar o fórum. Profissionais, não passem por ela. Não poderia ir a lugar algum sem você - 2. - página 240

 
artmedia70:
É essa toda a diferença que podíamos ver?
tudo o que vi, como não olhei para o resto, não é conveniente ler o código cinza
 
artmedia70:

Talvez seja a maneira de fazer isso. :

//===================================================================================
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);
}
//===================================================================================



Tudo funciona perfeitamente!!!!!!!!!!!
 

Entendo corretamente que se eu otimizar três parâmetros do bool no testador, ele executará todas as 9 combinações de seus valores? ou seja

1) bool1=verdadeiro, bool2=verdadeiro, bool3=verdadeiro,
2) bool1=verdadeiro, bool2=verdadeiro, bool3=falso,
3) bool1=verdadeiro, bool2=falso, bool3=verdadeiro,
4) bool1=verdadeiro, bool2=falso, bool3=falso, etc.
 
eddy:

Entendo corretamente que se você otimizar três parâmetros de bool no testador, ele executará todas as 9 combinações de seus valores...?

Parece-me que o bool não pode ser executado em etapas durante a otimização. Em vez disso, eu o faço int e o executo de 0 a 1.
 

Pensei que você poderia simplesmente colocar um bool e ele correria em variantes verdadeiras e falsas.

Eu nunca usei otimização antes, estou me familiarizando com o tema

 
Experimente. Não funcionou para mim.
 
daytrader19:

Caros colegas, ainda sou um "boneco" completona programação MQL, comecei a estudar este tópico muito recentemente. Mas eu já comecei a escrever meu primeiro Expert Advisor, ou pelo menos eu tentei fazê-lo.

Na 182ª página deste tópico, eu expus os critérios comerciais pelos quais esta EA deve negociar. Por favor, veja o que diz (último post na página). Estou lutando há três semanas e ainda não consigo escrever aqui a parte do código responsável pelos critérios comerciais. Eu lio capítulo tutorial dedicado a este tópico, mas isso não me ajudou neste caso em particular.

Escrevi dezenas de variantes desta parte do código durante minhas batalhas de programação, mas nenhuma delas funciona corretamente. Obviamente não tenho conhecimentos suficientes, não consigo dominara MQL tão rapidamente .De qualquer forma, aqui está uma das variantes de código que funciona, pelo menos aproximadamente, como eu gostaria que funcionasse.

//+-------------------------------------------------------------------------------------+
//| Расчет значений технических индикаторов с формированием сигналов для позиций        |
//+-------------------------------------------------------------------------------------+
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 - == Окончание блока =============================================================
}

Eu sei que o código é todo torto e inclinado, e em geral as posições da baía e venda são misturadas. Mas esta é a única variante do código, quando Stochastic e Envelope estão negociando juntos, sem ignorar um ao outro. Ao mesmo tempo, os sinais parabólicos não são levados em conta no comércio por algum motivo. De qualquer forma, por favor, não me repreenda demais por essa "surra", estou bem ciente de que o código não está correto.

Por favor, ajude-me, por favor, conserte o código do meu Conselheiro Especialista. Estou tendo dificuldades com isso. Eu implementei estratégias mais fáceis (Mooving + Momentum; Mooving +RSI), mas esta funciona. Por favor, ajude. Por favor, reescreva todas as linhas erradas para fazer meu comércio EA por essas regras, que descrevina página 182. Eu realmente preciso disso.

P.S.: Eu não escrevi o código completo do Expert Advisor, porque eu usei modelos MQL já prontos .

Acho que descobri qual foi meu principal (e talvez não o único) erro. Todas as condições em meus critérios comerciais são combinadas com "e" lógico. Tanto quanto sei, isso significa que todas as condições devem ser cumpridas simultaneamente. Mas de acordo com as regras do sistema não é correto. Os sinais de Envelope e Stochastic devem ser síncronos - sim. Mas o parabólico deve confirmar a abertura de uma posição apósreceber sinais do Envelope e do Estocástico. Pode até acontecer (e isto é bastante normal) que confirme após 5-10 barras.

Pergunta: Como este "depois" pode ser colocado no código? Se for possível, por favor me mostre um exemplo do meu código.
Por favor, me ajude muito. Já estou exausto com estes critérios comerciais.
 
eddy:

Entendo corretamente que se o testador otimizar três parâmetros de bool, ele executará todas as 9 combinações de seus valores? ou seja


Dois para a terceira potência sempre foram oito :-)
 
daytrader19:

Acho que já descobri qual foi meu principal (talvez não o único) erro. Todas as condições em meus critérios comerciais são agrupadas junto com um "e" lógico. Tanto quanto sei, isto significa que todas as condições devem ser cumpridas ao mesmo tempo. Mas de acordo com as regras do sistema não é correto. Os sinais de Envelope e Stochastic devem ser síncronos - sim. Mas o parabólico deve confirmar a abertura de uma posição apósreceber sinais do Envelope e do Estocástico. Pode até acontecer (e isto é bastante normal) que ele possa confirmar posições após 5-10 barras.

Minha pergunta é: Como colar este "depois" em meu código? Se possível, por favor, mostre-me um exemplo do meu código.
Por favor, me ajude muito. Estou apenas me esgotando com estes critérios comerciais.


Então tente, eu consertei seu código aqui mesmo na página - não o verifiquei eu mesmo - preste atenção aos comentários.

Tudo como descrito na página 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:

Dois para a terceira potência sempre foram oito :-)

Boa observação :-))))