0000010000110111111100011001100010101100110010111010011001011011101111011000010100010111010001011000010111011010100100010000001100101100010010101110100101111000101110101010100101001000001001000000011010001111111111101000001110101111111000100011100100011101110111111010000010111011101000010111111100000010100011010101101000011001110001011011010011100010011000000100010011100010010100010110000101000100 1110101101001011011010000111111100001111111100011010001000111010001110101010001001100100001110100001110101001010011100000100101101110111001110000001000000101000001111100111011010100111101011000100110100011000011110001110101111101011011000011001011001100000111111011010110010000010001011001011011101100010101001001010111100010011100000100100110111101100000000111101010001111110010101100101011110001101 1010010011000010001001111100101100100000001101001011000011101101110101010010101000110111000110011100100000010011010110000111110101010100101100010101100011010110000101100101110010110001011001110110100100011110101001000011001110101000100101000001110011011111000000011100001000100011101000000101111110001111010010011011000101100000101010010001000000001000010101100000100010101011000100010001111010101011 0010001110000111001000111110011101111000011010101001000011011101100001101110110011110100001111011101000101000011111011100101100001110100011110000011010101110101111110010111000110010110011000010001000010111101101011010000110000100001111100000101001001111100011000011000011110010111101101010110101110000110100101101110100010100100111111000101110001001010110111100000101110101111101011000101011110000101 0010010110001110010010100010101111100011110110010001100111110000100111110011110000110010010010010101011010111011111011111110000001000101000011110011111000000000100010100000101110110001010111011010011111000100010011000111010001000101110000111011000000011100001001001010001101100001011011011000000111010110001100101000011100011000001111111000000101110011101101011011100001000110110111110011111110001001 1001101111100101110100101100101001001101100111011100001100001010011110000000110001001111110101000101101111011001110110001010000101001111001001110001001110111110001010100000111000110010011001101101000111101010010111010100011011111011110110110001111000100000100101001001011101101000000011110010000000101011011101111110000111001110100010000111110101011001100001000001100110111011000110011001100101110010 1101101001000001100111100011100001101010000001010100110110101001010011100110001011000011010000010111011101111101111011100011100010110101101001110000010100111011111010010101011111010011110100111001110010111111111101100000011010101101110011011001100011001101100001001011101001100001111111100001000100010001010011000111101011011100111010011100110000011101100011001110000000001100000110110001011111001010 1000111010010000110010000101100001101000000000001011100000110111110001110010110000100100111000110100101100011000010101010100010100010010000000001000110010011001110111101100111000100011010100101010110001100101001100100101000000001001000110001011111110100001001001100010011101011010011011000110000110011011100011010011001110101101111100000101111010000111110111110101010000010110010111111011011111011010 0000111001110001100100000001110000100101111100001010110110000011111010010111000010110001000000101110101110010001110110011010101101110011010001000010101100111000001111111001111001111110011101010111111010100111100100000011001010100011010010010100000101100001011111000001110101110000101100001011010100101011001011110100010110001100111010110101111000110110101111011001100101011100010100010011101000110101 1101101011000001010010010101100001110011010100100010101111110100110100110110101010100001100010111111011101010010000010000001011111010011110101010101001100000101100010111010000110010000111100110110100001110001010001100001101001001010010101111011110110100000101010001111110011000111000101110110000101101101101001111010101011100100111101011101010000010000011100010001111000100000010000001010010110001011 1111111100011011000101001100110010111011011110001000001110101011011010100011010000100001100001100011011110000000101111000000001110101100000000010101100101110010010111110110000001101001001101001110100101111001111100010101100101011010110001011011100001010000001101010110000101011110110010001000011010110011100110001111011000000101010111111011100011111000011001110101110011001110011100110001000010001101 1001010011101010110010111001011001100001111010101011101111110110000000101000011101100000100101101101001010011101011010111100100000010001001000101100111010110110100100101100111000011001110011111110011000011100101100001011111001100111000001011110101100111111101110010110111110100000010000001001111100001010110110010111101010011101011100101100000001011011011111111000100001101110100010001011001010001110 1010001010100100100000100010000011000010110010000110000001101010100101101111101110111110000000110111110000111001001110001100111011111101011100001111111001101100011001101001110100110101110010010001011110101101011110100101010110111000101001110001100111001011011011011010101000101011011110001100000111101100111010000010001110000111000100011111111001110001110110110100100010011100100010000011001001000110 1010001011000010110101000010100100010001101101101110110101000010000011111101001010111110111101110101010010000010001010000000110010011000100000110010010110110000001101110101001000001101111101111100000011011110011011011000010111101011100100001100110010011010011111010011110111011000010010110000011001001011101001111111100010111001100101101010101011001010101110011010110000000000010101110010111001001101 1010101101000101010100110100001100111111011100001111100111111010100110011101100110111111011001111010111000000011011010010001000000100100000011101111010000000000001100010010010001110011001011011010110001100000101000101010100011000000000111001111100010010011111011011101101000100110100011011000011101000010111010010001100110010100111101100010101011010011110100011111001111111000010110001111101001000001 0000010010111011100110110100100001101010010110001010000010001001011101110111110010010101110010111110100101010110001000000001000001110001001010101110111011110111010111110110011100010000101110010011101010111001111000001001000010000011010111011110101011100100010111100111111110001000100001111100110000011111100111101000001010101100101111010111111011100111101011000100011100001111010100001010001100010000 0100111001001100011000111111101000010010011010000100010000111011100110011001101110010010101111100010110101110001011011011000001010010100010011110111010011010100101111101010010111111111101100100000110011100100011010110101101001010010100110010011100100001001100111011110110100001100101010111101010111000101010010010001010000100110011010111110001001001101000111010111111110100010001110111100111111001100 1100100000010111110010010101110100110001100111101101110001100101100000111011010110110001001100011111011010101110110011000010101111111010011001111101110111101101010101101111010101111000010010101111011100011101010000100001011100011111011010001010001010110011011111000111111100011000101111110001001110000000100101001000011111100101010101010000010100001001101000000101000100100000000110101100011011010000 0101000010000101010100111001001010111100101100101101100100100111010110100100000000100011010111001111010100011110000101100111000001001011101111001000001101011011101000010110010111111010101101110100110100010011100111110010110111100011110000000001101000101110110111010001100011110111111000110101101010100011011010011111101100010011001001101101011010010000010010100101000110000110001111010110101110110110 0010100001001110001011111100110000100101111101101011001101110101100011101111110101000011110110101011011000001010001010010011011010001001110010000011101011100000110111001111101011100001001010110111110111011101011101110001111000111110010011011100101001000101011100000101010100011111100011101011101110011011100001100011000111010000010111100101110001111010111110010000101011111110110001011001011100110001 1001100101100001001001000111011010111011100110011111010001011100111111110011010001100101010101001000000111001000000111110110101011010011101100100100111110010111011011010000101100100101100110111111000010101001011110101011011001101111101110010101011111010000110000110000011000100000000111100100110100100000110001000111000110000101111001110101010110100110000101111110100111101100101111110101000100111011 0010010001101011110100010010001001010000000101010011111001110010110000110110000010111010111100000001101011111000101111110101011010000101001011010100110110110100011110101101110110011011011111011101111110000001100000011101011110101010100010111111011001110100001001110010000011101011001000000101100101001101111010101100100110011000101110100000111101111011011001001101100111100111000111001000101010100101 1011010000100110011001011111101000101101101101100000100100001001111010010011101000001100011100010010101010000100001110100000111010000101011111111000000111110000000101111000001111100001010010101111011101100111010111011000011010101000101101001111000101011011010000000110011000110001001001110001101001011110100101110011100000011101000111110101101011010010111010000001110000101100100001101010110111010011 1001001000011011010001010110000100000101010000111110101110001001001001111101110110110101010010111011011101010010001010011001010110011111100001000001100101111110011101010000001101101101000011110010101011111101001010000001010100101101111110100100011001010100010011000111110000111110110011101001011010001001110110011110101010110110101100010111101110000101010110010101101101101111101000100001100100111001 0111110010101100001111000010000010100111001111011010100011000101011000111100000111101010100001110011000010010101101001011001001110011000011111101101110110101111011110001000110100100111101010010011011110010000100011100000010101010000010010110000101101111110000001110100100010101101110110111100100101001001001101110001100101101010110101101000011110111000111001010010111110100000011001100011101100100001 1011010001101010000000001011100110101001010111011110101110101000000111011010101111010111101001100100010110000110100100000110101001100110110101000010010001100101111001111110000110001111010011010010001001011111001010011101000111110101101111000011000111100010111011111110101001100100100001011000000100110010100010001111111100010000110100010101101000110001110011001101000001010011100100001010111010000100 0010111100001101110110011111001100100100001001111101011111101001000101010001010100110100110011100101010001110100011001010000101001101000101001100111010011101000011001000111010011011110110101110111010110001000110100010010000111100111110001010110010000010010110111101001011000011110110101011001110000010101010101001101010110100110111110110010001010010100010010000111011010111000001011110101111000111110 0111101111001000001111001100001001101001110101010101111010000000110010000110010111000011100111001101000001111001011110110001000010111011110101100011001001111110101110101010110010100000111001100100010011011010110010100010110010011011101111011010000010110001110000101111110111001001011100110011100011000110000010100000010000001011100000000100110100101111100101100100101000101100110101010000000011101100 1110011110010000001010010010101010111000011100100111011010011001001000011100110100100111100010010101111010101100010110011000011000100000101000110101011010100010101110101100011100100000101111000010011010101100110011111110010100101100001011101100110101111101110010011000011110100000100100001000111011011010110010110000010111110110110100111001001000000010011110000111110011001011001110100111010011110100 0100010001110011100010011001111011001011101110101011110101111100100101110011111010011111000101100101101000011111111011001110100100000110111001101110111000010001111100010111001011110101101000110000101010011110100110000011101011101100110100101001011100101011000001001011001010100010111101110010001010011100000110011011110111100100101110100000101100011000101110100100001101010101010100101011001011010111 0101110110101101000000010100011001001101100001001010100010011000100010000100010110000001000110011111001110010101111011101101010100100011000110110001100011100010111000111100101101010111110001111100100011001110101100111010000011010100101001000000111011000101111011110010001000111101111000110100100001000011010100001101000111101001100111000110100111001110110111001101010110000100111010101110011010100100 0111100110000100101110100011110110100100011000100101110101010101111001001000001111100101111001101110000110000110100010110001110000010111000111111100111100010110010010110011101000101100101110010110111011110001100101010011001110011010101100101011000110100100111101001101010101100110111010000010010101101010100000001011001100111111011001011000011000101001001010101110001110010110011000011110001010011100 0001100011100000110000011010110101101011110010001111010110110000110011000111011010000110010100011000000111110100111110000000110001010011111011100001001101001001000110001111111011000101111001010100110010001101101111001011001011001101110010010111110010001001001011101001010011011010010111001010100010101110001011100101101001011101111010111100111010000111110100001100001011100100000000110001001110110001 1000100111100001011010110100010000110000010010010011001001010110111101000100100110001111111110110111110000110100110000101111100101011111000111011111011111011100100101010001011001111011101100111101010110100011001110111100001101110010111011101000000100101011110111001100101100101111000000100010111000100010110010001101000000110001001100100011110110000010011011111101001100001001011010111001100111000001 1001101011110111100010100010100110101001110100100111001001001001110111100100011000011000111010000001000101010100100110000010000110111110100011001101111100110110010111001011111111000010011000100000110011111111010100100001011011101000111001000000010100100001011011000101111000011000001000110010011100111110101111000110100010000100001010100011101101011110000101111101001000011110010100001101010001000100 0000001011001110000101101110101000001011110001100110111101000101011011010100100010011011000000001010101011101100111010100000100100001010101101011110010111001001100010101100110011100100001111000101000101001111000000000000011010010110101110101111100011011011011001111111111111010100111100111000000100001000010001101001111101111110000011101011110011110010101110100110100110100100111000001111011001010010 0111101010011000001110001000000000000111111010010111000010000101011011011110010100100100100101110100110110011000100111000000101011000000101101101100011011101000101110100001100110010110110110011100100110101100101111110100001101001011011011011000111111101011000110000111000000001111101010110001000100000111000001010100000111000100011000010101110011000000111110000111011001111010000110110011110011010111 1100000010010111100001010110011000000001111001111011101000001110110010011100010011101110100000110111110010010100111110110110101110000101100001001101100011011101111000111100000001101100111001010100010101100101101100000101001101000000110100100101011101010001100001011110111001100011100100011101111100000010010010000101110010011100100010100110111010000111011110011001010001101110001111101111011110010000 1010110010111111010001100011000000111100001100111100101100011010101011011100111010101111001100001011101001000011101111000111100010110000110000000010111001110111011001111100101101110100000111110010010100111001010001111111100011010010100011110100011100100011011001011110100010001000010011001110101101000000001011111011101101100011110000000101100111101101011101111111000001101110110001000010100100101110 0010011111011001111011101010101100001011000010100111111010010101101100000001101110100001101101010001011111000010111110110100111000001100001111101010101011110111100001100110110010100000100001101100011011111001110010011111111100110110010011100110100010110111010010100110110100100100011011010000101000101001110010101111000100110111010010101101000001000001111111011111111101011011010110111000111110110001 0010110010000010100010111010111001100101101110000100000000000011001111100110110100001010110010000110000111111100100100110001100110101110100000110100100001100111111100111011110111110010100110110101011100111110010101000100010101101001000100111100011101101010101101100011111001010011010110010000101111001111011100101111000011111110110111101100110000000111000010000110001000011011110001100011101000110111 1001111101101010110100101010010101010111110101110111011100010001110011011110011000010100011100100000111100110001000111100110111111001010001011111100101010100101001110111000000000111111101101100111101011111111011111011100100001011010000110011110100010110010110111100111101100111001001111110010110101011011101111010011100000001011011111011110011111010110111001000010111010111101110000110100000000000000 0110010001110010110000000011110000110001110000100010000010111100101101001110000110100001111111011100000100001010100011011100001101110100000100110111101001111111101100000100100111000000111011000010111011011101001001000001010010000001110001010110110001011001001010101010011110110010001101001100100101011111110010010000001011000000101000110001110111000011001010100010000010001111100111000001110000000001 0101011001011100100111111000000100001110000000000111100110010001001111000111101011101101010111101000001001010010111001001011010110101100000001110001011000111101101111111100110101111000000011110000111111001000110011000101111000111101101101110011100011110011001100111001100000100000001110011110101011111001110000111000010010110101010101001001110100000111010110010101001001101111010111010001110001101110 0011101011011001101000111010110011111011111100100111010010010000010111011001010110001011101000010001101111101100000001010100110101110011011110100010110111101101001011010010010101100001111001110110001110111010101011110000100111110000000001111010101100100100101001110010011011011000000010011011010100100001101100011110110010110111000000011100011110001110000000000010010001110101100110001101011101110010 0100110001111101011010111110110110101110100010010011100111011011100100011010111111000001000110010010100000101111011011000110100111101010010011100011110101001010110101001111101111000010110110001001001001000011000100110110111010000001010010111101111011011111100110110101111010101011100111010101000100011111110101110110011011101100001001001011101101110001100100100011100001111111010100110000101001110111 0100000101011010100100100110011010100110110110011011100001000001101010101101011111000110001100110110100110100100011000101100110110011110010011000110000111000010100110100100011000101001100000000100101010011011110101010001001001011000001001010111000100010100110110110100111111000000101000001101000000011001111110111011010001111101111110101000111111100111001000100010000001101010000001110001100000010100 0100000011111011101000011001111011101100011001100001001011001001000010100101100110110101010000010000000101100111101100000101000100010110100010000010001001001101000110101010101100001010011011101111111011010101001000110010101000100101110011000011001010011011111010010010001111000100000111110100110010110110010100011101101000010010000100001000011111010111110110101110001000110110110100111000110100011001 1010111101101000101010011100110001101001000100101100011001101100111101111111010100010100001010000001001001111010110010110001101001000100110010001000101111100100001101000110110101100001101110001111001010111111010010110111000010100011100011101100101110110100110100101110010111011001010000101111011111111111111110111100000011111001101001011011010010000011010110110001111111011001110011000100100101011000 0011101001011011100001011011111110001001100000111110100100001100110110010011111011011100100000000111100111001000110101101011110111010010010110100111101011110101101101000011011110010111100100111100111110111000111110010010100011111110000100011010110111010101000011000000001011110101101011111110010001001101001111011111011110111111011000001001010110101011001000001001010001010100011110001100001011100011 1001110111111011100000110010011001110110001100000010110100100110111001110101010101111111100011101010110011110110101100101001111001000001110111101100111001111000001100110110110010110001011111011100111111011110011001000001011100001011001001000000111100001111011010010100111011100011011010000101111111100101111000011111001101000001101111101000011110100010011001010001000001110001100010001100111011100110 0100100000100100111011001001011011010111101101100110110000001101001010110001011111100111100001111001100111011010000110111100110100010001011101001100100101001110000110110000000011100101110101101111100101100001101010011011111001010110100101100000001011010001110010100100001010010111100100010101100010011011110001001001000010100111111100100101000010100010101111000100011000010010001010001100011101001110 1101010111101010010001100010001000001010010011100110011011111100000001100011110110110111110010111101000011000110100010110001101010110001111010100111000101110101010001100000000001010100010010110100111010111011100010101001101111101000001000000010011011001001001000001100111010000010000011011011010010010110011011111110110011000111010111011100100111110101011101000000101011000100001110001010100101011011 0011111110111100110010001110000101000000010110111101101110101111101001011011101011101010001111000111111011111111011011101101111100110001001011100101011111010010011110111000110001110101000011011001110110100101110101001000011111001100100010001000011001001000110100101111010001000010101101011001000011010101001010010011110100111100010100111101111110101000011001101110110111000001000010111100001101111101 1100001011011000101100110000000110011001010101011001011011010111010110110000110010010001100010010010100010110100110111000001100001100111101011110110100000100011101110110000001110101000001110101110110101000110001111010010011111110101100110010000010101100110100111100100010011100111111000101011010111100011111010101111000000001101000101000110001010000101000011010111100101101001110001111100100010000111 0100101101010001010101000000101111100011000110001111101101111011000011100010001001010010110110100111010111100110011110001100110010110100001100001100100010100011011110111100111111010000110001111010101101010010100010110100111000000011110011111011011100001111110011010010100100111000011010111110001011101010101010101011001111010001010010001100000110101101111110101100010110110101010111000010100110111010 0101100110110110110011000110101100111111000100000000110000111011011100001111011110010000111000100111010001011010110110001000110110010010011111100010011001011101110001101100010110100100101101000110110000001010111011011110011011000111000101011101101001011110100010010001011111001111101001001101001011101000010100010100111000001011110100001001010000010001101100101100001101011110001011011101000110101110 1000000001111111001110110011110110010001000010111111100100100011100110111010001001010101110000000000000111001101010001001010011100000101010100001001100010101000100100001110000101010100001001001001001010100101000000101011010000000010100100110011000101110000100010110000110011110011000110101000010010010100011110000000110010011100100101111101100001000110100111000100110001001001111110000000111010011111 1100110101111110110101011111011010001110010101010011011101101100100100101100110101100000111010101010100100111110011111010111110011000110011001000001010110000111000101100010010010100100011001011110000111011001110101101111000011010100101111110000110101110110101000110010101010001000110001010001111001000111010001101010000001000000011101101100100111110011100100100000001101111011110110110001101001001100 0111000001010000010010000010111111010011100000000010010000110010110101001000110101111001010100101001001101101101110111100101001001010000111010100011001000011010000111001101111010010011101011110101011101110110111010000101101110100011111101001000001110100011101100001001010001101010001110111111001010110010010100010111110001001001101110010001110110110100111110010110000010000100101010001111110010001011 1001001110000010011110111011000001110111100011000011101110100111001110100100100100111111100000010001111011000111111000111011011000001010111000101111001100010110000100101011111011010110010010110001100011111110001100011111010111011001010111110011110111111001011100101110100111001011000100011111010000101000011010100110010111001010110011101110111100010100011001101100010111000110001100001010100011001010 0100001000010110110110110000100011110010001100110100001111001011010011110010100010100000001000001111111010110110011011001101110011010110011000010000101011111100010110110111100100000111100101101100100001111111000011111101101010000101110010000000001010100110101100001000100011101100011111000101110010011110010011001111001000110001100010110010111100100101101101110100110110001000101110001100101011110111 1111100010011001000011010100111011010101011011011101010010000101011010001100110110110110100011011000100010100010001111111100100101001110001010100000101101100010000001010001100101000001011011100011000000000011010010101101010001111000101101011001001111000111001111100001011010000101111000011011011011111001110111010100010011110011101011111100111000110100101001100111111111010010010000001100010101101110 0100101101100010111001000111010100111010111101101010111100111011110010111000011001101000000001100000000001010100010110011100000110000000011111100100101110111111110010011000000100000001100100001101001000001101101110010000011010110100011010001100011011001111011011010110101100101111100000011000001100001111011011101101101001100010111111001110001110001000010101111100111100010001000100101011011011100100 0101001000100000110000010000001111111110101001001110011010101011100100011001001001010000111001011010100000011010101101101100000100011111010010100000100001110000111101111001101010001000011110001010100111111100011001111001010011001110011111001101100110110001011100110010111100011101111001110100111010000010001010000010101000100110110101110101100011101001000110110100110101111011010001001000011100110011 0011100001100000001101011001000111100111011000000100001010100001001110001110001011100110111110000011000010001010010111100110011101110110101001000100100011101010011011100010000001011011101000110110011011001100110011011001000111001000011110111010001001000111111110110001101000001010111011010010000000110100110010011010010011000111111010110101011010111000010000110000100010100110011001110101111111100100 0101111111011110010110011010001110111100001111110111110101101001000110100110111001101111011101110001110101000101001011111010010111011011001100011001100110000101000100110010100010001100101111001110100101110110010111101110000101110000111010001100000010011101000111100001100110100110100110010001101001100011011000011111000000110111010101110011101110111010100110001000101100010101110011101010000000111101 1100001011001110101011110101111000010001001110111100001110100100100110100001110100101000111010000001010110100111111000010000101001010110011001000011000000101111100101100001110001011000000011000111001101111010110111010110010100011010101111101100100101010010101001011101001100101010000010100001111100001100111110011101110100000001110111011000111000110010111011001011011111001101011011011110101000010101 0001001010100100011110101010010110000000010111000001001110111111011101000101000101000110001101001011111000010100111101111111101000010111001110111101101110011011011010110011110000110101101110100101001111101111110110100101010110010100011101010111001010111100100011010011000111100010110101011100001001011111011111111100100100111011111100111000010000111101011000100111011011001011001000000101111100010000 0000101000000000001110100100111000100011110101000000111000011100100000101011100100000111111100010001011011110000000011001011100001011110010100110010101001000010001110100100010100001011101111000010010111001010111011000110000010101101100100110110100101011100110101000000000100001110011100100111001101011011000000111111010010101100010011000010000101100100110100110010000100110111000001000011001010101010 1001011100100101101111111110100101010110001011001101011100111001010000000010010101011110111010011011101011011100111010000100001001101111101101010101111111001011001000101011011001011001101111100000111101000010110000110101111100010101010010100110100111110110000110000000111100110100001100110111110001011111010111010101111101011001000110111111011000000011111010111011000111100001101111110111100001101001 1101101100011100011001011111000101101101111101000101000001000101101100010101110101101111001111110001001001111110010010100001011101010011101110110101011000110010100110010111001010000110000011010110011101001101001001011001001010000001101111000001111100110100011100011101110001101011100100110100010001101010001001011110101011110111100011010011000100101011000100110000000111000010011110000111010010011110 1001110111010111101011001010000011001010011110111110101101111110100101011010100110001110000011001111111111111111010100110110110101101010111010000010001110101101000001011001101011111100110010100101100001101001111111100110111001110011011101011001001110011010010111111111111000101011010000101010001101000000110101010010100101011111111011110001110110100100100100010010011100010100011011110001100110011000 0010000110101101111111000011100101110010011100110010000110001011000011001101101010011000011000100110000101110110010100000101101110110010111110000011100010000000001011001110111110010101100111110110010101110001100010010000100010000100101010111111010000100100001011010011010010010100011100010000100001001000100001101111001111100110011001111011101000001011111001110001100101011010111010100101110100110010 0000001101010000001000100000001100110010110011110011000111010100001111010011011001010000010111001000000011010001110101010110110101100110100000000101111010001001110100000001100101101001111011100001101110100001110100001010111111110100011110101010000011101010110001101001101000010100111100100110010110011011110110001011110110000110011000101000010001110000000010011100010101010101101111111001101100100100 1110101000110001100000101110001001000001011110000110001000110011110110000100100111011111000000010100001001001101011010111111101110000011100101000101010111001000111010100001011000000100010111010001111011000101000110111001010110111011011111010001101010100011110010111100101111010111110011011101110001010010110011110010110000100100100011110100000101010101001111110001011010000000110111011001101011100110 1100010100001001101000001011100000101000101101001011000111111000011001011100001100000010100011010011011100010010111101110110001010101101110100010010100011111111001111100100010000100111111111010001000000000111000100100100101010100000101111001101000001101101001001100000001000101110011110101010000100101111100000010111010000101110010100100011000100101111011110110110101101100001000000111100011101010011 1011101100011010101000101110011010001111111011000010101111011011001010111111000000000101100101100100111001110111101101001011010011011101100010001101111001101011011011001101101101011001011101110001100011011010110111010110011001011011100000110100010101011111100100100010011010100011101011100001000001010010000111101010010000100100111110101011001011001110110000010011111110100111111100111011010100110101 0010011100101000000110001011111100000011100111101111111001000000001110110011001100000100111101110101110010010000110001101111100100111011110001011111011011110110100010100101100010001011010000011011101101011011100100101011010101011011111000101111000101100100001101010011001001111111011111001001100111001111000111100000001011001100111101100110100010100000101000011101000000000000010001110100101011011110 0001110101011010101100010110000010111000000001100001110111101110100111010100000000110001101111110111111110010010111111000010011010000111100001111011000001110101010001000011110101110011101110010101000010111001000001100100101100100011011100110111101101100011000000000100010001110101000111011010110100101010000001000101100111110101101011100011100000100011110010001010110100101100110100100101110010001011 1000100000111110010110110101001001001101010000011001111111001111010001011101100010110110111010100110000011111000010101111111010111000010111100001000111011000111001011110101001110000000010011101111010010110101110001000101111010001011111111000101110100110111000011001010011101010001110010000011011011101011111111101001001010110011000110001101100010000011011000110101100011001100100101001011110000010000 0100010001110110101111110100101000000100010100111100000100110111110100101110001100010111110110100000000111110001101000111100111101010010000101110000100111111111010001011011111010001000101011000101010100101100111100111011011001011110010110011001010111101101011001011000000110000101111100110100000111001000110110000101111101100011000001000101110010100100010001001011000010001100110011000101101110100001 0011101101010101000111100100011000111110011011000110000011000110011111101101111110110011101101001000110101010111100101010011001001111100100101010100000000011010110000001111010111010110011111010001111011011011011000111010110000101000001001010110000001011001111111010000101101100111000001111001111101100000101010101101111110010111100011010001011001000101010110011011001000100111100000101011011010100000 0110000101111010001011110111110100101111010111100001101101110001001000011100001001011110100010011000011000010111011000001011011100111101111111010000010101000001101000111111010110110000011110101011001111001101000111100101011111011011110111101101010101001001011000000010011110110110111111111100101110101000010100010011100100101000011010011000001110110010110001111010010111010111110001111101000001110111 0000100000110011001001000000100100001101100011110110110100100001011100101001000010001001010010111011010001000001101100011100001110110000110001011001110011110100110000010111101000100001111010001010110100111011001010101011011110010001110000101100011011010101000010101110001000000001100100010010001001011101001000101011100110110111011010110110000010011111101000101011110100000111100111111011111100110101 0001110011010110110010001101000111000010001110101001101000011111111011000001000000010000001111100100011000000110100110011000101001000001010000110011001101110111011010111011011111000000100000100100011100001010100010000001100001100010010100001011110110000011010001001110111100010011000011001100110001000110010001011010000111100010110000011101100110001100100111010100010001111100111110101011111001101011 1000100111011100100100111000001010011101100011111111111001000001001100111100111001010011101100110101100010011101111101110111010001101011011111101011101101010110000111001010011111011010111111101000010010010000000001101100100100011011110100111100101000100010101100001101111011110011001011010111101100110100010000101111010111011111111010100011110010100010010100011101111010010010011100111100001100101111 1101101111100011111010100011011010011110101110000011111011110101010111101011011010000011011000010111110001110100101100010110000000001000100111011001101001001110100111011110011111000010001010010000001101101110101101111110101111000101111010100000100111010001110111000000000101010011010101000011001111010011011100011010110011110010110010001011110000001110110011001000101111010010010111011001010000111010 1001010110011101111111011011001001010010000110110011101010110001100101111101000111110001111010010011001110001111011110101001101100000011001111011000111110100111101011001100001011100011110100100101111111100000110110101011100111100001111101101101010010101101111111100001000011010010110011110000110001001111111010110111111010111011110111011011011011111000001000111001110010110001100101000100111100111111 1101010011110110101010111111100110100100001111110101101000010101111101111101011111010101001110010011000101001010010010101001010010110111010110011110101111011000010111011010110000111011100010001010011010000110110000100111010100110011000011011000111001100100011110000100101110001000101001111100000111100100010101110111000100101010000111010101111101000000001011010100111101000000011110100011011110100110 1011011010100110110000101000101111111100000011000110111111001101110111101011011111101100101010111100011111000010001100101000011100010100111000110101011110101010001110100100011110101101000101011010110000001001100100001011011110000110100111110111110110110100010100101011100110001110011011010110111100101100001100100010100011011001001100110010110011000100001100000111110011001101111111111110010100100100 0001110011110110001011101010100001000110111110111010110111011000101010001011110011010110011001011110011010101111000100111110010110010101000000011110110101010011000001010001010000000110101100101000001111010010010101101011001110111110011101110111110100011010001100110011110111010000000010110101011111001001101001010101001100010100100101011110001001001011001101110100001011110111100110001101100010101000 1100011011101000111000000011111001110001010110011001100000000011001111111001010001111011100000111110010001001001011010100101111111000001000001110011100010000001101111100001110100110111111000101111001011001100001000100011101111011111101111011111110110101000101111110000011000000101100101001100010010010110011011100011110111010001010100011111011011101100111001001101011001011110000110011011111011111111 1011111100101110011001001110110111100101100011001001001010101101101101001000101101110001110011010101010001001110101101111100100110000010000101000011011110100101110100101010111011111011101101101100001011010110010101111011010111101101000110110111100000001111111011001000111010101001000100010001001101100010010101001101000111001100100110001111001010111011000000101011000100110101111011110010101101101110 0000101000011110001001100011010001010101110110001111010000100100001010101001000001110000001011011111110100011111001110100100010111101001101000101000000001000011011110000101000000001100011000111110100100111001001110001000110110010010000001000100100110000000010101101011111011010100111010000001100011101001001100000110000111111010111110001001110100010110101111000000111111010001010110101011000001001000 1011100101000010000000111100000010101001111001010111000111101010110000001111101000101110000011000101111110110111011011110011101111100001011011101001010001110101110111011101000001000001111111101101011101100111001000011010100001011011111000000111011100010100010100111011011010101010111001100010011101000111111000001001101000111001001101110011100010011010011000110100011000110000010110110011000000010000 0101110111010101101001111100101101001000011111101010010011110000110011101101111000111101101001111001100111001001100110111110111011101100111011100101011111110111110010011110111001000100010101011000101101111111001101000010011100011011111011000100100110011010100110111001000001001100010001111111010100011001110010100010111000101100011111101011010111011101011011000001010101111001011110010001110111110011 0100001000110010000111011101111111111010100000011111100110110101000010101110011101010100000000110101111011010001000001010101111111111000101100001100100011011000100001101010000110000110101001001110110101010011010010010001000010100000101010101110100011001010001100000110001111000101100101000010110000101101111111010101101011011001111000110100001110100000101100111100111111000011100000010010011010011101 1011000001100010011111011111011100000100000111111101111010000010010110010110011110011001100001010111010101111010100011110111011110100100010000010011000111100010011100011110100100111010101100001101110110001011111100110111100000110010101101001010011111010001100100110001011101011100101011110100110100011101010011100101010001110001111010001011001010100100100001000011100110010001101110100111000101111000 1110101010111110000110101001010000001010001100011011111110001001111000001110101000101101000100111110010111110100111000010010010101100011010101010111010000111110000110100101011000101111100100000010010000100000011011011100111110110111111100010000001000000011000111010001111011001111100001110110110110001011111010010101111111001100000111000101111111010110110001011110101010111000010111011100111101100001
cTrader Algo

【cTrader】スクリプトをバックテストで使ってみる

1/2/2021 1/8/2021

5年以上前の記事です。内容が古くなっている可能性があります。

スクリプトの動作確認をしたい

cTraderでもcBotのOnStartにだけ処理を書くことでスクリプトを作れるよ、という話をしました。

しかしこの作り方だと、バックテストのビジュアルモードで試してみることができません。実行と同時に一瞬で終わってしまいますから。

単純なスクリプトならデモ口座のリアルタイム環境でちょちょいとテストすればいいかもしれませんが、少し複雑なプログラムを作った場合はさまざまな相場で動作テストをするためにビジュアルモードを使いたいと思うのは自然でしょう。

今回はスクリプトをビジュアルモードで動かすための作り方を紹介したいと思います。

 

バックテスト時の動作だけ変える

やり方としてはバックテスト時の動作を、リアルタイム環境での動作とは別にプログラムすればいいのです。

IsBacktestingプロパティを利用して、バックテストのときだけは、起動後ボタンを押すたびにスクリプトの処理を走らせるように変更します。

(同じバックテストでもビジュアルモードのかそうじゃないかかでちゃんと振り分けたいという丁寧な方はIsBacktestingではなくてRunningModeプロパティを使ってもいいです。)

ボタンの使い方はわからない方もいるかもしれませんので、以前作ったAutoFibonacciを例に一つずつ説明します。

 

スクリプト本体を別メソッドにする

OnStart内に書いたスクリプト本体の処理を丸っと別メソッドに切り分けてください。名前は何でもいいですが、ScriptMain()とでもしておきましょうか。

最後にStop()を書いてる場合は、これだけは消してください。

//-----------------------------
// OnStartの中身を別メソッドに移す
private void ScriptMain(){
  //内容省略(OnStartの内容をそのまま書く)
    //Stop(); この行だけは消す。これが残ってるとボタン押した途端バックテストが止まってしまう。
}

OnStart()内ではScriptMain()を呼び出してからStop()を呼んであげれば、動作は今までと全く同じです。

 

バックテスト環境でだけ動きを変える

続いてOnStart()をバックテスト環境でだけ動作を変えるように変更します。リアルタイム環境では今まで通り、ScriptMain()を呼び出すだけですが、バックテスト環境ではScriptMainを実行するボタンを作って、チャート左下に設置してます。

//--------------------------------
// OnStart内でバックテスト時の処理振り分け
protected override void OnStart() {
    if (IsBacktesting) {
        // --- バックテスト環境のとき
        var button = new Button { // ①ボタン作成
            HorizontalAlignment = HorizontalAlignment.Left,
            VerticalAlignment = VerticalAlignment.Bottom,
            Margin = 20,
            Text = ToString(),
        };
        button.Click += (_=>ScriptMain()); // ②動作登録
        Chart.AddControl(button); // ③チャートに設置
    } else {
        // --- リアルタイム環境のとき
        ScriptMain();
        Stop();
    }
}

ボタンをを作る処理は、①ボタン作成と同時にプロパティ設定、②ボタンの動作登録、③ボタンをチャートに設置、というだけです。ボタンの場所や色変えたければnew Button{}内をいじってください。(参考:Button)

 

完成

これで完成。コード全体載せておきます。このままコピペしてビルドすれば動きます。バックテスト(ビジュアルモード)では左下に”AutoFibonacci”というボタンが表示されるのがわかると思います。

using System;
using System.Linq;
using cAlgo.API;
using cAlgo.API.Indicators;
using cAlgo.API.Internals;
using cAlgo.Indicators;

namespace cAlgo.Robots {
    [Robot(TimeZone = TimeZones.UTC, AccessRights = AccessRights.None)]
    public class AutoFibonacci : Robot {
        [Parameter(DefaultValue = 25)]
        public int Period { get; set; }

        //--------------------------------
        // OnStart内でバックテスト時の処理振り分け
        protected override void OnStart() {
            if (IsBacktesting) {
                var button = new Button {
                    HorizontalAlignment = HorizontalAlignment.Left,
                    VerticalAlignment = VerticalAlignment.Bottom,
                    Margin = 20,
                    Text = ToString(),
                };
                button.Click += (_ => ScriptMain());
                Chart.AddControl(button);
            } else {
                ScriptMain();
                Stop();
            }
        }
        //-----------------------------
        // OnStartの中身を別メソッドに移す
        private void ScriptMain() {
            // --- 対象期間のbarsを抽出して最高値、最安値のインデックスを求める
            var bars = Bars.Skip(Bars.Count - Period).ToArray();
            var highestIndex = bars.Select((bar, index) => Tuple.Create(index, bar.High)).OrderByDescending(t => t.Item2).First().Item1;
            var lowestIndex = bars.Select((bar, index) => Tuple.Create(index, bar.Low)).OrderBy(t => t.Item2).First().Item1;

            // --- フィボナッチリトレースメントの始点と終点を決める
            double y1, y2;
            DateTime t1, t2;
            if (highestIndex < lowestIndex) {
                y1 = bars[highestIndex].High;
                t1 = bars[highestIndex].OpenTime;
                y2 = bars[lowestIndex].Low;
                t2 = bars[lowestIndex].OpenTime;
            } else {
                y1 = bars[lowestIndex].Low;
                t1 = bars[lowestIndex].OpenTime;
                y2 = bars[highestIndex].High;
                t2 = bars[highestIndex].OpenTime;
            }

            // --- フィボナッチリトレースメント描いて、表示レベルを調整し、編集可能にして終了
            var ff = Chart.DrawFibonacciRetracement(Guid.NewGuid().ToString(), t1, y1, t2, y2, Color.Yellow);
            var visibleLevels = new double[] { 0, 38.2, 50.0, 61.8, 100 };
            foreach (var level in ff.FibonacciLevels) level.IsVisible = visibleLevels.Contains(level.PercentLevel);
            ff.IsInteractive = true;
            //Stop(); ここが残ってるとボタン押した途端止まってしまう。
        }

        protected override void OnTick() {
            // Put your core logic here
        }

        protected override void OnStop() {
            // Put your deinitialization logic here
        }
    }
}

 

 

動作確認だけでなくトレード練習にも

ボタンはいくつでも設置できますので、このボタンでスクリプト(なんらかの処理)を呼び出すという処理は地味に便利です。

例えば発注スクリプトや決済スクリプトを自作して、スクリプトだけでトレードが完結できるようにしておけば、簡単にバックテスト環境で売買練習ができるcBotが作れます

参考までにボタンを複数設置するときのサンプルコードを載せておきます。ポイントはボタンを設置するためのパネルを作ってボタンをのっけてからそのパネルをチャートに設置するというところです。

(直接ボタンをチャートに複数置くこともできますが、パネルに置いておいた方が後々なにかと便利です。)

ちなみに、下記コード内のOrderMethodとExitMethodに自作の発注スクリプトと決済スクリプトの中身を移すだけで、自分専用トレード練習Botが完成します。(このコードだとリアルタイム環境では動きません)

protected override void OnStart() {
    if (IsBacktesting) {
        var panel = new StackPanel {
            HorizontalAlignment = HorizontalAlignment.Left,
            VerticalAlignment = VerticalAlignment.Bottom
        };
        var button1 = new Button {
            Margin = 5,
            Text = "Order",
        };
        button1.Click += (_ => OrderMethod());
        var button2 = new Button {
            Margin = 5,
            Text = "Exit"
        };
        button2.Click += (_ => ExitMethod());
        panel.AddChild(button1);
        panel.AddChild(button2);
        Chart.AddControl(panel);
    }
}
private void OrderMethod() {
    //発注処理 例:この通貨ペア1000通貨の買い注文
    ExecuteMarketOrder(TradeType.Buy, SymbolName, 1000);
}
private void ExitMethod() {
    //決済処理 例:全ポジション(全通貨ペア)決済
    foreach (var pos in Positions) pos.Close();
}
    

ちょっと前にcTranerというトレード練習ツールを公開しておいてなんですが、自分でスクリプト作る人ならトレード練習はもうこれだけで十分な気もしてきました。

あ、自分でスクリプトは作らないけどバックテスト環境でトレード練習したいという方は、ぜひcTranerをご利用ください。


まだコメントはありません

新しいコメント

コメントは承認後に公開されます。承認まで次のコメントは投稿できません。

cTrader's Life

© 2026 ajinori