Funciones útiles de KimIV - página 92

 
alexpert007 >> :

Y aquí hay otra pregunta para Igor.

¿Ha creado una función personalizada (u otra) para invertir la posición de compra-venta y viceversa, sin el habitual OrderClose - OrderSend?

No soy Igor, pero hay una función estándar OrderCloseBy para el volteo.

 

Hola, necesito ayuda para resolver un problema. Voy a intentar describirlo:

Hay una función que cuenta los pedidos:

int OrdersAll(int mag)
{
int kolvo=0;
for (int i=OrdersTotal()-1; i>=0; i--)
{
if (OrderSelect(i,SELECT_BY_POS,MODE_TRADES))
{
if((OrderType()==OP_BUY || OrderType()==OP_SELL) && OrderSymbol()==Symbol() && OrderMagicNumber() == mag )
kolvo++;
}
}
return(kolvo);
}

Además, en el proceso, si no hay ninguna orden para el símbolo actual, cuando se cumple la condición, se debe colocar una orden, por ejemplo, de compra:

if(OrdersAll(MAGICNO)==0)
{
if(condition)
{
op=Ask;if(SL>0){sl=Ask-SL*Point*mn;}if(TP>0){tp=Ask+TP*Point*mn;}
err=OrderSend(Symbol(),OP_BUY,LotsOptimized(),NormalizeDouble(op,Digits),3,NormalizeDouble(sl,Digits),
NormalizeDouble(tp,Digits),"",MAGICNO,0,Blue);
if(err<0)
{
Print("OrderSend()- Error OP_BUY. No se acepta el pedido. op "+op+" sl "+sl+" tp "+tp+""+GetLastError());return(-1);
}
}
}

En cambio, al abrir varios símbolos en el terminal y ejecutar el EA en cada uno de ellos, por ejemplo, el código anterior puede abrir una orden - esto es correcto, pero al mismo tiempo puede abrir 20-30 órdenes hasta que la morsa se agote, si la condición se mantiene durante varios ticks. Todavía no he visto que esto ocurra en un solo instrumento, pero tampoco estoy seguro de que no ocurra en un solo instrumento. ¿Cómo puedo arreglar mi código para que no se pueda abrir más de un pedido?

 

Igor, buenas noches,

No puedo gestionar su llamada de función:

//+----------------------------------------------------------------------------+
//| Autor : Kim Igor V. alias KimIV, http://www.kimiv.ru |
//+----------------------------------------------------------------------------+
//| Versión: 19.02.2008
//| Descripción : Devuelve el beneficio total de las posiciones abiertas en la moneda del depósito |
//+----------------------------------------------------------------------------+
//| Parámetros: |
//| sy - nombre del instrumento (" - cualquier símbolo, |
//| NULL - símbolo actual) |
| //| op - operación (-1 - cualquier posición) |
//| mn - MagicNumber (-1 - cualquier magik) |
//+----------------------------------------------------------------------------+
double GetProfitOpenPosInCurrency(string sy="", int op=-1, int mn=-1) {
doble p=0;
int i, k=Total de Pedidos();

if (sy=="0") sy=Símbolo();
for (i=0; i<k; i++) {
if (OrderSelect(i, SELECT_BY_POS, MODE_TRADES)) {
si ((OrderSymbol()==sy || sy==") && (op<0 || OrderType()==op)) {
if (OrderType()==OP_BUY || OrderType()==OP_SELL) {
if (mn<0 || OrderMagicNumber()==mn) {
p+=OrderProfit()+OrderCommission()+OrderSwap();
}
}
}
}
}
return(p);
}

Me puede decir, en la llamada TotOrdProf=GetProfitOpenBuyPosInCurrency(EURUSD, ____, 1);

1. Supongamos EURUSD, ¿debe ir entre comillas "EURUSD" o se permite sin ellas?

2. Cuál debería ser el segundo parámetro de llamada (donde hay un guión) para calcular el beneficio total de compra y venta (he probado el -1 por defecto; no es correcto)

3. ¿el tercer parámetro es el número mágico del Asesor Experto? - Todavía no he llegado a ella, sólo una pregunta si entiendo bien el parámetro.

Gracias.

 

TotOrdProf=GetProfitOpenBuyPosInCurrency("EURUSD",-1, -1);

- sólo para el EURUSD

- todas las posiciones abiertas (-1)

- posiciones con cualquier magik (-1)

 

Buenas tardes.

Como sabes, Sleep() no funciona en el probador de terminales, por lo que tienes que usar bucles de funciones matemáticas para retrasar la ejecución:

if (IsTesting()==true){for(int z0 = 1; z0 < zFILE*10000; z0++){MathSqrt(MathPow(5,5));MathSqrt(MathPow(5,5));MathSqrt(MathPow(5,5));}}

donde zFILE es el retraso de ejecución del Asesor Experto.

Mi pregunta es: ¿Existe una solución más sofisticada, porque necesito un retraso de unos pocos segundos a 10-20min (procesamiento de datos por un programa externo)?

¿O al menos cómo medir el tiempo de ejecución con mayor precisión (ya que el rendimiento de los procesadores es diferente) y elegir el más lento?





 
Piboli >> :

Pregunta: ¿existe una solución más elegante (función de retardo), ya que el retardo es necesario desde unos pocos segundos hasta 10-20min (procesamiento de datos por software externo)?

¿No intentó utilizar callbacks y sincronizadores?

 

Funciones de Kim

Me pregunto si existe una función que permita sacar el nombre del último patrón

y registrar los cambios en sus componentes


 

KimIV tal vez pueda y escriba un indicador

El indicador debe buscar un canal plano dentro de un período de tiempo especificado y no más amplio que el especificado en los ajustes

Este indicador debe buscar el canal tanto dentro de un día como con la transición al día siguiente como en su función isTradeTimeInt().
Este indicador puede dibujar 5 canales durante un día o sólo uno.
En la configuración

extern double altura máxima del canal en puntos
extern int Bar_Time cómo calculamos el intervalo de tiempo en barras (1) o en horas y minutos (2)
cadena externa intervalo de tiempo mínimo del canal en horas y minutos
extern int intervalo de tiempo mínimo del canal en bares
extern int número máximo de canales dibujados que permanecen dibujados

Adjunto un indicador similar a https://www.mql5.com/ru/code pero dibuja el canal en un intervalo de tiempo estrictamente establecido y no busca dicho canal por sí mismo. Sólo debe buscar un canal que no supere la altura máxima del canal y que no sea más corto que el intervalo de tiempo mínimo del canal.
Si elegimos Bar_Time para la hora del canal, el canal(1) se calcula a partir de la hora actual menos la hora indicada en los ajustes, es decir, 2 horas 15 minutos u otra hora. Si ahora es 1 hora 15 minutos, busca el máximo y el mínimo a partir de las 23 horas 00 minutos y si el máximo menos el mínimo está por debajo de la altura máxima del canal, dibuja dos líneas de máximo y mínimo desde las 23:00 hasta las 02:15. También dibuja los niveles de Fibo por encima y por debajo del canal.

Si elegimos Bar_Time por número de barras, el canal se calcula desde la barra actual menos el número de barras especificado en los ajustes, es decir, desde la barra cero hasta la barra cero menos el número especificado en los ajustes. Si el número elegido es 50, buscamos el máximo y el mínimo de las últimas 50 barras desde la barra cero y si el máximo menos el mínimo no supera la altura máxima del canal, se dibujarán dos líneas de máximos y mínimos de 50 barras.

Todos los niveles y datos de los canales se almacenan en buffers

 

Pregunta a Igor

Si me pueden dar un fragmento de código de un Asesor Experto que trabaje en dos cuentas separadas (Compra-Venta), sondeando el estado de cada cuenta (para calcular el tamaño del lote) y que tenga la capacidad de transferir el depósito de una cuenta a otra, así como simular el retiro de parte del depósito bajo ciertas condiciones (digamos una ganancia mensual o trimestral - de ella n%)

Permítanme aclarar mi pregunta

1 El Asesor Experto trabaja en la compra (estado de encuestas de la cuenta 2) . 6200

2 El Asesor Experto abre una posición de venta (solicita el saldo de la cuenta a 1) ... 8400

Si no hay puestos vacantes

1100 de la cuenta 2 a la cuenta 1

cuenta 1 - 7300

cuenta 2 - 7300

depósito bruto total SD=14600 Riesgo máximo - 10% Lote máximo 0,14

Más información en

a partir del 01.04.09 SD=10000

a partir del 01.07.09 SD=14600

Beneficio=4600

10% = 460

460 euros deducidos en la tercera cuenta

Gracias

 

Querido Igor, ¡ayúdame!

He conectado a-SimpleTrailing.mqh.

Se ha añadido lo que se ha especificado, pero aparecen 3 errores:

'clModifyBuy' - variable no definida
'clModifySell' - variable no definida
'ti' - variable ya definida

¿Qué hacer?(



Esto es lo que cabe:

.........................
   total=OrdersTotal();
   if( total<1)
     {
      if(AccountFreeMargin()<(1000* Lots))
        {
         Print("У вас нет денег. Свободные средства = ", AccountFreeMargin());
         return(0);
        }
      if(Hour()>=0)
        {
         chk=1;
         Print("Позиция возможна!");
        }
      if( chk==1)
        {
         if((Low[0]<= MaDert1sell) || (Low[0]<= MaDert2sell))
           {
int ti= OpenPosition(NULL, OP_BUY, 0.1);
if (OrderSelect( ti, SELECT_BY_TICKET))
ModifyOrder(-1, Ask-30*Point, Bid-99*Point, clModifySell);
            if( ticket>0)
              {
               if(OrderSelect( ticket, SELECT_BY_TICKET, MODE_TRADES))
                  Print("Открыт ордер SELL : ",OrderOpenPrice());
               chk=0;
              }
            else
              {
               Print("Ошибка открытия SELL ордера : ",GetLastError());
               return(0);
              }
           }
         if((High[0]>= MaDert1buy) || (High[0]>= MaDert2buy))
           {
int ti= OpenPosition(NULL, OP_BUY, 0.1);
if (OrderSelect( ti, SELECT_BY_TICKET))
ModifyOrder(-1, Ask-30*Point, Bid-99*Point, clModifyBuy);
            if( ticket>0)
              {
               if(OrderSelect( ticket, SELECT_BY_TICKET, MODE_TRADES))
                  Print("Открыт ордер BUY : ",OrderOpenPrice());
               chk=0;
              }
            else
              {
               Print("Ошибка открытия BUY ордера : ",GetLastError());
               return(0);
              }
           }
        }
      return(0);
     }
   for( cnt=0; cnt< total; cnt++)
     {
      OrderSelect( cnt, SELECT_BY_POS, MODE_TRADES);
      if(OrderType()<=OP_SELL &&   // это открытая позиция? OP_BUY или OP_SELL 
         OrderSymbol()==Symbol())  // инструмент совпадает?
        {
         if(OrderType()==OP_BUY)   // открыта длинная позиция
           {
            // проверим, может уже пора закрываться?
            if(Hour()==23)
              {
               chk=0;
               OrderClose(OrderTicket(),OrderLots(),Bid,3,Violet); // закрываем позицию
               return(0); // выходим
              }
           }
         else // иначе это короткая позиция
           {
            // проверим, может уже пора закрываться?
            if(Hour()==23)
              {
               chk=0;
               OrderClose(OrderTicket(),OrderLots(),Ask,3,Violet); // закрываем позицию
               return(0); // выходим
              }

           }
        }
     }
   return(0);
  }

//+----------------------------------------------------------------------------+
//+----------------------------------------------------------------------------+
//|  Автор    : Ким Игорь В. 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);
      }
    }
  }
}
//+----------------------------------------------------------------------------+
//|  Возвращает наименование торговой операции                                 |
//|  Параметры:                                                                |
//|    op - идентификатор торговой операции                                    |
//+----------------------------------------------------------------------------+
string GetNameOP(int op) {
	switch ( op) {
		case OP_BUY      : return("Buy");
		case OP_SELL     : return("Sell");
		case OP_BUYLIMIT : return("Buy Limit");
		case OP_SELLLIMIT: return("Sell Limit");
		case OP_BUYSTOP  : return("Buy Stop");
		case OP_SELLSTOP : return("Sell Stop");
		default          : return("Unknown Operation");
	}
}
//+----------------------------------------------------------------------------+
Razón de la queja: