以文本方式查看主题

-  金字塔客服中心 - 专业程序化交易软件提供商  (http://weistock.com/bbs/index.asp)
--  高级功能研发区  (http://weistock.com/bbs/list.asp?boardid=5)
----  请教:下面代码意图与结果严重不符,请老师指点  (http://weistock.com/bbs/dispbbs.asp?boardid=5&id=94766)

--  作者:nscman
--  发布时间:2016/3/15 12:36:20
--  请教:下面代码意图与结果严重不符,请老师指点

请教:下面代码意图与结果严重不符,请老师指点:
一、建立一个框架“myFrame”,有主K线图“KMain”
在“myFrame”的“myFrame_Paint()”事件中加载下面的“mainfunc1()”方法
二、代码如下:
\'变量定义
public myGrid, myHistoryData
Set myGrid = myFrame.GetGridByName("KMain")
Set myHistoryData = myGrid.GetHistoryData()

dim intCount,intPos
public arrayLHigh(), arrayPels()'arrayLHigh是向上突破极限,arrayPels取K线在屏幕上位置

intCount=myGrid.DataCount
redim arrayLHigh(intCount), arrayPels(intCount)

\'函数设计意图:根据价格变化,画出相应的向上突破极限,便于看图时作出判断
Function  MoveLimit2()
    MoveLimit2=0
    for intPos=1 to intCount
     If intPos=1 Then
  arrayLHigh(intPos)=myHistoryData.High(intPos)*1.1    \'如果是第一根K线,突破极限设为此K线最高价1.1倍
 ElseIf myHistoryData.high(intPos)<arrayLHigh(intPos-1) and myHistoryData.high(intPos)>myHistoryData.high(intPos-1) Then
  arrayLHigh(intPos)=arrayLHigh(intPos-1)    \'如果当前最高价小于上一周期突破极限,且大于上一周期最高价,则此周期突破极限等于上一周期
 Else
  arrayLHigh(intPos)=myHistoryData.High(intPos)*1.1   \'否则,突破极限设为此K线最高价1.1倍
 End If

 arrayPels(intPos)=myGrid.PelsByPos(intPos) \'取X坐标

 if(myGrid.PtInGrid( arrayPels(intPos), myHistoryData.High(intPos))) then
  myGrid.DrawLine arrayPels(intPos-1), arrayLHigh(intPos-1), arrayPels(intPos), arrayLHigh(intPos), vbRed, 2, 0
 end if
    Next
End Function

Function mainfunc1()
 if myGrid.DataType<>1 then
  msgbox "当前窗口不是K线窗口,不宜进行分析,此功能退出!", "重要提示!"
  exit Function
 end if
 if myGrid.Type<>0 then
  msgbox "当前窗口不是主图窗口,不宜进行分析,此功能退出!", "重要提示!"
  exit Function
 end if
 msgbox "当前限高为:"& arrayLHigh(intCount) &vbNewLine _
 &"当前X坐标为:"&  arrayPels(intCount) &vbNewLine _
 &"当前Y坐标为:"& myHistorydata.high(intPos)

 MoveLimit2
End Function
三、希望得到的结果是:向上突破极限随价格变动不断变化。

图片点击可在新窗口打开查看此主题相关图片如下:02.png
图片点击可在新窗口打开查看
实际结果是:在图的最上面有一条线,与实际价格严重脱离。

图片点击可在新窗口打开查看此主题相关图片如下:01.png
图片点击可在新窗口打开查看
谢谢。



图片点击可在新窗口打开查看此主题相关图片如下:01.png
图片点击可在新窗口打开查看

--  作者:yukizzc
--  发布时间:2016/3/15 18:38:13
--  

myGrid.DrawLine arrayPels(intPos-1), arrayLHigh(intPos-1), arrayPels(intPos), arrayLHigh(intPos), vbRed, 2, 0

arrayLHigh(intPos-1)这个数组你保存是所记录的极限的数值,而drawline这个函数里是用坐标位置来表示的。用pricetopels去取下对应的坐标值,另外数组下标是从0开始的我这边改了下,绘图的话从第一根开始

 

 

 for intPos=0 to intCount

 

 if(myGrid.PtInGrid( arrayPels(intPos), myHistoryData.High(intPos))) and intPos>0 then
  myGrid.DrawLine arrayPels(intPos-1), myGrid.PriceToPels(arrayLHigh(intPos-1)), arrayPels(intPos), myGrid.PriceToPels(arrayLHigh(intPos)), vbRed, 2, 0
 end if
    Next