junli110 2019-07-24 17:13 采纳率: 100%
浏览 354
已采纳

开发一个股票技术指标编辑语言 的编译器,遇到一个 array (数组) 做为 if 语句 条件的情况实现不了

开发一个股票技术指标编辑语言 的编译器,遇到一个 array (数组) 做为 if 语句 条件的情况实现不了
语法都参考 tradingview 的 Pine script
Pine script

//@version=3
study("For Loop tutorial - Example 5")

//volume = [10,20,10]
//open = [1,2,3]
//close =[2,3,1]

total_volume = volume - volume  //total_volume=[0,0,0] 

for i = 0 to 2
    if close >= open  // close >= open =[true,true,false]
        continue
    total_volume := total_volume + volume

plot(total_volume, style=histogram)  //total_volume=[0,0,30]

我尝试了下面的实现 但是有很多不足,所以请教大神。


public class IfElseNode : Node
    {
        private Node exp;
        private Node expX;
        private Node expY;
        public IfElseNode(Node expinput, Node expxinput, Node expyinput)
        {
            exp = expinput;
            expX = expxinput;
            expY = expyinput;
        }

        public Object eval(SymbolTable symbols)
        {
            SymbolTable table1 = new SymbolTable(symbols);
            SymbolTable table2 = new SymbolTable(symbols);

            return ((Value)exp.eval(symbols)).Iff(expX.eval(table1), expY.eval(table2));

        }
    }
public Value Iff(Value x, Value y)
        {
            if (this.type == "bool") return Convert.ToBoolean(value) ? x : y;

            if (this.type == "array")
            {

                 var convert = new ConvertMap();
                var reusltList = new List<Value>();

                var arrayY = convert.ConvertArray(y); 

                var arrayX = convert.ConvertArray(x);

                for (int i = 0; i < ((List<Value>)value).Count; i++)
                {
                    var item =((List<Value>)value)[i];

                    var xItem = ((List<Value>)arrayX.value)[i];
                    var yItem = ((List<Value>)arrayY.value)[i];

                    if (Convert.ToBoolean(item.value))
                    {
                        reusltList.Add(new Value(xItem.value, xItem.type));

                    }
                    else
                    {
                        reusltList.Add(new Value(yItem.value, yItem.type));
                    }


                }
                return new Value(reusltList, "array");
            }
            return null;
        }

我的问题是 volume ,total_volume,close 和open 都是 数组,如何让 数组和数组比较大小 并作为 if 语句的条件
我已经用Antlr 把代码 编译成 抽象树 并转化 为C#对象,但无法用C#实现 以数组作为 条件的 if 语句 和 if 控制流

可以解决问题可以加分

  • 写回答

4条回答 默认 最新

  • junli110 2019-07-26 20:11
    关注

    找到了,局部变量不过滤,全局变量用 条件过滤就可以了

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论
查看更多回答(3条)

报告相同问题?

悬赏问题

  • ¥15 delta降尺度计算的一些细节,有偿
  • ¥15 Arduino红外遥控代码有问题
  • ¥15 数值计算离散正交多项式
  • ¥30 数值计算均差系数编程
  • ¥15 redis-full-check比较 两个集群的数据出错
  • ¥15 Matlab编程问题
  • ¥15 训练的多模态特征融合模型准确度很低怎么办
  • ¥15 kylin启动报错log4j类冲突
  • ¥15 超声波模块测距控制点灯,灯的闪烁很不稳定,经过调试发现测的距离偏大
  • ¥15 import arcpy出现importing _arcgisscripting 找不到相关程序