Funciones útiles de KimIV - página 7

 

Bueno, ya que no hay preguntas, continuemos...

Función ModifyOrder().

La función ModificarOrden está diseñada para cambiar uno o más niveles de precio de una orden preseleccionada. Aquí se entiende por orden pendiente una orden de Límite o Stop, así como una orden de Compra o Venta de mercado, es decir, una posición. Con la función ModifyOrder se pueden modificar dos niveles de precio StopLoss y TakeProfit para la posición, mientras que para la orden pendiente se puede cambiar también el precio de ajuste OpenPrice. Los niveles de precios modificados se pasan a la función ModifyOrder como parámetros. Si alguno de los parámetros es negativo, el nivel de precios correspondiente no se modificará.

//+----------------------------------------------------------------------------+
//|  Автор    : Ким Игорь В. aka KimIV,  http://www.kimiv.ru                   |
//+----------------------------------------------------------------------------+
//|  Версия   : 28.11.2006                                                     |
//|  Описание : Модификация одного предварительно выбранного ордера.           |
//+----------------------------------------------------------------------------+
//|  Параметры:                                                                |
//|    pp - цена установки ордера                                              |
//|    sl - ценовой уровень стопа                                              |
//|    tp - ценовой уровень тейка                                              |
//|    cl - цвет значка модификации                                            |
//+----------------------------------------------------------------------------+
void ModifyOrder(double pp=-1, double sl=0, double tp=0, color cl=CLR_NONE) {
  bool   fm;
  double op, pa, pb, os, ot;
  int    dg=MarketInfo(OrderSymbol(), MODE_DIGITS), er, it;
 
  if (pp<=0) pp=OrderOpenPrice();
  if (sl<0 ) sl=OrderStopLoss();
  if (tp<0 ) tp=OrderTakeProfit();
  
  pp=NormalizeDouble(pp, dg);
  sl=NormalizeDouble(sl, dg);
  tp=NormalizeDouble(tp, dg);
  op=NormalizeDouble(OrderOpenPrice() , dg);
  os=NormalizeDouble(OrderStopLoss()  , dg);
  ot=NormalizeDouble(OrderTakeProfit(), dg);
 
  if (pp!=op || sl!=os || tp!=ot) {
    for (it=1; it<=NumberOfTry; it++) {
      if (!IsTesting() && (!IsExpertEnabled() || IsStopped())) break;
      while (!IsTradeAllowed()) Sleep(5000);
      RefreshRates();
      fm=OrderModify(OrderTicket(), pp, sl, tp, 0, cl);
      if (fm) {
        if (UseSound) PlaySound(NameFileSound); break;
      } else {
        er=GetLastError();
        pa=MarketInfo(OrderSymbol(), MODE_ASK);
        pb=MarketInfo(OrderSymbol(), MODE_BID);
        Print("Error(",er,") modifying order: ",ErrorDescription(er),", try ",it);
        Print("Ask=",pa,"  Bid=",pb,"  sy=",OrderSymbol(),
              "  op="+GetNameOP(OrderType()),"  pp=",pp,"  sl=",sl,"  tp=",tp);
        Sleep(1000*10);
      }
    }
  }
}
 

Ejemplos de cómo utilizar la función ModifyOrder().

Decidí dar los primeros ejemplos que me han preguntado muchas veces. Se trata de la apertura de posiciones en términos de ejecución de órdenes de mercado Market Watch. Es cuando no podemos dar simultáneamente una orden de apertura de posición a precio de mercado y adjuntarle una orden pendiente. Dicha apertura en Market Watch debe realizarse en dos etapas: primero, abrimos una posición, y luego le adjuntamos una orden pendiente, es decir, establecemos los niveles de precio StopLoss y TakeProfit.

1. Compre 0,1 lotes del símbolo actual y fije un stop de 30 puntos

int ti=OpenPosition(NULL, OP_BUY, 0.1);
if (OrderSelect(ti, SELECT_BY_TICKET))
  ModifyOrder(-1, Ask-30*Point, -1, clModifyBuy);

2. Vender 0,15 lotes del instrumento actual y establecer SL=45, TP=99

int ti=OpenPosition(NULL, OP_SELL, 0.15);
if (OrderSelect(ti, SELECT_BY_TICKET))
  ModifyOrder(-1, Bid+45*Point, Bid-99*Point, clModifySell);
En el tráiler se incluye un guión de trabajo con ejemplos.
Archivos adjuntos:
 
Igor, ¿tiene una función de orden de cierre (tanto sólo Close como CloseBy)?
 
Lukyanov:
Igor, ¿tienes una función para cerrar órdenes (tanto sólo Close como CloseBy)?
Close está ahí, CloseBy no.
 
Cerrar en orden alfabético debe ser antes de ModifyOrder ;-)
 
Lukyanov:
Cerrar en orden alfabético debe ser antes de ModifyOrder ;-)
Sí, eso es... Primero abrir, luego modificar y finalmente cerrar ;-)
 

Tiene sentido... ;)

¿Consideras que es un descaro hacer una pequeña libación, de un solo post, sobre el tema de la "Transmisión a la función"?
Hasta ahora es un oscuro bosque lógico-ideológico para mí...
(no, no lo es...).

 
kombat писал (а):
¿Consideras que es una desfachatez tener un poco de educación en un puesto sobre el tema de la "Transmisión a la función"?
No, no lo haría. En lo que respecta a mis funciones, se acepta cualquier pregunta en cualquier momento. Intentaré responder a todas ellas...
 

Gracias...
Y por supuesto no hay prisa... no hay prisa.
El mercado no huirá de nosotros... :)))

 
kombat писал (а):
Gracias...
Y por supuesto no hay prisa... no hay prisa.
El mercado no huirá de nosotros... :)))
En realidad, esperaba que me hicieran preguntas. Preguntas concretas, indicando directamente lo que necesita aclarar en el ámbito de la utilización de mis funciones.