[¡Archivo!] Cualquier pregunta de novato, para no saturar el foro. Profesionales, no lo dejéis pasar. No podría ir a ningún sitio sin ti - 2. - página 240

 
artmedia70:
¿Esa es toda la diferencia que puedes ver?
todo lo que vi, ya que no miré el resto, no es conveniente leer el código gris
 
artmedia70:

Tal vez esa sea la manera de hacerlo. :

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



¡¡¡¡¡¡¡¡¡¡¡Todo funciona perfectamente!!!!!!!!!!!
 

¿Entiendo correctamente que si optimizo tres parámetros bool en el probador, éste ejecutará las 9 combinaciones de sus valores? es decir

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 etc.
 
eddy:

¿He entendido bien que si se optimizan tres parámetros bool en el comprobador, éste ejecutará las 9 combinaciones de sus valores?

Me parece que bool no puede ser ejecutado en pasos durante la optimización. En su lugar, tomo el int y lo recorro de 0 a 1.
 

Pensaba que se podía poner un bool y se ejecutaban las variantes true y false.

Nunca he utilizado la optimización, me estoy familiarizando con el tema

 
Pruébalo. A mí no me funcionó.
 
daytrader19:

Estimados colegas, todavía soy un completo "tonto"en la programación MQL, empecé a estudiar este tema hace muy poco. Pero ya empecé a escribir mi primer Asesor Experto, o al menos lo intenté.

En la página 182 de este tema he expuesto los criterios de negociación que debe seguir este AE. Por favor, vea lo que dice (último puesto de la página). Llevo tres semanas luchando y todavía no puedo escribir aquí la parte del código responsable de los criterios de negociación. He leídoel capítulo del tutorial dedicado a este tema, pero no me ayudó en este caso concreto.

He escrito docenas de variantes de esta parte del código durante mis batallas de programación, pero ninguna de ellas funciona correctamente. Obviamente no tengo suficientes conocimientos, no puedo dominarMQL tan rápidamente .De todos modos, aquí está una de las variantes de código que funciona, al menos aproximadamente, como yo quiero.

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

Sé que el código está todo torcido e inclinado, y en general las posiciones de la bahía y la venta están mezcladas. Pero esta es la única variante del código, cuando el Estocástico y la Envolvente operan juntos, sin ignorarse mutuamente. Al mismo tiempo, las señales parabólicas no se tienen en cuenta en el comercio por alguna razón. De todas formas, por favor, no me regañes mucho por semejante "pataleta", soy muy consciente de que el código no es correcto.

Por favor, ayúdenme a arreglar el código de mi Asesor Experto. Me está costando mucho trabajo. He implementado estrategias más fáciles (Mooving + Momentum; Mooving +RSI), pero esta funciona. Por favor, ayuda. Por favor, reescriba todas las líneas erróneas para hacer que mi EA opere según esas reglas, que he descritoen la página 182. Realmente lo necesito.

P.S.: No escribí todo el código del Asesor Experto, porque utilicé plantillas MQL ya hechas .

Creo que he descubierto cuál fue mi principal (y quizá no el único) error. Todas las condiciones de mis criterios de negociación se combinan con "y" lógicos. Por lo que entiendo, significa que todas las condiciones deben cumplirse simultáneamente. Pero según las reglas del sistema no es correcto. Las señales de Envelope y Stochastic deberían ser sincrónicas - sí. Pero el Parabólico debería confirmar la apertura de una posicióndespués derecibir señales de la Envolvente y el Estocástico. Incluso puede ocurrir (y es bastante normal) que se confirme después de 5-10 compases.

Pregunta: ¿Cómo se puede poner este "después" en el código? Si es posible, por favor muéstrame un ejemplo de mi código.
Por favor, ayúdenme mucho. Ya estoy agotado con estos criterios de negociación.
 
eddy:

¿Entiendo correctamente que si el comprobador optimiza tres parámetros bool, ejecutará las 9 combinaciones de sus valores? es decir.


Dos a la tercera potencia siempre ha sido ocho :-)
 
daytrader19:

Creo que he descubierto cuál ha sido mi principal (quizá no el único) error. Todas las condiciones de mis criterios de negociación se agrupan con una "y" lógica. Según tengo entendido, esto significa que todas las condiciones deben cumplirse al mismo tiempo. Pero según las reglas del sistema no es correcto. Las señales de Envelope y Stochastic deberían ser sincrónicas - sí. Pero el Parabólico debería confirmar la apertura de una posicióndespués derecibir señales de la Envolvente y el Estocástico. Incluso puede ocurrir (y esto es bastante normal) que pueda confirmar posiciones después de 5-10 barras.

Mi pregunta es: ¿Cómo puedo pegar este "after" en mi código? Si es posible, por favor, muéstreme un ejemplo de mi código.
Por favor, ayúdenme mucho. Me estoy agotando con estos criterios de negociación.


Así que pruébalo, he arreglado tu código aquí en la página - no lo he comprobado yo - presta atención a los comentarios.

Todo ello como se describe en la 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:

Dos a la tercera potencia siempre ha sido ocho :-)

Buena observación :-)))