您现在的位置:程序化交易>> 期货公式>> 金字塔等>> 金字塔知识>>正文内容

请问:金字塔C接口用逐K模式,下面代码哪个需要用? [金字塔]

  • 咨询内容:

    //计算收盘价的均价,一个常数参数,表示计算周期
    //调用方法:
    // "STOCKFUNC@MYMACLOSE"(5)

    __declspec(dllexport) int WINAPI MYMACLOSE(CALCINFO* pData)
    {
     if ( pData->m_pfParam1 &&    //参数1有效
       pData->m_nParam1Start<0 &&   //参数1为常数
       pData->m_pfParam2==NULL )   //仅有一个参数
     {
      float fParam = *pData->m_pfParam1;
      int nPeriod = (int)fParam;   //参数1
      if(nPeriod>0)
      {
       float fTotal;
       int i, j;
       for ( i = nPeriod-1; i < pData->m_nNumData; i++ )//计算nPeriod周期的均线,数据从nPeriod-1开始有效
       {
        fTotal = 0.0f;
        for ( j = 0; j < nPeriod; j++ )    //累加
         fTotal += pData->m_pData[i-j].m_fClose;
        pData->m_pResultBuf[i] = fTotal/nPeriod; //平均
       }
       return nPeriod-1;
      }
     }

     return -1;
    }

    //计算均价,2个参数,参数1为待求均线的数据,参数2表示计算周期
    //调用方法:
    // "STOCKFUNC@MYMAVAR"(CLOSE-OPEN,5)

    __declspec(dllexport) int WINAPI MYMAVAR(CALCINFO* pData)
    {
     if(pData->m_pfParam1 && pData->m_pfParam2 &&  //参数1,2有效
      pData->m_nParam1Start>=0 &&     //参数1为序列数
      pData->m_pfParam3==NULL)     //有2个参数
     {
      const float*  pValue = pData->m_pfParam1; //参数1
      int nFirst = pData->m_nParam1Start;   //有效值起始位
      float fParam = *pData->m_pfParam2;   //参数2
      int nPeriod = (int)fParam; 
      
      if( nFirst >= 0 && nPeriod > 0 )
      {
       float fTotal;
       int i, j;
       for ( i = nFirst+nPeriod-1; i < pData->m_nNumData; i++ )
       {
        fTotal = 0.0f;
        for ( j=0; j < nPeriod; j++ )   //累加
         fTotal += pValue[i-j];
        pData->m_pResultBuf[i] = fTotal/nPeriod;//平均
       }
       return nFirst+nPeriod-1;
      }
     }
     return -1;

        /*对于逐K线模式,的处理方式的示范代码
     if(pData->m_pfParam1 && pData->m_pfParam2)
     {
      //对于逐K线模式,由于传递数据都是数值,因此需要一个数组用来保存传递过来的参数,用来计算.
      //本例只是简单演示这个用法,如果用户在公式多次调用了接口,则会出现重复使用该变量导致计算出错
      //因此要根据情况做几个这种全局静态变量用于保存各种数据。
      static std::vector<double> arMaData;
      
      //第一个周期初始化数据
      if(pData->m_dwBarpos == 0)
      {
       arMaData.clear();
      }
      
      double dbData = *pData->m_pfParam1;

      //防止使用仅刷最后K线的反复刷新问题
      if(arMaData.size() >= pData->m_nNumData)
       arMaData[arMaData.size()-1] = dbData; //仅仅更新最后一个数据
      else
       arMaData.push_back(dbData);

      DWORD dwCyc = (DWORD) *pData->m_pfParam2;
      
      if(pData->m_dwBarpos < dwCyc-1)
      {
       //对于未到计算周期,返回无效数据
       return -1;
      }

      //先累加
      float fAdd = 0;
      for(DWORD i = pData->m_dwBarpos-(dwCyc-1); i <= pData->m_dwBarpos; i++)
      {
       fAdd += arMaData[i];
      }

      *pData->m_pResultBuf = fAdd / dwCyc;
     }
     return 1;*/
    }

    //计算多个序列的均值,5个参数,参数1-4为待求多个序列,参数5用于举例说明数值参数的用法,实际在此例中无需该参数
    /*
    调用方法:
     MA1:=MA(CLOSE,3);
     MA2:=MA(CLOSE,6);
     MA3:=MA(CLOSE,12);
     MA4:=MA(CLOSE,24);
     MYBBI: "STOCKFUNC@MYBBI"(MA1, MA2, MA3, MA4, 4);
    */

    __declspec(dllexport) int WINAPI MYBBI(CALCINFO* pData)
    {
     if ( pData->m_pCalcParam[0].m_nParamStart >= 0 &&
       pData->m_pCalcParam[1].m_nParamStart >= 0 &&
       pData->m_pCalcParam[2].m_nParamStart >= 0 &&
       pData->m_pCalcParam[3].m_nParamStart >= 0 )   //4个序列都含有效数值
     {
      //计算返回的序列的第一个有效值位置
      int nFirst = pData->m_pCalcParam[3].m_nParamStart;  //已知返回的序列的第一个有效值位置与第4个序列一致
    //若不知,则
    /*
      int nFirst = pData->m_pCalcParam[0].m_nParamStart;
      if ( nFirst < pData->m_pCalcParam[1].m_nParamStart )
       nFirst = pData->m_pCalcParam[1].m_nParamStart;
      if ( nFirst < pData->m_pCalcParam[2].m_nParamStart )
       nFirst = pData->m_pCalcParam[2].m_nParamStart;
      if ( nFirst < pData->m_pCalcParam[3].m_nParamStart )
       nFirst = pData->m_pCalcParam[3].m_nParamStart;
     */

      const float* pValue1 = pData->m_pCalcParam[0].m_pfParam;
      const float* pValue2 = pData->m_pCalcParam[1].m_pfParam;
      const float* pValue3 = pData->m_pCalcParam[2].m_pfParam;
      const float* pValue4 = pData->m_pCalcParam[3].m_pfParam;
      int nNum = (int)(pData->m_pCalcParam[4].m_fParam);  //实际上该例中已知nNum=4,在此用于说明数值参数的用法
      for( int i = nFirst; i < pData->m_nNumData; i++ )
      {
       pData->m_pResultBuf[i] =
        (pValue1[i] + pValue2[i] + pValue3[i] + pValue4[i])/nNum;
      }
      return nFirst;
     }
     return -1;
    }

     

  • 金字塔客服: 请版主改好一下,菜鸟是我

 

有思路,想编写各种指标公式,程序化交易模型,选股公式,预警公式的朋友

可联系技术人员 QQ: 1145508240  点击这里给我发消息进行 有偿 编写!不贵!点击查看价格!


【字体: 】【打印文章】【查看评论

相关文章

    没有相关内容