[ARCHIVO]Cualquier pregunta de novato, para no saturar el foro. Profesionales, no lo dejéis pasar. No puedo ir a ningún sitio sin ti - 5. - página 271

 
hoz:

Entiendo lo que hay. Pero no está claro por qué se implementa de esta manera.

Cada función individual de la biblioteca es parte del conjunto, y una biblioteca individual es parte del conjunto de mis bibliotecas - sin esta conciencia es imposible entender el código.

hoz:

De todos modos, no puedes utilizar tus bibliotecas en su forma original, es decir, tienes todo atado allí. Cada función en el paquete de otros...

Y ahí es donde te equivocas. ¿Ha pensado alguna vez en la estructura del EA "medio"? Lo que hace que un EA sea individual son las condiciones de la estrategia (es decir, las condiciones de entrada/salida), y todo lo demás es código estándar. La forma en que creo EAs, incluidos los basados en órdenes: tomo una plantilla (por ejemplo, SAR, si se necesita un EA de red) y conecto a ella una biblioteca adicional en la que se escriben las condiciones de una nueva estrategia (la recreo).

hoz:

No quería comprobarlo de ninguna manera. Además, no cabe duda de que todo está escrito de forma muy competente. Es que no lo entiendo todo, por eso he dicho que no lo creo. Miro, pienso... Pero no lo entiendo todo. Por eso he preguntado.

P.D. Con bs_Symbol sigo sin entenderlo.

Para entender la aplicación, hay que entender los datos de origen. Las librerías se crearon con la capacidad de trabajar con cualquier instrumento (forex) y tanto en modo mono como multidivisa, de ahí la introducción de la variable global bs_Symbol, que contiene el valor del instrumento actual.
 
IIya:

¡Amigos! Necesito ayuda para afinar un EA.

Hay un código que abre una orden bajo cierta condición if. La ejecución de la condición puede tener lugar cada tick porque se coloca en el cuerpo de int start().

Necesitamos:

1. Tras la ejecución de la condición (y la apertura de una orden), pausa para la apertura de nuevas órdenes, pausa de n barras. Por ejemplo, si el EA está en el timeframe M30 y necesito una pausa de 3 horas, la pausa debe ser de 6 barras.

2. Este programa debería funcionar en el probador de estrategias.

¿Qué código se necesita? Y cuál sería el lugar adecuado para ponerlo.

La función iBarShift() le ayudará. En primer lugar, hay que averiguar la hora de la última apertura del pedido y pasarla a esta función, y luego controlar el valor devuelto por esta función comparándolo con algún número (en su caso 6).
 
TarasBY:
La función iBarShift() le ayudará. En primer lugar, hay que averiguar la hora de la última apertura del pedido y pasarla a esta función, y luego controlar el valor devuelto por esta función comparándolo con algún número (en su caso, 6).

Resolvámoslo juntos )

Pasamos la hora de la última apertura de la orden a esta función y obtenemos el número devuelto. Esto es aproximadamente:

OrderSelect(OrdersTotal()-1,SELECT_BY_POS,MODE_TRADES);
int my_bar = iBarShift(NULL,PERIOD_M30,OrderOpenTime()); 

Bien, tenemos el número del bar. Ahora, ¿cómo hacemos una pausa para abrir las órdenes de 6 bares?

 
IIya:

Resolvámoslo juntos )

Pasamos la hora de la última apertura de la orden a la función, y obtenemos el número devuelto es aproximadamente:

Bien, tenemos el número del bar. Ahora, ¿cómo hacemos una pausa para abrir las órdenes de 6 bares?

Este es un enfoque analfabeto:

OrderSelect(OrdersTotal()-1,SELECT_BY_POS,MODE_TRADES);

Pero como no es directamente relevante para este caso, no nos centramos en ello. El esquema es el siguiente:

    if (my_bar >= 6)
    {
        OrderSend();
    }
 
TarasBY:
No hay errores evidentes en la lógica. Imprime el código paso a paso. El procedimiento comercial está vinculado al valor de la variable del billete. En primer lugar, vigila sus cambios. Preste también atención al valor de la variable global "TRADECONTEXT" - su valor debe ser 0.

Gracias. Es que no entiendo nada(((, soy como un gatito ciego en estos códigos(((...
 
al7bar:

Gracias. Pero no entiendo nada(((, soy como un gatito ciego en estos códigos(((...
Resulta que no eres el autor de este código. Así es más fácil contactar con el autor.
 
TarasBY:

Cada función individual de la biblioteca es parte del conjunto, y cada biblioteca individual es parte del conjunto de mis bibliotecas - sin esta conciencia es imposible entender el código.

Estoy tratando de entenderlo y me encuentro con todo tipo de matices. Por eso te lo pregunto, porque tú lo sabes mejor. Usted es el autor...

TarasBY:

Y ahí es donde te equivocas. ¿Has pensado alguna vez en la estructura del Asesor Experto "medio"? Lo que hace que un EA sea individual son sus condiciones de estrategia (es decir, las condiciones de entrada/salida), y todo lo demás es código estándar. La forma en que creo Asesores Expertos, incluidos los basados en órdenes: tomo una plantilla (por ejemplo, SAR, si se necesita un EA de red) y conecto a ella una biblioteca adicional en la que se escriben las condiciones de la nueva estrategia (la vuelvo a crear).

Lo entiendo. Simplemente no quiero copiar toda la biblioteca. Entiendes que es más conveniente crear una fundación, con la que será conveniente trabajar personalmente.

TarasBY:

Para entender la aplicación, hay que entender los datos iniciales. Las librerías fueron creadas con la posibilidad de trabajar con cualquier herramienta (Forex) y en modo mono y multidivisa, por lo que se introdujo la variable global bs_Symbol, que contiene el valor del símbolo actual.

¿Y dónde se establece explícitamente esta variable, si no es un secreto? :) Veo en la bibliotecab-PSI@Base.mqh que sólo se declara:

 bs_Symbol,                            // текущий инструмент

Pero no hay nada más de hecho. De todos modos, el valor de la herramienta actual se devuelve por defecto a través de Symbol(). Entonces, ¿por qué necesitamos una variable aquí?

 
TarasBY:

Este es un enfoque analfabeto:

Pero, como no es directamente relevante para este caso, no nos centramos en ello. Y el patrón se ve así:

Ahora nuestro código funciona. En mi versión, funciona así:
int start()
  {
   if (OrdersTotal()<1)                                                //условие
      {
         OrderSend(Symbol(),OP_BUY,1,Ask,0,0,0,"Order BUY",0,0);     //открытие ордера
      }
   OrderSelect(OrdersTotal()-1,SELECT_BY_POS,MODE_TRADES);
   int my_bar = iBarShift(NULL,PERIOD_M30,OrderOpenTime()); 
   if (my_bar > 6)                                                     //если прошло 6 баров с момента открытия последнего ордера
      {
         OrderSend(Symbol(),OP_BUY,1,Ask,0,0,0,"Order BUY",0,0);      //открываем новый ордер
      }
   return(0);
  }

:) Pero si se introduce en el Asesor Experto tal y como está ahora, todo empieza a funcionar incorrectamente.

Según tengo entendido, se debe a esta entrada:

OrderSelect(OrdersTotal()-1,SELECT_BY_POS,MODE_TRADES);

¿Qué pasa?

 
Hola a todos. por favor, responder a todos los que pueden crear una secuencia de comandos que aumenta los lotes en la apertura de la transacción. detalles escribir en un personal. garantía de remuneración en la satisfacción de la tarea
 
IIya:
Nuestro código ahora funciona. En mi versión, funciona así:

:) Excepto que si se implementa en el EA tal y como está ahora, entonces todo empieza a funcionar incorrectamente.

Lo entiendo gracias a esta entrada:

¿Qué pasa?

Yo sólo he esbozado un esquema, mientras que tu tarea era pensar en la lógica posterior:

int start()
{
   if (OrdersTotal()<1)                                                //условие
      {
         OrderSend(Symbol(),OP_BUY,1,Ask,0,0,0,"Order BUY",0,0);     //открытие ордера
      }
   else
   {
       OrderSelect (OrdersTotal()-1,SELECT_BY_POS,MODE_TRADES);
       int my_bar = iBarShift (NULL,PERIOD_M30,OrderOpenTime()); 
       if (my_bar >= 6)                                                     //если прошло 6 баров с момента открытия ордера
       {OrderSend (Symbol(),OP_BUY,1,Ask,0,0,0,"Order BUY",0,0);}      //открываем новый ордер
   }
   return(0);
}