En el artículo anterior, nos dimos cuenta de las estrategias de simplificación de la cuantificación de 30 líneas de código, y en este artículo, el autor nos llevará paso a paso a los principiantes de la cuantificación para acercarse más al placer de diseñar estrategias de cuantificación. El texto continúa diciendo que esta vez se trata de una transacción de BTC en el momento, y que el autor es completamente ignorante en materia de finanzas, inversiones, valores, etc.; incluso no entiende el proceso de negociación de futuros. Y es más, los ojos deslumbrados, los nombres desconocidos, los términos confundidos, y la cabeza aturdida (¡que también es un poco entendido! Después de leer el contenido, tengo en mente los conceptos básicos, combinados con mi lenguaje de JS con un poco de conocimiento, escribo un simple. En pocas palabras, la línea K es un registro del mercado en un período determinado, que facilita la observación de la dinámica del mercado. La línea media es el indicador utilizado en el artículo anterior y, al igual que el indicador MACD, es un indicador que refleja la tendencia del mercado. Los conceptos, algoritmos, formulaciones de derivación, etc. de estos dos indicadores se describen de manera diferente. Si no entiende, consulte Baidu.
Nombre de la variable | Valores iniciales | Explicación |
---|---|---|
Intervalo de tiempo | 2000 | Esta variable es el ciclo de consulta, es decir, la cantidad de tiempo que el programa espera para suspenderse, la unidad es de milisegundos, 1000 milisegundos es de 1 segundo, por lo que la variable tiene un valor inicial de 2 segundos. |
Estado libre | 0 | Esta es una variable de estado que indica el espacio libre. |
El estado_comprar | 1 | Esta es una variable de estado que indica que se tiene una posición múltiple. |
El estado de la venta | 2 | Variable de estado, que indica una posición vacía. |
No se puede hacer más | 3 | Variable de estado de almacenamiento, que indica que no está almacenado. |
El número de orden es el siguiente: | 4 | La información es muy clara. |
estado | Estado libre | Variable de estado, inicializado con el estado de vacío. |
La señal de retraso | 0 | La señal se retrasó, por el momento no sirve. |
StopProfit | 0.002 | Esta variable es más importante, la tasa de stop loss, por ejemplo, el capital * tasa de stop loss ((0.002) significa que el máximo de pérdida es de 0.002 veces el capital, el límite de pérdida. |
el paso | 0.5 | Valor de paso de la pausa de deslizamiento. Se utiliza para elevar, bajar y clasificar los precios de pausa. |
OpCantidad | 1 | La cantidad de operaciones fijas. |
ganancia | 0 | ¿Qué es lo que está pasando? |
var holdOrder = {//持仓信息对象
orderState: ORDER_INVALID,// 持仓状态
price: 0, //持仓均价
amount: 0, //持仓量
time: null, // 操作时间
stopPrice: 0, // 止损价
level: 1, //止损等级
updateCurrentProfit: function(lastPrice,amount){//更新当前盈亏
if(state === STATE_SELL){//当前 空头持仓
return (lastPrice - this.price) * amount;
}
if(state === STATE_BUY){//当前 多头持仓
return - (lastPrice - this.price) * amount;
}
},
SetStopPrice: function(ticker,stopState){//更新止损价
if(stopState === STATE_FREE){ //更新止损时状态 为空闲
return this.stopPrice;
}
if(stopState === STATE_BUY){ //更新止损时状态 为多仓
if(this.orderState === ORDER_INVALID){
return this.stopPrice;
}
if(this.stopPrice === 0){//初始 止损价为0 时
this.stopPrice = this.price * ( 1 - stopProfit );
}
if( ticker.Last <= this.price ){ //最后成交价 小于等于 持仓均价时
this.stopPrice = this.price * ( 1 - stopProfit );
this.level = 1;
}else{//其它情况
if( ticker.Last - this.price > this.level * step ){//超出当前等级 设置滑动止损
this.stopPrice = this.price * (1 - stopProfit) + (ticker.Last - this.price );
//更新止损价为滑动后的止损价
this.level++;//上调止损等级
}else{//其它
this.stopPrice = this.stopPrice;//保持当前止损价不变
}
}
}else if( stopState === STATE_SELL){//空头持仓类似
if(this.orderState === ORDER_INVALID){
return this.stopPrice;
}
if(this.stopPrice === 0){
this.stopPrice = this.price * ( 1 + stopProfit );
}
if( ticker.Last >= this.price ){
this.stopPrice = this.price * ( 1 + stopProfit );
this.level = 1;
}else{
if( this.price - ticker.Last > this.level * step ){
this.stopPrice = this.price * (1 + stopProfit) - ( this.price - ticker.Last );
this.level++;
}else{
this.stopPrice = this.stopPrice;
}
}
}
return this.stopPrice;//返回止损价
},
initHoldOrder: function(){//平仓后 用于 初始化持仓信息的 函数
this.orderState = ORDER_INVALID;
this.price = 0;
this.amount = 0;
this.time = null;
this.stopPrice = 0;
this.level = 1;
}
};
El código fue subido a la dirección github: Hacer clicel sitio web githubEntra.
Los que no se han unido al grupo oficial de QQ pueden unirse al grupo: 309368835 Inventor Quantification.
Función MACD_Cross (() {// detecta el indicador MACD, función en el estado de cruce
var records = exchange.GetRecords (();// Obtener datos de las líneas K
while ((!records の の records.length < 45) { // Los datos de la línea K no pueden ser null, tienen más de 45 columnas y no cumplen con los estándares.
Los registros = exchange.GetRecords (en inglés);
¿Qué es lo que está pasando?
¿Por qué no?
var macd = TA.MACD ((records,12,26,9);// Llama a la función indicador, el parámetro es el parámetro predeterminado por el MACD.
var dif = macd[0]; línea // dif
var dea = macd[1]; línea //dea
var column = macd[2]; // columna del MACD
var len = records.length; // K longitud del ciclo de la línea
si (dif [len-1] > 0 && dea [len-1] > 0) && dif [len-1] > dea [len-1] && dif [len-2] < dea [len-2] && column [len-1] > 0.2) {
// Condición de corte de oro: dif y dea son mayores que 0 en este momento, y dif atraviesa a dia desde abajo hacia arriba, y el pilar de MACD es mayor que 0.2
return 1; // devuelve 1 para la señal de la horquilla de oro.
¿Por qué no?
si (dif [len-1] < 0 && dea [len-1] < 0) && dif [len-1] < dea [len-1] && dif [len-2] > dea [len-2] && column [len-1] < -0.2) {
Las condiciones de la horquilla:
return 2; / return 2 representa el signo del tenedor muerto.
¿Por qué no?
return 0; // gold fork 、death fork. Además de la señal, para la señal de espera 0.
¿Por qué no?
getTimeByNormal(time) {// Función que obtiene el tiempo Convierte el tiempo en milisegundos en tiempo estándar
var timeByNormal = nueva fecha ();
En el caso de las personas que se encuentran en situaciones de riesgo, el tiempoByNormal.setTime ((time);
var strTime = timeByNormal.toString (((); el valor de tiempo es el mismo que el valor de tiempo.
var showTimeArr = strTime.split (¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡
var showTime = showTimeArr[3]+
Función principal
var initCuenta =\(.GetAccount(exchange);// Primero vamos a registrar la información de la cuenta en el momento inicial, aquí se llama a la función de exportación de la biblioteca de clases de plantillas
var nowAccount = initAccount;// Declare una variable de nuevo para indicar la información de la cuenta ahora
var diffMoney = 0; // dinero Diferencia
var diffStocks = 0;// moneda Diferencia
var repair = 0; // calcula la cantidad de ganancias y pérdidas que se utilizan para corregir
var ticker = exchange.GetTicker ((); // obtener el mercado en este momento
Log (("cuenta inicial:",initAccount); // la salida muestra la información de la cuenta inicial.
mientras ((true) {// el ciclo de la función principal
scan ((); // Función de exploración, explicada más adelante, que se centra principalmente en la determinación de las posiciones abiertas, de liquidación y de las operaciones de apertura, de liquidación.
ticker = exchange.GetTicker();// en el ciclo de mientras obtener el mercado
si (!ticker) {// si no llega a (null) salta el siguiente ciclo de reinicio
Continuar;
¿Por qué no?
if ((holdOrder.orderState == ORDER_VALID) {// Determina si está en el momento de la orden.
Log (("Presentación actual:",holdOrder); // Si está en el momento de la presentación de la información
¿Por qué no?
Si no está en el orden, el orden está en el equilibrio.
Ahora cuenta = \).GetAccount ((exchange); // Obtener información de la cuenta actual
diffMoney = nowAccount.Balance - initAccount.Balance; // Calcula la diferencia de dinero entre la cuenta actual y la cuenta inicial
diffStocks = nowAccount.Stocks - initAccount.Stocks; // Calcula la diferencia de monedas entre la cuenta actual y la cuenta inicial
repair = diffStocks * ticker.Last; // convierte la diferencia de monedas * precio de transacción final, en dinero equivalente, para calcular ganancias y pérdidas
LogProfit ((diffMoney + repair,
La función scan ((() { var sellInfo = null; // declarado Variables para almacenar información de liquidación, inicializado en null var buyInfo = null; // declarado abierto, inicializado null var opFun = null;// Función de puesta en marcha, dos estados, puesta en marcha múltiple, puesta en marcha vacía. var singal = 0; // señal while ((true) {// Detección y operación Ciclo var ticker = exchange.GetTicker ((); // obtener el mercado if ((!ticker) { // juicio Obtención fallida Salta a continuación y continúa el ciclo de obtención Continuar; ¿Por qué no? HoldOrder.SetStopPrice ((ticker,state); // ajustar el precio de detención Si el estado === STATE_FREE && (single = MACD_Cross))!== 0) { // Determina si la política está en estado de funcionamiento vacante, si la señal del indicador MACD está vacante en este momento, corresponde a la política está en estado de funcionamiento vacante y se ejecuta con una horquilla de oro o horquilla muerta: HoldOrder.initHoldOrder (();// Información sobre el almacenamiento inicial ¿Qué es esto?¿ Por qué no lo compras?.Sell ;// determina el número de posiciones abiertas o abiertas según el resultado devuelto por la función MACD_Cross. buyInfo = opFun ((opAmount);// Operación de apertura de la bolsa HoldOrder.orderState = ORDER_VALID;// Configurar la información de mantenimiento, el estado es mantenimiento HoldOrder.price = buyInfo.price; // Establece el precio de la operación de compra por el operador opFun. HoldOrder.amount = buyInfo.amount; // Establece el volumen de la orden holdOrder.time = getTimeByNormal (((new Date (()))) getTime (()));// establece el tiempo de inicio del almacenamiento state = singal === 1? STATE_BUY : STATE_SELL; // actualizar el estado de la política para múltiples puestos o puestos vacíos var cuenta =\(.GetAccount ((exchange); // Obtener información de la cuenta if ((singal === 1) {// Importa la dirección de apertura y la información de la cuenta actual Log (("hacer más operaciones。","cuenta:",account); ¿Qué es eso? Log (((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((()))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))) ¿Por qué no? ¿Qué es lo que está pasando? ¿Qué es eso? var lastPrice = holdOrder.price;// Asigna el valor de la orden de mantenimiento al lastPrice Si el estado === STATE_BUY && holdOrder.orderState === ORDER_VALID && ticker.Last < holdOrder.stopPrice ) { // Si hay varias posiciones y la información está en una posición y el precio final de la transacción es menor que el precio de stop loss, ejecute lo siguiente: Log (("Pronto de liquidación de pérdidas múltiples","precio inicial de liquidación:"holdOrder.price * (1 - stopProfit), "--precio de liquidación de pérdidas deslizantes:"holdOrder.stopPrice, "precio final de la transacción:"ticker.Last, "nivel de liquidación de pérdidas múltiples:"holdOrder.level);//información de liquidación de pérdidas múltiples ¿Qué es esto? ¿Qué es esto?.Sell ((holdOrder.amount);// Posicionamiento HoldOrder.orderState = ORDER_INVALID;// Información de liquidación Objeto actualizado El precio de la orden es el precio de la orden. El número de orden que se puede obtener es el siguiente: HoldOrder.time = getTimeByNormal (((new Date))) y getTime ()) y getOrder.time = getTimeByNormal (((new Date)) y getTime ()) Profit = holdOrder.updateCurrentProfit ((lastPrice, sellInfo.amount);// actualizar las ganancias y pérdidas flotantes estado = estado libre;// estado de actualización Break; / Salta fuera ¿Por qué no? Si el estado === STATE_SELL && holdOrder.orderState === ORDER_VALID && ticker.Last > holdOrder.stopPrice) {// también, este es el punto de equilibrio de pérdida en blanco. Log ((Logo de liquidación de la cabeza vacía, precio de liquidación inicial de la cabeza vacía: * (1 + stopProfit), precio de liquidación del movimiento de la cabeza vacía: *, holdOrder.price), precio de liquidación del movimiento de la cabeza vacía: *, holdOrder.stopPrice, precio de liquidación final de la cabeza vacía: *, ticker.Last, nivel de liquidación: *, holdOrder.level);// prueba ¿Qué es esto?¿Qué es lo que está pasando? El estado de la orden es el siguiente: El precio de la orden es el precio de la orden. El número de orden que se puede obtener es el siguiente: HoldOrder.time = getTimeByNormal (((new Date))) y getTime ()); Profit = holdOrder.updateCurrentProfit ((lastPrice, sellInfo.amount)); el precio de venta es el mismo que el precio de venta. El estado = estado libre; ¿Qué es lo que está pasando? ¿Por qué no? if ((state === STATE_BUY && MACD_Cross() === 2)) {// cuando se hace más, el indicador MACD muere en el parche -- el parche muere ¿Qué es esto? ¿Qué es esto?El nombre de la aplicación es.Sell (en inglés) y.Hold (en inglés). Log ((Logo de equilibrio de la horquilla, precio inicial de stop loss de la horquilla: stop,holdOrder.price * (1 - stopProfit), precio de stop loss de la horquilla: stop,holdOrder.stopPrice, precio final de la horquilla: stop,ticker.Last, nivel de stop loss de la horquilla: stop,holdOrder.level);// prueba El estado de la orden es el siguiente: El precio de la orden es el precio de la orden. El número de orden que se puede obtener es el siguiente: HoldOrder.time = getTimeByNormal (((new Date))) y getTime ()) y getOrder.time = getTimeByNormal (((new Date)) y getTime ()) y getOrder.time = getTimeByNormal ()) y getOrder.time = getTimeByNormal ()) y getOrder.time = getTimeByNormal (); Profit = holdOrder.updateCurrentProfit ((lastPrice, sellInfo.amount)); el precio de venta es el mismo que el precio de venta. El estado = estado libre; ¿Qué es lo que está pasando? ¿Por qué no? if(state === STATE_SELL && MACD_Cross() === 1 ) {// cuando se hace en blanco, el indicador MACD es el tenedor de oro El tenedor de oro está en equilibrio El precio de venta es el precio de compra. Log ((Logo de equilibrio de la horquilla de oro, precio inicial de stop loss de la horquilla de oro: o, holdOrder.price * (1 + stopProfit), precio de stop loss de la horquilla de oro: o, holdOrder.stopPrice, precio final de la horquilla de oro: o, ticker.Last, nivel de stop loss de la horquilla de oro: o, holdOrder.level);// prueba El estado de la orden es el siguiente: El precio de la orden es el precio de la orden. El número de orden que se puede obtener es el siguiente: HoldOrder.time = getTimeByNormal (((new Date))) y getTime ()) y getOrder.time = getTimeByNormal (((new Date)) y getTime ()) y getOrder.time = getTimeByNormal ()) y getOrder.time = getTimeByNormal ()) y getOrder.time = getTimeByNormal (); Profit = holdOrder.updateCurrentProfit ((lastPrice, sellInfo.amount)); el precio de venta es el mismo que el precio de venta. El estado = estado libre; ¿Qué es lo que está pasando? ¿Por qué no? ¿Por qué no? Sleep ((Interval);//intervalo de consulta, es dejar que el programa se detenga un momento. ¿Por qué no? ¿Por qué no?
Primero, el principio de la suspensión por deslizamiento.
En este código sobre el deterioro del deslizamiento, se muestra que el sistema de control de velocidad de los motores no es el único que funciona.SetStopPrice
Función de acuerdo con la transmisiónstopState
(Estado de suspensión) yticker
(Datos del mercado) para actualizar el precio de stop loss.stopState === STATE_BUY
), para juzgar y actualizar el precio de suspensión de pérdidas en función de las diferentes situaciones.orderState
Para el estado de inactividad (es decir, no se mantiene una posición efectiva), se devuelve el precio de stop loss actual. Si el precio de stop loss es 0, se inicializa como el precio medio de compra multiplicado por(1 - stopProfit)
Después, según el precio final de la transacción.ticker.Last
Los precios de las acciones y de las accionesthis.price
La diferencia entre el valor de los valores de los valores de los valores de los valores de los valores de los valores de los valores de los valores de los valores de los valores de los valores de los valores de los valores de los valores de los valores de los valores de los valores de los valores de los valoresthis.level
) se compara con el multiplicador del paso (step). Si se supera el nivel actual, se actualiza el precio de stop loss como el valor después del deslizamiento, al mismo tiempo que se aumenta el nivel de stop loss; de lo contrario, se mantiene el precio de stop loss actual sin cambios.stopState === STATE_SELL
La lógica es similar, pero se toma un valor negativo de la diferencia entre el precio de la transacción final y el precio de la propiedad, y se reduce la diferencia al actualizar el precio de suspensión. Finalmente, se devuelve el precio de suspensión después de la actualización.
El stop loss deslizante es una estrategia de gestión de riesgos.
En el proceso de la tenencia, el precio del stop loss se ajusta según la fluctuación del precio del mercado para reducir las pérdidas o proteger las ganancias. Según la lógica del código, se pueden ver los siguientes puntos clave para lograr un stop slip:updateCurrentProfit
El método se utiliza para actualizar las ganancias y pérdidas actuales, calculando las ganancias y pérdidas actuales en función del estado de la posesión y el último precio. Si la posesión es un estado de venta libre (STATE_SELL), las ganancias y pérdidas se multiplican por la diferencia entre el precio más reciente y el precio de la posesión igual; si es un estado de compra múltiple (STATE_BUY), las ganancias y pérdidas son negativas. El método de SetStopPrice se utiliza para actualizar los precios de las pérdidas y pérdidas en función de los parámetros introducidos.1 - stopProfit
Si el precio final de la operación excede el paso del nivel actual, el precio de la operación se establece como el precio de la operación tras el deslizamiento y se sube el nivel de la operación. En otros casos, el precio de la operación se mantiene sin cambios. Si el estado de la operación es STATE_SELL, la lógica es similar.
Fuentes de información
el cielo medioHola, soy el propietario de www.banbiren.com, el autor de la plataforma de movimiento de monedas, estoy aprendiendo a transaccionar cuantitativamente, mi qq es:39866099, ¿puede invitarme a unirse al grupo, antes de buscar no puedo unirme?
No hay nadaEl progreso es rápido.
MuyaEs muy duro.
Los inventores cuantifican - sueños pequeñosBien ^^, usted por el lado. Solicite directamente, MAC QQ no encontró lugar para invitar >_<, 1 grupo número: 309368835 Ahora hay varias posiciones.
Los inventores cuantifican - sueños pequeños¡Qué bueno el dedo de Dios!
Los inventores cuantifican - sueños pequeñosAprenden juntos.