[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

Re: System tester



PureBytes Links

Trading Reference Links

Great,

Which one money management do you intend to add??

SC

> As I wrote before - at least some money management support is 
planned
> for 3.9.
> 
> Best regards,
> Tomasz Janeczko
> amibroker.com
> 
> ----- Original Message -----
> From: "Stephane Carrasset" <s.carrasset@xxxx>
> To: <amibroker@xxxx>
> Sent: 02 October, 2001 08:05
> Subject: [amibroker] System tester
> 
> 
> Tz,
> do you think to make some improvement for the system tester
> - fixed equity
> - fixed shares depend of percentage of the capital ( 2% of my 
capital
> is 1000, 1 share price is 10, stoploss is 5, my risk is to lose 5$/1
> Share, I can buy200 shares)
> - monte carlo analysis ( code c++ below)
> Stephane carrasset
> 
> Tz,
> do you think to make some improvement for the system tester
> - fixed equity
> - fixed shares depend of percentage of the capital ( 2% of my 
capital
> is 1000, 1 share price is 10, stoploss is 5, my risk is to lose 5$/1
> Share, I can buy200 shares)
> - monte carlo analysis
> Stephane carrasset
> Tz,
> do you think to make some improvement for the system tester
> - fixed equity
> - fixed shares depend of percentage of the capital :
> for example 2% of my capital is 1000$
> entryprice for 1 share price is 10, stoploss is 9,
> my risk is entryprice-stoploss = 1$ per share
> I can buy n Shares with 1000 = n*risk
> I can buy 1000/n soit 1000/1 soit 1000 shares
> - monte carlo analysis
> Stephane carrasset
> <http://dustbunny.physics.indiana.edu/~shepherd/cebaf/node47.html>
> Monte Carlo Simulation C++ Source Code
> This source code was compiled and run on a Sun Sparc Ultra170 
running
> Solaris 2.5. The GNU C compiler gcc version 2.7 was used by calling
> g++ so that the C++ code would be recognized. The code (named
> spectrum.cc) was compiled with the command:
> 
> g++ -o spectrum spectrum.cc
> 
> The math.h library must be linked in order for the program to
> successfully run. This may require the -lm option on some systems.
> The minimum information needed to run the program is input as:
> 
> spectrum voltage attenuation photoelectrons
> 
> The total supply voltage is given by voltage. The attenuation of the
> photomultiplier signal is given by attenuation, and is equal to the
> factor by which the signal is to be divided. The average number of
> photoelectrons ejected by the photocathode is given by
> photoelectrons. More options are available by entering a non-zero
> number after the other command line parameters. The user is then
> prompted for a threshold setting (default is zero), which is
> multiplied by ten to get the ADC channel for the cutoff (the
> multiplication by ten is convenient because the data output by the
> program was rebinned by a factor of ten before being analyzed). The
> user is then prompted for a gain factor (default is zero) to fit the
> program to individual 8854 tubes because the have different gains.
> The gain factor is given in percent divided by ten by which the gain
> is to be scaled, for example an input of 10 increases the simulated
> gain by 100% and an input of -1 decreases the gain by 10%.
> A directory called ``newspec'' must be created as a subdirectory of
> the directory in which the program is run before running the 
program.
> All output files are put in this directory. Each run of the program
> results in 31 files. The format of the file names is:
> 
> voltage_attenuation_photoelectrons_number
> 
> The last part of the file name indicates the number of initial
> photoelectrons represented in that particular histogram file. The
> file ending in 0 is the sum of all other histograms, the spectrum
> actually seen if the experiment was run. The histograms for specific
> numbers of initial photoelectrons were created to analyze the effect
> of the algorithm used to simulate the low charge events on larger
> numbers of photoelectrons and to look at the relations between mean
> and standard deviations of the individual peaks without interference
> from other peaks. The output of the program can be analyzed in any
> program that can import text and make histograms. The file format is
> one channel per line (200 channels at 2.5 pC per channel).
> #include <iostream.h>
> #include <fstream.h>
> #include <stdlib.h>
> #include <sys/types.h>
> #include <time.h>
> #include <math.h>
> #include <String.h>
> 
> //DEFINES
> 
> //number of bins (in x direction)
> #define BINS 200
> 
> //maximum number of photoelectrons considered
> #define MAX_PE 30
> 
> //how many events to simulate
> #define NUM_EVENTS 40000
> 
> //FUNCTION PROTOTYPES
> 
> //return a random integer between lower and upper
> int myRandInt(int lower, int upper);
> 
> //return a random double between lower and upper
> double myRandDouble(double lower, double upper);
> 
> //return the value of the poisson distribution with
> //average value at x
> double myPoisson(int x, double avg);
> 
> //return value of gauss distribution with mean,
> //standard deviation at x
> double myGauss(double x, double mean, double stdev);
> 
> //return x! (return is a double to be able to handle
> //large numbers)
> double factorial(int x);
> 
> //return a random value conforming to a poisson
> //distribution
> int poissonBin(double avg, int xMax, double yMax);
> 
> //return a random value conforming to a gauss
> //distribution
> double gaussBin(double mean, double stdev, double lc);
> 
> //calculates unattenuated mean from voltage
> double myMean(double voltage);
> 
> //calculates unattenuated stdev from voltage
> double myStdev(double voltage);
> 
> //calculates low charge events for a gauss with mean
> double myLowC(double mean);
> 
> //returns the value attenuated by att
> double myAtt(double value, double att);
> 
> //Converts an integer to a String
> String myIntToString(int x);
> 
> //Converts a double to string, accurate to tenths place
> String myTenthsToString(double x);
> 
> //Converts a String to a double
> double myStringToDouble(String num);
> 
> //for optimization calculates the highest x value to
> //guess in the poisson
> int maxPoissonX(double avg);
> 
> //for optimization calculates the highest y value to
> //guess in the poisson
> double maxPoissonY(double avg);
> 
> //rounding integer routine
> int myRound(double x);
> 
> //MAIN
> 
> /*This is the main part of the program. There are 3
> required command line parameters and one optional.
> They are [voltage] [attenuation] [average number of
> photoelectrons] [editor mode (non zero value)](opt.)
> If the last parameter is omitted a default value of
> zero is used.
> */
> 
> void main(int argc, char *argv[]) {
> if(argc < 4) {
> cerr << "Error: too few parameters\n";
> exit(-1);
> }
> 
> srand48(time(NULL));
> 
> /*make 2 D array to hold all of the info to be written
> to files (spectra) there are MAX_PE+1 different spectra
> (one for the combined spectra) and each has BINS number
> of bins
> */
> 
> int spectra[MAX_PE+1][BINS];
> for(int i=0; i<MAX_PE+1; i++)
> for(int j=0; j<BINS; j++)
> spectra[i][j]=0;
> 
> /*
> gf is gain factor, gain factor scales the average and
> stdev. linearly in an attempt to account for variations
> in the gain of the tubes.
> */
> 
> double voltage, att, avgpe, opt;
> 
> opt=0;
> 
> voltage = myStringToDouble(argv[1]);
> att = myStringToDouble(argv[2]);
> while(att <= 0) {
> cout << "Please enter a positive attenuation factor: ";
> cin >> att;
> }
> avgpe = myStringToDouble(argv[3]);
> 
> if(argc > 4)
> opt=myStringToDouble(argv[4]);
> 
> double thresh=0,gf=0;
> 
> if(opt !=0){
> cout << "\n***Entering Option Editing Mode***\n\n"
> << "Enter the threshold (ADC Channel/10)(default=0):";
> cin >> thresh;
> cout << "Enter the gain factor(default=0):";
> cin >> gf;
> }
> 
> double stdev = myStdev(voltage);
> double mean = myMean(voltage);
> int poissonX = maxPoissonX(avgpe);
> double poissonY = maxPoissonY(avgpe);
> 
> /*adjust mean and stdev*/
> 
> mean = mean + gf*mean;
> stdev = stdev + 0.34*gf*stdev;
> 
> /*get Low Charge Fraction before mean is attenuated*/
> 
> double lc=myLowC(mean);
> 
> /*attenuate mean and stdev*/
> 
> mean=myAtt(mean,att);
> stdev=myAtt(stdev,att);
> 
> for(int i=0; i<NUM_EVENTS;) {
> 
> int numPE = poissonBin(avgpe, poissonX, poissonY);
> 
> double tmpGauss=0.0;
> for(int j=0; j<numPE; j++) {
> tmpGauss += gaussBin(mean,stdev,lc);
> 
> }
> 
> if(tmpGauss>=thresh) {
> int gauss = myRound(tmpGauss);
> if(gauss > BINS-1)
> gauss=BINS-1;
> spectra[numPE][gauss]++;
> i++;
> }
> }
> 
> 
> for(int i=0; i<BINS; i++)
> for(int j=1; j<MAX_PE+1; j++)
> spectra[0][i] += spectra[j][i];
> 
> 
> //output is "newspec/[voltage]_[attenuation]_[avgPE]"
> //all to tenths place
> 
> for(int i=0; i<MAX_PE+1; i++) {
> ofstream file_out;
> String name;
> name = "newspec/";
> name += myTenthsToString(voltage);
> name += "_";
> name += myTenthsToString(att);
> name += "_";
> name += myTenthsToString(avgpe);
> name +="_";
> name += myIntToString(i);
> file_out.open(name);
> 
> for(int j=0; j<BINS; j++)
> file_out << spectra[i][j] << endl;
> file_out.close();
> }
> 
> }
> 
> 
> int myRandInt(int lower, int upper) {
> int done=0;
> int result;
> while(!done) {
> result = int((upper+1-lower)*drand48() + lower);
> if(result != upper+1)
> done=1;
> }
> return result;
> }
> 
> 
> double myRandDouble(double lower, double upper) {
> return (upper-lower)*drand48() + lower;
> }
> 
> double myPoisson(int x, double avg) {
> return pow(avg,x)*exp(-avg)/factorial(x);
> }
> 
> double myGauss(double x, double mean, double stdev) {
> return exp(-0.5*pow((mean-x)/(stdev),2));
> }
> 
> double factorial(int x) {
> double result=1;
> for(int i=x; i>1; i--)
> result = result*i;
> return result;
> }
> 
> int poissonBin(double avg, int xMax, double yMax) {
> int done=0;
> int x;
> while(!done) {
> double y = myRandDouble(0,yMax);
> x = myRandInt(0,xMax);
> if(y < myPoisson(x,avg))
> done=1;
> }
> return x;
> }
> 
> 
> double gaussBin(double mean, double stdev, double lc) {
> int done=0;
> double x;
> while(!done) {
> double y = myRandDouble(0,1);
> x = myRandDouble(0,mean+6*stdev);
> 
> if((x<mean) && (y<lc))
> done=1;
> 
> if(y < myGauss(x,mean,stdev))
> done=1;
> }
> return x;
> }
> 
> //fit from data
> double myMean(double voltage) {
> return exp(0.00379*voltage-6.45);
> }
> 
> //fit from data
> double myStdev(double voltage) {
> return exp(0.0034*voltage-7.05);
> }
> 
> //fit to data
> double myLowC(double mean) {
> return (0.35 - 0.024*exp(0.0091*mean));
> }
> 
> double myAtt(double value, double att) {
> return value/att;
> }
> 
> 
> String myIntToString(int x) {
> String result;
> 
> if(x/10==0) {
> result = char('0'+x);
> }
> else {
> result = myIntToString(x/10);
> result += char('0' + x%10);
> }
> return result;
> }
> 
> 
> String myTenthsToString(double x) {
> int tmp = int(x*10);
> String result = myIntToString(tmp);
> char last = result[result.length()-1];
> result[result.length()-1]='.';
> result += last;
> return result;
> }
> 
> double myStringToDouble(String num) {
> int decimalq=0;
> int power=-1;
> double result=0;
> for(int i=0; i<num.length(); i++) {
> if(num[i]=='.')
> decimalq=1;
> else if(!decimalq)
> result=10*result + double(num[i]-'0');
> else {
> result=result + double(num[i]-'0')*pow(10,power);
> power--;
> }
> }
> return result;
> }
> 
> int maxPoissonX(double avg) {
> double maxY = maxPoissonY(avg);
> int i=0;
> for(i = int(avg)+1; (myPoisson(i,avg) > 0.001*maxY)
> && (i<MAX_PE); i++);
> return i;
> }
> 
> 
> double maxPoissonY(double avg) {
> 
> int tmp = int(avg);
> double max = 0.0;
> int i=tmp-1;
> 
> if(i < 0)
> i=0;
> for(i; i<=tmp+1; i++)
> if(myPoisson(i,avg) > max)
> max = myPoisson(i,avg);
> return max;
> }
> 
> int myRound(double x) {
> int result = int(x);
> if( (x - result) > 0.5 )
> result++;
> return result;
> }
> 
> 
> 
> 
> 
> 
> 
> 
> Your use of Yahoo! Groups is subject to 
http://docs.yahoo.com/info/terms/