A estratégia
Algumas pessoas acreditam que a abertura do mercado pela manhã é o momento em que o mercado tem a maior divergência. Após cerca de 30 minutos, o mercado digerirá completamente todos os tipos de informações durante a noite, e a tendência de preços tenderá a ser racional e retornar ao normal. Em outras palavras: a tendência do mercado nos primeiros 30 minutos ou mais constitui basicamente o padrão geral de negociação hoje.
Os pontos altos e baixos relativos gerados neste momento formam os pontos altos e baixos efetivos na Teoria Dow, e a estratégia HANS123 é a lógica de negociação estabelecida por isso. No mercado de futuros doméstico, o mercado abre às 09:00 da manhã e às 09:30 você pode julgar se é longo ou curto hoje. Quando o preço atravessa o ponto alto para cima, o preço continuará facilmente a subir; quando o preço atravessa o ponto baixo para baixo, o preço continuará facilmente a cair.
Embora a estratégia de ruptura possa entrar no mercado assim que a tendência for formada. Mas essa vantagem também é uma espada de dois gumes. Como resultado da entrada sensível, a ruptura de preço falhou. Portanto, é necessário definir um stop loss. Ao mesmo tempo, para alcançar a lógica de estratégia de ganhar e perder, o take profit deve ser definido.
Abertura por turnos:fmz.comsite> Login > Dashboard > Strategy Library > New Strategy > Clique no menu suspenso no canto superior direito para selecionar a linguagem Python e começar a escrever a estratégia. Preste atenção aos comentários no código abaixo.
# 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
Escrever um quadro estratégico, isto foi aprendido no capítulo anterior, um é oonTick
função, e o outro é omain
A função, na qual oonTick
função é executada em um loop infinito nomain
function.
up_line = 0 # upper rail
down_line = 0 # lower rail
trade_count = 0 # Number of transactions on the day
Como os trilhos superior e inferior só são contados às 09:30, e nenhuma estatística é feita no resto do tempo, precisamos escrever essas duas variáveis fora do loop.trade_count
Antes de usar estas duas variáveis globais na função principal doonTick
estratégia, você precisa usar oglobal
palavra-chave para referência.
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 obter dados, primeiro utilize oSetContractType
A sua função na plataforma FMZ API para subscrever variedades de futuros e, em seguida, usar oGetRecords
Você também pode passar na matriz de linha K especificandoPERIOD_M11
minutos quando se utiliza oGetRecords
function.
O próximo passo é obter o preço mais recente, que é usado para determinar a relação de posição entre o preço atual e os trilhos superior e inferior. Ao mesmo tempo, ao colocar uma ordem usando a função Comprar ou Vender, você precisa passar no preço especificado. Além disso, não se esqueça de filtrar o número de barras de linha k, porque se o número de barras de linha k for muito pequeno, haverá um erro que não pode ser calculado.
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)
Ao calcular os trilhos superior e inferior e colocar ordens, é necessário julgar se a hora atual corresponde à hora de negociação especificada por nós, de modo a facilitar o julgamento, precisamos lidar com as horas e minutos específicos da linha K atual.
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
O status da posição envolve a lógica estratégica. as nossas primeiras dez lições sempre usaram posições de detenção virtuais, mas em um ambiente de negociação real, é melhor usar oGetPosition
Função para obter informações sobre posições reais, incluindo: direção da posição, lucro e perda da posição, número de posições, 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 erros de lógica na estratégia, é melhor escrever a lógica da posição de fechamento antes da lógica da posição de abertura. Nesta estratégia, ao abrir uma posição, primeiro determine o status da posição atual, se está dentro do tempo de negociação especificado, e depois determine a relação entre o preço atual e os trilhos superior e inferior. Para fechar uma posição é primeiro determinar se está perto do fechamento do mercado, ou se atingiu as condições de lucro e parada de perda.
O HANS123 é uma estratégia de negociação automatizada muito típica e muito eficaz. Seu princípio básico é romper o preço mais alto ou mais baixo do mercado anterior dentro de um determinado período de tempo. O sistema pode ser aplicado a quase todos os produtos de câmbio com lucratividade estável. Este também é um modo de negociação de entrada inicial, com tecnologia de filtragem apropriada, ou pode melhorar suas chances de ganhar.
Clique para copiar o código fonte da estratégia completahttps://www.fmz.com/strategy/179805backtest sem configuração
O que está acima é o princípio e a análise de código da estratégia HANS123. Na verdade, a estratégia HANS123 fornece um melhor momento para entrar no mercado. Você também pode melhorar o tempo de saída de acordo com sua compreensão do mercado e compreensão da transação, ou de acordo com a volatilidade da variedade Para otimizar parâmetros como tirar lucro e parar a perda para alcançar melhores resultados.