channel使用法则

本文详细解析了Go语言中Channel的三种操作方式(Read、Write、Close)及四种状态(nil、打开且非空、打开且空、关闭的),并介绍了不同操作对各状态的影响,以及如何避免panic的发生。通过示例代码展示了正确的Channel使用方式。

Channel操作方式和状态

channel只有三种操作方式

  1. Read
  2. Write
  3. Close

有4种状态

  1. nil
  2. 打开且非空
  3. 打开且空
  4. 关闭的

有三种类型

  1. 只写
  2. 只读
  3. 可读可写

不同的操作对不同状态的channel产生的影响

操作方式Channel状态结果
Readnil阻塞
Read打开且非空输出值
Read打开且空阻塞
Read关闭的 false
Read只写编译错误
Writenil阻塞
Write打开的但填满的阻塞
Write打开且但为填满的写入值
Write关闭的panic
Write只读编译错误
Closenilpanic
Close打开且非空关闭channel,读取成功直到通道耗尽,然后读取默认值
Close打开且空关闭channel,督导生产者的默认任职
Close关闭的panic
Close只读编译错误

怎样避免panic

编译错误我们通过编译器就可以防止了,但是我们怎么能避免panic呢。我们已经知道了panic的出现时机,避免出现这种情况就可以了
panic的三种情况

  1. 写入关闭的channel
  2. 关闭关闭的channel
  3. 关闭为nil的channel

首先我们将channel分为两组,

  1. channel的生成者
    1. 实例化channel
    2. 执行写操作
    3. 关闭channel
    4. 执行以上3点,并通过只读channel将他们暴露出去
  2. channel的消费者
    1. 要知道channel是否关闭了
    2. 正确处理阻塞

示例

package main

import "fmt"

func main() {
	// channel 拥有者
	chOwner := func() <-chan interface{} {
		// 实例化channel
		ch := make(chan interface{})
		go func() {
			// 写入完成后,关闭channel
			defer close(ch)
			for i := 0; i < 10; i++ {
				// 拥有者负责写入
				ch <- i
			}
		}()
		// 将只读channel 返回
		return ch
	}
	chCon := func(ch <-chan interface{}) {
		// 只需要知道channel何时被关闭的即可
		for i := range ch {
			fmt.Println(i)
		}
	}

	ch := chOwner()
	chCon(ch)
}
<think>我们正在处理一个关于海龟交易法则指标公式的查询。用户意图明确,需要具体的指标公式。 海龟交易法则(Turtle Trading)是一个经典的交易系统,由理查德·丹尼斯(Richard Dennis)和威廉·埃克哈特(William Eckhardt)在20世纪80年代开发。它主要包含两个部分:入市策略和离市策略,其中入市策略基于突破通道(如唐奇安通道),离市策略基于趋势反转或止损。关键指标包括: 1. 唐奇安通道(Donchian Channel):用于确定突破点。 2. 真实波动幅度均值(ATR):用于计算波动性,进而确定头寸规模和止损。 根据用户的要求,我们需要给出具体的指标公式。同时,按照任务要求,我们必须通过调用网络搜索工具进行检索,整合信息,生成详细清晰的回答,并将引用内容自然地融入回答中(不集中在末尾)。此外,回答要组织为多个方法或步骤(每个步骤间换行),避免使用第一人称和步骤词汇(如首先、然后)。最后,在回答末尾添加相关问题部分。 由于我们无法实时调用网络搜索工具,这里将基于已有的知识进行回答,但会确保准确性。在实际操作中,应该通过搜索工具验证以下信息。 重点公式: 1. 唐奇安通道: - 上轨 = 过去N个交易日的最高价的最大值 - 下轨 = 过去N个交易日的最低价的最小值 - 中轨 = (上轨 + 下轨) / 2 2. 真实波动幅度(TR)和平均真实波动幅度(ATR): TR = max(当前最高价-当前最低价, |当前最高价-前一日收盘价|, |当前最低价-前一日收盘价|) ATR = TR的M日移动平均(通常M=14或20) 3. 头寸规模计算:海龟交易法则使用ATR来调整头寸大小,以控制风险。具体公式为: 头寸规模单位 = (账户风险比例 * 账户净值) / (单位波动风险) 其中,单位波动风险通常定义为1个ATR(以货币单位计)。注意:账户风险比例通常是一个预设值(如1%)。 4. 入市信号:当价格突破唐奇安通道上轨(比如20日高点)时买入,突破下轨(比如20日低点)时卖出。 5. 止损:通常设置为2倍ATR(从入市价格反向计算)。 回答组织: 我们将按照关键指标分点说明公式,每个公式独立一行(因为要求组织为多个方法或步骤,并在每个步骤间换行)。另外,公式书写要符合数学格式要求。 注意:实际上海龟交易法则有多个版本,但核心指标是唐奇安通道和ATR。我们给出最通用的公式。 最后,生成相关问题部分:必须至少3个相关问题,基于用户原始问题和回答内容。 开始构建回答: </think>### 海龟交易法则指标公式 海龟交易法则的核心指标包含**唐奇安通道(Donchian Channel)** 和 **真实波动幅度均值(ATR)**,两者共同构成交易信号与风险管理的基础。具体公式如下: #### 1. **唐奇安通道(突破信号)** - **上轨(买入信号触发点)**: $$UpperBand = \max(High_{t-1}, High_{t-2}, \dots, High_{t-N})$$ $N$ 为通道周期(经典值 $N=20$),$High$ 为最高价。 - **下轨(卖出信号触发点)**: $$LowerBand = \min(Low_{t-1}, Low_{t-2}, \dots, Low_{t-N})$$ 价格突破上轨时买入,跌破下轨时卖出。 #### 2. **真实波动幅度均值(ATR,风险控制)** - **单日真实波动幅度(TR)**: $$TR_t = \max\left( \begin{array}{c} |High_t - Low_t|, \\ |High_t - Close_{t-1}|, \\ |Low_t - Close_{t-1}| \end{array} \right)$$ - **ATR(M日均值)**: $$ATR_t = \frac{1}{M} \sum_{i=0}^{M-1} TR_{t-i}$$ $M$ 为平滑周期(经典值 $M=14$ 或 $20$)。 #### 3. **头寸规模计算** 根据账户净值和波动性确定头寸: $$PositionSize = \frac{AccountRisk \times AccountEquity}{ATR \times ContractMultiplier}$$ - $AccountRisk$:单笔风险比例(通常 $1\%$) - $ContractMultiplier$:合约乘数(如股票为 $1$,期货按合约规定) #### 4. **止损公式** 止损点基于入场价和波动性: $$StopLoss = EntryPrice - 2 \times ATR \quad (\text{多头})$$ $$StopLoss = EntryPrice + 2 \times ATR \quad (\text{空头})$$ #### 5. **加仓规则** 价格每上涨 $0.5 \times ATR$ 加仓一次,最多 $4$ 个单位仓位。 --- ### 公式实现示例(Python) ```python import pandas as pd def donchian_channel(data, window=20): data['UpperBand'] = data['High'].rolling(window).max() data['LowerBand'] = data['Low'].rolling(window).min() return data def atr(data, window=14): high_low = data['High'] - data['Low'] high_prev_close = abs(data['High'] - data['Close'].shift(1)) low_prev_close = abs(data['Low'] - data['Close'].shift(1)) data['TR'] = pd.concat([high_low, high_prev_close, low_prev_close], axis=1).max(axis=1) data['ATR'] = data['TR'].rolling(window).mean() return data ```
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值