Escribo indicadores, EAs, no de forma gratuita más :) - página 6

 
KimIV >> :
Parámetros de función incorrectos. Compruebe exactamente lo que pasa a la función OrderClose().

Lo he comprobado... Realmente no sé cuál es el problema... He probado tantas cosas diferentes %(

 

Buenas noches de nuevo :)

Con una nueva petición. Me he dado cuenta de que, de todas formas, no podré resolverlo por mí mismo.

Estoy pidiendo escribir un EA basado en el indicador WATR (código de EA abajo). Cuando el indicador hace un giro, cierra la orden abierta (si no ha sido cerrada por el SL o el TP) y abre una nueva orden en la dirección mostrada por el indicador. Abrimos sólo una orden exactamente en el punto de inversión. Entonces esperamos hasta la siguiente reversión del EA.

Parámetros de entrada: tamaño del lote, SL, TP, deslizamiento. Creo que no he olvidado nada :)

Saludos, Svetlana. ICQ 320355718

Código del indicador:

//+------------------------------------------------------------------+
//| WATR.mq4
//| Escrito por WizardSerg bajo el artículo konkop en ||
//| "Modern trading" #4/2001 |
//| http://www.wizardserg.inweb.ru |
//| wizardserg@mail.ru |
//+------------------------------------------------------------------+
#property copyright "Escrito por WizardSerg bajo el artículo konkop en <Modern trading> #4/2001"
#enlace de propiedad "http://www.wizardserg.inweb.ru"
//----
#propiedad ventana_del_gráfica_del_indicador
#property indicator_buffers 2
#property indicator_color1 Coral
#property indicator_color2 DodgerBlue
//---- parámetros de entrada
WATR_K externo = 10;
extern double WATR_M = 4.0;
ATR externo interno = 21;
//---- buffers
doble ExtMapBufferUp[];
doble ExtMapBufferDown[];
//+------------------------------------------------------------------+
//| Función de inicialización de indicadores personalizada |
//+------------------------------------------------------------------+
int init()
{
IndicatorBuffers(2);
SetIndexBuffer(0, ExtMapBufferUp);
ArraySetAsSeries(ExtMapBufferUp, true);
SetIndexStyle(0, DRAW_LINE, STYLE_SOLID, 2);
SetIndexBuffer(1, ExtMapBufferDown);
ArraySetAsSeries(ExtMapBufferDown, true);
SetIndexStyle(1, DRAW_LINE, STYLE_SOLID, 2);
IndicatorShortName("WATR(" + WATR_K + ", " + WATR_M + ")";
SetIndexLabel(0, "WATR_Up");
SetIndexLabel(1, "WATR_Dn");
return(0);
}
//+------------------------------------------------------------------+
//| Función de desinicialización de indicadores personalizada |
//+------------------------------------------------------------------+
int deinit()
{
//----
return(0);
}
//+------------------------------------------------------------------+
//| Función indicadora personalizada |
//+------------------------------------------------------------------+
bool AntiTrendBar(int i)
{
bool res = (TrendUp(i) && (Close[i] < Open[i]) ||
(!TrendUp(i) && (Close[i] > Open[i]);
return(res);
}
//+------------------------------------------------------------------+
//| Función indicadora personalizada |||
//+------------------------------------------------------------------+
double CalcIndicValue(int, bool trend)
{
double res = Close[i];
si(tendencia)
res -= (WATR_K*Punto + WATR_M*iATR(NULL, 0, ATR, i))
si no
res += (WATR_K*Punto + WATR_M*iATR(NULL, 0, ATR, i));
return(res);
}
//+------------------------------------------------------------------+
//| Función indicadora personalizada |
//+------------------------------------------------------------------+
bool TrendUp(int i)
{
return((Close[i+1] > ExtMapBufferUp[i+1]) &&
(ExtMapBufferUp[i+1] != EMPTY_VALUE))
}
//+------------------------------------------------------------------+
//| Función de iteración de indicadores personalizada |
//+------------------------------------------------------------------+
int inicio()
{
int límite;
int barras_contadas = IndicadorContado();
//---- se recalculará la última barra contada
//---- primer valor del indicador == precio-1 punto,
//es decir, considera que la tendencia es al alza
ExtMapBufferUp[Bars] = Close[Bars] - WATR_K*Point;
// límite = (barras_contadas > 0) ? (Bares - counted_bars) : (Bares - 1);
limit = Bares - counted_bars;
//---- bucle principal
for(int i = límite; i >= 0; i--)
{
if(AntiTrendBar(i))
{
ExtMapBufferUp[i] = ExtMapBufferUp[i+1];
ExtMapBufferDown[i] = ExtMapBufferDown[i+1];
}
si no
{
if(TrendUp(i))
{
ExtMapBufferUp[i] = CalcIndicValue(i, true);
if(ExtMapBufferUp[i] < ExtMapBufferUp[i+1])
ExtMapBufferUp[i] = ExtMapBufferUp[i+1];
ExtMapBufferDown[i] = EMPTY_VALUE;
}
si no
{
ExtMapBufferDown[i] = CalcIndicValue(i, false);
if(ExtMapBufferDown[i] > ExtMapBufferDown[i+1])
ExtMapBufferDown[i] = ExtMapBufferDown[i+1];
ExtMapBufferUp[i] = EMPTY_VALUE;
}
}
// precio de cruce
if(TrendUp(i) && (Close[i] < ExtMapBufferUp[i])
{
ExtMapBufferDown[i] = CalcIndicValue(i, false);
ExtMapBufferUp[i] = EMPTY_VALUE;
}
if(!TrendUp(i)) && (Close[i] > ExtMapBufferDown[i])
{
ExtMapBufferUp[i] = CalcIndicValue(i, true);
ExtMapBufferDown[i] = EMPTY_VALUE;
}
}
return(0);
}
//+------------------------------------------------------------------+



 
rusmos писал(а) >>

Disculpe, pero podría escribir algún código para el siguiente problema: el primer lote es, por ejemplo, 0,1, y cada lote siguiente se incrementa en un valor determinado.

Gracias de antemano.

Busca en este foro, ya se ha preguntado y escrito...

En todo caso hay algo parecido...

 
StatBars >> :

Busca en este foro, se ha preguntado y se ha escrito sobre ello...

Gracias >> Llevo unas tres horas hurgando en el foro, he encontrado muchas cosas, pero no esto.

 
StatBars >> :

Busca en este foro, ya se ha preguntado y escrito antes...

Y el código es probablemente de 10 términos como máximo.

Pero supongo que aquí no van a por cosas insignificantes.

 
rusmos >> :

Y el código es probablemente de 10 términos como máximo.

Pero supongo que aquí los profesionales no se andan con chiquitas.

Estaría bien formalizar la tarea no sólo de forma aproximada, sino concreta, para que alguien la asumiera.

 
rusmos писал(а) >>

Y el código es probablemente de 10 términos como máximo.

Pero los profesionales probablemente no juegan con las cosas pequeñas aquí.

Por favor, formule su pregunta correctamente. La primera orden, las siguientes. ¿El primero de qué? ¿Desde el principio del Universo, o desde el día en que vino Cristo, o desde la creación del mundo, o quizás desde el momento en que desayunaste y saliste a pasear? Cuáles son las preguntas, cuáles son las respuestas.

 
rusmos писал(а) >>

Y el código es probablemente de 10 términos como máximo.

Pero supongo que aquí no se van por las cosas pequeñas.

extern double RISK=20;


lotsize=MarketInfo(Symbol(),MODE_LOTSIZE)*0.01;
Balance=AccountBalance()*( RISK/100);
lots=NormalizeDouble( Balance/ lotsize,2); // - это и есть лот для открытия позиции
El código no sólo aumenta el lote, sino que también lo reduce, todo depende del depo, el depo sube - el lote sube... Pensé que necesitabas esto...
 
sol >> :

Estaría bien formalizar la tarea no sólo de forma aproximada, sino concreta, para que alguien pueda asumirla.

DE ACUERDO. El primer lote es Comprar con el lote 0.1. En respuesta, el SellStop se fija inmediatamente a 20 puntos de la parte inferior con 0,2 de lote (es decir, aumento de 0,1)

Además, si la venta se ha disparado, en la respuesta fijamos el Bystop con 0,3 lotes (es decir, volvemos a aumentar el último lote en 0,1) y en principio así.

Es importante que la magnitud del aumento del lote se ajuste a su criterio.

Bueno, respectivamente, dos opciones interesantes. Suma y multiplicación.

>> Ugh, creo que eso es todo).

 
StatBars >> :
El código no sólo aumenta el lote sino que también lo disminuye, todo depende del depo, el depo sube - el lote sube... Pensé que necesitabas esto...

El tamaño del depósito no importa.