Está perdiendo oportunidades comerciales:
- Aplicaciones de trading gratuitas
- 8 000+ señales para copiar
- Noticias económicas para analizar los mercados financieros
Registro
Entrada
Usted acepta la política del sitio web y las condiciones de uso
Si no tiene cuenta de usuario, regístrese
No, esta línea se elimina. Esto es un cálculo de beneficios, no funcionará así.
¿Dónde está el comando de cierre en el código - hay
// Возвращает суммарный профит в валюте депозита серии закрытых ордеров |
//+----------------------------------------------------------------------------+
double LastProfitCL(int op=-1){ //"op" позиция (-1 любая позиция)
double LastProfit=0;
for(i=OrdersHistoryTotal()-1;i>=0;i--)
if(OrderSelect(i,SELECT_BY_POS,MODE_HISTORY) && (OrderType()==OP_BUY || OrderType()==OP_SELL) && OrderSymbol()==Symbol() && OrderMagicNumber()==magic) {
if (OrderType()!= op || OrderSymbol()!= Symbol() || OrderMagicNumber()!= magic) continue;
if (op<0 || OrderType()==op){if(OrderCloseTime()>=t)LastProfit+=OrderProfit()+OrderCommission()+OrderSwap();}
}
return(LastProfit);
}
y en la condición de cierre
{CloseOrder(OrderTicket());t=TimeCurrent();}
{DeleteAll();t=TimeCurrent();}El 1 no cuenta, el 2 cuenta correctamente, el 3 no cuenta 0.
// Возвращает суммарный профит в валюте депозита серии закрытых ордеров |
//+----------------------------------------------------------------------------+
double LastProfitCL(int op=-1){ //"op" позиция (-1 любая позиция)
double LastProfit=0;
for(i=OrdersHistoryTotal()-1;i>=0;i--)
if(OrderSelect(i,SELECT_BY_POS,MODE_HISTORY) && (OrderType()==OP_BUY || OrderType()==OP_SELL) && OrderSymbol()==Symbol() && OrderMagicNumber()==magic) {
if (OrderType()!= op || OrderSymbol()!= Symbol() || OrderMagicNumber()!= magic) continue;
if (op<0 || OrderType()==op){if(OrderCloseTime()>=t)LastProfit+=OrderProfit()+OrderCommission()+OrderSwap();}
}
return(LastProfit);
}
y en la condición de cierre
{CloseOrder(OrderTicket());t=TimeCurrent();}
{DeleteAll();t=TimeCurrent();}1 no cuenta, 2 cuenta correctamente, 3 no cuenta 0
y eso es todo.
{DeleteAll();}
Y una cosa más.
¿Sus pedidos están cerrados según el ticket?
Así que hay que recordar la hora de inicio para cerrar la serie antes
Es decir, cuando se acaba de tomar la decisión de cerrar una serie, no importa si realmente se va a cerrar o no
Entiendo tu insistencia, pero te he dado una versión que funciona, con una buena función de cierre de una serie de posiciones para el comercio real, no funciona en el probador.
Cuenta y recuerda todo, incluso si se reinicia el terminal.
Aquí hay una prueba, sólo ejecútela en el probador, y compare los resultados con el historial de operaciones
PS. Me olvidé de escribir el código - aquí está la solución
Entiendo tu insistencia, pero te he dado una versión que funciona, con una buena función de cierre de una serie de posiciones para el comercio real, no funciona en el probador.
Cuenta y recuerda todo, incluso si se reinicia el terminal.
Aquí hay una prueba, sólo ejecútela en el probador, y compare los resultados con el historial de operaciones
¿Cómo puedo aplicar esto a mi código?
El valor deLastProfitCL determina miacción posterior
pero por lo demás
{DeleteAll();}
Una cosa más.
¿Sus pedidos se cierran con un billete?
Así que hay que recordar el momento del cierre de la serie incluso antes
Es decir, cuando se acaba de formar la decisión de cerrar una serie, no importa si habrá un cierre real o no
¿Cómo puedo aplicar esto a mi código?
Tengo el valor deLastProfitCL quedetermina la acción posterior
Así que está claro, sólo hay que aplicarlo como se necesita en esta forma
Comment(" Последний: ",DoubleToString(LastProfit,1) ," Профит: ", DoubleToString(Profit,1) );
Declare"LastProfit" una vez y utilícelo donde sea necesario
Si la orden se cierra por un stop, entonces{t=TimeCurrent();CloseOrder(OrderTicket();}{DeleteAll();} ya se perderá el valor del beneficio
Sí, lo hará.
Puede comprobar en cada momento cuántos pedidos vivos quedan.
Si es el mismo, entonces debe recordar la hora del tic anterior.
Entonces obtendrá lo que necesita.
Pero las paradas no suelen producirse en los autómatas
Si se cierra en un stop,{t=TimeCurrent();CloseOrder(OrderTicket();}{DeleteAll();} ya se perderá el valor del beneficio
Sólo contará los cerrados en último lugar en el tiempo, y no depende del importe de cierre.
En general, la tarea no está del todo clara, así que no hay más discusión.
//---------------------------------------------------------
Aquí ves la descripción, ya no entiendo el problema:
Aquí está todo dispuesto, ya no entiendo la tarea:
Esto también es correcto si "cnt" se pone a cero, pero entonces el valor es de nuevo incomprensible como en la captura de pantalla 3 (debería ser un valor de beneficio de 4,27)
int cnt=0;
double LastProfit=0;
for(i=0;i<OrdersHistoryTotal();i++)
if(OrderSelect(i,SELECT_BY_POS,MODE_HISTORY) && (OrderType()==OP_BUY || OrderType()==OP_SELL) && OrderSymbol()==Symbol() && OrderMagicNumber()==magic) {
if (OrderSymbol()!=Symbol() || OrderMagicNumber()!=magic) continue;
if ((op<0 || OrderType()==op) && cnt==0) {LastProfit+=OrderProfit()+OrderCommission()+OrderSwap(); cnt++;} else {cnt=0;}
}
return(LastProfit);
}