Что нового

Цикл(бесконечный, до первой ошибки) в скрипте отжирает память

CrazyDoc

Новичок
Сообщения
75
Репутация
2
Есть скрипт:
Код:
#include <Excel.au3>
#include <Date.au3>
$iDateCalc = _DateDiff( 's',"1970/01/01 00:00:00",_NowCalc())
While 1
ShortOpen()
WEnd


;ОПИСАНИЕ ФУНКЦИЙ
;ФУНКЦИЯ ОТКРЫТИЯ СДЕЛОК ШОРТ
Func ShortOpen()
	;ОПИСЫВАЕМ ДВА МАССИВА
	Dim $Array1[1], $Array2[1], $Array3[1]
	;ОТКРЫВАЕМ ФАЙЛ АКТИВНЫХ ОРДЕРОВ ДЛЯ ЧТЕНИЯ, ЧТОБЫ СОЗДАТЬ ИЗ НЕГО ПЕРВЫЙ МАССИВ СТРОК
	$hFile=FileOpen(@ScriptDir&"\History.txt", 0)
	If $hFile=-1 Then
		MsgBox(0, "FileOpen", "Невозможно открыть файл History.txt для чтения.")
		Exit
	EndIf
	;СОЗДАЕМ ПЕРВЫЙ МАССИВ СТРОК ИЗ ФАЙЛА АКТИВНЫХ ОРДЕРОВ
	$i=0
	While 1
		$Array1[$i]=FileReadLine($hFile)
		If @error=-1 Then ExitLoop
		If @error=1 Then
			MsgBox(0,"$Array1","Ошибка создания массива. FileReadLine=0")
			Exit
		EndIf
		$i+=1
		ReDim $Array1[$i+1]
	WEnd
	;ЗАКРЫВАЕМ ФАЙЛ АКТИВНЫХ ОРДЕРОВ
	FileClose($hFile)
	;ОТКРЫВАЕМ ФАЙЛ ОБРАБОТАННЫХ ОРДЕРОВ ДЛЯ ЧТЕНИЯ, ЧТОБЫ СОЗДАТЬ ИЗ НЕГО ВТОРОЙ МАССИВ СТРОК
	$hFile=FileOpen(@ScriptDir&"\Ticket_close_short.txt",0)
	If $hFile=-1 Then
		MsgBox(0, "FileOpen", "Невозможно открыть файл Ticket_close_short.txt.txt для чтения.")
		Exit
	EndIf
	;СОЗДАЕМ ВТОРОЙ МАССИВ СТРОК
	$i=0
	While 1
		$Array2[$i]=FileReadLine($hFile)
		If @error=-1 Then ExitLoop
		If @error=1 Then
			MsgBox(0,"$Array2","Ошибка создания массива. FileReadLine=0")
			Exit
		EndIf
		$i+=1
		ReDim $Array2[$i+1]
	WEnd
	;ЗАКРЫВАЕМ ФАЙЛ ОБРАБОТАННЫХ ОРДЕРОВ
	FileClose($hFile)
	;ОТКРЫВАЕМ ФАЙЛ ОБРАБОТАННЫХ ОРДЕРОВ ДЛЯ ЗАПИСИ
	$hFile=FileOpen(@ScriptDir&"\Ticket_close_short.txt",1)
	If $hFile=-1 Then
		MsgBox(0,"FileOpen","Невозможно открыть файл Ticket_close_short.txt для записи.")
		Exit
	EndIf
	;С КАЖДЫМ ШАГОМ, ЦИКЛА ПОВТОРЯЮЩЕГОСЯ ДО КОНЦА СТРОК ПЕРВОГО МАССИВА(НАЧАТОГО С 1 СТРОКИ, СТРОКА 0-НЕИНФОРМАТИВНА), РАЗБИВАЕМ СТРОКУ РАВНУЮ ШАГУ ЦИКЛА НА МАССИВ
	For $i=1 To UBound($Array1)-2
		if UBound($Array1)=0 Then
			MsgBox(0,"UBound($Array1)","Ошибка #"&@error)
			Exit
		EndIf
		$t=False
	;РАЗБИВАЕМ СТРОКУ i В ПЕРВОМ МАССИВЕ СТРОК, НА МАССИВ Temp1 С РАЗДЕЛИТЕЛЕМ ";"
		$aTemp1=StringSplit($Array1[$i],";",2)
		if $aTemp1=0 Then
			MsgBox(0,"StringSplit($Array1[$i])","Ошибка #"&@error)
			Exit
		EndIf
	;С КАЖДЫМ ШАГОМ, ЦИКЛА ПОВТОРЯЮЩЕГОСЯ ДО КОНЦА СТРОК ВТОРОГО МАССИВА, РАЗБИВАЕМ СТРОКУ РАВНУЮ ШАГУ ЦИКЛА НА МАССИВ
		For $j=0 To UBound($Array2)-2
			if UBound($Array1)=0 Then
				MsgBox(0,"UBound($Array1)","Ошибка #"&@error)
				Exit
			EndIf
	;РАЗБИВАЕМ СТРОКУ j ВО ВТОРОМ МАССИВЕ, НА МАССИВ Temp2 С РАЗДЕЛИТЕЛЕМ ";"
			$aTemp2=StringSplit($Array2[$j],";",2)
			if $aTemp2=0 Then
				MsgBox(0,"StringSplit($Array2[$i])","Ошибка #"&@error)
				Exit
			EndIf
	;ИЩЕМ В СТРОКЕ j ВТОРОГО МАССИВА С 1 ПО 10 СИМВОЛЫ, ЭЛЕМЕНТ РАВНЫЙ ПЕРВОМУ ЭЛЕМЕНТУ МАССИВА ПОЛУЧЕНОГО ИЗ СТРОКИ i
			if StringInStr($Array2[$j],$aTemp1[0],0,1,1,10) Then
	;ЕСЛИ НАХОДИМ - ПЕРЕХОДИМ К СЛЕДУЮЩЕЙ СТРОКЕ ПЕРВОГО МАССИВА, ЕСЛИ НЕ НАХОДИМ - ПЕРЕХОДИМ К ВЫПОЛНЕНИЮ СЛЕДУЮЩЕГО УСЛОВИЯ
				$t=True
				ExitLoop
			EndIf
		Next
	;ЕСЛИ НЕ НАХОДИМ И ТРЕТИЙ ЭЛЕМЕНТ СТРОКИ i ПЕРВОГО МАССИВА РАВЕН ЕДИНИЦЕ И ЕСЛИ ВРЕМЯ ЗАПИСИ СТРОКИ i БОЛЬШЕ ВРЕМЕНИ НАЧАЛА РАБОТЫ ЦИКЛА
		If ($t=False) And ($aTemp1[2]=1) And ($aTemp1[4]>=$iDateCalc) Then
	;ЗАПИСИВАЕМ ПЕРВЫЙ ЭЛЕМЕНТ СТРОКИ i ПЕРВОГО МАССИВА В КОНЕЦ ВТОРОГО МАССИВА
			$FW=FileWriteLine($hFile,$aTemp1[0])
			FileClose($hFile)
			;ЗДЕСЬ НАДО ЗАПУСТИТЬ ОТКРЫТИЕ\ЗАКРЫТИЕ ОРДЕРА В TWS
			;ОТКРЫВАЕМ СООТНОШЕНИЙ ФАЙЛ ДЛЯ ЧТЕНИЯ, ЧТОБЫ СОЗДАТЬ ИЗ НЕГО МАССИВ СТРОК
			$hFile=FileOpen(@ScriptDir&"\MT4_TWS.txt", 0)
			If $hFile=-1 Then
				MsgBox(0, "FileOpen", "Невозможно открыть файл MT4_TWS.txt для чтения.")
				Exit
			EndIf
			;СОЗДАЕМ ТРЕТИЙ МАССИВ СТРОК ИЗ ФАЙЛА СООТНОШЕНИЙ
			$z=0
			While 1
				$Array3[$z]=FileReadLine($hFile)
				If @error=-1 Then ExitLoop
				If @error=1 Then
					MsgBox(0,"$Array3","Ошибка создания массива. FileReadLine=0")
					Exit
				EndIf
				$z+=1
				ReDim $Array3[$z+1]
			WEnd
			;ЗАКРЫВАЕМ ФАЙЛ СООТНОШЕНИЙ
			FileClose($hFile)
			;ПОВТОРЯЕМ СТОЛЬКО РАЗ, СКОЛЬКО СТРОК В ТРЕТЬЕМ МАССИВЕ
			For $z=0 To UBound($Array3)-2
				if UBound($Array3)=0 Then
					MsgBox(0,"UBound($Array1)","Ошибка #"&@error)
					Exit
				EndIf
			;РАЗБИВАЕМ СТРОКУ i В ТРЕТЬЕМ МАССИВЕ СТРОК, НА МАССИВ Temp3 С РАЗДЕЛИТЕЛЕМ ";"
				$aTemp3=StringSplit($Array3[$z],";",2)
				if $aTemp3=0 Then
					MsgBox(0,"StringSplit($Array3[$i])","Ошибка #"&@error)
					Exit
				EndIf
			;ЕСЛИ ТИП СИМВОЛА В СТРОКЕ i МАССИВА СТРОК ИЗ ФАЙЛА ОТКРЫТЫХ ОРДЕРОВ СОВПАДАЕТ С ТИПОМ СИМВОЛА В СТРОКЕ z МАССИВА СТРОК ИЗ ФАЙЛА СООТНОШЕНИЙ
				if $aTemp1[1]==$aTemp3[0] Then
			;ПРИСВАИВАЕМ ЗНАЧЕНИЯ РАВНЫЕ ЗНАЧЕНИЯМ В СТРОКЕ z ФАЙЛА СООТНОШЕНИЙ
					$Symbol=$aTemp3[1]
					$Type=$aTemp3[2]
					$Exchange=$aTemp3[3]
					$Currency=$aTemp3[4]
			;ОТКРЫВАЕМ СДЕЛКУ В ТВС
					Local $oAppl=_Excel_Open()
					if $oAppl=0 Then
						MsgBox(0,"_Excel_Open","ошибка №"&@error)
						Exit
					EndIf
					Local $oWorkbook=_Excel_BookAttach("TwsDde.xls","filename")
					if $oWorkbook=0 Then
						MsgBox(0,"_Exel_BookAttachSort","ошибка №"&@error)
						Exit
					EndIf
					Local $RanIns=_Excel_RangeInsert($oWorkbook.Activesheet,"11:11",$xlShiftDown)
					if $RanIns=0 Then
						MsgBox(0,"_Excel_RangeInsert11:11","ошибка №"&@error)
						Exit
					EndIf
					Local $ExcRanWr=_Excel_RangeWrite($oWorkbook,$oWorkbook.Activesheet,$Symbol,"A11")
					if $ExcRanWr=0 Then
						MsgBox(0,"_Excel_RangeWriteA11","ошибка №"&@error)
						Exit
					EndIf
					Local $ExcRanWr=_Excel_RangeWrite($oWorkbook,$oWorkbook.Activesheet,$Type,"B11")
					if $ExcRanWr=0 Then
						MsgBox(0,"_Excel_RangeWriteB11","ошибка №"&@error)
						Exit
					EndIf
					Local $ExcRanWr=_Excel_RangeWrite($oWorkbook,$oWorkbook.Activesheet,$Exchange,"H11")
					if $ExcRanWr=0 Then
						MsgBox(0,"_Excel_RangeWriteH11","ошибка №"&@error)
						Exit
					EndIf
					Local $ExcRanWr=_Excel_RangeWrite($oWorkbook,$oWorkbook.Activesheet,$Currency,"J11")
					if $ExcRanWr=0 Then
						MsgBox(0,"_Excel_RangeWriteJ11","ошибка №"&@error)
						Exit
					EndIf
					Local $ExcRanWr=_Excel_RangeWrite($oWorkbook,$oWorkbook.Activesheet,"SELL","M11")
					if $ExcRanWr=0 Then
						MsgBox(0,"_Excel_RangeWriteM11","ошибка №"&@error)
						Exit
					EndIf
					Local $ExcRanWr=_Excel_RangeWrite($oWorkbook,$oWorkbook.Activesheet,"1","N11")
					if $ExcRanWr=0 Then
						MsgBox(0,"_Excel_RangeWriteN11","ошибка №"&@error)
						Exit
					EndIf
					Local $ExcRanWr=_Excel_RangeWrite($oWorkbook,$oWorkbook.Activesheet,"MKT","O11")
					if $ExcRanWr=0 Then
						MsgBox(0,"_Excel_RangeWriteO11","ошибка №"&@error)
						Exit
					EndIf
					$oAppl.Activesheet.Cells(11,1).Select
					$oAppl.Run("Sheet2.placeOrder")
				EndIf
			Next
					if $FW=0 Then
						MsgBox(0,"FileWriteLine($hFile,$aTemp1[0])","Ошибка записи")
					Exit
					EndIf
				EndIf
			Next
EndFunc

который поедает память. задача его не совсем в этом, потому прошу помощи - возможно какие-либо данные(подозреваю что массивы) надо удалять по окончанию цикла?

_WinAPI_EmptyWorkingSet()(не забыв подключить библиотеку) поставленное в начало цикла, вызывает закладку с библиотекой и жалуется на ошибки в ней.

обращение массивов в ноль, в конце цикла, тоже не помогло.
 

inververs

AutoIT Гуру
Сообщения
2,135
Репутация
465
какая каша...
Выкинь DIM это не понятно что, забудь и не используй... используй Local
Код:
While 1
        $Array1[$i]=FileReadLine($hFile)
        If @error=-1 Then ExitLoop
        If @error=1 Then
            MsgBox(0,"$Array1","Ошибка создания массива. FileReadLine=0")
            Exit
        EndIf
        $i+=1
        ReDim $Array1[$i+1]
    WEnd

это тоже устарело, используй FileReadToArray
В циклах не используй Local $... все переменные объявляй до начала циклов.

ну а это даже комментировать трудно. Что это??
Код:
While 1
ShortOpen()
WEnd

В цикле постоянно открывается_Excel_Open() и _Excel_BookAttach("TwsDde.xls","filename") нельзя ли открыть в начале, закрыть в конце?
Код не понятный, много проверок на ошибки и функция перегружена, чтением из файлов, логикой обработки и записью в ексель, никогда так не пиши.
 

---Zak---

Скриптер
Сообщения
455
Репутация
120
А еще... а еще... в каждый цикл поставить по
Код:
Sleep(100)

:beer:
 
Автор
C

CrazyDoc

Новичок
Сообщения
75
Репутация
2
сделал так:
Код:
#include <Array.au3>
#include <Excel.au3>
#include <Date.au3>
#include <File.au3>
Local $oWorkbook, $oAppl, $Array1, $Array2, $Array3, $a, $b, $c, $d, $aTemp1, $aTemp2, $aTemp3
$iDateCalc = _DateDiff( 's',"1970/01/01 00:00:00",_NowCalc())
$oAppl=_Excel_Open()
$oWorkbook=_Excel_BookAttach("TwsDde.xls","filename")
While 1
	_FileReadToArray(@ScriptDir & "\Trades.txt", $Array1)
	_FileReadToArray(@ScriptDir & "\Ticket_work_short.txt", $Array2)
	;С КАЖДЫМ ШАГОМ, ЦИКЛА ПОВТОРЯЮЩЕГОСЯ ДО КОНЦА СТРОК ПЕРВОГО МАССИВА(НАЧАТОГО С 1 СТРОКИ, СТРОКА 0-НЕИНФОРМАТИВНА), РАЗБИВАЕМ СТРОКУ РАВНУЮ ШАГУ ЦИКЛА НА МАССИВ
	For $a=1 To $Array1[0]
		$d=False
		;РАЗБИВАЕМ СТРОКУ $a В $Array1, НА МАССИВ $aTemp1 С РАЗДЕЛИТЕЛЕМ ";"
		$aTemp1=StringSplit($Array1[$a],";",2)
		;С КАЖДЫМ ШАГОМ, ЦИКЛА ПОВТОРЯЮЩЕГОСЯ ДО КОНЦА СТРОК ВТОРОГО МАССИВА, РАЗБИВАЕМ СТРОКУ РАВНУЮ ШАГУ ЦИКЛА НА МАССИВ
		For $b=1 To $Array2[0]
			;РАЗБИВАЕМ СТРОКУ j ВО ВТОРОМ МАССИВЕ, НА МАССИВ Temp2 С РАЗДЕЛИТЕЛЕМ ";"
			$aTemp2=StringSplit($Array2[$b],";",2)
			;ИЩЕМ В СТРОКЕ j ВТОРОГО МАССИВА С 1 ПО 10 СИМВОЛЫ, ЭЛЕМЕНТ РАВНЫЙ ПЕРВОМУ ЭЛЕМЕНТУ МАССИВА ПОЛУЧЕНОГО ИЗ СТРОКИ i
			If StringInStr($Array2[$b],$aTemp1[0],0,1,1,10) Then
				$d=True
				ExitLoop
			EndIf
		Next
		if ($d=False) And ($aTemp1[2]=1) And ($aTemp1[4]>=$iDateCalc) Then
			;ЕСЛИ НЕ НАХОДИМ И СДЕЛКА ИЗ Array1=Sell И ВРЕМЯ ОТКРЫТИЯ ОРДЕРА БОЛЬШЕ ВРЕМЕНИ СТАРТА СКРИПТА,
			;ТО ОТКРЫВАЕМ СДЕЛКУ В TWS, ПРЕДВАРИТЕЛЬНО ЗАМЕНИВ СИМВОЛЫ.
			;ЗАПИСЫВАЕМ ОТКРЫТУЮ СДЕЛКУ В Ticket_work_short.txt
			$hFile=FileOpen(@ScriptDir&"\Ticket_work_short.txt",1)
			FileWriteLine($hFile,$Array1[$a])
			FileClose($hFile)
			;СОЗДАЕМ ТРЕТИЙ МАССИВ СТРОК ИЗ ФАЙЛА СООТНОШЕНИЙ
			_FileReadToArray(@ScriptDir & "\MT4_TWS.txt", $Array3)
			;ПОВТОРЯЕМ СТОЛЬКО РАЗ, СКОЛЬКО СТРОК В ТРЕТЬЕМ МАССИВЕ
			For $c=1 To $Array3[0]
				;РАЗБИВАЕМ СТРОКУ i В ТРЕТЬЕМ МАССИВЕ СТРОК, НА МАССИВ Temp3 С РАЗДЕЛИТЕЛЕМ ";"
				$aTemp3=StringSplit($Array3[$c],";",2)
				;ЕСЛИ ТИП СИМВОЛА В СТРОКЕ $a МАССИВА $aTemp1 СОВПАДАЕТ С ТИПОМ СИМВОЛА В СТРОКЕ $c МАССИВА $aTemp3
				if $aTemp1[1]==$aTemp3[0] Then
					;ПРИСВАИВАЕМ ЗНАЧЕНИЯ РАВНЫЕ ЗНАЧЕНИЯМ В СТРОКЕ $c ФАЙЛА СООТНОШЕНИЙ
					$Symbol=$aTemp3[1]
					$Type=$aTemp3[2]
					$Exchange=$aTemp3[3]
					$Currency=$aTemp3[4]
					;ОТКРЫВАЕМ СДЕЛКУ В ТВС
					Local $RanIns=_Excel_RangeInsert($oWorkbook.Activesheet,"11:11",$xlShiftDown)
					Local $ExcRanWr=_Excel_RangeWrite($oWorkbook,$oWorkbook.Activesheet,$Symbol,"A11")
					Local $ExcRanWr=_Excel_RangeWrite($oWorkbook,$oWorkbook.Activesheet,$Type,"B11")
					Local $ExcRanWr=_Excel_RangeWrite($oWorkbook,$oWorkbook.Activesheet,$Exchange,"H11")
					Local $ExcRanWr=_Excel_RangeWrite($oWorkbook,$oWorkbook.Activesheet,$Currency,"J11")
					Local $ExcRanWr=_Excel_RangeWrite($oWorkbook,$oWorkbook.Activesheet,"SELL","M11")
					Local $ExcRanWr=_Excel_RangeWrite($oWorkbook,$oWorkbook.Activesheet,"1","N11")
					Local $ExcRanWr=_Excel_RangeWrite($oWorkbook,$oWorkbook.Activesheet,"MKT","O11")
					$oAppl.Activesheet.Cells(11,1).Select
					$oAppl.Run("Sheet2.placeOrder")
				EndIf
			Next
		EndIf
	Next
	Sleep(100)
WEnd

все работает, все стабильно. спасибо.
 
Верх