TicksToM1.tcl

Конвертер тиков сохранённых через TickWriter в котировки M1 пригодные к импорту в MetaTrader

Использование: tclsh TicksToM1.tcl файл_тиков_1 файл_тиков_2 > файл_M1.csv

прим. утилита предполагает что входные файлы подаются в календарном порядке

TicksToM1.tcl
#!/usr/bin/tclsh
# конвертор тиков от TickWriter в M1 для MetaTrader
set encoding unicode
set translation auto
set timeFormat "%Y.%m.%d; %H:%M"
set fields { unixtime mcs datetime bid ask last volume realvol flags }
set i 0
foreach field $fields {
	set index($field) $i
	incr i
}
array set bar {
	time 0
	open 0
	high 0
	low 0
	close 0
	volume 0
	realvol 0
}
set tcl_precision 14
proc WriteBar {} {
	global bar
	puts [ join [ list $bar(time) \
		$bar(open) $bar(high) $bar(low) $bar(close) $bar(volume) $bar(realvol) ] ";" ]
}
# предполагается что файлы подаются в календарном порядке
foreach fileName $argv {
	set f [ open $fileName "r" ]
	fconfigure $f -encoding $encoding -translation $translation
	while { ! [ eof $f ] } {
		set s [ string trim [ gets $f ] ]
		if { $s == 0 || [ string index $s 0 ] == "#" } {
			continue
		}
		set csv [ split $s ";" ]
		foreach field $fields {
			set $field [ lindex $csv $index($field) ]
		}
		if [ catch { clock format $unixtime -format $timeFormat } time ] {
			continue
		}
		if { $time != $bar(time) } {
			if { $bar(time) != 0 } {
				WriteBar
			}
			array set bar [ list "time" $time "open" $bid "high" $bid "low" $bid "close" $bid "volume" $volume "realvol" $realvol ]
		} else {
			if { $bid > $bar(high) } {
				set bar(high) $bid
			}
			if { $bid < $bar(low) } {
				set bar(low) $bid
			}
			set bar(close) $bid
			set bar(volume) [ expr $bar(volume) + $volume ]
			set bar(realvol) [ expr $bar(realvol) + $realvol ]
		}
	}
}
if { $bar(time)!=0 } {
	WriteBar
}