程序员的量化交易之路(30)--Cointrader之ConfigUtil(17)

一个免费开源的专业级量化交易软件 Northstar国内最优秀的基于JAVA的AI开源量化交易平台,秒替文华、MC、金字塔。具备历史回放、策略研发、模拟交易、实盘交易等功能。兼顾全自动与半自动的使用场景。Northstar是一款基于GPL-3.0协议分发的开源软件。 阅读详情

转载须注明出处:http://blog.youkuaiyun.com/minimicall?viewmode=contents,http://cloudtrade.top/

一个完整的系统,必然会涉及到配置文件。配置文件可以是xml、属性文件等形式。大多数而言我们并不需要重写配置读取解析模块,只需要使用开源的即可,这里使用的是apapche.commons.configuration的。

我们这里要说的是Cointrader的ConfigUtil类,它涉及到配置和注解成员之间的赋值等问题。

下面通过代码学习:

package org.cryptocoinpartners.util;

import org.apache.commons.configuration.*;
import org.apache.commons.configuration.tree.OverrideCombiner;
import org.apache.commons.lang.StringUtils;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

import javax.annotation.Nullable;
import java.io.File;
import java.io.IOException;
import java.io.PrintWriter;
import java.io.StringWriter;
import java.lang.reflect.Field;
import java.lang.reflect.Modifier;
import java.math.BigDecimal;
import java.math.BigInteger;
import java.net.URL;
import java.util.*;


/**
 * @author Tim Olson
 */
@SuppressWarnings("UnusedDeclaration")
public class ConfigUtil {

    public static CombinedConfiguration combined() { return combined; }

    public static PropertiesConfiguration defaults() { return defaultConfig; }
    public static PropertiesConfiguration user() { return userConfig; }
    public static PropertiesConfiguration buildtime() { return buildtimeConfig; }
    public static SystemConfiguration system() { return sysConfig; }
    public static MapConfiguration commandLine() { return clConfig; }


    /**
     * Finds all non-static members tagged with @Config and populates them with the current combined() configuration
     * 额,这个注释是错误的。不仅仅是@Config吧。就是素有的非静态成员的注解
     */
    public static void applyConfiguration( Object instance ) {
        Class<?> cls = instance.getClass();
        for( Field field : cls.getFields() ) {
            Config annotation = field.getAnnotation(Config.class);
            if( annotation != null )
                inject(combined(), instance, field, annotation);
        }
    }


    /**
     * Examines injectee for any setters or fields marked with @Config, then sets those fields to values from the
     * Configuration object.
     */
    public static void applyConfiguration(Object injectee, Configuration config) {
        Class<?> cls = injectee.getClass();
        for( Field field : cls.getFields() ) {
            Config annotation = field.getAnnotation(Config.class);
            if( annotation != null )
                inject((AbstractConfiguration) config, injectee, field, annotation);
        }
    }


    public static void init(String filename, Map<String,String> commandLine ) throws ConfigurationException {
        boolean loadUserPropertiesFile = new File(filename).exists();
        if( !loadUserPropertiesFile  )
            log.warn("Could not find configuration file \"" + filename + "\"");
        clConfig = new MapConfiguration(commandLine);
        sysConfig = new SystemConfiguration();
        if( loadUserPropertiesFile )
            userConfig = new PropertiesConfiguration(filename);
        else
            userConfig = new PropertiesConfiguration();
        URL defaultProps = ConfigUtil.class.getResource("/cointrader-default.properties");//加载配置文件
        if( defaultProps == null )
            throw new ConfigurationException("Could not load cointrader-default.properties");
        defaultConfig = new PropertiesConfiguration(defaultProps);
        URL buildtimeProps = ConfigUtil.class.getResource("/org/cryptocoinpartners/buildtime.properties");
        if( buildtimeProps == null )
            throw new ConfigurationException("Could not load buildtime.properties");
        buildtimeConfig = new PropertiesConfiguration(buildtimeProps);
        combined = buildConfig(Collections.<AbstractConfiguration>emptyList());
        if( log.isDebugEnabled() )
            log.debug("Combined Configuration:\n"+ asString(combined));
    }


    public static CombinedConfiguration forModule(Object... keyValuePairs) {
        if( keyValuePairs.length % 2 != 0 )
            throw new Error("Configuration parameters must be key-value pairs.  Found an odd number.");
        HashMap<String,Object> map = new HashMap<>();
        for( int i = 0; i < keyValuePairs.length; i++ )
            map.put(keyValuePairs[i++].toString(),keyValuePairs[i]);
        return forModule(Collections.singletonList(new MapConfiguration(map)));
    }


    public static CombinedConfiguration forModule(Collection<? extends AbstractConfiguration> moduleConfigs) {
        CombinedConfiguration result = buildConfig(moduleConfigs);
        if( log.isDebugEnabled() )
            log.debug("Module Configuration:\n"+ asString(result));
        return result;
    }


    public static List<String> getPathProperty(String pathProperty) {
        CombinedConfiguration config = combined();
        return getPathProperty(config, pathProperty);
    }


    public static List<String> getPathProperty(CombinedConfiguration config, String pathProperty) {
        String modulePath = config.getString(pathProperty, "");
        List<String> paths = new ArrayList<>(Arrays.asList(modulePath.split(":")));
        paths.add("org.cryptocoinpartners.module");
        paths.remove("");
        return paths;
    }


    private static CombinedConfiguration buildConfig(Collection<? extends AbstractConfiguration> intermediateConfigs) {
        final CombinedConfiguration result = new CombinedConfiguration(new OverrideCombiner());
        result.addConfiguration(buildtimeConfig); // buildtime config cannot be overridden
        result.addConfiguration(clConfig);
        result.addConfiguration(sysConfig);
        for( AbstractConfiguration moduleConfig : intermediateConfigs )
            result.addConfiguration(moduleConfig);
        if( !userConfig.isEmpty() )
            result.addConfiguration(userConfig);
        result.addConfiguration(defaultConfig);
        return result;
    }


    public static String asString(Configuration configuration) {
        StringWriter out = new StringWriter();
        PrintWriter pout = new PrintWriter(out);
        ConfigurationUtils.dump(configuration, pout);
        try {
            pout.close();
            out.close();
        }
        catch( IOException e ) {
            throw new Error(e);
        }
        ArrayList<String> outLines = new ArrayList<>();
        for( String line : out.toString().split("\n") ) {
            if( !isSecret(line) )
                outLines.add(line);
        }
        Collections.sort(outLines);
        return StringUtils.join(outLines,"\n");
    }


    protected static boolean isSecret(String line) {
        return line.contains("password") || line.contains("secret");
    }


    private static void inject(@Nullable Object instance, Field field ) {
        inject(combined(), instance, field, null);
    }


    private static void inject(AbstractConfiguration configuration, @Nullable Object instance, Field field, @Nullable Config configAnnotation ) {
        if( instance == null && !Modifier.isStatic(field.getModifiers()) )//如果instance为null或者该数据成员为静态的,则不可赋值
            return;

        if( Modifier.isFinal(field.getModifiers()) ) {//该数据成员是final修饰的,不可以修改。
            log.warn("Field " + field.getDeclaringClass().getName()+"."+field.getName() + " is tagged with @Config but is declared final.  Config for this field failed.");
            return;
        }
        if( configAnnotation == null )//如果configAnnotation为null,则直接获取field的注解。
            configAnnotation = field.getAnnotation(Config.class);
        String key = null;
        if( configAnnotation != null )
            key = configAnnotation.value();//标注的值作为键
        if( key == null )
            key = field.getName();//如果标注没有值,那么直接拿数据成员的名字作为键
        Config classConfigAnnotation = field.getDeclaringClass().getAnnotation(Config.class);//获取成员声明所在类的注解,即类注解
        if( classConfigAnnotation != null )
            key = classConfigAnnotation.value() + "." + key;//用“.”号连接类注解和成员注解
        Object value = getDynamic(field.getType(), configuration, key);//获取该注解对应配置的值
        if( value != null ) {
            try {
                field.set(instance, value);//将值反射注入到instance对象的改数据成员中。
                if( log.isDebugEnabled() ) {
                    // hide values marked as passwords
                    String printValue = isSecret(key) ? "**-hidden-**" : field.get(instance).toString();
                    log.debug("Set field " + field.getDeclaringClass()
                                                  .getName() + "." + field.getName() + " to " + printValue);
                }
            }
            catch( IllegalAccessException e ) {
                log.error("Could not set config on field " + field.getDeclaringClass().getName() + "." + field.getName(),e);
            }
        }
    }


    public static <T> T getDynamic(Class<T> resultType, AbstractConfiguration configuration, String key) {
        return getDynamic(resultType, configuration, key, null);
    }

//从配置文件中读取属性值
    @SuppressWarnings("unchecked")
    public static <T> T getDynamic(Class<T> resultType, AbstractConfiguration configuration, String key, T defaultValue) {
        if( resultType.isAssignableFrom(String.class) )
            return (T) configuration.getString(key, (String) defaultValue);
        else if( resultType.isAssignableFrom(Boolean.class) || resultType.isAssignableFrom(Boolean.TYPE) )
            return (T) configuration.getBoolean(key, (Boolean) defaultValue);
        else if( resultType.isAssignableFrom(Long.class) || resultType.isAssignableFrom(Long.TYPE) )
            return (T) configuration.getLong(key, (Long) defaultValue);
        else if( resultType.isAssignableFrom(Integer.class) || resultType.isAssignableFrom(Integer.TYPE) )
            return (T) configuration.getInteger(key, (Integer) defaultValue);
        else if( resultType.isAssignableFrom(Short.class) || resultType.isAssignableFrom(Short.TYPE) )
            return (T) configuration.getShort(key, (Short) defaultValue);
        else if( resultType.isAssignableFrom(Byte.class) || resultType.isAssignableFrom(Byte.TYPE) )
            return (T) configuration.getByte(key, (Byte) defaultValue);
        else if( resultType.isAssignableFrom(Double.class) || resultType.isAssignableFrom(Double.TYPE) )
            return (T) configuration.getDouble(key, (Double) defaultValue);
        else if( resultType.isAssignableFrom(Float.class) || resultType.isAssignableFrom(Float.TYPE) )
            return (T) configuration.getFloat(key, (Float) defaultValue);
        else if( resultType.isAssignableFrom(List.class) )
            return (T) configuration.getList(key, (List) defaultValue);
        else if( resultType.isAssignableFrom(BigDecimal.class) )
            return (T) configuration.getBigDecimal(key, (BigDecimal) defaultValue);
        else if( resultType.isAssignableFrom(BigInteger.class) )
            return (T) configuration.getBigInteger(key, (BigInteger) defaultValue);

        throw new IllegalArgumentException("Cannot cast configuration values to "+resultType.getName());
    }


    private static PropertiesConfiguration defaultConfig;
    private static PropertiesConfiguration buildtimeConfig;
    private static PropertiesConfiguration userConfig;
    private static MapConfiguration clConfig;
    private static SystemConfiguration sysConfig;
    private static CombinedConfiguration combined;
    private static Logger log = LoggerFactory.getLogger(ConfigUtil.class);
}
我们首先来分析inject函数,它实现的是一个将配置中值注入到对应对象的成员变量中去。

在这里我们补一下获取一个成员的注解的知识:学习代码如下:

package com.yiibai;

import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.reflect.Method;

// declare a new annotation
@Retention(RetentionPolicy.RUNTIME)
@interface Demo {

   String str();

   int val();
}

public class PackageDemo {

   // set values for the annotation
   @Demo(str = "Demo Annotation", val = 100)
   // a method to call in the main
   public static void example() {
      PackageDemo ob = new PackageDemo();

      try {
         Class c = ob.getClass();

         // get the method example
         Method m = c.getMethod("example");

         // get the annotation for class Demo
         Demo annotation = m.getAnnotation(Demo.class);

         // print the annotation
         System.out.println(annotation.str() + " " + annotation.val());
      } catch (NoSuchMethodException exc) {
         exc.printStackTrace();
      }
   }

   public static void main(String args[]) {
      example();
   }
}
让我们来编译和运行上面的程序,这将产生以下结果:

Demo Annotation 100


下面还有一个getResource去读取一个文件:

我们引用(抄袭)一个很好很简单的帖子:http://blog.youkuaiyun.com/lcj8/article/details/3502849

class.getResource()的用法
用JAVA获取文件,听似简单,但对于很多像我这样的新人来说,还是掌握颇浅,用起来感觉颇深,大常最经常用的,就是用JAVA的File类,如要取得c:/test.txt文件,就会这样用File file = newFile("c:/test.txt");这样用有什么问题,相信大家都知道,就是路径硬编码,对于JAVA精神来说,应用应该一次成型,到处可用,并且从现实应用来讲,最终生成的应用也会部署到Windows外的操作系统中,对于linux来说,在应用中用了c:/这样的字样,就是失败,所以,我们应该尽量避免使用硬编码,即直接使用绝对路径。 


  在Servlet应用中,有一个getRealPath(String str)的方法,这个方法尽管也可以动态地获得文件的路径,不秘直接手写绝对路径,但这也是一个不被建议使用的方法,那么,我们有什么方法可以更好地获得文件呢? 


     那就是Class.getResource()与Class.getResourceAsStream()方法,但很多人还是不太懂它的用法,因为很多人(比如不久前的我)都不知道应该传怎么样的参数给它,当然,有些人己经用得如火纯青,这些人是不需要照顾的,在此仅给不会或者还不是很熟的人解释一点点。 




比如我们有以下目录 
|--project 
    |--src 
        |--javaapplication 
            |--Test.java 
            |--file1.txt 
        |--file2.txt 
    |--build 
        |--javaapplication 
            |--Test.class 
            |--file3.txt 
        |--file4.txt 


在上面的目录中,有一个src目录,这是JAVA源文件的目录,有一个build目录,这是JAVA编译后文件(.class文件等)的存放目录 
那么,我们在Test类中应该如何分别获得 
file1.txt file2.txt file3.txt file4.txt这四个文件呢? 


首先讲file3.txt与file4.txt 
file3.txt: 
方法一:File file3 = new File(Test.class.getResource("file3.txt").getFile()); 
方法二:File file3 = new File(Test.class.getResource("/javaapplication/file3.txt").getFile()); 
方法三:File file3 = new File(Test.class.getClassLoader().getResource("javaapplication/file3.txt").getFile()); 


file4.txt: 
方法一:File file4 = new File(Test.class.getResource("/file4.txt").getFile()); 
方法二:File file4 = new File(Test.class.getClassLoader().getResource("file4.txt").getFile()); 


很好,我们可以有多种方法选择,但是file1与file2文件呢?如何获得? 
答案是,你只能写上它们的绝对路径,不能像file3与file4一样用class.getResource()这种方法获得,它们的获取方法如下 
假如整个project目录放在c:/下,那么file1与file2的获取方法分别为 
file1.txt 
方法一:File file1 = new File("c:/project/src/javaapplication/file1.txt"); 
方法二:。。。没有 


file2.txt 
方法一:File file2 = new File("c:/project/src/file2.txt"); 
方法二:。。。也没有 


总结一下,就是你想获得文件,你得从最终生成的.class文件为着手点,不要以.java文件的路径为出发点,因为真正使用的就是.class,不会拿个.java文件就使用,因为java是编译型语言嘛 


至于getResouce()方法的参数,你以class为出发点,再结合相对路径的概念,就可以准确地定位资源文件了,至于它的根目录嘛,你用不同的IDEbuild出来是不同的位置下的,不过都是以顶层package作为根目录,比如在Web应用中,有一个WEB-INF的目录,WEB-INF目录里面除了web.xml文件外,还有一个classes目录,没错了,它就是你这个WEB应用的package的顶层目录,也是所有.class的根目录“/”,假如clasaes目录下面有一个file.txt文件,它的相对路径就是"/file.txt",如果相对路径不是以"/"开头,那么它就是相对于.class的路径。。 


还有一个getResourceAsStream()方法,参数是与getResouce()方法是一样的,它相当于你用getResource()取得File文件后,再new InputStream(file)一样的结果 


   


class.getResource("/") --> 返回class文件所在的顶级目录,一般为包名的顶级目录。 --> file:/home/duanyong/workspace/cxxx/xxxx/bin/WEB-INF/classes/ 
class.getResource("/xxx.txt") --> 返回顶级目录下的xxx.txt路径。 file://..../bin/WEB-INF/classes/xxx.txt 


getResource(String path),path是以class文件的顶级目标所在的相对路径。如果顶级目录为classes,在classes/xxx/yyy.txt这样一个文件。取得yyy.txt的语法为:class.getResource("/xxx/yyy.txt"); 


示例代码: 
查看复制到剪切板打印
//取得classes顶级目录下的/xxx/yyy.txt文件   
System.out.println(Test.class.getResource("/xxx/yyy.txt"));   
//取得本class的上路径   
System.out.println(Test.class.getResource(Test.class.getSimpleName() + ".class"));          
[Java] view plaincopy
//取得classes顶级目录下的/xxx/yyy.txt文件  
System.out.println(Test.class.getResource("/xxx/yyy.txt"));  
//取得本class的上路径  
System.out.println(Test.class.getResource(Test.class.getSimpleName() + ".class"));          






结果: 
file:/home/duanyong/workspace/test/bin/WEB-INF/classes/xxx/yyy.txt 
file:/home/duanyong/workspace/test/bin/WEB-INF/classes/cn/duanyong/test/Test.class



java macd 开源,开源分布式量化交易系统——回测系统(一) 回测系统基础概念在开始编写策略系统之前,需要了解一些基础概念,搞明白什么是回测系统?怎么进行回测?如何进行回测分析?并且在回测中需要注意的一些要素,真正的做到有效的策略回测。根据回测的精度可分为Bar回测和Tick回测,所谓的Bar是指一根包含上下引线的柱体,由开盘价、最高价、最低价、收盘价、成交量、成交额、持仓量、时间等组成的分钟、小时、天、周或年的数据,这种方式回测速度快但精度不够细,适用于中... 阅读详情

相关推荐

redtorch:Java开源量化交易开发框架

redtorch 但知行好事,莫要问前程。 在您下载和使用本项目前,请务必阅读相关协议和注意事项 项目简介 项目是基于Java语言开发的开源量化交易程序开发框架。 项目仓库地址: 提示 如果你看到当前这段话,说明那你正在浏览的是1.0.0版本分支 。 此分支大幅精简了0.3.0版本中的通讯协议,增加了HTTP WebSocket混合RPC模式, 这极大的改善了性能,但是通讯模型理解难度增大; 此外,这个分支修复了大量拼写错误、 优化了Desktop模块的渲染方式、修复了诸多BUG、修改了接入认证方式。 由于改动幅度较大,尚未经过充分测试,请谨慎使用。 Web页面和Python客户端对应的1.0.0分支也已经发布,与0.3.0不兼容。 下一个版本1.1.0计划实现基于Zookeeper的HA,此版本已经提前准备了HaSession模块。 开发语言 Java 项目文档 此项目仅供代码相互学习,

到底是JAVA 做量化交易强,还是PYTHON 做量化交易强

网上几乎绝大多数网友都会认为“PYTHON 做量化交易强于JAVA”,有的甚至认为“PYTHON在量化交易领域,无可替代”。我作为一名JAVA出生的人,写了一辈子的JAVA,同是也是一名深度研究的股民,抱着恭敬学习的态度,买了一本《Python量化炒股》一书,仔细拜读和对比。每一个知识点,都要力求寻找在JAVA领域有没有可替代的工具包。结果大有所获。 我给大家以列图加文字的方式进行。首先这是我拜读的这本书《Python量化炒股》: 一共分19章节,大致内容可以归类如下: 第1章-----第7章 为p.

wangangls163it的博客 4909

[机器学习-回归实例] 李宏毅机器学习作业一:PM2.5 预测实例

[机器学习-回归实例] 李宏毅机器学习作业一:PM2.5 预测实例 简介   这是一个回归预测的实例,数据集来自李宏毅的《机器学习》课程的第一次作业,可以用来训练一个线性回归模型或者其他的回归模型,动手实践学习到的理论知识,在实践中去发现问题。这篇文章主要包括数据集的解释、数据的预处理过程及线性回归模型的代码实现这三个部分。由于这个数据集并不能直接使用,还需进行一些重构,为了对初学者更友好一些,我会提供重构完的可以读取后就直接使用的数据集,我也会提供 Matlab\rm MatlabMatlab 可直接使用

qq_27309515的博客 3574

基于java的量化交易软件,用户可自行编写交易策略,用于期货、股票、外汇、炒币等多种交易场景,前端采用node14 + vue2

这是一个面向程序员的开源高频量化交易软件,用于期货、股票、外汇、炒币等多种交易场景,实现自动交易。暂时只对接了国内期货交易所,理论上可以对接任意交易所。一站式平台,可适配对接不同的交易所;灵活多变的自动化策略框架,能实现复杂的个性化交易逻辑,如多合约价差交易,算法高频交易,CTA交易,期权期货混合交易等等;支持多账户交易,能实现跨市套利等复杂逻辑;直观易理解的API编程接口,并且提供了多种策略的编写范例,只需要掌握最基本的JAVA编程知识便可以上手编写自己的交易策略;

Python代码大全 3838

深入解析:如何在Visual Studio中高效编译libredwg与libdxfrw

本文详细介绍了在Visual Studio中高效编译libredwg与libdxfrw的完整流程,包括环境配置、源码获取、CMake技巧及常见错误解决方案。针对CAD开发者,提供了从基础编译到项目集成的实用指南,帮助快速处理DWG/DXF文件,提升开发效率。

weixin_29215391的博客 232

QT与Coin3D实现机器人的仿真

前言 Coin3D编程环境配置好后,开始下一步的机器人仿真任务。本文根据在研5轴机器人,完成三维模型生成与机器人的仿真。主要参考博主冯Jungle的博客,在此表示感谢。 ——2021.05.23 环境 Win10:VS2019、QT5.15.2、Coin3D、SolidWorks2016 机器人三维模型生成 目前广泛应用于因特网的VRML ( Virtual Reality Modeling Language,虚拟现实建模语言)为用户提供一种可参与的、并能对场景中对象主动做出反应的虚拟现实环境,现已成

焦露的博客 6908

量化java_用java做量化

这篇文章是对目前我自己用java开发量化交易系统的一个总结,后续有新的进展我会陆续更新到这个专栏里。用业余时间搞量化这个副业是想实现自己一直以来的愿望:当一个自由的宽客(其实大部分是因为不满足于死工资)想做量化已经有4-5年了,记得大学的时候第一次在网上看到宽客这个名词,当时心里很激动。第一,当宽客很自由,而且能发挥个人的聪明才智,大学时在学校里参加过数据建模竞赛,我对能够用模型描述解决现实问题的...

weixin_34952098的博客 2712

20.项目开发之量化交易QuantTrade(二)

项目开发之量化交易QuantTrade(二)讲解学习

sunnypaopao的博客 506

(11-3-01 )

以太坊(Ethereum)是一种基于区块链技术的开源平台和加密货币。它于2015年由Vitalik Buterin和Gavin Wood等开发者创建,并成为比特币之后最受欢迎的加密货币之一。以太坊不仅支持加密货币交易,还为开发者和企业提供了构建去中心化应用程序的强大工具。在本节的内容中,将实型一个完整的机器学习模型项目,智能检测出以太坊区块链中的非法账户。从问题定义到模型建立和评估,再到最终的总结和建议。本实例突出了处理类别不平衡问题的重要性,并展示了如何使用多种机器学习算法来解决实际问题。此外,通过数据可

码农三叔 2171

流媒体服务软件-LiveNVR channeltree 未授权访问

LiveNVR 能够通过简单的网络摄像机通道配置,将传统监控行业里面的高清网络摄像机 IPCamera、NVR 等具有 RTSP/Onvif 协议输出的设备接入到 LiveNVR,LiveNVR 能够将这些设备源的音/视频数据进行采集、转换、输出,进行全平台终端直播(PC、Android、iOS、微信、H5),并且LiveNVR能够将视频源的直播数据对接到第三方 CDN 网络,实现安防设备互联网级别的直播分发。对channeltree接口加上权限校验。直接访问接口即可获取数据。

iSee857的博客 1040

6.7 Java在量化投资中的应用

Java在量化投资中的应用是多方面的,从数据处理到策略开发,再到风险管理,Java都能发挥重要作用。希望这篇文章能让你对Java在量化投资中的应用有一个初步的了解。下一期,我们将深入探讨Java在量化投资中的更多高级应用,敬请期待!

云策量化的博客 525

《测控仪器设计课后习题答案-浦昭邦-王宝光

《测控仪器设计课后习题答案-浦昭邦-王宝光 1.1. 测控仪器的概念是什么? 测控仪器则是利用测量和控制的理论,采用机、电、光各种计量测试原理及控制系统与计算机相结合的一种范围广泛的测量仪器。 1.2. 为什么说测控仪器的发展与科学技术发展密切相关? 仪器仪表的用途和重要性— 遍及国民经济各个部门,深入到人民生活的各个角落,仪器仪表中的计量测试仪器与控制仪器统称为测控仪器,可以说测控仪器的水平是科学技术现代化的重要标志。 仪器仪表的用途: 在机械制造业中:对产品的静态与动态性能测试;加工过程的控制与监测;设

无名何许人的博客 2976

程序猿的量化交易之路(30)--Cointrader之ConfigUtil(17)

转载须注明出处:http://blog.csdn.net/minimicall?viewmode=contents。http://cloudtrade.top/ 一个完整的系统,必定会涉及到配置文件。配置文件能够是xml、属性文件等形式。大多数而言我们并不须要重写配置读取解析模块,仅仅须要使用开源的就可以,这里使用的是apapche.commons.configuration的。 我们...

weixin_33724059的博客 162

IEM模型,地表粗糙度模拟

利用微波反演土壤水分时候,利用IEM模型可以实现对随机地表的模拟

C# WinForm 基于DirectShow.dll编写的程序,可边预览边保存视频,音频和图片

基于微软的DirectShow.dll的二次开发1.自动识别连接的摄像头跟麦克风且可以对其进行选择(默认选中第一个)2.可录制wmv和avi两种格式的视频并且都带有音频,avi可以录制的分辨率和帧数进行选择,wmv默认进行了淸晰度优化如不喜欢可去除代码中有相关提示3.可在预览点开之后进行拍照,也可边录制视频边拍照4.添加了视频和音频的压缩功能(酌情使用)这次二次开发发现C#对DirectShow的相关信息太少,这次做完也不敢藏私共享出来,还望大家指正

javaweb学生量化设计和实现计与开发

采用数据库设计一个基于web的学生量化系统,了解信息系统的功能和作用、掌握管理信息系统开发的要点、熟知管理信息系统的应用问题,通过学习,初步掌握用计算机对管理数据进行组织、存储、处理和使用的知识,获得开发管理信息系统和在管理中应用计算机的初步能力,综合运用课堂所学的关于管理信息系统开发的各个方面,深刻体会开发一个管理信息系统的每个阶段的具体工作,增强自己对管理信息系统分析与设计的了解。一般包括学生学号,姓名,性别,电话,出生年月,籍贯,家庭住址,入校日期,职务,档案号,学院,专业,年级以及班级。

豆包程序员 494

SAP B1中文培訓教材_SDK

公司内部培训资料,对开发工具 ,DIAPI, UIAPI,Add-ON有详细解说

Java量化交易:从零构建专业级交易策略系统

Ta4j作为纯Java技术分析库,采用模块化设计理念,为量化交易策略开发提供完整工具链。其核心架构围绕四个关键模块构建,形成了从数据处理到策略执行的全流程解决方案。 ### 核心模块组织结构 Ta4j的代码组织结构清晰,主要功能模块集中在`ta4j-core/src/main/java/org/ta4j/core/`目录下: - **指标系统**:`indicators/`目录包含超过130

gitblog_00698的博客 334

STM32F407中文手册

STM32f407中文手册 本参考手册面向应用开发人员,提供有关使用 STM32F405xx/07xx、STM32F415xx/17xx、 STM32F42xxx 和 STM32F43xxx 微控制器存储器与外设的完整信息。STM32F405xx/07xx、STM32F415xx/17xx、STM32F42xxx 和 STM32F43xxx 构成一个微 控制器系列,各产品具有不同的存储器大小、封装和外设。有关订购信息以及器件的机械与电气特性,请参见数据手册。有关 ARM Cortex™-M4F 内核的信息,请参见《Cortex™-M4F 技术参考手册》。

量化交易系统的开发

一.架构 我设计的架构图大概如下: 二.参考 <海龟交易法则> vnpy 期货职业资格考试丛书 <量化投资策略与技术> 三.开发前思考 1.计算机-金融-数学,知识比重为1-3-6 2.用java还是python写都可以,架构方面没太大区别,java的interface用python的abc库一样可以实现。但是java的库比较少 3.对...

研究源码的最底层,只持有正确的仓位 7864

‌金融科技新浪潮:Java在量化交易与风控系统的需求

Java在量化交易和风控系统中的需求核心是:满足高性能计算、实时处理、可扩展性和安全性。通过合理架构设计(如微服务),Java能高效实现数学模型和算法,助力金融机构应对新浪潮挑战。如果您有具体场景(如开发一个交易策略),我可进一步提供代码示例或优化建议。

2501_93877867的博客 771

Commons Configuration之二基本特性和AbstractConfiguration

为什么80%的码农都做不了架构师?>>> ...

weixin_34100227的博客 415

利用java做量化分析--FINTECH研究

此贴用于记录java做量化分析历程,一步一个脚印。

GZKace的博客 908

Android WiFi —softAP流程分析

Android WiFi —softAP流程分析

Android framework 3782

基于SpringBoot+Vue+uniapp的驾校收支管理可视化平台的详细设计和实现(源码+lw+部署文档+讲解等)

🌞博主介绍:✌全网粉丝15W+,优快云特邀作者、211毕业、高级全栈开发程序员、大厂多年工作经验、码云/掘金/华为云/阿里云/InfoQ/StackOverflow/github等平台优质作者、专注于Java、小程序技术领域和毕业项目实战,以及程序定制化开发、全栈讲解、就业辅导✌🌞👇🏻精彩专栏 推荐订阅👇🏻2023-2024年最值得选的微信小程序毕业设计选题大全:100个热门选题推荐✅2023-2024年最值得选的Java毕业设计选题大全:500个热门选题推荐✅Java精品实战案例《500套》

hwx20010805的博客 4387

自学Python不知道看什么书?10本Python经典好书(附pdf),看完少走一半弯路

Python 的语法简单,易于上手,这使得初学者能够快速地掌握编程基础,并迅速投入到实际项目中去。同时Python入门时阅读书籍的作用是多方面的,阅读书籍不仅为初学者提供了系统学习Python的基础、掌握的基础知识,还可以培养他们的编程思维和学习动力,为未来的编程之路打下坚实的基础,帮助他们建立起对编程的深入理解和长期的学习兴趣。Python入门书籍对于初学者来说是非常有益的。[美]埃里克·马瑟斯 | 著袁国忠 | 译。

2301_78096295的博客 1万+
上一篇: 程序员的量化交易之路(29)--Cointrader之Tick实体(16)
下一篇: 程序员的量化交易之路(31)--cointrader之Balance现金(18)
minimicall
博客等级 码龄18年 407粉丝 174原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值