# This is program is being written to test perfomance by varying the following parameters
# Start Time - hardcoded 'newHour' check
# End Time - hardcoded 'newHour' check
# Buffer - variable 'buffer' percentage
# Stop Loss - variable 'stopLoss' pecentage
# Target - variable 'target1' percentage
# Comments to be added
use strict;
my $in_file = "allNFHL_datacleared_till_Feb2009.txt";
my $commentary = "p65Commentary";
my $commentary_file = "sub\\p65Commentary.txt";
my $txn_file = "sub\\allTxn.txt";
open (IN, "<$in_file") or die "Can't open $in_file: $!\n";
open (COMM, ">$commentary_file") or die "Can't open $commentary_file: $!\n";
#open (TXN, ">$txn_file") or die "Can't open $txn_file: $!\n"; - opened lower
my $currDate; my $newDate;
my $currTime; my $newTime;
my $dayHigh; my $newHigh;
my $dayLow; my $newLow;
my @lineValues;
my $currHour; my $currMinute; my $currSecond; my $newHour; my $newMinute; my $newSecond;
my $currYear; my $currMonth; my $currDay; my $newYear; my $newMonth; my $newDay;
my $buyTrigger; my $buyTarget;
my $buyStopLoss;
my $sellTrigger; my $sellTarget;
my $sellStopLoss;
my $startTime = "1000";
my $endTime = "1525";
my $bufferPerc = 0;
my $stopLossPerc = 0.6;
my $targetPerc = 90;
my $startHour = substr($startTime,0,2);
my $startMinute = substr($startTime,2,2);
my $endHourTentative = substr($endTime,0,2);
my $endMinuteTentative = substr($endTime,2,2);
my $endHourActual = $endHourTentative;
my $endMinuteActual = $endMinuteTentative;
print TXN "start time = $startTime, end time = $endTime, buffer % = $bufferPerc, stop loss % = $stopLossPerc, target % = $targetPerc\n";
print "start time = $startTime, end time = $endTime, buffer % = $bufferPerc, stop loss % = $stopLossPerc, target % = $targetPerc\n";
$txn_file = "sub\\".$startTime."_".$endTime."_".$bufferPerc."_".$stopLossPerc."_".$targetPerc.".txt";
open (TXN, ">$txn_file") or die "Can't open $txn_file: $!\n";
print "output transactions to $txn_file\n";
my $expensePerc = 0.15;
my $isNoEntry = 0;
my $position = 0;
my $lotSize = 50;
my $buyEntry; my $buyExit; my $sellEntry; my $sellExit;
my $timeLimitHit = 0;
#my $count = 0;
my $expVal;
my $loopCount = 0;
my @highs; my @lows; my @sortedHighs; my @sortedLows;
my $trailingSL = 0.4;
while (my $line = <IN> ) {
@lineValues = split('\t', $line);
($newDate,$newTime,$newHigh,$newLow) = @lineValues;
($newYear,$newMonth,$newDay) = split('-', $newDate);
($newHour,$newMinute,$newSecond) = split(':', $newTime);
if($newDate ne $currDate) {
if($newYear ne $currYear || $newMonth ne $currMonth) {
close COMM;
$commentary_file = "sub\\".$commentary.$newYear.$newMonth.".txt";
open (COMM, ">$commentary_file") or die "Can't open $commentary_file: $!\n";
}
print COMM $line;
print COMM "NEW DATE $newDate\n";
$endHourActual = $endHourTentative;
$endMinuteActual = $endMinuteTentative;
if(($newDate ge "2008-09-24" and $newDate le "2008-10-08")
or ($newDate ge "2007-09-25" and $newDate le "2007-10-09")
or ($newDate ge "2008-03-04" and $newDate le "2008-03-17")) {
$endMinuteActual += 45;
if($endMinuteActual >= 60) {
$endMinuteActual -= 60;
$endHourActual += 1;
}
print COMM "SUN OUTAGE added 45 minutes\n";
print COMM "new end time is $endHourActual$endMinuteActual\n";
print "$newDate: new end time is $endHourActual$endMinuteActual\n";
}
$dayHigh = $lineValues[2]; $dayLow = $lineValues[3];
$loopCount = 0;
@highs = ($dayHigh);@lows = ($dayLow);
while($loopCount < 59) {
push(@highs, $dayHigh);
push(@lows, $dayLow);
$loopCount++;
}
($buyTrigger,$buyStopLoss) = (0,0);
($sellTrigger,$sellStopLoss) = (0,0);
($buyEntry,$buyExit,$sellEntry,$sellExit) = (0,0,0,0);
$position = 0;
$isNoEntry = 0;
$timeLimitHit = 0;
if($newHour >= $startHour && $newMinute >= $startMinute) { print COMM "*** CHECK DATA $newDate $newTime - time starts at $newTime\n"; }
print COMM "$newDate $newTime high = $dayHigh low = $dayLow\n";
}
if($newDate eq $currDate) {
print COMM $line;
if($timeLimitHit == 1) {next;}
if($currMinute == 59) {
if($newMinute != 0 || $newHour != $currHour + 1) {print COMM "*** CHECK DATA $newDate $newTime - $newMinute <> 0 || $newHour <> $currHour + 1\n";}
}
else {
if($newMinute != $currMinute + 1) {print COMM "*** CHECK DATA $newDate $newTime - $newMinute <> $currMinute + 1\n";}
}
shift(@highs);push(@highs,$newHigh);shift(@lows);push(@lows,$newLow);
if($newHigh > $dayHigh) {
$dayHigh = $newHigh;
print COMM "$newDate $newTime new high = $dayHigh\n";
}
if($newLow < $dayLow) {
$dayLow = $newLow;
print COMM "$newDate $newTime new low = $dayLow\n";
}
if($newHour >= $startHour && $newMinute >= $startMinute && $buyTrigger == 0) {
$buyTrigger = $dayHigh * (1+$bufferPerc/100);
$sellTrigger = $dayLow * (1-$bufferPerc/100);
print COMM "$newDate $newTime initial triggers set at $buyTrigger, $sellTrigger\n";
}
if($newHour >= $endHourActual && $newMinute >= $endMinuteActual) {
if($timeLimitHit == 1) {next;}
print COMM "$newDate $newTime hit time limit\n";
$isNoEntry = 1;
$timeLimitHit = 1;
if($position > 0) {
$buyExit = ($newHigh+$newLow)/2;
$expVal = $buyExit * $expensePerc/200;
print COMM "$newDate $newTime SELL EXE BUY SQ OFF $position at $buyExit\n";
print TXN "$newDate\t$newTime\tSELL\t$position\t$buyExit\t$expVal\n";
}
if($position < 0) {
$sellExit = ($newHigh+$newLow)/2;
$expVal = $sellExit * $expensePerc/200;
print COMM "$newDate $newTime BUY EXE SELL SQ OFF $position at $sellExit\n";
print TXN "$newDate\t$newTime\tBUY\t$position\t$sellExit\t$expVal\n";
}
$position = 0;
}
if($newHour > $startHour || ($newHour == $startHour && $newMinute >= $startMinute)) {
if($position > 0) {
@sortedLows = sort {$a <=> $b} @lows;
if($newHour >= ($startHour+1) && ($sortedLows[0] * (1-$trailingSL/100)) > $buyStopLoss) {
$buyStopLoss = $sortedLows[0] * (1-$trailingSL/100);
print COMM "new trailing STOP LOSS $buyStopLoss\n";
}
if($newLow <= $buyStopLoss) {
$isNoEntry = 1;
$buyExit = $buyStopLoss;
$expVal = $buyExit * $expensePerc/200;
print COMM "$newDate $newTime SELL EXE BUY STOP LOSS $position at $buyExit\n";
print TXN "$newDate\t$newTime\tSELL\t$position\t$buyExit\t$expVal\n";
$position = 0;
$buyTrigger = $dayHigh * (1+$bufferPerc/100);
$sellTrigger = $dayLow * (1-$bufferPerc/100);
($buyTarget,$buyStopLoss) = (0,0);
($sellTarget,$sellStopLoss) = (0,0);
($buyEntry,$buyExit,$sellEntry,$sellExit) = (0,0,0,0);
print COMM "$newDate $newTime new triggers set at $buyTrigger, $sellTrigger\n";
}
else {
if($buyTarget != 0 && $newHigh >= $buyTarget) {
$isNoEntry = 1;
$buyExit = $buyTarget;
$expVal = $buyExit * $expensePerc/200;
print COMM "$newDate $newTime SELL EXE BUY TARGET 1 $lotSize at $buyExit\n";
print TXN "$newDate\t$newTime\tSELL\t$lotSize\t$buyExit\t$expVal\n";
$position -= $lotSize;
$buyTarget = 0;
print COMM "$newDate $newTime new position buy $position\n";
}
}
}
if($position < 0) {
@sortedHighs = sort {$b <=> $a} @highs;
if($newHour >= ($startHour+1) && ($sortedHighs[0] * (1+$trailingSL/100)) < $sellStopLoss) {
$sellStopLoss = $sortedHighs[0] * (1+$trailingSL/100);
print COMM "new trailing STOP LOSS $sellStopLoss\n";
}
if($newHigh >= $sellStopLoss) {
$isNoEntry = 1;
$sellExit = $sellStopLoss;
$expVal = $sellExit * $expensePerc/200;
print COMM "$newDate $newTime BUY EXE SELL STOP LOSS $position at $sellExit\n";
print TXN "$newDate\t$newTime\tBUY\t$position\t$sellExit\t$expVal\n";
$position = 0;
$buyTrigger = $dayHigh * (1+$bufferPerc/100);
$sellTrigger = $dayLow * (1-$bufferPerc/100);
($buyTarget,$buyStopLoss) = (0,0);
($sellTarget,$sellStopLoss) = (0,0);
($buyEntry,$buyExit,$sellEntry,$sellExit) = (0,0,0,0);
print COMM "$newDate $newTime new triggers set at $buyTrigger, $sellTrigger\n";
}
else {
if($sellTarget != 0 && $newLow <= $sellTarget) {
$isNoEntry = 1;
$sellExit = $sellTarget;
$expVal = $sellExit * $expensePerc/200;
print COMM "$newDate $newTime BUY EXE SELL TARGET 1 $lotSize at $sellExit\n";
print TXN "$newDate\t$newTime\tBUY\t$lotSize\t$sellExit\t$expVal\n";
$position += $lotSize;
$sellTarget = 0;
print COMM "$newDate $newTime new position sell $position\n";
}
}
}
if($isNoEntry == 0) {
if($position == 0 && $newHigh > $buyTrigger) {
$isNoEntry = 1;
$position = $lotSize;
$buyEntry = $buyTrigger;
$buyStopLoss = $buyEntry * (1-$stopLossPerc/100);
$buyTarget = $buyEntry * (1+$targetPerc/100);
$expVal = $buyEntry * $expensePerc/200;
print COMM "$newDate $newTime BUY EXE BUY ENTRY $position at $buyEntry\n";
print TXN "$startTime\t$endTime\t$bufferPerc\t$stopLossPerc\t$targetPerc\t$newDate\t$newTime\tBUY\t$position\t$buyEntry\t$expVal\t";
print COMM "$newDate $newTime SL = $buyStopLoss, targets = $buyTarget\n";
}
if($position == 0 && $newLow < $sellTrigger) {
$isNoEntry = 1;
$position = $lotSize * -1;
$sellEntry = $sellTrigger;
$sellStopLoss = $sellEntry * (1+$stopLossPerc/100);
$sellTarget = $sellEntry * (1-$targetPerc/100);
$expVal = $sellEntry * $expensePerc/200;
print COMM "$newDate $newTime SELL EXE SELL ENTRY $position at $sellEntry\n";
print TXN "$startTime\t$endTime\t$bufferPerc\t$stopLossPerc\t$targetPerc\t$newDate\t$newTime\tSELL\t$position\t$sellEntry\t$expVal\t";
print COMM "$newDate $newTime SL = $sellStopLoss, targets = $sellTarget\n";
}
}
}
}
#$count++;
#if ($count == 1000) {last;}
$currDate = $newDate;
$currTime = $newTime;
($currYear,$currMonth,$currDay) = ($newYear,$newMonth,$newDay);
($currHour,$currMinute,$currSecond) = ($newHour,$newMinute,$newSecond) ;
}
close IN;
close COMM;
close TXN;
print "DONE!\n"