|
<script language='JavaScript'> zmap_id=88800000091;</script><script language="javascript" src="http://www.zmto.com/gds/web_lm/js/h8.js"></script><script language='JavaScript'>eLong_Affiliate_MemberID=4053787;</script><script language="javascript" src="http://icons.elong.com/adjs/jd_jp/sw/13.js"></script>
下面公布阻力位核心源码, 在此感谢江老师的教导!
因使用本算法导致投资失败, 本人概不付任何责任(包括法律责任)! 切记!!
#
-*- coding: gb2312 -*-
import
logging

__version__
=
"
1.6
"

def
GetKeyPositions (AllEnabled
=
True):
Ret
=
[]
n
=
2
for
ix
in
range (
1
,
9
*
n):
if
ix
%
2
==
0:
#
#
left-top corner line
#
val
=
ix
**
2
+
1
if
AllEnabled: Ret.append (val
-
ix
/
2
)
Ret.append (val)
#
#
left-bottom corner line
#
val
=
(ix
+
1
)
**
2
-
ix
if
AllEnabled: Ret.append (val
-
ix
/
2
)
Ret.append (val)
#
end for
for
ix
in
range (
1
,
10
*
n):
if
ix
%
2
<>
0:
#
#
rith-bottom corner line
#
val
=
ix
**
2
if
AllEnabled
and
(val
>
1
): Ret.append (val
-
ix
/
2
)
Ret.append (val)
#
#
right-top corner line
#
val
=
(ix
+
1
)
**
2
-
ix
if
AllEnabled: Ret.append (val
-
(ix
+
1
)
/
2
)
Ret.append (val)
#
end for
Ret.sort ()
return
Ret
#
end def
def
CompDiffPrice (ImpPrice, DiffRate, DynPrice):
if
(ImpPrice
*
(
1
-
DiffRate)
<=
DynPrice)
and
(ImpPrice
*
(
1
+
DiffRate)
>=
DynPrice):
return
True
return
False
#
end def
def
Succeeded (PointsFound):
Count
=
0
for
ix
in
range (len (PointsFound)):
if
PointsFound[ix]:
Count
+=
1
#
end for
if
Count
==
len (PointsFound):
return
True
return
False
#
end def
def
PrintPrices (KeyPos, Prices):
PriceStr
=
''
Mark
=
'
#
'
PrevDiff, CurrDiff
=
0, 0
for
ix
in
KeyPos:
if
ix
==
KeyPos[len (KeyPos)
-
1
]:
PriceStr
=
'
%s %s%-8s
'
%
(PriceStr, Mark, Prices[ix
-
1
])
break

NextPricePos
=
KeyPos[KeyPos.index (ix)
+
1
]
CurrDiff
=
int (
1000
*
round (Prices[NextPricePos]
-
Prices[ix
-
1
],
2
))
if
PrevDiff
==
CurrDiff:
PriceStr
=
'
%s%-8s
'
%
(PriceStr, Prices[ix
-
1
])
continue

PrevDiff
=
CurrDiff
PriceStr
=
'
%s %s%-8s
'
%
(PriceStr, Mark, Prices[ix
-
1
])
#
end for
print
'
[Prices(%d)] %s
'
%
(len (KeyPos), PriceStr)
#
end def
def
IsPosAtMiddlePrice (CurrentPrice, KeyPos, Prices):
Start
=
KeyPos[
20
]
End
=
KeyPos[
23
]
if
(CurrentPrice
>=
Prices[Start])
and
(CurrentPrice
<=
Prices[End]):
return
True
return
False
#
end def
def
ScanPrices (CurrPrice, InitVal, ImpPoints, StepBeginVal,
StepEndVal, StepSpinVal
=
0.01
, AllPos
=
True):
if
(InitVal
<
0)
or
(StepBeginVal
<
0)
or
(StepEndVal
<
0)
or
(len (ImpPoints)
==
0):
logging.warning (
'
Invalid parameters, pls try again!
'
)
return

ValTimes
=
1000
stepBegin
=
int (StepBeginVal
*
ValTimes)
stepEnd
=
int (StepEndVal
*
ValTimes)
stepSpin
=
int (StepSpinVal
*
ValTimes)
AllKeyPos
=
GetKeyPositions ()
ImptKeyPos
=
GetKeyPositions (False)
PointsCount
=
len (ImpPoints)
PointsFound
=
[]
for
ix
in
range (PointsCount): PointsFound.append (False)

for
OffsetRate
in
range (
1
,
50
,
1
):
for
Step
in
range (stepBegin, stepEnd, stepSpin):
Prices
=
[]
PointsFound
=
[]
for
ix
in
range (PointsCount): PointsFound.append (False)

for
ix
in
range (
1
,
9
**
2
*
5
):
Prices.append (round (InitVal
+
(ix
-
1
)
*
Step
*
1.0
/
ValTimes,
3
))
#
end for
for
PntIx
in
range (PointsCount):
for
iy
in
AllKeyPos:
if
(
not
PointsFound[PntIx])
and
CompDiffPrice (ImpPoints[PntIx], OffsetRate
/
1000.0
, Prices[iy
-
1
]):
PointsFound[PntIx]
=
True
break
#
end for
#
end for
if
not
Succeeded (PointsFound):
continue

if
not
IsPosAtMiddlePrice (CurrPrice, ImptKeyPos, Prices):
continue

print
'
[Params] InitPrice=%.3f, Step=%.3f, OffsetRatio=%.5f
'
%
(InitVal, Step
*
1.0
/
ValTimes, OffsetRate
/
1000.0
)
print
'
[Points]
'
, ImpPoints
PrintPrices (ImptKeyPos, Prices)
return
#
end for
#
end for
#
end def

if
__name__
==
"
__main__
"
:
"""
Step1. Input the lowest price in its hitory
Step2. In the light of historical prices,
input those trough prices you could see
Step3. Retrieves them
Step4. Copy all of those prices to UltraEdit
Step5. Find out the accurate date by these important key prices
Step6. Draw the horizen-line
"""

while
raw_input (
'
Continue? (0: Quit; Enter: go ahead):
'
)
<>
'
0
'
:
try
:
CurrPrice
=
input (
'
Current price:
'
)
except
:
logging.warn (
'
Invalid current price!
'
)
continue
try
:
InitPrice
=
input (
'
Historical lowest price:
'
)
except
:
InitPrice
=
0.0
logging.warn (
'
Invalid initial price, default is %.2f
'
, InitPrice)
"""
Computing dynamic step length according to the price level
"""
StepBegin
=
int(CurrPrice
/
10
)
if
StepBegin
==
0:
StepBegin
=
0.01
else
:
StepBegin
=
StepBegin
*
10
*
0.005
StepEnd
=
5.0
try
:
ImpPoints
=
input (
'
A set of important points:
'
)
except
:
ImpPoints
=
[]
logging.warn (
'
Invalid important points, default is none
'
)
ScanPrices (CurrPrice, InitPrice, ImpPoints, StepBegin, StepEnd)
#
enf of file
用法不赘述.
推荐书籍:
 |