Funciones útiles de KimIV - página 98

 
Hola Igor! 09.05.2008 17:10 en la página 17. 17 Ha descrito la función de correlación. ¿Podría describir la función de correlación utilizando la fórmula de Pearson
 

¡Hola Igor!

Podrías cambiar el EA e-OpenByTime o escribir uno nuevo, o sugerir uno ya preparado :)))

¡Necesito un EA que ponga las pausas en diferentes direcciones en X tiempo por N puntos del precio!

 

¡Hola, Igor!

¿Tienes un script que dibuje segmentos de líneas horizontales a X e Y pips de la señal?

Me explico: hay señales de compra/venta (cruce de muwings, fractal, etc.).

El script establece 4 parámetros, por ejemplo:

- 300 pips para el Stop,

- 500 pips para tomar,

- 10 barras = longitud de las barras,

- dónde y cómo tomar las señales - referencia al indicador de señales, inserción de condiciones para las señales... Este punto es algo en lo que hay que pensar.

El script dibuja 2 líneas en cada señal de compra:

1) el primero ("stop") más bajo en 300 pips desde el precio de apertura de la barra de señal;

2) segundo ("Take") más alto en 500 puntos desde el precio de apertura de la barra de señal

3) las líneas comienzan en la barra de señal y terminan en la 10ª barra.

Es lo mismo en el caso de las señales de venta, sólo que las sangrías de las líneas están invertidas.

Creo que esta visualización será útil para la estimación preliminar de la "señal de parada".

Saludos, Vadim.

 

¡Hola Igor!

Pregunta 1.

Hay un error 138 en su función OpenPosition() - ERR_REQUOTE se pone en pausa:

if (err!=135) Sleep(1000*7.7);

Aunque en la documentación se recomienda refrescar los datos y volver a intentarlo de inmediato (el precio se va, quiero abrir una posición lo antes posible)).

Que sea correcto, entonces:

if (err!=135 && err!=138) Sleep(1000*7.7);?

¿O quizás me estoy perdiendo algo?

Pregunta 2.

Por favor, aconséjeme cómo especificar correctamente el parámetro Slippage igual a 5 puntos en la función OrderSend() si mi empresa de corretaje (Alpari) da 5 decimales.

- ¿"50"?

- o "5"?

 
slavamir писал(а) >>

Pregunta 1.

En su función OpenPosition() el error 138 - ERR_REQUOTE se pone en pausa:

if (err!=135) Sleep(1000*7.7);

Aunque en la documentación se recomienda refrescar los datos y volver a intentarlo enseguida (el precio se va, quiero abrir una posición lo antes posible)).

Que sea correcto, entonces:

if (err!=135 && err!=138) Sleep(1000*7.7);?

Sí, ¡está bien! También puedes hacerlo así... Gracias.

slavamir escribió >>

Pregunta 2.

Por favor, dígame cómo establecer correctamente el parámetro Slippage igual a 5 puntos en la función OrderSend() si mi empresa de corretaje (Alpari) da 5 decimales.

- ¿"50"?

- ¿O es "5"?

5
 

Hola Igor,

¿podría ayudar a refinar su función GetProfitFromDateInCurrency(). Necesito que se calcule la ganancia de las órdenes cerradas solamente. Utilizo el cierre parcial (división) de órdenes y la función CloseBy para cerrar el saldo de una orden existente. Para determinar si se ha cerrado un número par o impar de pedidos, utilizo la fórmula:

double x, y; --------------------------------- Supongamos
x=MathFloor(OrderLots()/0.02); --------- a. Si lotes 0.04/0.02=2 --- b. Si lotes 0.03/0.02=1
y=x*0.02; ---------- 2*0,02=0,04 --- б. 1*0.02=0.02
if (y==OrderLots()) ---------- а. 0,04==0,04 --- b. ¡0,02!=0,04
XLots=y; Si es igual, entonces XLots obtiene el valor de y

Esto funciona (no se me ocurrió una forma mejor de dividir en pares/impares y no me dieron ninguna pista cuando pregunté).

A continuación, la llamada a la función real (la que hice a partir de la tuya)
ClOrdProf=GetProfitFromDateInCurrency("", -1, -1, XTime, XLots);

Y mi vano intento de añadir a tu función la condición de que el beneficio debe calcularse si los lotes son pares:

double GetProfitFromDateInCurrency(string sy="", int op=-1, int mn=-1, datetime dt=0, double lt=-1)
{
double p=0;
int i, k=OrdersHistoryTotal();

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

No quiere contar.
1. ¿Me equivoco en alguna parte de la función?
2. ¿Podría tener algún efecto el hecho de que las órdenes se cierren mediante OrdCloseBy?

 
supongamos que el parámetro int lt toma tres valores de bandera
-1 todos los pedidos, 0 - lotes pares, 1 - lotes impares, entonces
reemplaza
si (OrderLots()==lt) {
p+=OrderProfit()+OrderCommission()+OrderSwap()

}

a

if (lt == -1){
p+=OrderProfit
()+OrderCommission()+OrderSwap();
} else {
int test = OrderLors() * 100;
if (lt == test % 2) {
p+=OrderProfit()+OrderCommission()+OrderSwap();
} else {
p+=OrderProfit()+OrderCommission()+OrderSwap();
}
}
 
keekkenen писал(а) >>
digamos que en la función GetProfitFromDateInCurrency() el parámetro int lt toma tres valores de bandera


Gracias, tu método de cálculo de lotes por módulo es correcto, lo utilizaré más adelante... Pero aquí es interesante, resulta que la función que refiné funciona... en cierto modo. He añadido Alert para ver los cambios de "p+=" y lo calcula todo correctamente. Pero el valor ClOrdProf del que vamos a tomar información no aparecerá: Alert ("ClOrdProf= ",ClOrdProf);. En el código se ve así:
int inicio()
{
........................
bool
ClOrdProf=false; //valor lógico
........................
ClOrdProf=GetProfitFromDateInCurrency(",-1,-1,XTime,XLots); //llamada a la función
si (ClOrdProf==true)
Alert ("ClOrdProf=",ClOrdProf); - no se actualiza en el registro
.........................
return; //salir de start()
}
// Función para calcular el beneficio de las órdenes cerradas
double GetProfitFromDateInCurrency(string sy="", int op=-1, int mn=-1, datetime dt=0, double lt=-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_HISTORY)) {
si ((OrderSymbol()==sy || sy==") && (op<0 || OrderType()==op)) {
if (OrderType()==OP_BUY || OrderType()==OP_SELL) {
if (mn<0 || OrderMagicNumber()==mn) {
si (dt<OrderCloseTime()) {
if (OrderLots()==lt) {
p+=OrderProfit()+OrderCommission()+OrderSwap();
Alert ("p= ", p); - actualizado en el registro
}
}
}
}
}
}
}
return(p);
}
No puedo entender qué es lo que está mal...

 

Divertido, no es, divertido... divertido para ti e incluso para mí...(Vladimir Semyonovich)
Originalmente ClOrdProf no es un bool sino un double. Y debería haber "si (ClOrdProf>0 || ClOrdProf<0)" - la segunda parte, que empieza con "o", para contar en caso de beneficio negativo... lo que yo llamo "ojo lavado" - yo mismo no vi lo que hay en la superficie.
Gracias a keekkenen por la ayuda en el cálculo de los lotes pares e impares.
Gracias a Igor, por la posibilidad de actualizar su función.

 
KimIV >>:

Функция TicketNearPos().

Эта функция возвращает тикет ближайшей к рынку позиции. В качестве критерия "близости" позиции выступает минимум расстояния в пунктах между ценой открытия позиции и текущей рыночной ценой. Отбор учитываемых позиций задаётся внешними параметрами:

  • sy - Наименование рыночного инструмента. Если задать этот параметр, то функция учтёт позиции только заданного инструмента. Значение по умолчанию - "" означает любой рыночный инструмент. Значение NULL означает текущий инструмент.
  • op - Торговая операция, тип позиции. Допустимые значения: OP_BUY, OP_SELL или -1. Значение по умолчанию -1 означает любую позицию.
  • mn - Идентификатор позиции, MagicNumber. Значение по умолчанию -1 означает любой идентификатор.
ЗЫ. Во вложении скрипт для тестирования функции TicketNearPos().
if (pp == 0) 
{return (ti);}
He observado un error en la función TypeNearPos cuando se cumple la condición:
Precio de mercado = precio de la orden abierta, entonces esta orden ya no es tenida en cuenta por esta función.
Tuve que añadir esta simple condición al código.
Esta condición también ayudará en las funciones similares TypeNearPos() y PriceOpenNearPos().