Crocodile line trading system Python version
Tags: python, trading, cryptocurrency, fmzquant
Published: 2024-06-12 01:24:24

## Summary
People who have done financial trading will probably have an experience. Sometimes the price fluctuations are regular, but more often it shows an unstable state of random walk. It is this instability that is where market risks and opportunities lie. Instability also means unpredictable, so how to make returns more stable in an unpredictable market environment is also a problem for every trader. This article will introduce the crocodile trading rules strategy, hoping to inspire everyone.

## What is a crocodile line

![Image description](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/cl4h794kj37coanezmbn.png)

The crocodile line is actually three special moving averages, which correspond to the chin of the blue line, the teeth of the red line, and the upper lip of the green line. The chin is a 13-period moving average and moves 8 bars in the future. The tooth is an 8-period moving average and moves 5 bars in the future. The upper lip is a 5-period moving average and moves 3 bars in the future.

## Principle of crocodile line
The crocodile line is a set of technical analysis methods summarized based on geometry and nonlinear dynamics. When the crocodile's chin, teeth and upper lip are closed or entangled, it means that the crocodile is asleep. At this time, we usually stay outside the market until the fragment appears, and only participate in the obvious trend market.

The longer the crocodile sleeps, the more hungry it will be when it wakes up, so once it wakes up, it will open its mouth wide. If the upper lip is above the teeth and the teeth are above the chin, it indicates that the market has entered a bull market and the crocodiles are going to eat beef. If the upper lip is below the teeth and the teeth are below the chin, it indicates that the market has entered a bear market and the crocodiles are going to eat bear meat. Until it is full, it will then close its mouth again (hold and make a profit).

## Crocodile line calculation formula
Upper lip = REF(SMA(VAR1,5,1),3)
Teeth = REF(SMA(VAR1,8,1),5)
Chin = REF(SMA(VAR1,13,1)

Crocodile strategy composition

### Step 1: Write a strategy framework
```
# 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
```
FMZ using the polling mode, one is the onTick function, and the other is the main function, in which the onTick function is executed in an infinite loop in the main function.

### Step 2: Import Python library
```
import talib
import numpy as np
```
The SMA function is used in our strategy. SMA is the arithmetic mean. There are already ready-made SMA functions in the talib library, so directly import the talib Python library and then call it directly. Because when calling this function, you need to pass in numpy format parameters, so we need to use import to import these two Python libraries at the beginning of the strategy.

### Step 3: Convert K-line array data
```
# Convert the K-line array into an array of highest price, lowest price, and closing price, for conversion to numpy.array
def get_data(bars):
    arr = []
    for i in bars:
        arr.append(i['Close'])
    return arr
```
Here we created a get_data function, the purpose of this function is to process the ordinary K-line array into numpy format data. The input parameter is a K-line array, and the output result is processed data in numpy format.

### Step 4: Obtain position data
```
# Get the number of positions
def get_position ():
     # Get position
     position = 0 # The number of assigned positions is 0
     position_arr = _C (exchange.GetPosition) # Get array of positions
     if len (position_arr)> 0: # If the position array length is greater than 0
         for i in position_arr:
             if i ['ContractType'] == 'rb000': # If the position symbol is equal to the subscription symbol
                 if i ['Type']% 2 == 0: # If it is long position
                     position = i ['Amount'] # Assigning a positive number of positions
                 else:
                     position = -i ['Amount'] # Assigning a negative number of positions
     return position
```
Position status involves strategy logic. Our first ten lessons have always used virtual positions, but in a real trading environment it is best to use the GetPosition function to obtain real position information, including: position direction, position profit and loss, number of positions, etc.

### Step 5: Get the data
```
exchange.SetContractType('rb000') # Subscribe the futures varieties
     bars_arr = exchange.GetRecords() # Get K line array
     if len(bars_arr) < 22: # If the number of K lines is less than 22
         return
```
Before acquiring data, you must first use the SetContractType function to subscribe to relevant futures varieties. FMZ supports all Chinese commodity futures varieties. After subscribing to the futures symbol, you can use GetRecords function to obtain K-line data, which returns an array.

### Step 6: Calculate the data
```
np_arr = np.array (get_data (bars_arr)) # Convert closing price array
sma13 = talib.SMA (np_arr, 130) [-9] # chin
sma8 = talib.SMA (np_arr, 80) [-6] # teeth
sma5 = talib.SMA (np_arr, 50) [-4] # upper lip
current_price = bars_arr [-1] ['Close'] # latest price
```
Before calculating the SMA using the talib library, you need to use the numpy library to process the ordinary K-line array into numpy data. Then get the chin, teeth and upper lip of the crocodile line separately. In addition, the price parameter needs to be passed in when placing an order, so we can use the closing price in the K-line array.

### Step 7: Place an order
```
position = get_position ()
if position == 0: # If there is no position
     if current_price> sma5: # If the current price is greater than the upper lip
         exchange.SetDirection ("buy") # Set the trading direction and type
         exchange.Buy (current_price + 1, 1) # open long position order
     if current_price <sma13: # If the current price is less than the chin
         exchange.SetDirection ("sell") # Set the trading direction and type
         exchange.Sell (current_price-1, 1) # open short position order
    
if position> 0: # If you have long positions
     if current_price <sma8: # If the current price is less than teeth
         exchange.SetDirection ("closebuy") # Set the trading direction and type
         exchange.Sell (current_price-1, 1) # close long position

if position <0: # If you have short position
     if current_price> sma8: # If the current price is greater than the tooth
         exchange.SetDirection ("closesell") # Set the trading direction and type
         exchange.Buy (current_price + 1, 1) # close short position
```
Before placing an order, you need to get the actual position. The get_position function we defined earlier will return the actual number of positions. If the current position is long, it will return a positive number. If the current position is short, it will return a negative number. If there is no position, returns 0. Finally, the buy and sell functions are used to place orders according to the above trading logic, but before this, the trading direction and type also need to be set.

## Complete strategy
```
'' 'backtest
start: 2019-01-01 00:00:00
end: 2020-01-01 00:00:00
period: 1h
exchanges: [{"eid": "Futures_CTP", "currency": "FUTURES"}]
'' '

import talib
import numpy as np


# Convert the K-line array into an array of highest price, lowest price, and closing price, used to convert to numpy.array type data
def get_data (bars):
    arr = []
    for i in bars:
        arr.append (i ['Close'])
    return arr


# Get the number of positions
def get_position ():
    # Get position
    position = 0 # The number of assigned positions is 0
    position_arr = _C (exchange.GetPosition) # Get array of positions
    if len (position_arr)> 0: # If the position array length is greater than 0
        for i in position_arr:
            if i ['ContractType'] == 'rb000': # If the position symbol is equal to the subscription symbol
                if i ['Type']% 2 == 0: # If it is long
                    position = i ['Amount'] # Assign a positive number of positions
                else:
                    position = -i ['Amount'] # Assign a negative number of positions
    return position
    
    

# Strategy main function
def onTick ():
    # retrieve data
    exchange.SetContractType ('rb000') # Subscribe to futures varieties
    bars_arr = exchange.GetRecords () # Get K line array
    if len (bars_arr) <22: # If the number of K lines is less than 22
        return
    
    # Calculation
    np_arr = np.array (get_data (bars_arr)) # Convert closing price array
    sma13 = talib.SMA (np_arr, 130) [-9] # chin
    sma8 = talib.SMA (np_arr, 80) [-6] # teeth
    sma5 = talib.SMA (np_arr, 50) [-4] # upper lip
    current_price = bars_arr [-1] ['Close'] # latest price

    position = get_position ()
    if position == 0: # If there is no position
        if current_price> sma5: # If the current price is greater than the upper lip
            exchange.SetDirection ("buy") # Set the trading direction and type
            exchange.Buy (current_price + 1, 1) # open long position order
        if current_price <sma13: # If the current price is less than the chin
            exchange.SetDirection ("sell") # Set the trading direction and type
            exchange.Sell (current_price-1, 1) # open short position order
        
    if position> 0: # If you have long positions
        if current_price <sma8: # If the current price is less than teeth
            exchange.SetDirection ("closebuy") # Set the trading direction and type
            exchange.Sell (current_price-1, 1) # close long position

    if position <0: # If you have short positions
        if current_price> sma8: # If the current price is greater than the tooth
            exchange.SetDirection ("closesell") # Set the trading direction and type
            exchange.Buy (current_price + 1, 1) # close short position

            
# Program main function
def main ():
    while True: # loop
        onTick () # execution strategy main function
        Sleep (1000) # sleep for 1 second
```
Directly click the link below to copy the complete strategy without configuration:
https://www.fmz.com/strategy/199025

## End

The biggest role of the crocodile trading rule is to help us maintain the same direction as the market when trading, regardless of how the current market price changes, and continue to profit until the consolidation market appears. The crocodile line can be used well with other MACD and KDJ indicators.

From: https://blog.mathquant.com/2020/06/09/crocodile-line-trading-system-python-version.html