Funciones útiles de KimIV - página 71

 
Hay que numerar los fractales superiores e inferiores por separado. En los parámetros de la función, especifique el tipo UPPER o LOWER y el número de fractal. Por cierto, si al buscar los puntos de inflexión en zigzag se numeraran por separado las torceduras superiores e inferiores, sería más cómodo de usar.
 
KimIV писал(а) >>

Sí, no hay... Porque no podía decidir cómo numerar esos fractales:

¿Y si algo así no cuenta como una formación fractal? ¿Una opción?

 
kombat. No estoy de acuerdo con esta opción. El hecho es que justo cuando hay dos fractales en la misma barra, es una señal de la conocida figura "lente", a veces llamada "diamante". Por lo tanto, esta cifra se puede pescar en el Asesor Experto mediante este signo.
 
Pregunta a Docs e Igor = ¿Es posible construir el indicador "Profit" o "Funds" como una línea continua del tiempo (de diferentes Т\F) en una ventana separada del tiempo ( lo que significa - el control del rendimiento de la cartera en la dinámica)... Por desgracia, hay un indicador en el sitio web de Igor, pero es en forma de tabla y estática ... (o tal vez hay uno - dame un enlace) ....
 
khorosh писал(а) >>
kombat. No estoy de acuerdo con esta opción. El hecho es que justo cuando hay dos fractales en una barra, es una señal de la conocida figura "lente", a veces llamada "diamante". Por lo tanto, esta cifra se puede pescar en el Asesor Experto por este signo.

Para la definición SÍ, pero para la numeración, que es de lo que se trata...

 
nuj >> :
Pregunta a Docs e Igor = ¿Es posible construir un indicador de "Beneficios" o "Fondos" como una línea continua del tiempo (de diferentes Т\F) en una ventana separada del tiempo ( lo que significa - control del rendimiento de la cartera en la dinámica)... Por desgracia, hay un indicador en el sitio web de Igor, pero es en forma de tabla y estática ... (o tal vez hay uno - dame un enlace) ....

buscar en el foro

Archivos adjuntos:
equity_v7.mq4  17 kb
 

y pregunte si tiene un asesor que:

1. recoge todas las posiciones abiertas.

2. establece un stop sin pérdidas.

3. pesca de arrastre

4. cierra posiciones en tres niveles. por ejemplo:

Lote igual a 1.

Salida 1 - Se cierra el 50% del lote, por ejemplo, 30 pips desde el precio de apertura.

2 way out - el 30% del lote se cierra, por ejemplo 70 puntos del precio abierto.

3 vías de salida - el 20% del lote está cerrado, por ejemplo en el cruce de MA.

Gracias.

 

Buenas tardes, Podrían decirme cómo implementar la función NumberOfBarOpenLastPos en este sencillo Expert Advisor,

para que una orden se active una vez por barra... He puesto la función en el código, pero no funciona nada...

//--------------------------------------------------------------------
// tradingexpert.mq4
//
//--------------------------------------------------------------------
#property copyright "Copyright © Book, 2007"
#enlace de propiedad "http://AutoGraf.dp.ua"
//--------------------------------------------------------------- 1 --
// Valores numéricos para M15
extern double StopLoss =200; // SL para la orden que se abre
extern double TakeProfit =10; // TP para la orden que se abre
extern intern Period_MA_1=11; // Periodo MA 1
extern int Periodo_MA_2=31; // Periodo MA 2.
extern double Rastvor =28.0; // Distancia entre MAs.
extern double Lotes =0.1; // Número fijo de lotes.
extern double Prots =0.07; // Porcentaje de fondos libres

bool Work=true; // El Asesor Experto funcionará.
string Symb; // Nombre del instrumento financiero
//--------------------------------------------------------------- 2 --
int inicio()
{
int
Total, // Número de pedidos en la ventana
Tip=-1, // Tipo de pedido seleccionado (B=0,S=1)
Ticket; // Número de pedido
doble
MA_1_t, // Valor. Valor actual de MA_1
MA_2_t, // Valor de MA_2_t. MA_2_t valor actual, // MA_2_t valor.
Lote, //Número de lote en la Orden actualmente seleccionada
Lts, //Número de lotes en una orden abierta
Min_Lot, // Número mínimo de lotes
Paso, // Paso del cambio de tamaño del lote
Libre, // Fondos libres actuales
One_Lot, // Valor de un lote
Precio, // Precio de la orden seleccionada
SL, // Precio SL de la orden seleccionada
TP; // TP de la orden seleccionada
bool
Ans =false, // Respuesta del servidor después del cierre
Cls_B=false, // Criterio de cierre Comprar
Cls_S=false, // Criterio de cierre Venta
Opn_B=false, // Criterio de apertura de Buy
Opn__S=false; // criterio de apertura Venta
//--------------------------------------------------------------- 3 --
/Preprocesamiento
if(Bars < Period_MA_2) // No hay suficientes barras
{
Alert("No hay suficientes barras en la ventana. El Asesor Experto no funciona");
return; // Salir de start()
}
if(Work==false) // Error crítico.
{
Alert("Error crítico. El Asesor Experto no funciona");
return; // Salir de start()
}
//--------------------------------------------------------------- 4 --
// Recuento de pedidos
Symb=Símbolo(); // Nombre del instrumento financiero.
Total=0; // Número de pedidos
for(int i=1; i<=TotalPedidos(); i++) // Bucle de pedidos
{
if(OrderSelect(i-1,SELECT_BY_POS)==true) // Si
{ // Análisis de pedidos:
if (OrderSymbol()!=Symb)continue; // No es nuestro instrumento financiero
if (OrderType()>1) // Tenemos una orden pendiente
{
Alert("Orden pendiente detectada. El Asesor Experto no está funcionando;)
return; // Exit()
}
Total++; // Contador de órdenes de mercado
if (Total>1) // No hay más de un pedido
{
Alert("Varias órdenes de mercado. El Asesor Experto no funciona;)
return; // Exit()
}
Ticket=OrderTicket(); // Número de pedido seleccionado.
Tip =OrderType(); // Tipo de la orden seleccionada.
Precio =OrderOpenPrice(); // Precio de la orden seleccionada.
SL =OrderStopLoss(); // SL de la orden seleccionada.
TP =OrderTakeProfit(); // TP de la orden seleccionada.
Lot =OrderLots(); // Número de lotes
}
}
//--------------------------------------------------------------- 5 --
// Criterios comerciales
MA_1_t=iMA(NULL,0,Period_MA_1,0,MODE_LWMA,PRICE_TYPICAL,0); // MA_1
MA_2_t=iMA(NULL,0,Period_MA_2,0,MODE_LWMA,PRICE_TYPICAL,0); // MA_2

if (MA_1_t > MA_2_t + Rastvor*Point) // si la diferencia entre
{ // ...MA1 y 2 es grande
Opn_B=true; // Abrir criterio de compra
Cls_S=true; // Criterio de cierre Vender
}
if (MA_1_t < MA_2_t - Rastvor*Point) // Si la diferencia entre
{ // ..MA_1 y 2 es grande
Opn_S=true; //abrir el criterio de venta
Cls_B=true; //Criterio de clic Comprar
}
//--------------------------------------------------------------- 6 --
// Cerrar órdenes
while(true) //Ordenar el cierre del bucle.
{
if (Tip==0 && Cls_B==true) //Abrir orden de compra.
{ //hay un criterio de cierre
Alert("Intentando cerrar Buy ",Ticket,";)
RefreshRates(); // Actualizar datos
Ans=OrderClose(Ticket,Lot,Bid,2); // Cerrar la compra
if (Ans==true) // Ha funcionado :)
{
Alerta ("Orden de compra cerrada ",Ticket;)
break; // Salir del bucle de cierre
}
if (Fun_Error(GetLastError())==1) // Gestión de errores
continuar; // reintentar
return; // Salir de start()
}

if (Tip==1 && Cls_S==true) // Orden de venta abierta.
{ // hay un criterio de proximidad
Alert("Intentando cerrar la venta ",Ticket,";)
RefreshRates(); // Actualizar datos
Ans=OrderClose(Ticket,Lot,Ask,2); // Cierre de la venta
if (Ans==true) // Ha funcionado :)
{
Alerta ("Orden de venta cerrada ",Ticket;)
break; // Salir del bucle de cierre
}
if (Fun_Error(GetLastError())==1) // Gestión de errores
continuar; // reintentar
return; // Salir de start()
}
break; // Salir mientras
}
//--------------------------------------------------------------- 7 --
// Ordenar los valores
RefreshRates(); // Actualizar datos
Min_Lot=MarketInfo(Symb,MODE_MINLOT); // Número mínimo de lotes
Free =AccountFreeMargin(); // Liberar fondos
One_Lot=MarketInfo(Symb,MODE_MARGINREQUIRED);// Valor de 1 lote
Step =MarketInfo(Symb,MODE_LOTSTEP); // Cambio de tamaño por pasos

if (Lots > 0) // Si se especifican los lotes
Lts =Lotes; // trabajamos con ellos
else // % de fondos libres
Lts=MathFloor(Free*Prots/One_Lot/Step)*Step;// Para la apertura

if(Lts < Lote_Mín) Lts=Lote_Mín; // No menos que Lote_Mín; // No menos que Lote_Mín
if(Lts*One_Lot > Free) // Lotes más caros que Free
{
Alert(" No hay suficiente dinero ", Lts," lotes);
return; // Salir de start()
}
//--------------------------------------------------------------- 8 --
//Ordenes abiertas
if (NumberOfBarOpenLastPos()>0){
while(true) // Cerrar el bucle de orden.
{
if (Total==0 && Opn_B==true) // No hay órdenes abiertas
{ //criterio de compra abierto.
RefreshRates(); // Actualizar datos
SL=Bid - New_Stop(StopLoss)*Punto; // Cálculo del SL abierto
TP=Bid + New_Stop(TakeProfit)*Punto; // Cálculo del TP abierto.
Alert("Intentando abrir Buy. Esperando respuesta...");
Ticket=OrderSend(Symb,OP_BUY,Lts,Ask,2,SL,TP);//comprar
if (Ticket > 0) // ha funcionado :)
{
Alerta ("Orden de compra abierta ",Ticket;)
return; //Salir de la orden
}
if (Fun_Error(GetLastError())==1) // Gestión de errores
continuar; // reintentar
return; // Salir de start()
}
if (Total==0 && Opn_S==true) // no hay órdenes abiertas
{ //abrir criterio de venta.
RefreshRates(); // Actualizar datos
SL=Ask + New_Stop(StopLoss)*Punto; // Cálculo de SL abierto.
TP=Ask - New_Stop(TakeProfit)*Punto; // Cálculo del TP abierto.
Alert("Intentando abrir la venta. Esperando respuesta...");
Ticket=OrderSend(Symb,OP_SELL,Lts,Bid,2,SL,TP);//Open Sel.
if (Ticket > 0) // Ha funcionado :)
{
Alerta ("Orden de venta abierta ",Ticket;)
return; // Salir del inicio()
}
if (Fun_Error(GetLastError())==1) // Gestión de errores
continuar; // reintentar
return; // Salir de start()
}
break; // Salir mientras
}
}
//--------------------------------------------------------------- 9 --
return; //salir while; //iniciar()
}
//-------------------------------------------------------------- 10 --


//+----------------------------------------------------------------------------+
//| Autor : Kim Igor V. alias KimIV, http://www.kimiv.ru |
//+----------------------------------------------------------------------------+
//| Versión: 19.02.2008
//| Descripción : Devuelve el número de barra de la última posición abierta o -1.
//+----------------------------------------------------------------------------+
//| Parámetros: |
//| sy - nombre del instrumento ("" o NULL - símbolo actual) |
//| tf - timeframe ( 0 - timeframe actual) ||
//| op - operación ( -1 - cualquier posición) |
//| mn - MagicNumber ( -1 - cualquier número mágico) ||
//+----------------------------------------------------------------------------+
intOfBarOpenLastPos(string sy="0", int tf=0, int op=-1, int mn=-1) {
datetime t;
int i, k=Total de Pedidos();

if (sy=="" | sy=="0") sy=Símbolo();
for (i=0; i<k; i++) {
if (OrderSelect(i, SELECT_BY_POS, MODE_TRADES)) {
if (OrderSymbol()==sy) {
if (OrderType()==OP_BUY || OrderType()==OP_SELL) {
if (op<0 || OrderType()==op) {
if (mn<0 || OrderMagicNumber()==mn) {
if (t<OrderOpenTime()) t=OrderOpenTime();
}
}
}
}
}
}
return(iBarShift(sy, tf, t, True))
}

int Fun_Error(int Error) // Función de gestión de errores
{
switch(Error)
{ // Errores que se pueden evitar.
caso 4: Alerta("El servidor comercial está ocupado. Inténtelo de nuevo...");
Sleep(3000); // Solución simple.
return(1); // Salir de la función.
case 135:Alert("El precio ha cambiado. Inténtelo de nuevo...");
RefreshRates(); // Actualizar datos.
return(1); // Salir de la función.
case 136:Alert("No hay precio. Esperando un nuevo tick...");
while(RefreshRates()==false) // Till a new tick
Sleep(1); // Retraso en el bucle
return(1); // Salir de la función
case 137:Alerta("El corredor está ocupado. Inténtelo de nuevo...");
Sleep(3000); // Solución simple.
return(1); // Salir de la función.
case 146:Alert("El subsistema de comercio está ocupado. Inténtelo de nuevo...");
Sleep(500); // Decisión simple
return(1); // Salir de la función
// Errores críticos
caso 2: Alert("Error general;)
return(0); // Salir de la función.
caso 5: Alert("Versión antigua del terminal.");
Work=false; // Ya no funciona
return(0); // Salir de la función
caso 64: Alerta("Cuenta bloqueada.");
Work=false; // Ya no funciona
return(0); // Salir de la función
caso 133:Alerta("Prohibido comerciar");
return(0); // Salir de la función
caso 134:Alerta("No hay suficiente dinero para ejecutar la transacción");
return(0); // Salir de la función
por defecto: Alert("Se ha producido un error ",Error); // Otras opciones
return(0); // Salir de la función
}
}
//-------------------------------------------------------------- 11 --
int New_Stop(int Parametr) // Comprueba la parada.
{
int Min_Dist=MarketInfo(Symb,MODE_STOPLEVEL);// Distancia mínima
if (Parametr<Min_Dist) // Si es menor de lo permitido.
{
Parametr=Min_Dist; // Establecer la tolerancia.
Alert("La distancia de parada ha aumentado;)
}
return(Parametr); // Valor de retorno.
}
//-------------------------------------------------------------- 12 --

 
kurilko >> :

// Apertura de pedidos

if (NumberOfBarOpenLastPos()>0)

La función devuelve más de 0 sólo si se ha abierto una posición, si no -1 entonces sigue...

if (NumberOfBarOpenLastPos()>0|NumberOfBarOpenLastPos()==-1)

{

}

 

Se ha cambiado la condición a if (NumberOfBarOpenLastPos()>0||NumberOfBarOpenLastPos()==-1)

Sigue sin funcionar, ¿quizás haya que escribirlo en otro lugar del código?

Razón de la queja: