[¡AVISO CERRADO!] Cualquier pregunta de novato, para no saturar el foro. Profesionales, no pasen. No puedo ir a ningún sitio sin ti. - página 842

 
Tienes la modificación de la orden en el mismo bloque que la apertura, y su condición es sin órdenes. Resulta que acabas de abrir una orden e inmediatamente intentas modificarla, pero ¿de dónde saldrá el beneficio de 5 pips?
 

Hola a todos! Recientemente me he interesado por las medias móviles. Encontré alguna combinación de medias móviles y condiciones de trading y decidí comprobar mi TS, si es rentable o no, y optimizarlo, si es que hay algo. Pero mi Asesor Experto no abrió operaciones durante las pruebas. Me he pasado toda la tarde intentando averiguar la solución y he decidido preguntaros a vosotros, queridos programadores. Para entender cómo funciona el EA, explicaré brevemente mi TS: en el gráfico con EMA(13) y EMA(55), si una barra cruzó la EMA(13) y todas las barras siguientes estuvieron por encima/debajo de la EMA(13), entonces al tocar el precio con la MA(13) abrimos una posición en la dirección de las barras anteriores (después de cruzar + al menos 9 y no más de 23). Take Profit 60 puntos, Stop Loss = EMA(55) más menos cinco puntos. En realidad, esa es toda la estrategia. Para ilustrar mejor, he puesto un ejemplo:

Y aquí está el código del Asesor Experto:

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

Si alguien puede ayudar por favor. También le daré el propio EA

Archivos adjuntos:
dwm.mq4  5 kb
 

Se pueden reunir muchas funciones en un ciclo for para abrir, cambiar, cerrar posiciones, etc.

Este es un ejemplo sencillo:

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

- Pregunta: ¿es correcto utilizar aquí "break" en lugar de "return"? ¿Hay alguna diferencia?

 
chief2000:

Se pueden reunir muchas funciones en un ciclo for para abrir, cambiar, cerrar posiciones, etc.

Este es un ejemplo sencillo:

- Pregunta: ¿es correcto utilizar aquí "break" en lugar de "return"? ¿Hay alguna diferencia?

Desde https://docs.mql4.com/ru/basis/operators/break:
"La sentencia break detiene la ejecución de la sentencia switch, while o for externa anidada más próxima. El control se da al operador que sigue al que termina".

Desde https://docs.mql4.com/ru/basis/operators/return:
"La sentencia return termina la función actual y devuelve el control al programa que la llama".

Respuesta: Es correcto utilizar "break" aquí.

 
abolk:

Desde https://docs.mql4.com/ru/basis/operators/break:
"El operador break termina la ejecución del interruptor externo anidado más cercano, el operador while o el operador for. El control se transfiere al operador que sigue al que termina".

Desde https://docs.mql4.com/ru/basis/operators/return:
"El operador return termina la función actual y devuelve el control al programa que lo llama".

Respuesta: es correcto utilizar "break" aquí.

En realidad yo también uso break, pero pensaba que return significaba un cambio de tilde (y break no).

En realidad, hasta que no cambie la orden, habrá un cambio de tick, por lo que para que el probador simule correctamente la situación

necesitas usar el retorno. ¿Verdad?

Tal vez me equivoque, pero me gustaría entenderlo.

 
chief2000:

De hecho, yo mismo utilizo break, pero pensaba que return significaba un cambio de marca (mientras que break no).

En realidad, hasta que no cambie la orden, se producirá el cambio de tick y, por lo tanto, el probador tiene que utilizar el retorno para simular correctamente la situación

necesitas usar el retorno. ¿Verdad?

Tal vez me equivoque, pero quiero entenderlo.

Leamos en la documentación: "El operador de retorno de tiene la ejecución de la función actual y devuelve el control al programa que llama".

Si la función actual start(), de nuevo leer la documentación:

https://docs.mql4.com/ru/runtime/start
"Cuando llega una nueva cotización, se ejecuta la función start() de los Asesores Expertos e indicadores personalizados adjuntos. Si al llegar una nueva cotización se ejecuta la función start(), que se ejecuta en la cotización anterior, entonces la cotización entrante será ignorada por el Asesor Experto. Todas las nuevas comillas, que llegan durante la ejecución del programa, se ignoran hasta que finaliza la siguiente ejecución de la función start(). Después de eso, la función start() se lanzará sólo después de la llegada de la siguiente cita nueva.

 
abolk:

Lee en la documentación: "La sentencia return termina la función actual y devuelve el control al programa que la llama".

Si la función actual es start(), lea de nuevo la documentación:

https://docs.mql4.com/ru/runtime/start
"Cuando llegan nuevas cotizaciones, se ejecuta la función start() para los Asesores Expertos e indicadores personalizados adjuntos. Si al llegar una nueva cotización se ejecuta la función start(), que se ejecuta en la cotización anterior, entonces la cotización entrante será ignorada por el Asesor Experto. Todas las nuevas comillas, que llegan durante la ejecución del programa, se ignoran hasta que finaliza la siguiente ejecución de la función start(). Después de eso, la función start() se lanzará sólo después de la llegada de la siguiente cita nueva.

Me gustaría que lo pusieras en tus propias palabras. No entiendo lo que quieres decir.

En el probador, si for termina con break y alguna otra función le sigue, se ejecutará en el mismo tick. Pero en realidad, varios ticks pueden cambiar durante este tiempo (mientras se modifica la orden). Por eso creo que el retorno es más realista. ¿No es así?

 
chief2000:

Me gustaría que lo hubieras puesto con tus propias palabras. No entiendo lo que quieres decir.

Si for termina con break y va seguido de alguna otra función, se ejecutará en el mismo tick. Pero en realidad, varios ticks pueden cambiar durante este tiempo (mientras se modifica la orden). Por eso creo que el retorno es más realista. ¿No es así?


start() comienza al principio de un tic y puede no haber terminado al principio del siguiente tic.

break termina para, y return termina la función. Si no hay operadores después de for, no hay diferencia en usar for y return para este algoritmo.

Pero cada operador tiene su propósito. Y el uso involuntario de un operador es como una escopeta descargada.

De nuevo, en el algoritmo del bucle for, por alguna razón no es necesario continuar ejecutando la función, podemos utilizar return.

En otras palabras, si el algoritmo requiere una ruptura en el bucle, entonces se utiliza la ruptura, incluso si la función todavía se termina después del bucle.

 
abolk:


start() comienza a trabajar al principio de un tick y su trabajo puede no terminar al principio del siguiente tick.

break completa para, return completa la función. Si no hay operadores después de for, no hay diferencia entre usar for y return para este algoritmo.

Pero cada operador tiene su propósito. Y el uso involuntario de un operador es como una escopeta descargada.

De nuevo, en el algoritmo del bucle for, por alguna razón no es necesario continuar ejecutando la función, podemos utilizar return.

En otras palabras, si el algoritmo requiere que rompamos el bucle, ponemos break, incluso si la función termina después del bucle de todos modos.

Se me ha ocurrido una idea, ya que todo esto está pensado sólo para el probador, podemos (cuando sea necesario) hacer lo siguiente:

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

break;

Gracias.

 
chief2000:

Se me ha ocurrido una idea - ya que esto sólo se inició para un probador, podría (en su caso) hacer lo siguiente:

Gracias.


puedes