tb跨周期函数

这是一个用于获取不同时间周期(如月线、周线、日线)K线数据的用户函数,通过计算当前BAR在目标周期下的索引值,实现对目标周期的开盘价、最高价、最低价、收盘价和成交量的获取。函数考虑了交易时间的不规则性和夜盘问题,适用于各种周期的分析和计算。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

// ------------------------------------------------------------------------
//  简称: k_Bar
//  名称: 跨周期函数--基础BAR数据
//  类别: 用户函数
//  类型: 用户函数
//  输出: 数值型
// ------------------------------------------------------------------------


Params 
    Numeric TimeFrame(
1440 );    
        
//  目标时间周期:按月线=4周(40320),周线=7天(10080),日线=24小时(1440)
        
//  其他日内的周期等于相应的分钟数,如:1小时=60, 30分钟=30。。。
        
//  1分钟图表,支持不规则分钟数,如3分钟、8分钟、14分钟等
        
    Numeric BarsBack(
0 ); 
        
//  目标时间周期BAR偏移:
        
//  1--表示当前周期下的当前BAR对应目标周期的前一根BAR
        
//  0--表示当前周期下的当前BAR对应目标周期的当前BAR截止到目前为止的BAR数据值

Vars
    Numeric TradeDate;                
//  当前K线实际交易日期(主要解决夜盘问题)
    Numeric TradeHour;                 //  当前K线实际交易时间(小时)
    Numeric TradeMinute;             //  当前K线实际交易时间(分钟)
    NumericSeries Index;             //  当前BAR在TimeFrame时间周期下的索引值
    Numeric SessionStartHour;         //  当前K线实际的交易日的第一节交易的起始时间(小时)


    NumericSeries barCnt;            
//  读取目标周期上一根BAR的数据在当前周期下需要回溯的BAR数
    NumericSeries Ht_CurBar;         //  当前BAR在目标周期下对应的CurrentBar
    Numeric barCntSum;                  //  临时变量,返回目标周期数据需要回溯的BAR数
    NumericSeries Ht_Open;             //  目标时间周期的开盘价
    NumericSeries Ht_High;             //  目标时间周期的最高价
    NumericSeries Ht_Low;             //  目标时间周期的最低价
    NumericSeries Ht_Close;             //  目标时间周期的收盘价
    NumericSeries Ht_Vol;             //  目标时间周期的成交量
    NumericSeries Ht_OpenInt;         //  目标时间周期的持仓量
     bool  condition( false
### TB6612电机驱动函数实现与使用 TB6612是一款双H桥直流电机驱动芯片,能够通过PWM信号调节电机的速度和方向。以下是基于STM32微控制器的TB6612 PWM控制函数实现示例。 #### 初始化GPIO引脚配置 为了使能TB6612的功能,需初始化其对应的GPIO引脚。具体包括IN1、IN2、PWMA用于控制第一个电机;IN3、IN4、PWMB用于控制第二个电机[^2]。 ```c void TB6612_GPIO_Init(void) { GPIO_InitTypeDef GPIO_InitStruct = {0}; __HAL_RCC_GPIOA_CLK_ENABLE(); // 启用GPIOA时钟 __HAL_RCC_GPIOB_CLK_ENABLE(); // 启用GPIOB时钟 // IN1, IN2 (PA0, PA1) GPIO_InitStruct.Pin = GPIO_PIN_0 | GPIO_PIN_1; GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP; // 推挽输出模式 GPIO_InitStruct.Pull = GPIO_NOPULL; // 不带上下拉电阻 GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_HIGH; // 高速模式 HAL_GPIO_Init(GPIOA, &GPIO_InitStruct); // PWMA (PB0), IN3, IN4 (PA2, PA3) GPIO_InitStruct.Pin = GPIO_PIN_2 | GPIO_PIN_3; HAL_GPIO_Init(GPIOA, &GPIO_InitStruct); // PWMB (PB1) GPIO_InitStruct.Pin = GPIO_PIN_1; HAL_GPIO_Init(GPIOB, &GPIO_InitStruct); } ``` #### 设置PWM通道 利用TIM定时器生成PWM波形并将其分配到相应的引脚上。这里以TIM2为例设置两个独立的PWM通道分别对应PWMA和PWMB。 ```c void TB6612_PWM_Init(uint16_t freq) { TIM_HandleTypeDef htim2; __HAL_RCC_TIM2_CLK_ENABLE(); htim2.Instance = TIM2; htim2.Init.Prescaler = SystemCoreClock / 1000000 - 1; // 设定预分频系数为1MHz htim2.Init.CounterMode = TIM_COUNTERMODE_UP; htim2.Init.Period = 1000000 / freq - 1; // 周期设定为指定频率下的计数值 htim2.Init.ClockDivision = TIM_CLOCKDIVISION_DIV1; HAL_TIM_Base_Init(&htim2); TIM_OC_InitTypeDef sConfigOC; sConfigOC.OCMode = TIM_OCMODE_PWM1; sConfigOC.Pulse = 0; // 初始占空比设为零 sConfigOC.OCPolarity = TIM_OCPOLARITY_HIGH; sConfigOC.OCFastMode = TIM_OCFAST_DISABLE; HAL_TIM_PWM_ConfigChannel(&htim2, &sConfigOC, TIM_CHANNEL_1); // PB0 -> CH1(PWMA) HAL_TIM_PWM_ConfigChannel(&htim2, &sConfigOC, TIM_CHANNEL_2); // PB1 -> CH2(PWMB) HAL_TIM_PWM_Start(&htim2, TIM_CHANNEL_1); HAL_TIM_PWM_Start(&htim2, TIM_CHANNEL_2); } // 调整PWM占空比 void SetMotorSpeed(TIM_HandleTypeDef *htim, uint8_t channel, uint16_t duty_cycle) { if(channel == 1){ __HAL_TIM_SET_COMPARE(htim, TIM_CHANNEL_1, duty_cycle); } else{ __HAL_TIM_SET_COMPARE(htim, TIM_CHANNEL_2, duty_cycle); } } ``` #### 控制电机转向 通过改变INx引脚的状态可切换电机正反转或停止状态。下面给出一个简单的API来简化操作过程: ```c typedef enum { STOP, FORWARD, BACKWARD } MotorDirection; void ControlMotor(MotorDirection dir, uint8_t motor_id, uint16_t speed) { if(motor_id == 1){ // 对应于MOTOR_A switch(dir){ case FORWARD: HAL_GPIO_WritePin(GPIOA, GPIO_PIN_0, GPIO_PIN_RESET); HAL_GPIO_WritePin(GPIOA, GPIO_PIN_1, GPIO_PIN_SET); break; case BACKWARD: HAL_GPIO_WritePin(GPIOA, GPIO_PIN_0, GPIO_PIN_SET); HAL_GPIO_WritePin(GPIOA, GPIO_PIN_1, GPIO_PIN_RESET); break; default: // STOP HAL_GPIO_WritePin(GPIOA, GPIO_PIN_0|GPIO_PIN_1, GPIO_PIN_RESET); break; } SetMotorSpeed(&htim2, 1, speed); }else{ // MOTOR_B switch(dir){ case FORWARD: HAL_GPIO_WritePin(GPIOA, GPIO_PIN_2, GPIO_PIN_RESET); HAL_GPIO_WritePin(GPIOA, GPIO_PIN_3, GPIO_PIN_SET); break; case BACKWARD: HAL_GPIO_WritePin(GPIOA, GPIO_PIN_2, GPIO_PIN_SET); HAL_GPIO_WritePin(GPIOA, GPIO_PIN_3, GPIO_PIN_RESET); break; default: // STOP HAL_GPIO_WritePin(GPIOA, GPIO_PIN_2|GPIO_PIN_3, GPIO_PIN_RESET); break; } SetMotorSpeed(&htim2, 2, speed); } } ``` 以上代码展示了如何在嵌入式环境中完成对TB6612模块的基础功能调用以及速度调控机制的设计思路。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值