La estrategia
Algunas personas creen que la apertura del mercado por la mañana es el momento en que el mercado tiene la mayor divergencia. Después de unos 30 minutos, el mercado ha digerido completamente todo tipo de información durante la noche, y la tendencia del precio tenderá a ser racional y volverá a la normalidad. En otras palabras: la tendencia del mercado en los primeros 30 minutos constituye básicamente el patrón general de negociación de hoy.
Los puntos altos y bajos relativos generados en este momento forman los puntos altos y bajos efectivos en la
Aunque la estrategia de avance puede entrar en el mercado tan pronto como se forme la tendencia. Pero esta ventaja también es una espada de dos filos. Como resultado de la entrada sensible, el avance del precio fracasó. Por lo que es necesario establecer un stop loss. Al mismo tiempo, para lograr la lógica de estrategia de ganar y perder, debe establecerse el take profit.
Abierto a su vez:fmz.comsitio web> Iniciar sesión > Panel > Biblioteca de estrategias > Nueva estrategia > Haga clic en el menú desplegable en la esquina superior derecha para seleccionar el lenguaje Python y comenzar a escribir la estrategia. Preste atención a los comentarios en el código a continuación.
# Strategy main function
def onTick():
pass
# Program entry
def main():
while True: # enter infinite loop mode
onTick() # execute strategy main function
Sleep(1000) # Sleep for 1 second
Escribe un marco estratégico, esto se ha aprendido en el capítulo anterior, uno es elonTick
la función, y el otro es elmain
En la actualidad, elonTick
La función se ejecuta en un bucle interminable en elmain
function.
up_line = 0 # upper rail
down_line = 0 # lower rail
trade_count = 0 # Number of transactions on the day
Debido a que los rieles superior e inferior sólo se cuentan a la hora de 09:30, y no se hacen estadísticas en el resto del tiempo, necesitamos escribir estas dos variables fuera del bucle.trade_count
Variable también se escribe fuera del bucle. Antes de utilizar estas dos variables globales en la función principal de laonTick
estrategia, usted necesita para utilizar elglobal
palabra clave para la referencia.
exchange.SetContractType("rb888") # Subscribe to futures varieties
bar_arr = _C(exchange.GetRecords, PERIOD_M1) # Get 1-minute K line array
current_close = bar_arr[-1]['Close'] # Get the latest price
if len(bar_arr) <50: # If less than 50 k line bars
return # Return to continue waiting for data
Para obtener datos, primero utilice elSetContractType
La función en la plataforma FMZ API para suscribirse a las variedades de futuros, y luego utilizar elGetRecords
También puede pasar en la matriz de K-línea especificandoPERIOD_M11
minutos cuando se utiliza elGetRecords
function.
El siguiente paso es obtener el precio más reciente, que se utiliza para determinar la relación de posición entre el precio actual y los rieles superior e inferior. Al mismo tiempo, al realizar un pedido utilizando la función de Compra o Venta, debe pasar el precio especificado. Además, no olvide filtrar el número de barras de k líneas, porque si el número de barras de k líneas es demasiado pequeño, habrá un error que no se puede calcular.
def current_time():
current_time = bar_arr[-1]['Time'] # Get current K-line timestamp
time_local = time.localtime(current_time / 1000) # Processing timestamp
hour = time.strftime("%H", time_local) # Format the timestamp and get the hour
minute = time.strftime("%M", time_local) # Format the timestamp and get the minute
if len(minute) == 1:
minute = "0" + minute
return int(hour + minute)
Al calcular los rieles superiores e inferiores y colocar órdenes, es necesario juzgar si el tiempo actual cumple con el tiempo de negociación especificado por nosotros, por lo que para facilitar el juicio, necesitamos tratar con las horas y minutos específicos de la línea K actual.
global up_line, down_line, trade_count # Introduce global variables
current_time = current_time() # processing time
if current_time == 930: # If the latest K-line time is 09:30
up_line = TA.Highest(bar_arr, 30,'High') + count # The highest price of the first 30 k line bars
down_line = TA.Lowest(bar_arr, 30,'Low')-count # The lowest price of the first 30 ke line bars
trade_count = 0 # Reset the number of transactions to 0
position_arr = _C(exchange.GetPosition) # Get position array
if len(position_arr) > 0: # If the position array length is greater than 0
position_arr = position_arr[0] # Get position dictionary data
if position_arr['ContractType'] =='rb888': # If the position symbol is equal to the subscription symbol
if position_arr['Type']% 2 == 0: # If it is a long position
position = position_arr['Amount'] # The number of assigned positions is a positive number
else:
position = -position_arr['Amount'] # Assign a negative number of positions
profit = position_arr['Profit'] # Get position profit and loss
else:
position = 0 # The number of assigned positions is 0
profit = 0 # Assign position profit and loss to 0
El estado de la posición implica la lógica de la estrategia. Nuestras primeras diez lecciones siempre han utilizado posiciones de tenencia virtuales, pero en un entorno de negociación real, lo mejor es utilizar elGetPosition
Función para obtener información sobre posiciones reales, incluida: dirección de la posición, pérdidas y ganancias de la posición, número de posiciones, etc.
# If it is close to market closing or reach taking profit and stopping loss
if current_time > 1450 or profit > stop * 3 or profit < -stop:
if position > 0: # If holding a long position
exchange.SetDirection("closebuy") # Set transaction direction and type
exchange.Sell(current_close-1, 1) # Close long order
elif position <0: # If holding an empty order
exchange.SetDirection("closesell") # Set transaction direction and type
exchange.Buy(current_close + 1, 1) # Close short order
# If there is no current position, and it is less than the specified number of transactions, and within the specified trading time
if position == 0 and trade_count < 2 and 930 < current_time < 1450:
if current_close > up_line: # If the price is greater than the upper line
exchange.SetDirection("buy") # Set transaction direction and type
exchange.Buy(current_close + 1, 1) # Open long order
trade_count = trade_count + 1 # Increase the number of transactions
elif current_close < down_line: # If the price is less than the lower line
exchange.SetDirection("sell") # Set transaction direction and type
exchange.Sell(current_close-1, 1) # Open a short order
trade_count = trade_count + 1 # Increase the number of transactions
Para evitar errores de lógica en la estrategia, lo mejor es escribir la lógica de posición de cierre antes de la lógica de posición de apertura. En esta estrategia, al abrir una posición, primero determina el estado de la posición actual, si está dentro del tiempo de negociación especificado, y luego determina la relación entre el precio actual y los rieles superior e inferior. Para cerrar una posición es determinar primero si está cerca del cierre del mercado, o si ha alcanzado las condiciones de obtener ganancias y detener pérdidas.
HANS123 es una estrategia de negociación automatizada muy típica y muy efectiva. Su principio básico es romper el precio más alto o más bajo del mercado anterior dentro de un cierto período de tiempo. El sistema se puede aplicar a casi todos los productos de divisas con rentabilidad estable.
Haga clic para copiar el código fuente de la estrategia completahttps://www.fmz.com/strategy/179805Prueba posterior sin configuración
Lo anterior es el principio y el análisis de código de la estrategia HANS123. De hecho, la estrategia HANS123 proporciona un mejor momento para ingresar al mercado. También puede mejorar el tiempo de salida de acuerdo con su comprensión del mercado y la comprensión de la transacción, o de acuerdo con la volatilidad de la variedad Para optimizar parámetros como tomar ganancias y detener pérdidas para lograr mejores resultados.