Cualquier pregunta de novato, para no saturar el foro. Profesionales, no pasen de largo. En ninguna parte sin ti - 6. - página 191

 
yan720:

Gracias por su respuesta. Yo mismo me sorprendí de que se planteara esa cuestión. Aunque, tal vez, he entendido mal lo que he visto y lo que ha provocado la pregunta.

Ahora estoy mirando el código de otras personas para ver qué métodos (diferentes a los míos y quizás más eficientes) se utilizan para implementar ciertos algoritmos. En este momento estoy viendo el notorio Asesor Experto Ilan 1.6 (adjunto). Puedo ver que fue ensamblado a partir de varias piezas y luego reconstruido. Pero la línea 337 contiene una función de trailing stop definida por el usuario (aunque la bandera de su uso se borra forzosamente al principio). Esta función se llama en la línea 52.

Mi pregunta surge porque el trailing stop mencionado anteriormente modifica las órdenes abiertas (y puede haber varias) por un stop loss manteniendo su TakeProfit inicial pero fijando el mismo valor (AveragePrice, que se calcula en las líneas 173 y 178) a esas órdenes como precio abierto (segundo parámetro de la función OrderModify).

O bien, ¿ese parámetro (precio de apertura) es simplemente ignorado por el servidor cuando se modifica una orden abierta y el servidor puede establecer cualquier precio?

Al modificar una posición de mercado, el precio debe ser fijado e igual al precio de apertura: OrderOpenPrise()

PD Si yo fuera tú, no buscaría "algoritmos eficientes" en este código - parece que la persona escribió código sin saber realmente lo que está haciendo allí...

 
Ir a
 Alert("Исполнение программы");
    double p[100];
    int i =0;
    int n = OrdersTotal ();
    int t =0;
    
    for (i=0; i<=n+1; i++)
    {
    
    OrderSelect(i,SELECT_BY_POS,MODE_TRADES);
    if (OrderSelect(i,SELECT_BY_POS,MODE_TRADES)==true)
     {
     
      p[i+1] = OrderProfit();      // р - це прибуток ордера
     
     } 
    }
    for (i=0; i<=n+1; i++)
    {
    if (p[i+1]>0)                  // якщо ордер прибутковий, то його 
    {
      Alert("Є прибуток ордер ",i+1);
      OrderSelect(i+1,SELECT_BY_POS,MODE_TRADES); 
      Alert("Маємо помилку ",GetLastError());
      Alert("Вибрали ордер ",i+1);
      double ld_Price;
      if (OrderType() == 0) ld_Price = NormalizeDouble (Bid, Digits);
      else ld_Price = NormalizeDouble (Ask, Digits);
      OrderClose (OrderTicket(), OrderLots(), ld_Price, 2);  // треба зачинити 
      Alert("Маємо помилку ",GetLastError());
      Alert("Закрили ордер ",i+1); 
       if ( OrderType()==OP_BUY)                              //  в залежності від того, якого типу ордер ми зачинили
       { 
        Alert("Ордер типу бай");
        OrderSend(Symbol(),OP_SELL,0.1,Bid,3,Bid-25*Point,Ask+25*Point);   // змінюється порядок відкривання наступних ордерів
        Alert("Відкрили ордер типу селл");
        Sleep(10000);
        OrderSend(Symbol(),OP_BUY,0.1,Ask,3,Bid-25*Point,Ask+25*Point);
        Alert("Відкрили ордер типу бай");
        }else
      {
        OrderSend(Symbol(),OP_BUY,0.1,Ask,3,Bid-25*Point,Ask+25*Point);
        Alert("Відкрили ордер типу бай");
        Sleep(10000);
        OrderSend(Symbol(),OP_SELL,0.1,Bid,3,Bid-25*Point,Ask+25*Point);    
        Alert("Відкрили ордер типу селл");
      }
    } 
   } 
    Alert("Последняя ошыбка ",GetLastError()); 
//----
   return(0);
  }

encontrar esa "estupidez" ser misericordioso, tener piedad de un hombre torturado por Pascal.

 
artmedia70:
Al modificar una posición de mercado, el precio debe ser fijado e igual al precio de apertura de la posición: OrderOpenPrise()

Entonces esta función, en su opinión, no funcionará? No lo he probado pero me parece que forma parte de un código que funciona (este Ilan fue obviamente reconstruido a partir de algo depurado en el mejor de los casos). ¿O sigue siendo un código deficiente?

void TrailingAlls(int pType, int stop, double AvgPrice) {
   int profit;
   double stoptrade;
   double stopcal;
   if (stop != 0) {
      for (int trade = OrdersTotal() - 1; trade >= 0; trade--) {
         if (OrderSelect(trade, SELECT_BY_POS, MODE_TRADES)) {
            if (OrderSymbol() != Symbol() || OrderMagicNumber() != MagicNumber) continue;
            if (OrderSymbol() == Symbol() || OrderMagicNumber() == MagicNumber) {
               if (OrderType() == OP_BUY) {
                  profit = NormalizeDouble((Bid - AvgPrice) / Point, 0);
                  if (profit < pType) continue;
                  stoptrade = OrderStopLoss();
                  stopcal = Bid - stop * Point;
                  if (stoptrade == 0.0 || (stoptrade != 0.0 && stopcal > stoptrade)) OrderModify(OrderTicket(), AvgPrice, stopcal, OrderTakeProfit(), 0, Aqua);
               }
               if (OrderType() == OP_SELL) {
                  profit = NormalizeDouble((AvgPrice - Ask) / Point, 0);
                  if (profit < pType) continue;
                  stoptrade = OrderStopLoss();
                  stopcal = Ask + stop * Point;
                  if (stoptrade == 0.0 || (stoptrade != 0.0 && stopcal < stoptrade)) OrderModify(OrderTicket(), AvgPrice, stopcal, OrderTakeProfit(), 0, Red);
               }
            }
            Sleep(1000);
         }
      }
   }
}
 
Hola, es necesario escribir un Asesor Experto en la estrategia de 3 velas.el comercio se lleva a cabo en los gráficos de Renko que se borran del ruido del mercado.Cuando tres barras consecutivas en la misma dirección para abrir una orden de compra o venta, la pérdida de la parada de poner en la parte superior de la barra anterior, después de cerrar la vela tiene una pérdida de la parada en la barra prevedshego
 
artmedia70:

PD Si yo fuera tú, no buscaría "algoritmos eficientes" en ese código - parece que el tipo escribió el código sin saber realmente lo que está haciendo allí...

Sí, el código es muy específico con mucha redundancia y no sólo eso. Pero no me interesan tanto los algoritmos como tal, sino el enfoque de la aplicación de la idea que los sustenta. Estoy viendo el panorama general, o algo así. Lo que se pone en las funciones individuales, cómo se implementa el mismo brazo de arrastre, a diferencia de la mía, etc. Soy autodidacta y sólo me es útil :)
 
artmedia70:
En el lugar correcto - ¿qué lugar es ese?


Por ejemplo una orden está en la posición de 1200 puntos ya... y el precio por ejemplo bajó y los astros se alinearon para que en este lugar se deba colocar una orden... y la orden ya está ahí y para no bajar el saldo por debajo del requerido no colocar 2 órdenes cada uno, por ejemplo
 
yan720:

Entonces, ¿crees que esta función no funcionará? No lo he probado, pero me parece que es parte de un código que funciona (este Ilan fue obviamente reconstruido a partir de algo depurado en el mejor de los casos). ¿O sigue siendo un código deficiente?

Bueno... el código no es real. Por lo menos.

 
La esencia de la pregunta es la siguiente. Quiero cambiar el MACD simple Expert Advisor estándar, pero soy un cero total en la programación.
Quiero cambiar el EA para que no funcione con una orden sino con una parrilla, stop y magia.
Estas son las variables que quería añadir:
Stoploss = se coloca en el mismo nivel para toda la parrilla, por ejemplo, es igual a EUR/USD = 200pp y se coloca en el nivel de 1,3450 para todas las órdenes de la parrilla
MaxOnDer = Número máximo de órdenes en la parrilla, por ejemplo, si=3, entonces el máximo de órdenes en la parrilla será 3
Dist = Distancia entre dos órdenes pendientes

Lommultiplicator = La relación del tamaño del lote de la siguiente orden en la parrilla.

Magic= número mágico

Salimos de la operación como en el código inicial, es decir, todas las órdenes de la parrilla se cerrarán cuando se cierre la primera orden.

Eso es todo
¡Si alguien otvezvayut estaría muy agradecido!
Estaría muy agradecido! Tal vez alguien tiene un Asesor Experto listo, que ya se implementa en la vida, también, va a hacer.
 
sannin:

hay por ejemplo una orden a 1200 puntos ya... y el precio bajó, por ejemplo, y las estrellas se alinean para que en este lugar se deba colocar la orden... y la orden ya está ahí y no bajar el saldo por debajo del requerido para no colocar 2 órdenes por una, digamos

Es algo así:

//+----------------------------------------------------------------------------+
bool ExistOrdersByPrice(string sy, int op, int mn, double pp) {
   int i, k=OrdersTotal()-1;
   for (i=k; i>=0; i--) {
      if (OrderSelect(i,SELECT_BY_POS)) {
         if (OrderMagicNumber()!=mn)   continue;
         if (OrderSymbol()!=sy)        continue;
         if (OrderType()!=op)          continue;
         if (MathAbs(OrderOpenPrice()-pp)<0.5*Point) return(true);
         }
      else Print("FUNC ExistOrdersByPrice() : ошибка выбора ордера "+GetLastError());
      }
   return(false);
}
//+----------------------------------------------------------------------------+

Para comprobar si hay una orden BuyStop en el símbolo actual al precio de 1,35000 con Magic, llamamos a la función

//+----------------------------------------------------------------------------+
   if (!ExistOrdersByPrice(Symbol(), OP_BUYSTOP, Magic, 1.35000)) {
      // тут код, если нет такого ордера
      }
   else {
      // тут код, если есть такой ордер
      }
//+----------------------------------------------------------------------------+
 
atztek:

Si se trata de documentación, resalte la palabra en el MetEditor y pulse F1. O bien, por ejemplo, se puede recurrir a Internet:
https://docs.mql4.com/ru/customind/SetLevelStyle

Por supuesto, gracias, pero si te da pereza leer la pregunta, ¿qué sentido tiene responder? Puedo cambiar el valor, el grosor, el color y el estilo de los niveles del indicador en las dos funciones que tengo. No tengo acceso a la descripción. Vuelvo a preguntar, ¿alguien sabe la respuesta? No sé si lo he visto antes.

Adjunto una imagen para mostrar lo que necesito.