[¡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 622

 
Rossi:

¿hay alguna forma de ordenar los instrumentos en las pestañas de la parte inferior de la pantalla? porque 8 instrumentos en 4 marcos temporales están dispersos en un lío....

no
 
DDFedor:

coge la pestaña con el nombre del gráfico y arrástrala hasta el lugar adecuado

AAAAAAAAAAAAAAAAAAAAAAAAAA gran respuesta, gracias...
 
artmedia70:
:) Ahora ha aparecido el error 130. Lo más confuso es que con stops erróneos (130) sigue poniendo despegues correctos (calculados por ATR), pero mis stops no estaban puestos desde el principio...
¿Hay alguna manera de entender esto?
Un error de 130 podría ser un stoploss o un takeprofit erróneo.
 
ToLik_SRGV:


Añadí órdenes de límite (me olvidé de ellas en el código anterior :)) + procesamiento del error #1 (antes de la modificación se compara el nuevo precio con el actual, si son iguales, entonces no pasa nada):

Parece que las órdenes modificadas movidas por el arrastre más cerca del mercado pierden su herencia TakeProfit... Una vez que se activan, se cuelgan en el gráfico en posiciones y consumen estúpidamente el margen. No cierran en pérdidas o ganancias, y no hay línea de TakeProfit... Aunque, a propósito, añadí el valor tp, calculado con el ATR, al código para comprobarlo:

void trailingOrder(int magic, int trailing){
   int index = 0, tp=TakeProfitATR (5);
   while(trailing > 0 && OrdersTotal() != 0 && OrderSelect(index, SELECT_BY_POS)){
      if(OrderMagicNumber() == magic){
         if(OrderType() == OP_BUYSTOP){
            if(OrderOpenPrice() - Ask > Point*trailing){
               if((Ask+Point*trailing) - Ask >= MarketInfo(Symbol(), MODE_STOPLEVEL)*Point &&
                 (Ask+Point*trailing) - Ask > MarketInfo(Symbol(), MODE_FREEZELEVEL)*Point &&
                 (Ask+Point*trailing) != OrderOpenPrice()){
                  if(!OrderModify(OrderTicket(),Ask+Point*trailing,OrderStopLoss(),
                  /*OrderTakeProfit()*/tp, 0, MediumSpringGreen))Print(">>> ERROR ", GetLastError());
               }else{
                  Print(">>> Слишком близко к рынку или передано неизмененное значение!");
               }
            }
            return;
         }
// ..... Далее по тексту функции также добавлены изменения...

Tanto antes como después de mis cambios la orden modificada no tenía una línea de toma ni antes ni después de su conversión a una posición...

¿Cuál puede ser la razón?

 
artmedia70:

Parece que las órdenes modificadas movidas por el arrastre más cerca del mercado pierden su herencia TakeProfit... Una vez que se activan, se cuelgan en el gráfico en posiciones y consumen estúpidamente el margen. No cierran en pérdidas o ganancias, y no hay línea de TakeProfit... Aunque, a propósito, añadí el valor tp, calculado con el ATR, al código para comprobarlo:

Tanto antes como después de añadir los cambios, la orden modificada no tenía una línea de toma ni antes ni después de su conversión a una posición...

¿Cuál podría ser la razón?

Cuando se modifica el precio de una orden pendiente, también deben modificarse el stoploss y el takeprofit.
 
khorosh:
El error 130 puede ser un stoploss o un takeprofit equivocado.
Gracias. Ya lo sabía... Ese no era el objetivo. Era la red de arrastre la que me daba el error - la desactivé y todo está bien. Todavía no tengo tiempo para ocuparme de ello.
 
khorosh:
Al modificar el precio de la orden pendiente, también debe modificar el StopLoss y el TakeProfit.

¿No lo hace la función ATR Take Profit? Lo llamo antes de modificar una orden, obtengo el valor actual de la toma calculado por TakeProfitATR() y lo pego en la modificación de la orden... Esto está en mi ejemplo anterior:

int index = 0, tp=TakeProfitATR (5); // Рассчёт нового тейка по значению ATR. Ф-ция возвращает размер тейка в пунктах

....

if(!OrderModify(OrderTicket(),Ask+Point*trailing,OrderStopLoss(),
   /*OrderTakeProfit()*/tp, 0, MediumSpringGreen))Print(">>> ERROR ", GetLastError()); // здесь вместо OrderTakeProfit() подставляю tp
Parece que he encontrado un error al escribir esto... La función TakeProfit de ATR devuelve el valor de TakeProfit en pips, mientras que el precio debe ser utilizado.
Pero entonces no entiendo por qué el orden modificado estaba perdiendo su toma... Aunque, OrderTakeProfit() debería escribir el valor de su punto de toma en la orden que se está modificando...
Y entonces la pregunta - por qué debería modificarla (tomar) cada vez, si, digamos, sólo quiero mover una orden pendiente más cerca del mercado sin cambiarla, si el mercado se ha alejado de ella y está listo para una reversión o corrección... ???
 
artmedia70:

¿No lo hace la función ATR Take Profit? Lo llamo antes de modificar una orden, obtengo el valor actual de la toma calculado por TakeProfitATR() y lo pego en la modificación de la orden... Esto está en mi ejemplo anterior:

....

Parece que he encontrado mi error al escribir esto... La función TakeProfit de ATR devuelve el valor de TakeProfit en pips, mientras que el precio debe ser utilizado.
Pero entonces no entiendo por qué la orden modificada seguía perdiendo su valor de punto de toma antes de estos cambios... Aunque, OrderTakeProfit() debería escribir el valor de su punto de toma en la orden que se está modificando...
Y entonces la pregunta - por qué debo modificarla (tomar) cada vez, si, digamos, sólo quiero mover una orden pendiente más cerca del mercado sin cambiarla, si el mercado se ha alejado de ella y está listo para una reversión o corrección... ???




He añadido a mi método stop y takeovers automáticos. Cuando pongas una orden pendiente sólo tienes que poner limitadores y el método arrastrará todo al lugar correcto :))

//+------------------------------------------------------------------+
void trailingOrder(int magic, int trailing){
   int index = 0;
   double takeprofit, stoploss;
   while(trailing > 0 && OrdersTotal() != 0 && OrderSelect(index, SELECT_BY_POS)){
      if(OrderMagicNumber() == magic){
         if(OrderType() == OP_BUYSTOP){
            if(OrderOpenPrice() - Ask > Point*trailing){
               if((Ask+Point*trailing) - Ask >= MarketInfo(Symbol(), MODE_STOPLEVEL)*Point &&
                 (Ask+Point*trailing) - Ask > MarketInfo(Symbol(), MODE_FREEZELEVEL)*Point &&
                 (Ask+Point*trailing) != OrderOpenPrice()){
                  if(!OrderModify(OrderTicket(),Ask+Point*trailing, Ask+Point*trailing-(OrderOpenPrice()-OrderStopLoss()), Ask+Point*trailing+(OrderTakeProfit()-OrderOpenPrice()), 0))Print(">>> ERROR ", GetLastError());
               }else{
                  Print(">>> Слишком близко к рынку или передано неизмененное значение!");
               }
            }
            return;
         }
         if(OrderType() == OP_SELLSTOP){
            if(Bid - OrderOpenPrice() > Point*trailing){
               if(Bid - (Bid-Point*trailing) >= MarketInfo(Symbol(), MODE_STOPLEVEL)*Point &&
                 Bid - (Bid-Point*trailing) > MarketInfo(Symbol(), MODE_FREEZELEVEL)*Point &&
                 (Bid-Point*trailing) != OrderOpenPrice()){
                  if(!OrderModify(OrderTicket(),Bid-Point*trailing,Bid-Point*trailing+(OrderStopLoss()-OrderOpenPrice()),Bid-Point*trailing-(OrderOpenPrice()-OrderTakeProfit()), 0))Print(">>> ERROR ", GetLastError());
               }else{
                  Print(">>> Слишком близко к рынку или передано неизмененное значение!");
               }
            }
            return;
         }
         if(OrderType() == OP_SELLLIMIT){
            if(OrderOpenPrice() - Bid > Point*trailing){
               if((Bid+Point*trailing) - Bid >= MarketInfo(Symbol(), MODE_STOPLEVEL)*Point &&
                 (Bid+Point*trailing) - Bid > MarketInfo(Symbol(), MODE_FREEZELEVEL)*Point &&
                 (Bid+Point*trailing) != OrderOpenPrice()){
                  if(!OrderModify(OrderTicket(),Bid+Point*trailing,Bid+Point*trailing+(OrderStopLoss()-OrderOpenPrice()),Bid+Point*trailing-(OrderOpenPrice()-OrderTakeProfit()), 0))Print(">>> ERROR ", GetLastError());
               }else{
                  Print(">>> Слишком близко к рынку или передано неизмененное значение!");
               }
            }
            return;
         }
         if(OrderType() == OP_BUYLIMIT){
            if(Ask - OrderOpenPrice() > Point*trailing){
               if(Ask - (Ask-Point*trailing) >= MarketInfo(Symbol(), MODE_STOPLEVEL)*Point &&
                 Ask - (Ask-Point*trailing) > MarketInfo(Symbol(), MODE_FREEZELEVEL)*Point &&
                 (Ask-Point*trailing) != OrderOpenPrice()){
                  if(!OrderModify(OrderTicket(),Ask-Point*trailing,Ask-Point*trailing-(OrderOpenPrice()-OrderStopLoss()),Ask-Point*trailing+(OrderTakeProfit()-OrderOpenPrice()), 0))Print(">>> ERROR ", GetLastError());
               }else{
                  Print(">>> Слишком близко к рынку или передано неизмененное значение!");
               }
            }
            return;
         }
      }
      index++;
   }
}
//+------------------------------------------------------------------+
 
ToLik_SRGV:


He añadido al método stop y takeovers automáticos. Al establecer las órdenes pendientes, pongo los limitadores una vez y luego el propio método arrastra todo al lugar correcto :))

¡Muy útil! Pero no es óptimo. Deberíamos cambiar dinámicamente la toma. ¿Por qué tenemos que seguir al mercado? Si establecemos una orden pendiente y el precio se ha alejado - una corrección, por ejemplo... ¿Qué hacemos? ¿Esperamos a que vuelva el precio? ¿O eliminar el pedido? ¿No sería mejor hacer esto...

Imaginemos una situación en la que el mercado tiene una baja volatilidad pero una tendencia alcista constante. El precio se ha alejado lentamente de la orden pendiente de SELLSTOP hacia arriba. Una posición abierta de COMPRA ya ha sido trabajada y cerrada con beneficio. Esperamos a que la volatilidad del mercado aumente, y en cuanto supere algún umbral, movemos una orden limitada al precio. De este modo, captamos la corrección que se ha iniciado y el Limiter funciona no como una posición de bloqueo, sino como una fuente adicional de ingresos. Si no la hubiéramos movido, la corrección podría haberla alcanzado, tocado y terminado. En este caso tendríamos una posición lota de venta en una tendencia alcista.

Una excursión de este tipo en un safari de moda...

Si tenemos TPs dinámicos, entonces al mover una orden pendiente al mercado y teniendo en cuenta la fuerte volatilidad (en este caso será mayor que para la volatilidad débil) es más probable que tomemos más beneficios de una corrección que en caso de TPs estáticos. De todos modos, si no cerramos en la toma, la red de arrastre hará su trabajo y sólo perderemos el beneficio perdido...

Ugh... Hacía tiempo que no pulsaba tanto el teclado...

Por lo tanto, la sugerencia se deduce por sí misma. Hacer en el paso de parámetros de la función también TimeFrame. Y en base a ello calcular la toma de valores ATR.

Experimenté durante algún tiempo y mis investigaciones para M5 TF me llevaron a la conclusión de que el take profit óptimo según ATR se calcula con ATR*45000, y lo hice para mis cálculos. A estos valores, el mercado casi siempre "atrapa" la toma a tiempo:

//+------------------------------------------------------------------+
//|                  Take from ATR                                   |
//+------------------------------------------------------------------+
double TakeProfitATR (int tf)
  {
   double   atr   =iATR(NULL,tf,14,0);
   double   mltp  =15000;
   if (tf==1) mltp=15000;
   if (tf==5) mltp=45000;
   double   tp    =MathRound(atr*mltp);
   return  (tp);
  }

Por supuesto, la función no está terminada, pero me basta para hacer pruebas (por ahora estoy probando el M5)... Por cierto, con el valor de entrada = 1 da una distancia bastante buena para el ajuste de la orden pendiente.

Sería bueno verlo en su función... :)

Gracias de todos modos - es bastante satisfactorio teniendo en cuenta mis modificaciones sólo para conseguir lo anterior...
ZS... estaría bien añadir colores para los iconos de modificación... (en realidad ya los he añadido)...

 

He aquí una pregunta: ¿cómo se las arregla BC con un gran número de oficios? Mi Asesor Experto abre una posición cada 29 minutos (sólo una de las cinco estrategias). Luego, cuando el patrimonio aumenta un 5%, se cierran todos juntos. Lo principal es que el saldo aumenta un 5% cada tres o cinco días.

Me pregunto si BC tiene algún derecho a este tipo de comercio.