欢迎使用金字塔普通技术服务论坛,您可以在相关区域发表技术支持贴。
我司技术服务人员将优先处理 VIP客服论坛 服务贴,普通区问题处理速度慢,请耐心等待。谢谢您对我们的支持与理解。


金字塔客服中心 - 专业程序化交易软件提供商金字塔软件高级功能研发区 → 最大持有股票数不得超过20个的股票策略

   

欢迎使用金字塔普通技术服务论坛,您可以在相关区域发表技术支持贴。
我司技术服务人员将优先处理 VIP客服论坛 服务贴,普通区问题处理速度慢,请耐心等待。谢谢您对我们的支持与理解。    


  共有3769人关注过本帖树形打印复制链接

主题:最大持有股票数不得超过20个的股票策略

帅哥哟,离线,有人找我吗?
yukizzc
  1楼 | 信息 | 搜索 | 邮箱 | 主页 | UC


加好友 发短信
等级:超级版主 帖子:21598 积分:0 威望:0 精华:1 注册:2010/7/31 16:35:30
  发帖心情 Post By:2016/11/1 11:20:37 [显示全部帖子]

'买入条件量比你可以直接用股票池选股选出来然后放到自选股分类的TEST板块中去,然后用下面vba程序去做买入动作

 

dim num

'每只股票投入资金量
dim money
money = 100000

'最大持有股票数量
dim max_holding
max_holding = 10


Set b = CreateObject("Stock.Block")

call b.open("TEST",1)

 

'第一个计时器建立头寸

call application.SetTimer(0,5000)

 

'第二个计时器10秒发单,直到money市值
call application.SetTimer(1,10000)

 


 

Sub APPLICATION_Timer(ID)

if ID = 0 then

 for i = 0 to b.count-1
  buynum = marketdata.GetReportData(b.GetStockCode(i),b.GetStockMarket(i)).SellVolume1*0.5
  Result = Order.HoldingInfoByCode2(b.GetStockCode(i),b.GetStockMarket(i),BuyHolding,BuyCost,BuyTodayHolding,SellHolding,SellCost,SellTodayHolding,PNL,UseMargin,"")
  cond_first = BuyHolding<1 and Result <>1
  if num+order.Holding2 + order.OrderNum2 <=max_holding and cond_first  then
   num = num+1
   call order.buy(1,buynum,0,0,b.GetStockCode(i),b.GetStockMarket(i),"",0)
  end if
 next
end if


if ID = 1 then
 for i = 0 to order.Holding2-1
 Result = Order.HoldingInfo2(i,BuyHolding,BuyCost,BuyTodayHolding,SellHolding,SellCost,SellTodayHolding,PNL,UseMargin ,Code,Market)
 buynum = marketdata.GetReportData(Code,Market).SellVolume1*0.5
 price = marketdata.GetReportData(Code,Market).NewPrice
  if BuyHolding<money/price then
   call order.buy(1,buynum,0,0,Code,Market,"",0)
  end if
  next
end if

End Sub


'


Sub APPLICATION_VBAEnd()
call application.KillTimer(0)
call application.KillTimer(1)
set b = nothing
End Sub


Sub APPLICATION_VBAStart()
num = 0
End Sub


 回到顶部
帅哥哟,离线,有人找我吗?
yukizzc
  2楼 | 信息 | 搜索 | 邮箱 | 主页 | UC


加好友 发短信
等级:超级版主 帖子:21598 积分:0 威望:0 精华:1 注册:2010/7/31 16:35:30
  发帖心情 Post By:2016/11/1 13:06:00 [显示全部帖子]

利用股票池选股后添加到板块中去,vba代码去对这个板块进行循环遍历就行了。

本例是利用股票池和vba结合的使用,简化算法代码


 回到顶部
帅哥哟,离线,有人找我吗?
yukizzc
  3楼 | 信息 | 搜索 | 邮箱 | 主页 | UC


加好友 发短信
等级:超级版主 帖子:21598 积分:0 威望:0 精华:1 注册:2010/7/31 16:35:30
  发帖心情 Post By:2016/11/1 13:39:09 [显示全部帖子]

工具-市场与板块,这边对应分类下的新建一个板块做保存。我这边例子是新建test的板块名


图片点击可在新窗口打开查看此主题相关图片如下:%i2c_f`h$txy%%4ul28{1.png
图片点击可在新窗口打开查看


 回到顶部
帅哥哟,离线,有人找我吗?
yukizzc
  4楼 | 信息 | 搜索 | 邮箱 | 主页 | UC


加好友 发短信
等级:超级版主 帖子:21598 积分:0 威望:0 精华:1 注册:2010/7/31 16:35:30
  发帖心情 Post By:2016/11/1 15:55:32 [显示全部帖子]

每次开仓前加入了资金判断,本地测试下没有问题,您那边再看看

 

 

dim num

'每只股票投入资金量
dim money
money = 50000

'最大持有股票数量
dim max_holding
max_holding = 10


Set b = CreateObject("Stock.Block")
call b.open("TEST",1)

 

'第一个计时器建立头寸

call application.SetTimer(0,2000)

 

'第二个计时器10秒发单,直到money市值
call application.SetTimer(1,10000)

Sub APPLICATION_Timer(ID)

if ID = 0 then

 for i = 0 to b.count-1
  buynum = marketdata.GetReportData(b.GetStockCode(i),b.GetStockMarket(i)).SellVolume1*0.5*100
  buyprice = marketdata.GetReportData(b.GetStockCode(i),b.GetStockMarket(i)).SellPrice1
  Result = Order.HoldingInfoByCode2(b.GetStockCode(i),b.GetStockMarket(i),BuyHolding,BuyCost,BuyTodayHolding,SellHolding,SellCost,SellTodayHolding,PNL,UseMargin,"")
  cond_first = BuyHolding<1 and Result <>1
  kcnum = min(money,buynum*buyprice)/buyprice
  if num+order.Holding2 + order.OrderNum2 <max_holding and cond_first  then
   num = num+1
   call order.buy(1,kcnum,0,0,b.GetStockCode(i),b.GetStockMarket(i),"",0)
   application.MsgOut "第一次开仓数量"&kcnum&"品种代码为"&b.GetStockCode(i)&"现在的num值为"&num
  end if
 
 
 next
end if


if ID = 1 then
 for i = 0 to order.Holding2-1
 Result = Order.HoldingInfo2(i,BuyHolding,BuyCost,BuyTodayHolding,SellHolding,SellCost,SellTodayHolding,PNL,UseMargin ,Code,Market)
 buynum = marketdata.GetReportData(Code,Market).SellVolume1*0.5*100
 buyprice = marketdata.GetReportData(Code,Market).SellPrice1
  kcnum = min(money-BuyHolding*buyprice,buynum*buyprice)/buyprice
 
  if kcnum>100 then
   call order.buy(1,kcnum,0,0,Code,Market,"",0)
    application.MsgOut "第二次开仓数量"&kcnum&"品种代码为"&Code&"money的返回值为"&money&"Buyholding置为"&BuyHolding&"buyprice价格为"&buyprice
  end if
 
  next
end if
End Sub


'


Sub APPLICATION_VBAEnd()
call application.KillTimer(0)
call application.KillTimer(1)
set b = nothing
End Sub


Sub APPLICATION_VBAStart()
num = 0
End Sub

 

function min(x,y)
if x<y then
 min = x
else
 min = y
end if
end function


 回到顶部
帅哥哟,离线,有人找我吗?
yukizzc
  5楼 | 信息 | 搜索 | 邮箱 | 主页 | UC


加好友 发短信
等级:超级版主 帖子:21598 积分:0 威望:0 精华:1 注册:2010/7/31 16:35:30
  发帖心情 Post By:2016/11/2 9:56:12 [显示全部帖子]

Set b = CreateObject("Stock.Block")
call b.open("TEST",1)

application.msgout b.count

看下这段输出有没有,是不是自己板块TEST没有添加进去


图片点击可在新窗口打开查看此主题相关图片如下:ztwek@k29_(q@1(~kb5x75.png
图片点击可在新窗口打开查看

 回到顶部
帅哥哟,离线,有人找我吗?
yukizzc
  6楼 | 信息 | 搜索 | 邮箱 | 主页 | UC


加好友 发短信
等级:超级版主 帖子:21598 积分:0 威望:0 精华:1 注册:2010/7/31 16:35:30
  发帖心情 Post By:2016/11/2 10:25:19 [显示全部帖子]

加你q远程看了

 回到顶部