[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 37

 
skyjet:

Muchas gracias por su respuesta. Pero aún así, ¿cómo describir la futura barra que sigue a Ask[0],Bid[0]?

Tan pronto como aparezca esta barra futura se convertirá en cero. Y la barra que ahora es [0] será [1].


La demanda y la oferta NO son matrices, sólo hay un valor actual, todos los anteriores se olvidan

 

Por favor, ayúdenme a entender el cálculo del depósito
porque mi depósito estimado coincide exactamente con el terminal
sólo cuando todas las órdenes están completamente bloqueadas
. Cuando añado una orden más al sistema de órdenes - el resultado del terminal del depósito
siempre difiere de mi depósito estimado muy ligeramente
pero ¡nunca puedo llegar a ser una bala en una bala!
He aquí un ejemplo muy breve:

La cuenta tiene 4 órdenes de 10.00 lotes cada una, dos de ellas bicicletas
y dos ventas. Está claro que la cuenta está en equilibrio y todas las órdenes están bloqueadas
Calculamos el depósito estándar de cada orden, lo dividimos entre 4 y todo pasa de puntillas
El terminal llama exactamente.

Ponemos un byke más a 1.00 lote a 1.4059
Calculamos el depósito. Está claro que para ello tenemos que pagar el depósito estándar
ya que todos los pedidos existentes están en la caja.
Para un apalancamiento de 1:100 tenemos la promesa de la nueva bicicleta

ZALBuy = 140,59*1,00 = 140,59

Por lo tanto, el depósito anterior debe incrementarse en esta cantidad,
. Suma el depósito anterior y el depósito de nuestro 1,00 byte

ZAL=ZALold + ZALBuy = 1407,23 + 140,59 = 1547,82

Después de poner el bye en el terminal el depósito resultó ser de 1547.91
Esto sería aceptable si hubiera puesto el bye 9 puntos más alto que
al tipo de cambio 1.4068 Pues si calculamos el incremento real del depósito
como la diferencia del depósito antes y después, obtenemos exactamente el depósito estándar
para 1.00 lote al tipo de cambio 1.4068

1547.91 - 1407.23 = 140.6801

El cambio de versión del terminal, por desgracia, no ha servido de nada.

-----------------------------------------------

Por favor, perdóneme por tomar su tiempo, pero estos
constantes pequeñas discrepancias son muy molestos para mí
como mi máquina cuenta diferentes opciones,
y el depósito como el equilibrio y el beneficio se utiliza para calcular
todos los parámetros de la cuenta después de ciertas acciones antes de su aplicación
. Así que la precisión es muy deseable aquí.
Tal vez no entienda algo, pero he buscado en la documentación
y no he podido encontrar la razón de esta discrepancia.
Le agradecería mucho su ayuda.


Saludos MADZX
 
keep87:


Puedes olvidarte de este ajuste. La re-citación ocurre si la cantina quiere tomar tu dinero, no les importa la brecha, lo harán de todos modos). Esta es la realidad del algotrading la mayoría de las empresas de estafa que se autodenominan "el mejor broker XXXXX" (XXXXXX - insertar nombre de un continente o galaxia, lo que sea)

Cambie o no cambie la configuración, todo sigue igual.


¡Tiene toda la razón! Yo también lo he visto.
 
skyjet:
Hola, ¿pueden describirme un bar real +1? Por ejemplo, necesito el precio de la siguiente barra, no la actual.

Por lo que he entendido estás intentando obtener información de la máquina del futuro
Si encuentras una manera - comparte, te lo agradecería :)
 
Kobalerro:
Saludos a todos. Yo mismo soy nuevo en la programación, así que por favor, resuelve el problema.

Es necesario que varios EAs en la misma cuenta, abran un número limitado de órdenes.

Por ejemplo: 10 EAs pero sólo puede abrir 5 órdenes, pero no más de una por par de divisas.

Esto se ha implementado de la siguiente manera, pero no funciona así.

extern int МаксКолОрдеров   = 5;

//+------------------------------------------------------------------+

int ПодсчетОткрОрдеров() {
  int k=OrdersTotal();
   if (Символ=="0") Символ=Symbol();
    for (int i=МаксКолОрдеров; i<k; i++) {
     if (OrderSelect(i, SELECT_BY_POS, MODE_TRADES)) {
      if (OrderSymbol()==Символ || Символ=="") {
       if (МагикНомер<0 || OrderMagicNumber()==МагикНомер) {
      if (OrderMagicNumber()<1) return(True);
     }
    }
   }
  }
 return;

}

//+------------------------------------------------------------------+
int start()
  {
   if(ПодсчетОткрОрдеров()==0)ПровТоргУсловий();
   }


¡Yo pondría en práctica un programa de este tipo de la siguiente manera:
Los 10 caballos están trabajando cada uno en su propio horario, como si estuvieran en habitaciones adyacentes
y, por lo tanto, ninguno de ellos sabe lo que hace el vecino detrás de la pared - este es el principal problema
para su idea!
Por lo tanto, le indicaría a cada EA que escribiera sus acciones en el archivo de disco
que estará disponible para todos los caballos, ya que está en el directorio de la terminal .
¡Si alguno de ellos tiene un deseo ardiente de hacer algo en su ventana
debe primero analizar este archivo y comprobar la posibilidad de implementar
deseo !
con respecto a su escenario debe añadir en el archivo el número de órdenes
y los pares de divisas en los que están abiertas
. Por ejemplo:
EURUSD 1
GBPUSD 1
EURGBP 0

Aquí vemos que no podemos abrir operaciones enEURUSD yGBPUSD porque el script no permite que
tenga más de una orden por par.
Está claro que habrá tantas líneas como pares en funcionamiento.
Con esta solución todos sus caballos estarán siempre al tanto de lo que ocurre en el momento
, y podrán calcular si se permite o no cualquier acción en el momento.
Cuando se establece una orden en cualquier par, hay que poner 1 en la línea de la derecha
Cuando se cierra, se sustituye por cero
Esto definitivamente va a funcionar, aunque un poco complicado para un novato
. Pero adelante, porque todo el mundo estaba allí - como un novato hasta que llegue el momento!

¡Que tengas una buena caza!
MADZX

 

Estoy escribiendo una estrategia de retroceso. Necesito colocar una orden de stop por encima (por debajo) del extremo de la vela correspondiente. He aquí un ejemplo:

Está claro que si el cierre está por debajo de la apertura, es una vela bajista, y viceversa - una vela alcista. Quiero saber cómo hacer una condición que diga que la vela anterior es alcista... ...fulano de tal.

Lógicamente, hago una función que determine el tipo de vela.

int CandleType()
{
  if(Open[1] > Close[1])
    return(BullCandle);
    
  if{Open[1] < Close[1]}
    return(BearCandle);
    
  return(dodji);
}

Entonces debería preguntar de alguna manera si la barra con índice 1 es alcista o bajista... ...y hacer algo...

¿Cómo lo hago?

 
madzx:


Yo pondría en práctica un programa de este tipo:
Los 10 caballos trabajan cada uno en su propio horario, como si estuvieran en habitaciones adyacentes
y, por lo tanto, ninguno de ellos sabe lo que hace el vecino detrás de la pared - ¡este es el principal problema
para su idea!
Por lo tanto, le indicaría a cada EA que escribiera sus acciones en el archivo de disco
que estará disponible para todos los caballos, ya que está en el directorio de la terminal .
¡Si alguno de ellos tiene un deseo ardiente de hacer algo en su ventana
debe primero analizar este archivo y comprobar la posibilidad de implementar
deseo !
con respecto a su escenario debe añadir en el archivo el número de órdenes
y los pares de divisas en los que están abiertas
. Por ejemplo:
EURUSD 1
GBPUSD 1
EURGBP 0

Aquí vemos que no podemos abrir operaciones enEURUSD yGBPUSD porque el script no permite que
tenga más de una orden por par.
Está claro que habrá tantas líneas como pares en funcionamiento.
Con esta solución todos sus caballos estarán siempre al tanto de lo que ocurre en el momento
, y podrán calcular si se permite o no cualquier acción en el momento.
Cuando se establece una orden en cualquier par, hay que poner 1 en la línea de la derecha
Cuando se cierra, se sustituye por cero
Esto definitivamente va a funcionar, aunque un poco complicado para un novato
. Pero adelante, porque todo el mundo estaba allí - como un novato hasta que llegue el momento!

¡Que tengas una buena caza!
MADZX

Gracias por el consejo, pero es demasiado complicado. Y luego en tu versión resulta que todo funciona, y se tarda 10 en comprobar la condición de entrada,

Pero sólo se abren los cinco primeros que han llegado a tiempo y luego, cuando uno de ellos se cierra, se vuelve a abrir el primero que cumple las condiciones,

no se limita a EURUSD 1 , GBPUSD 1 , EURGBP 0.

Creo que debería haber una solución más sencilla. Debería ser similar a contar el número total de pedidos con una condición de limitación por un parámetro determinado.

Y la limitación puede establecerse mediante un símbolo o un número mágico no superior a uno.

Aunque tu versión probablemente también funcionaría, pero no puedo decidir cómo implementarla en el código.

 
hoz:

Tengo una cosa extraña aquí. Esta es la función de las órdenes de apertura:

aquí está el error:

if(SL < g_stopLevel)
    SL = g_stopLevel*pt;

si el nivel de parada = 5 entonces usted está tratando de poner un stop loss en 0,00005.

El segundo error es que no se comprueba dónde se está colocando la orden. Si la vela cerró en o cerca de su máximo mínimo, obtendrá el error 130. Como puede ver en la imagen, el servidor abrió una orden de venta en lugar de una sellstop porque intentó abrir una orden sellstop a un precio mayor o igual al precio actual.

Aprende a utilizar la huella. Sólo hay que poner Print(); en el lugar adecuado, poner las variables necesarias entre paréntesis y separarlas con esto: ", así: Print(Price," ",SL); y durante la prueba en el momento de abrir una orden en la pestaña "Expertos" verá a qué equivalen estas variables, y podrá entender qué es lo que está mal.

El registro también mostrará lo que el EA está tratando de hacer, donde establecer un Stop Loss y Take Profit. Allí verá todo lo que necesita.

Lógicamente, hago una función que detecte el tipo de vela.

Trabajemos dentro del inicio de la función.

Primero, creamos una variable en la que escribiremos la dirección de la vela anterior.

int Candle=-1;

Lo llenaremos con algunos valores, uno de los cuales denotará un alcista, otro - bajista. Si es -1, no es nada (no se ha determinado o no tiene dirección close=open).

Valor que propongo utilizar por analogía con una orden comercial 0 - compra, 1 - venta;

entonces tenemos que escribir:

if(Close[1]>Open[1]) Candle=0; else
if(Close[1]<Open[1] Candle=1;

Ahora tenemos una dirección definida y podemos usarla directamente en la función OrderSend( string symbol, int cmd, ...otras cosas...);

if(Candle!=-1) OrderSend( Symbol(),Candle, ...otras cosas...);

o siguiendo su analogía:

if(Candle==0) OpenBuy();
if(Candle==1) OpenSell();

 
Kobalerro:

Gracias por el consejo, pero es demasiado complicado. Y luego resulta que todos ellos trabajan en su variante y se necesitan 10 para comprobar la condición de entrada,

y abren primero sólo los cinco que han llegado a tiempo y luego, cuando uno de ellos se cierra, se vuelve a abrir el primero que cumple las condiciones,

no se limita a EURUSD 1 , GBPUSD 1 , EURGBP 0.

Creo que debería haber una solución más sencilla. Debería ser como contar el número total de pedidos con una condición de limitación por un parámetro determinado.

Y tenemos que limitar este número por un símbolo o por un número mágico, o por no más de uno.

Aunque, quizás, tu opción también funcione, pero cómo implementarla en el código, no se me ocurre.


O tal vez así:

if(NumberOfPositions("EURUSD")==0 && NumberOfPositions()<10)
Y aquí la función
 
keep87:

hay un error aquí:

si el nivel de parada = 5 entonces usted está tratando de poner un stop loss en 0,00005.

El segundo error es que no se comprueba dónde se está colocando la orden. Si la vela cerró en o cerca de su máximo mínimo, obtendrá el error 130. Como puede ver en la imagen, el servidor abrió una orden de venta en lugar de una sellstop porque intentó abrir una sellstop a un precio mayor o igual al precio actual.

Aprende a utilizar la huella. Sólo hay que poner Print(); en el lugar adecuado, poner las variables necesarias entre paréntesis y separarlas con esto: ", así: Print(Price," ",SL); y durante la prueba en el momento de abrir una orden en la pestaña "Expertos" verá a qué equivalen estas variables, y podrá entender qué es lo que está mal.

El registro también mostrará lo que el EA está tratando de hacer, donde establecer un Stop Loss y Take Profit. Se mostrará todo lo que se necesita.

Yo lo uso así de vez en cuando. Mira, ahora las funciones se ven así:

//+-------------------------------------------------------------------------------------+
//| Открытие длинной позиции                                                            |
//+-------------------------------------------------------------------------------------+
bool OpenBuy()
{
  int ticket = -1;
  string myNote = "Сов баянул";
  
  double price = High[1] + i_thresholdFromInput*pt;
  Print("price = ", price);
  double SL = Low[1] - i_thresholdFromBasedSL*pt ;
  Print("SL = ", SL);

  if(price > Ask)
  {
    ticket = OrderSend(Symbol(),OP_BUYSTOP,0.1,NormalizeDouble(price,Digits),i_slippage,0,0,myNote,i_myMagic,TimeCurrent() + 600,Navy);
  }
  
  if(ticket > 0 && OrderSelect(ticket,SELECT_BY_TICKET,MODE_TRADES) == true)
    if(!OrderModify(ticket,OrderOpenPrice(),NormalizeDouble(SL,Digits),NormalizeDouble(High[1] + i_tp*pt,Digits),0,Navy))
    return(false);
  
  return(true);
}
//+-------------------------------------------------------------------------------------+
//| Открытие короткой позиции                                                           |
//+-------------------------------------------------------------------------------------+
bool OpenSell()
{
  int ticket = -1;
  string myNote = "Сов шортанул";
  
  double price = Low[1] - i_thresholdFromInput*pt;
  Print("price = ", price);
  double SL = High[1] + i_thresholdFromBasedSL*pt;
  Print("SL = ", SL);
  
  if(price < Bid)
  {
    ticket = OrderSend(Symbol(),OP_SELLSTOP,0.1,NormalizeDouble(price,Digits),i_slippage,0,0,myNote,i_myMagic,TimeCurrent() + 600,Red);
  }
  
  if(ticket > 0 && OrderSelect(ticket,SELECT_BY_TICKET,MODE_TRADES) == true)
    if(!OrderModify(ticket,OrderOpenPrice(),NormalizeDouble(SL,Digits),NormalizeDouble(Low[1] - i_tp*pt,Digits),0,Red))
    return(false);
    
  return(true);
}

Leí en el diario:

2012.12.25 18:20:16     2012.02.13 00:05  5_minites_TS_by_Philippe Nell EURUSD,M5: modify #1 buy stop 0.10 EURUSD at 1.32103 sl: 1.32007 tp: 1.32243 ok
2012.12.25 18:20:16     2012.02.13 00:05  5_minites_TS_by_Philippe Nell EURUSD,M5: open #1 buy stop 0.10 EURUSD at 1.32103 ok
2012.12.25 18:20:16     2012.02.13 00:05  5_minites_TS_by_Philippe Nell EURUSD,M5: SL = 1.3201
2012.12.25 18:20:16     2012.02.13 00:05  5_minites_TS_by_Philippe Nell EURUSD,M5: price = 1.321
2012.12.25 18:20:14     2012.02.13 00:00  5_minites_TS_by_Philippe Nell EURUSD,M5: OrderSend error 130
2012.12.25 18:20:14     2012.02.13 00:00  5_minites_TS_by_Philippe Nell EURUSD,M5: SL = 1.3194
2012.12.25 18:20:14     2012.02.13 00:00  5_minites_TS_by_Philippe Nell EURUSD,M5: price = 1.3204
2012.12.25 18:20:14     5_minites_TS_by_Philippe Nell inputs: i_fastMaPeriod=10; i_slowMaPeriod=21; i_filtrMaPeriod=50; i_trading_TF=5; i_thresholdFromInput=1; i_thresholdFromBasedSL=1; i_slippage=3; i_tp=15; i_myMagic=33330215; 
2012.12.25 18:20:12     5_minites_TS_by_Philippe Nell EURUSD,M5: loaded successfully

Así que inicialmente desde el precio de compra hasta el stop fue la diferencia 1,3204 - 1,3194 = 0,001 puntos

Además, 1,3210 - 1,3201 = 0,009 puntos

Y por alguna razón, en el segundo caso, el stop estaba más cerca del precio de entrada, ¡pero no había ningún error! Lo pensé y no lo entendí.

Más tarde corregí el error de otra manera. Ya hay condiciones en el código:

if(precio > Ask) && if(precio < Bid) respectivamente para comprar y vender. ¿O había otra variante? Ahora no tenemos más errores. Pero, sin embargo, me gustaría escuchar la opinión de un programador más experimentado.

Razón de la queja: