Estoy aprendiendo a escribir un asesor... - página 5

 


¿Cómo utilizar correctamente la función RefreshRates()?

 int ticket;
   while(true)
     {
      ticket=OrderSend(Symbol(),OP_BUY,1.0,Ask,3,0,0,"комментарий эксперта",255,0,CLR_NONE);
      if( ticket<=0)
        {
         ......
         RefreshRates();
        }
      else
        {
         .....
        }
     }

También leer en el foro "ERROR: code=138 - requote".

Tengo "OrderSend error 138" generado en el tester varias veces por segundo... ¿es una recotización? Si es así, ¿cómo se lucha con él)?

 

Después de leer 20 hilos sobre requotes... Por fin me he dado cuenta de cuál era mi error)

Tuve una "pseudo" recotización. La razón fue la condición de entrada que se disparó y por lo tanto el precio fue enviado a . En realidad, el precio real era inferior o superior al anunciado en . Cada vez que OrderSend intentaba abrir un pedido, daba el error 138, por supuesto.

La solución fue comprobar antes del OrderSend si el precio real era igual al precio pasado por la señal)

RefreshRates();
      if (Bid == ( цена переданная сигналом на продажу))
         OrderSend (....); //продажа

Lo que queda por hacer es la comprobación de errores en las órdenes OrderModify, ya que esto podría acarrear malas consecuencias, ¡sin parar!

Creo que no es necesario comprobar el OrderSend, dejar que bata su pulso al precio dado por la señal) Si vienen requotes, no importará - tendré tiempo para comprar o vender. Lo principal es que todo funcione según lo previsto)

 
ALex2008 писал(а) >>

Después de leer 20 hilos sobre requotes... Por fin me he dado cuenta de cuál era mi error)

Tuve una "pseudo" recotización. El motivo era la condición de entrada que se activaba y por tanto el precio se pasaba a OrderSend. Y en realidad, el precio real era inferior o superior al que había introducido en OrderSend. Cada vez que OrderSend intentaba abrir un pedido, daba el error 138.

La solución fue comprobar antes del OrderSend el precio real, si era igual al precio pasado por la señal).

Queda por comprobar si hay errores en las órdenes OrderModify, porque esto puede tener malas consecuencias, ¡sin parar!

Creo que no es necesario comprobar el OrderSend, dejar que bata su pulso al precio que marque la señal) Si llegan las recotizaciones, no importará - tendré tiempo de comprar o vender. Lo principal es que todo funcione según lo previsto)

RefreshRates();
útil para hacer antes de acceder a la oferta de compra

Si desea comprobar todos los valores de los límites de venta o de compra antes del bloque que calcula el precio de parada y de entrada, es posible que las órdenes pendientes de largo alcance no se vean afectadas si no se calculan en función del precio actual

 
YuraZ >> :

RefreshRates();
es útil hacerlo antes de acceder a Ask Bid

¿No es eso lo que hice... antes de la Oferta

if (Bid == (цена переданная сигналом на продажу))

antes del bloque que calcula el precio de parada y de entrada - las órdenes de larga distancia podrían no verse afectadas si no se calculan al precio actual

Explícame... Así que, en mi caso, no es necesario aquí, porque no cuenta, pero ¿compara? ¿Estoy leyendo bien?
 
ALex2008 писал(а) >>

¿No es eso lo que hice... antes de pasar a Bid


>>Por favor, explique. Así que en mi caso no es necesario aquí, porque no está contando, está comparando? ¿Estoy leyendo bien?

Has hecho lo correcto :-)

Allí no hay ningún problema.

Sólo que el bloque donde se accede a los precios debe estar preferentemente en un solo lugar

es preferible tener este comando antes de aplicar

Te diriges al Bid Ask y después de calcular todos los stops tienes que entrar en el mercado sin mucha demora.

---

añadir esto al código

en términos simplificados

1 - Señal recibida - fijar la bandera para la ejecución.

2refresh() calcular los topes de recogida

3 en

4 servidores rechazados

Error de decodificación 5

La señal 6 sigue activa: ¿se ha activado la bandera de ejecución?

7- ir al punto 1

y es necesario romper este ciclo

porque puede llegar a ser bastante largo

pero tenemos que

1-decidir sobre el error

2 - tratar de golpear el distribuidor no tanto como el ciclo pide

2.1 por ejemplo podrías hacer un recuento de las veces que golpeas

2.2 puedes hacer un quantum de tiempo

2.3 ¡Debe comprobar si tiene una señal antes de emitir las órdenes de ejecución!

o puede que quieras cancelarlo.

 
YuraZ >> :

...es que se debe tener el bloque donde se accede a los precios preferentemente en un solo lugar

y es preferible tener este comando antes de llamar a

vas al Bid Ask y calculas todos los stops para entrar en el mercado sin ningún retraso...

En un lugar... No lo entiendo... Estoy haciendo un indicador para mucho tiempo pero no puedo completar el bucle).

Lo tengo así:

-El precio de entrada está definido por las funciones UpTrend() y DownTrend() que comprueban la señal

-comprobar (si) la paridad de precios con el precio de la señal

-El precio a introducir y los precios son procesados por OrderSend

-el precio de stop se procesa en la función ModifyPos() que sigue a OrderSend


1- Señal recibida - bandera fijada para la ejecución //la función de comprobación de la señal pasa a la función de fijación de la orden
2-refresh() calcular los despegues //comprobar la coherencia con el precio - precio de la señal (si aún está activa)
3-entrada //el cálculo de los despachos es estático en la función OrderSend, se detiene en la función OrderModify
4-servidor rechazado //si la orden no está colocada y hay una señal, entonces volvemos a entrar al precio de la señal (si todavía es válida)
5-decodificar el error //lo necesitas para ti, en caso de que haya un nuevo problema
La señal 6 sigue activa - bandera para ejecutar ? //condición de la coincidencia de precios - precio de la señal (si todavía es válida).
7-ir al paso 1 //al paso 3

y tenemos que romper este ciclo.
puede llegar a ser bastante largo //siempre y cuando el precio==el precio de la señal, no lo creo, pero puede ser frecuente)
pero tenemos que

1-Determinar el error //Creo que hoy trabajaré en ello.
2-intentar golpear el distribuidor no tan largo como debería ser //el precio==el precio de la señal
2.1 puedes hacer un contador para saber cuantas veces tienes que ir de largo // tienes que pensarlo, revisa tu historial en el probador
2.2 puedes hacerlo en un quantum de tiempo //puedes perder el precio==el precio de la señal (si aún está activa)
2.3 ¡Debe comprobar si hay una señal antes de dar órdenes para ejecutar cada serie!
podría ser el momento de cancelar la señal //la función de comprobación de la señal pasa a la función de ajuste de la orden


 

Ahora no entiendo cómo implementar correctamente OrderModify ? Sin ella no puedo establecer un límite de CC al abrir...

- puede obtener un error de 130 si el precio cambia después de la apertura y se acerca

-Es posible que se produzca un error de recotización 138 y que el precio suba más y entonces no se fije el stop

-Es posible que se produzca una recotización de 138 y que el precio baje, lo cual no es crítico ya que el stop se fijará más tarde.

Así que...

сигнал действует

RefreshRates
();
if (Bid == ( цена сигнала))
{
OrderSend(Symbol(), OP_SELL, Lot, ( Low_candl - Proboy*Point), Slippage, 0, ldTake, lsComm, MAGIC,0, clOpenSell);
OrderModify(....);
}

Las desventajas de esta variante son

-Si el precio se mueve por debajo del precio de apertura, el stop nunca se fijará

Si el precio se sitúa por debajo del precio de apertura, el stop nunca se colocará - siempre intentará modificar la orden. ¿O no?


o así...


сигнал действует

RefreshRates
();
if (Bid == ( цена сигнала))
OrderSend(Symbol(), OP_SELL, Lot, ( Low_candl - Proboy*Point), Slippage, 0, ldTake, lsComm, MAGIC,0, clOpenSell);
OrderModify(....);

Desventajas de esta variante

-Habrá muchos errores si el precio se mueve en contra


 

Por ahora estoy considerando esta opción en la parada, ponerla hasta que esté configurada)

void ModifyPos()
   {
        if (OrderSelect(0, SELECT_BY_POS)==true) // Если есть открытый ордер
            { 
               if (OrderType()==OP_BUY)
                     double SLB = Bid- Stop*Point;
                     bool ModifyB = OrderModify(OrderTicket(),OrderOpenPrice(), SLB,OrderTakeProfit(),0,Red);
                        if ( ModifyB == false)
                           for (int i=0; ModifyB==true; i++)
                              {
                                 SLB = SLB+ i*Point;
                                 RefreshRates();
                                 ModifyB;
                              }
               if (OrderType()==OP_SELL)
                     double SLS = Ask+ Stop*Point;
                     bool ModifyS = OrderModify(OrderTicket(),OrderOpenPrice(), SLS,OrderTakeProfit(),0,Red);
                        if ( ModifyS == false)
                           for (int j=0; ModifyS==true; j++)
                              {
                                 SLS = SLS+ j*Point;
                                 RefreshRates();
                                 ModifyS;
                              }                                                   
            }      
   }

Pero hay errores en las líneas con ModifyB; ModifyB;

- ';' - variable ya definida

- ';' - variable ya definida




 

Otra opción, pero también con errores (

void ModifyPos()
   {
        if (OrderSelect(0, SELECT_BY_POS)==true) // Если есть открытый ордер
            { 
               if (OrderType()==OP_BUY)
                     double SLB = Bid- Stop*Point;
                     bool ModifyB = OrderModify(OrderTicket(),OrderOpenPrice(), SLB,OrderTakeProfit(),0,Red);
                        if ( ModifyB == false)
                           for (int i=0 ;; i++)
                              {
                                 SLB = SLB+ i*Point;
                                 RefreshRates();
                                 bool ModifyB = OrderModify(OrderTicket(),OrderOpenPrice(), SLB,OrderTakeProfit(),0,Red);
                                    if ( ModifyB==true)
                                       continue; 
                              }
               if (OrderType()==OP_SELL)
                     double SLS = Ask+ Stop*Point;
                     bool ModifyS = OrderModify(OrderTicket(),OrderOpenPrice(), SLS,OrderTakeProfit(),0,Red);
                        if ( ModifyS == false)
                           for (int j=0 ;; j++)
                              {
                                 SLS = SLS+ j*Point;
                                 RefreshRates();
                                 bool ModifyS = OrderModify(OrderTicket(),OrderOpenPrice(), SLS,OrderTakeProfit(),0,Red);
                                    if ( ModifyS==true)
                                       continue; 
                              }                                                   
            }      
   }
 
ALex2008 писал(а) >>

Otra opción, pero también con errores (

ticket=OrderSend( symb, bs, lot, op, slippage,0,0, comm, magic);
      if( ticket==-1) {
Print("Не получилось открыть ордер, ошибка ",GetLastError());
      }
      if( ticket>0) {
         OrderSelect( ticket, SELECT_BY_TICKET);
         if(OrderType()==OP_BUY) {
            sl= расчет стопа;
            tp= расчет тейка;
         }
         if(OrderType()==OP_SELL) {
            sl= расчет стопа;
            tp= расчет тейка;
         }
         ... Проверка стопов на стоплевел
            if(!OrderModify( ticket, OrderOpenPrice(), sl, tp, 0, CLR_NONE)) {
               Print("Не получилось модифицировать ордер, ошибка ",GetLastError());
           }
Inténtalo de esta manera.