Funciones útiles de KimIV - página 113

 
togomsk:


¡Hola!

Por alguna razón, cuando se conecta su librería, el operador extern deja de funcionar, es decir, las variables se definen, todo compila normalmente, y en principio, el EA funciona, pero al mismo tiempo, el EA no tiene ningún parámetro al iniciar el tipo, a pesar de que hay bastantes parámetros. ¿Cuál puede ser la razón de esto?


Encuentra en el código

#property library

Y borrar.

 

He añadido una variable j a esta función, para la penúltima transacción.

double GetProfitLastClosePos(string sy="", int op=-1, int mn=-1, int j=0) {
datetime o;
doble p=-1;
int i, k=Total de Pedidos();

if (sy=="0") sy=Símbolo();
for (i=0; i<k; i++) {
if(OrderSelect(i-j, SELECT_BY_POS, MODE_HISTORY)) {
if (OrderSymbol()==sy || sy=="") {
if (OrderType()==OP_BUY || OrderType()==OP_SELL) {
if (op<0 || OrderType()==op) {
if (mn<0 || OrderMagicNumber()==mn) {
si (o<OrderCloseTime()) {
o=OrderCloseTime();
p=OrderProfit();
}
}
}
}
}
}
}
return(p);
}
 
abdul1:

He añadido una variable j a esta función, para las penúltimas operaciones.

Si tenemos en cuenta que los pedidos que se han cerrado se consideran en OrdersHistoryTotal() según el momento de cierre de derecha -> izquierda (el último a la derecha):

double GetProfitLastClosePos (string sy="", int op=-1, int mn=-1,
                              int j=0)          // Искомый (по номеру) ордер от последнего закрытого 
{
    int k = OrdersHistoryTotal(), li_cnt = 0;
//----
    if (sy == "0" || sy == "") sy = Symbol();
    for (int i = k - 1; i >= 0; i--)
    {
        if (!OrderSelect (i, SELECT_BY_POS, MODE_HISTORY)) continue;
        if (OrderSymbol() != sy) continue;
        if (OrderType() > 1) continue;
        if (op >= 0) if (OrderType() != op) continue;
        if (mn >= 0) if (OrderMagicNumber() != mn) continue;
        if (j == li_cnt) return (OrderProfit());
        li_cnt++;
    }
//----
    return (-1.0);
}

La función devuelve la ganancia j-ésima de la última orden cerrada, "filtrada" por símbolo, magik, tipo. Y los números se cuentan desde el 0.

 
TarasBY:

Si tenemos en cuenta que las órdenes cerradas se contabilizan en OrdersHistoryTotal() por la hora de cierre de derecha a izquierda (la más reciente de extrema derecha):

La función devuelve el beneficio j-ésimo de la última orden cerrada, "filtrado" por instrumento, Magik, tipo. Y los números se cuentan desde el 0.

¡Eso es lo que necesito!
 

Hola a todos.

Se necesita una función para cerrar las órdenes de compra y venta de lotes iguales mediante contraórdenes, cuando su beneficio llega a +. Intenté hacer esta función, pero sale el error 4108 (entradas equivocadas)

¿Puede decirme cuál es el problema?

//+------------------------------------------------------------------+
int fCloseBu(){
        // Закрываем встречные
  double LotB,LotS,PrB=0,PrS=0;
  int TicketB,TicketS,i, k=OrdersTotal();

  for (i=k-1; i>=0; i--) {
    if (OrderSelect(i, SELECT_BY_POS, MODE_TRADES)) {
      if ((OrderSymbol()==Symbol() || Symbol()=="")) {
        if (Magic_N<0 || OrderMagicNumber()==Magic_N) {
        //----------
        if(OrderType()==OP_BUY){
          if (PrB<OrderProfit()+OrderSwap()+OrderCommission()) {
            PrB=OrderProfit()+OrderSwap()+OrderCommission();
            LotB=OrderLots();
            TicketB=OrderTicket();
          }
        }
        if(OrderType()==OP_SELL){
          if (PrS<OrderProfit()+OrderSwap()+OrderCommission()) {
            PrS=OrderProfit()+OrderSwap()+OrderCommission();
            LotS=OrderLots();
            TicketS=OrderTicket();
          }
        }
       if (PrB>0 && PrS>0 && LotB==LotS) {
          OrderCloseBy(TicketB,TicketS,CLR_NONE);
          Print("Закрываем пару встречных ордеров c одинаковыми лотами в плюсе");
          }  
        }
      }
    }
  }
//-------------
   return(0);
}
//+------------------------------------------------------------------+
 
Los pedidos deben cerrarse cuando se haya realizado todo el ciclo de comprobaciones, es decir, después de la sentencia for, no dentro.
 
¿Me pueden aconsejar dónde puedo encontrar un EA que funcione al cruzar una media móvil con la posibilidad de desplazar la media móvil en los ajustes?
 
Roger:
Los pedidos deben cerrarse cuando se haya realizado todo el ciclo de comprobaciones, es decir, después de la sentencia for, no dentro.


Gracias. Si alguien más necesita una función de este tipo, será así:

//+------------------------------------------------------------------+
//|    Закрываем встречные                                           |
//+------------------------------------------------------------------+
int fCloseBu(){
  double LotB,LotS,PrB=0,PrS=0;
  int TicketB,TicketS,i, k=OrdersTotal();

  for (i=k-1; i>=0; i--) {
    if (OrderSelect(i, SELECT_BY_POS, MODE_TRADES)) {
      if ((OrderSymbol()==Symbol() || Symbol()=="")) {
        if (Magic_N<0 || OrderMagicNumber()==Magic_N) {
        //----------
        if(OrderType()==OP_BUY){
          if (PrB<OrderProfit()+OrderSwap()+OrderCommission()) {
            PrB=OrderProfit()+OrderSwap()+OrderCommission();
            LotB=OrderLots();
            TicketB=OrderTicket();
          }
        }
        if(OrderType()==OP_SELL){
          if (PrS<OrderProfit()+OrderSwap()+OrderCommission()) {
            PrS=OrderProfit()+OrderSwap()+OrderCommission();
            LotS=OrderLots();
            TicketS=OrderTicket();
             }
           }
         }
       }
     }
   }//for
   if(PrB>0 && PrS>0 && LotB==LotS) {
     OrderCloseBy(TicketB,TicketS,CLR_NONE);
     Print("Закрываем пару встречных ордеров c одинаковыми лотами в плюсе");
  }
//-------------
   return(0);
}
//+------------------------------------------------------------------+
 
¿Existe algún video tutorial sobre este idioma?
 
Andrei5:
¿Existe algún video tutorial sobre este idioma?
Hay un libro. Puede leerlo en línea o descargarlo en su ordenador. Mira arriba -> "Tutorial".
Razón de la queja: