1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
| # -*- coding: utf-8 -*-
def lwma1(tmpStartValueLWMA1):
# вычисление первого значения Moving Average. Происходит если количество свеч равно периоду МА1 и ранее первое значение МА1 не вычислялось
print(tmpStartValueLWMA1)
global firstMA1Number, MA1Number, MALineBuffer1, firstMA1Number
if ((CandleNumber - 1) == tmpStartValueLWMA1) and (firstMA1Number == False):
weightsum = 0
firstValue1 = 0
i = 0
while i < StartValueLWMA1:
k = StartValueLWMA1 - i
firstValue1 += CloseBuffer[i] * k
weightsum += k
i += 1
firstValue1 = firstValue1 / weightsum
MALineBuffer1.append(round(firstValue1, 5))
MA1 = MALineBuffer1[MA1Number]
MA1Number += 1
firstMA1Number = True
print("MA1=", MA1)
if (CandleNumber - 1) > StartValueLWMA1:
# тест_стандартная формула расчета МА
MAincr = 1
weightsum = 0
firstValue1 = 0
i1 = CandleNumber - StartValueLWMA1
while i1 < CandleNumber:
k = MAincr
firstValue1 += CloseBuffer[i1] * k
weightsum += MAincr
MAincr += -1
i1 += 1
firstValue1 = firstValue1 / weightsum
MALineBuffer1.append(round(firstValue1, 5))
MA1 = MALineBuffer1[MA1Number]
MA1Number += 1
print("MA1=", MA1)
print("Control:MA1Number=", MA1Number)
print("Control:MALineBuffer1=", MALineBuffer1[len(MALineBuffer1) - 1])
return MA1
def lwma2(tmpStartValueLWMA2):
# вычисление второго значения Moving Average. Происходит если количество свеч равно периоду МА1 и ранее первое значение МА1 не вычислялось
print(tmpStartValueLWMA2)
global firstMA2Number, MA2Number, MALineBuffer2, firstMA2Number
if ((CandleNumber - 1) == StartValueLWMA2) and (firstMA2Number == False):
weightsum = 0
firstValue2 = 0
i = 0
while i < tmpStartValueLWMA2:
k = StartValueLWMA2 - i
firstValue2 += CloseBuffer[i] * k
weightsum += k
i += 1
firstValue2 = firstValue2 / weightsum
MALineBuffer2.append(round(firstValue2, 5))
MA2 = MALineBuffer2[MA2Number]
MA2Number += 1
firstMA2Number = True
print("MA2=", MA2)
if (CandleNumber - 1) > tmpStartValueLWMA2:
# тест_стандартная формула расчета МА
MAincr2 = 1
weightsum2 = 0
firstValue2 = 0
i2 = CandleNumber - StartValueLWMA2
while i2 < CandleNumber:
k2 = MAincr2
firstValue2 += CloseBuffer[i2] * k2
weightsum2 += MAincr2
MAincr2 += -1
i2 += 1
firstValue2 = firstValue2 / weightsum2
MALineBuffer2.append(round(firstValue2, 5))
MA2 = MALineBuffer2[MA2Number]
MA2Number += 1
print("MA2=", MA2)
print("Control:MA2Number=", MA2Number)
print("Control:MALineBuffer2=", MALineBuffer2[len(MALineBuffer2) - 1])
return MA2
StartValueLWMA1 = input('ВВедите старотовое значение для перебора расчётов первой LWMA:')
print(StartValueLWMA1)
StartValueLWMA1 = int(StartValueLWMA1)
print(StartValueLWMA1)
EndValueLWMA1 = int(input('ВВедите конечное значение для перебора расчётов первой LWMA:'))
print(EndValueLWMA1)
StartValueLWMA2 = int(input('ВВедите старотовое значение для перебора расчётов второй LWMA:'))
print(StartValueLWMA2)
EndValueLWMA2 = int(input('ВВедите конечное значение для перебора расчётов второй LWMA:'))
print(EndValueLWMA2)
StartInaquality = int(input('ВВедите старотовое значение для расчётов свеч:'))
print(StartInaquality)
EndInaquality = int(input('ВВедите конечное значение для расчётов свеч:'))
print(EndInaquality)
# перебираем построчно файл с тиками и загоняем значения в список
Ticks = []
for line in open('ticks.txt'):
# print(line)
Ticks.append(float(line))
# t = len(Ticks)
# print (t)
f = open("log.txt", "w")
Stats = []
number = 1
# начинаем перебор всех вариантов свеч со скользящими с подсчетом количества свеч и количества пересечений скользиящими друг друга
# в этом цикле while перебираем варианты высот свеч в заданном в начале программы диапазоне
while StartInaquality <= EndInaquality:
tmpStartValueLWMA1 = StartValueLWMA1
tmpStartValueLWMA2 = StartValueLWMA2
# в этом цикле while перебираем варианты периодов первой скользящей средней в заданном диапазоне в начале программы
while tmpStartValueLWMA1 <= EndValueLWMA1:
# в этом цикле while перебираем варианты периодов второй скользящей средней в заданном диапазоне в начале программы
print("Control:1")
TicksCounter = 0
inaquality = float(StartInaquality) * 0.00001
OpenBuffer = []
HighBuffer = []
LowBuffer = []
CloseBuffer = []
CandleNumber = 0
FirstStart = True
MALineBuffer1 = []
MA1Number = 0
MALineBuffer2 = []
MA2Number = 0
firstMA1Number = False
firstMA2Number = False
f.write("____________________________________" + '\n')
f.write("____________________________________" + '\n')
MaInaquality = []
Intersection = 0
MaInaqualityNumber = 1
MaInaquality.append(0)
while tmpStartValueLWMA2 <= EndValueLWMA2:
print("Control:2")
if tmpStartValueLWMA2 > tmpStartValueLWMA1:
print("tmpStartValueLWMA2=",tmpStartValueLWMA2)
print("tmpStartValueLWMA1=",tmpStartValueLWMA1)
print("tmpStartValueLWMA2 > tmpStartValueLWMA1:Continue")
continue
FirstMA1Number = False
# перебераем список с тиками и производим расчёты свеч и скользящих средних
for CurrentTick in Ticks:
TicksCounter += 1
# print("Control:3")
if FirstStart:
print("Control:4")
# текущая котировка будет являться ценой открытия свечи
OpenBuffer.append(CurrentTick)
# текущая котировка будет являться максимальной ценой свечи
HighBuffer.append(CurrentTick)
# текущая котировка будет являться минимальной ценой свечи
LowBuffer.append(CurrentTick)
# текущая котировка пока является ценой закрытия текущей свечи
CloseBuffer.append(CurrentTick)
FirstStart = False
continue
else:
# print("Control:5")
# print("StartValueLWMA1=", StartValueLWMA1)
# print("StartValueLWMA2=", StartValueLWMA2)
if (HighBuffer[CandleNumber] - LowBuffer[CandleNumber]) < inaquality:
CloseBuffer[CandleNumber] = CurrentTick
if CurrentTick > HighBuffer[CandleNumber]: HighBuffer[CandleNumber] = CurrentTick
if CurrentTick < LowBuffer[CandleNumber]: LowBuffer[CandleNumber] = CurrentTick
CurrentInaquality = HighBuffer[CandleNumber] - LowBuffer[CandleNumber]
if (HighBuffer[CandleNumber] - LowBuffer[CandleNumber]) >= inaquality:
CurrentInaquality = (HighBuffer[CandleNumber] - LowBuffer[CandleNumber])
CloseBuffer[CandleNumber] = CurrentTick
MA1 = lwma1(tmpStartValueLWMA1)
MA2 = lwma2(tmpStartValueLWMA2)
print("MA1_after=", MA1)
print("MA2_after=", MA2)
#Рассчитываем разницу между текущими значениями двух скользящих средних
if (MA1 and MA2) !=None:
MaInaquality.append(round((MA1-MA2), 5))
f.write("MaInaquality=" + str(MaInaquality[MaInaqualityNumber]) + '\n')
f.write("MaInaqualityNumber=" + str(MaInaqualityNumber) + '\n')
#проверяем на наличие пересечений между двумя скользящими средними, если есть пересечение,
# инкрементим количество пересечений на единицу
print("MaInaquality[MaInaqualityNumber - 1]=",MaInaquality[MaInaqualityNumber - 1])
print("MaInaquality[MaInaqualityNumber]=",MaInaquality[MaInaqualityNumber])
if ((MaInaquality[MaInaqualityNumber - 1] < 0 and MaInaquality[MaInaqualityNumber] > 0) or (
MaInaquality[MaInaqualityNumber - 1] > 0 and MaInaquality[MaInaqualityNumber] < 0)):
Intersection += 1
f.write("Intersection=" + str(Intersection) + '\n')
MaInaqualityNumber += 1
CandleNumber += 1
# print("CandleNumber", CandleNumber)
OpenBuffer.append(CurrentTick)
HighBuffer.append(CurrentTick)
LowBuffer.append(CurrentTick)
CloseBuffer.append(CurrentTick)
CurrentInaquality = (HighBuffer[CandleNumber] - LowBuffer[CandleNumber])
f.write("CandleNumber=" + str(CandleNumber) + '\n')
f.write("OpenBuffer[CandleNumber]=" + str(OpenBuffer[CandleNumber]) + '\n')
f.write("HighBuffer[CandleNumber]=" + str(HighBuffer[CandleNumber]) + '\n')
f.write("LowBuffer[CandleNumber]=" + str(LowBuffer[CandleNumber]) + '\n')
f.write("CloseBuffer[CandleNumber]=" + str(CloseBuffer[CandleNumber]) + '\n')
f.write("MA1=" + str(MA1) + '\n')
f.write("MA2=" + str(MA2) + '\n')
# input()
f.write("tmpStartValueLWMA2=" + str(tmpStartValueLWMA2) + '\n')
Stats.append([number,StartInaquality,tmpStartValueLWMA1,tmpStartValueLWMA2,CandleNumber,Intersection])
number =+ 1
tmpStartValueLWMA2 += 1
print ("RESULTS")
tmpStartValueLWMA1 += 1
f.write("tmpStartValueLWMA1=" + str(tmpStartValueLWMA1) + '\n')
StartInaquality += 1
f.write("StartInaquality=" + str(StartInaquality) + '\n')
# for MA1 in MALineBuffer1:
# print(MA1)
print("End of computing")
f.write("number" + " | " + "StartInaquality" + " | " + "tmpStartValueLWMA1" + " | " + "tmpStartValueLWMA2" + " | " + "CandleNumber" + " | " + "Intersection" + "\n")
for i in Stats:
for j in i:
f.write(str(j) + " | ")
f.write("\n")
print (" END RESULTS")
print("The End")
f.write("The End") |