0001110011001101111110010100100010010011010000110110100111100010100111011011100101010110001001000101110100011100111011001110000010010110000011110010110101000011000001001110111000111111000110100110001111101001000100010101011000110000100101010001011000110111011010000011001110001011000011000110000010011010010011001010001001101101010100100110001001011100110101100001001110000111001011100111110001011011 0010101101011111000000000000010101001100101000011000100011111110110100000001010011110000011001000110000100111111101101011001010010001001111011100010000110001111101110000001000000100000001011010001011110111110011111100100001001010110100010011011101011101011011100000011101010000010010001110001101010101000101110000001011011010000001110010011011111000010111010110010110100111100010110100010110001111001 1011111111011011000000000010101001100101000010010010110110110000010100001110001001100101011001010011111111011111101000001011011011011010100111111011110010011100011000010101111100011011100100001111000001100100001100111100101000101100110110100010110000010110101100101110001100110001001000000110100010100010011111111101110101010101011101100000100111110100101110100001000111110101011000100101000111100110 0001101100010001111001001100110101110100001011100001110111111010010001001111011011110110001000100100100011001110101100010001100000000000101000011011011101100001010101111111001101011110100010000010001110011000101000110100101001101100001110011110010101010011100010101011110001101100001011100100111010010001110110111101110101000011111001100100111100010100011011000010110011001011111100111001010100101100 1100110011101000001001100000110101000111011000111001011101110101100011001100010011110101101011001101000100110000011010101110011011110101001011100101111010111110111000111010100011010111000111010110001000001110111100111011001001110100101000001111110101010000110110001001001110100011111011101001100100001101101000101000110010001010011101001110100110001010100110000001010010101101100010001010000101000010 1101111111101000000000110101100111011010110111100011010000000010001111010111001011011100000100111100000100011011011000010001100100010011001101111010000100111100010011010111101100000101100111100100101111000111000101011001100111011001100000000001000101011110101101000100110000110010001010000001000011010101001010110010110001011110110000110011100000110110001001100101111111010101011111010000011010110011 1111110111100100100001010010001101010000110111011111101111000101010100000001100010011111001011101010101100011111100011110000001011001111011111011100100001111100100000010101111001110010110000110001111101101011110111100100011110011000101011001100011101101110110110111101001011100111111110110110000000110001100011111011111001010101111110111110110100000101001110010001010110100110000000111011000001100010 1101111101110001101111010111001010001001110011100011101110010001011101110000011000110010011101011101100100011000100111011000011110010010101110111100001111100011001001100001100111111000000100100010110001111101111101000000001010011111010110100110101010101000011101000001000100100001111000011000000101000100001000111011001100011011010101000111010010011011001011101011000000000011011101000100100111010101 1011111001010101000011111101001011000010001010001000011110010010101101101000011110101011101101100111000010101110111111010000011101001010101000101101111111010101101110001111100001010101100111001110101011101000011010100001111111101010010101100101001111001110001101001001110100000011101011001100110001000010111100010000100001010110110011101010101011100110010001101001111100111110011001101001001100000010 1001000110000110101001011111001110010000111011111010101101011110001100011010010010110110110110100010110000100101100011010100010011000100001101111100101011000010100001000100111111100011100110000111111001010010011111100011011100000111000001011000001000101001011000000010110010000101001001011111101011110010001011101110011000111110101000000111011000100001011110110000011100101101100010010101010001011001 1000101101101110111100001110000100010010001101111011001101100100100100001010100010101101001100010010010011110011101010101011111110010010011110011010010000110100010000100010000011111011100011101110111100100110101101100010010001100010001010110100110110000100111100010110010101100100011101010110111011001101110001010110100000011100010100100111001110001010110000101000000000100011010000100100000101100101 0100111011101101110001000010000101111111110001100011011010011011001000010111101011101111011000011011101010011001101110100011111000111100100001100000011001111110011101000110110010100100001010110111110111100100000110010000001010110010100010110110101101010111010000101100110111101010011001011110100110001110000011111011001111001010111101101100010110101001000000100000010101110101011101000100000100101110 0011001101011111110011000111101000010011101000101000100011100011011110000011001100000101101010001001001000011000110001100110010110000110001001110100110101010101010011110100101001110000011111000111001110110011111000000101000011110100101011011000110111000100001100100111100000110010010001000101111011000001011110001100011110000000100101101011000011011111011110101000110010000010010110100100011011100110 0010011010100001111111110011110001000010000110100001101100101001010010000000001001110110111011100000101101001110100111111011001010010000001010100111000110011100100110010011111001101011110001011011010111011101011011001011110000000011100010110110011011110100011111011010001101100100100100101000110111100001000000000010011111111000110110100011111101010010010000101011010100111011001101110010111010101110 1010000101111000011110001010011100000100010001110001011100110011010111011101111010011110010110010001011001001010010101111111100100000011101100100001000000011001110111001010100101100000101001010000101001101100110000101111110011100011011000110000100011001100011000110110000001111011110111011000011100111010110111111100101110101100111000001110100101000001110011100010010011100100011111001000111110111111 1100000101011010111100101001000100010000111101101010010010000001011111011000111111111111111010110010010100110011001000101110010110001101010011110100001110110101110001100110001101011001111011110001110111000011111000010100000011101000011100100001111011001000111100110100001011101111000100100000011100010010011001111111010100000011111100011100011001010110011101110011111000010101001101011000010101101111 0000100011110100111010010110010000101111001000100111100111111100111011100110111010100010111100110110110000111101100111110111011110110000011111100100000001110111011110110011100000111010111010110111100000110001100111001011011000000010111110100110011110101010011110101111110010010001111100110101000100010010111110100010000110000100011110011011101110011000111111110111101010111101000100000010111110011111 0110001001001111010011001100111010111100101000110100011100100011011011000010110010110101011100111010001110100111111111101111010000110111100000001111011010001101010011110110111110111101111001100110000000001001010011100101110111111000011100101001001011010001101001100001010010101000011000011111011000100001110100101100010100111111110101100111100110010101000111010000011001101000000111110100111111100001 1101001100110101001101110011111010111001001010011010001110100100010110111010110100111111011110000101111100000000011000110111000101011011000010000111000000011011011001111101111110000000110001100100100000100001100110110111011110011110000001001111000011000000110011100000110101011111110111100011001010100010001001111000100001010110000001011000101111011011011111000011001000111101010111000110100101100100 0100111110100000010101010110111010011100011111001010100101100110101011110011001011100101010010001011101011010110100101001110011101001000101110111010110011010110101110010010100100110101110111010111001100111001101110100011010110011110000110101001011100001111111000001001110100011010010011101001010000010110011001000111110100101101000001001010010000010011000111111100101101110100101010010011100001100011 0101011011010001110110100010000111111101010001100010001010011110000111011010010111110001000000001011011010011110000010011011010101111101001111100100101011000110111101011010111000001010010100000000001100010101001100010101110011001010011010010101000011111100111110100011010110000100001101100010000011100010111101101101111100110111011001101111111001010010110111001000111100100110010100010010010000000110 0010000011001111110000100111101100011010010001111011001110110111001111100101011001010100111111010001111001100110001110100110110111100101000001110110100101001100011001000011000101111110001110101100010010111110110010100010010000111110010101000100001001101110110010010001011110100110111001101000000010101101011000010001100010100001111010011111000001000100100000101010111011000000000110001111010001111000 1001110000000001011000011011001011000100010111100110110110010110111111011101100011000101100010100101100111011010001011101000001000010110101000011000011011100100010011001011011111100101100111111100110010010111110110101100001000000010111100000110010000010100000011111101011001000000011110010100000101001101010011001100000010011110110110010110110111010101000010101000111111110010011000100010110000100110 0001111011110010100011110110110110001000001111111001111100000110010110010000001000001010101111001001011111111001011000110101011100110000100111000101010000001110011001100100000011000001001111111111001100001101000011110100110010010011101111111110110001011110001010101000011001101111111001110101011010011101001010101000101101100011110000010100101001001000111010100101110011001101100011001111011011100101 1101111110010100001001001010011000000100110110100101000111101101111011110110000110011001010001100110010010011001010101001000111010110110001100111010110000001100001100101101001100110000011011111110111110011100011011110010001001011000011100010110111001010001011101001001100100010000100010101101111110001000100000010000101101001110010010000000111101100101011001001011010000101101001000110110000000101000 1011101000010011001110101000101001000110000011111110011000011011001001100010010000000100101111111101001000011011111011110011110111110111011110011001000101110100010100010010011010110000000110111110101110001010110110101101011011001110100010011100101111101111011100011111001100101101100010000011111101100000111010100100110010000000010110100111100111011111110010001011100011000100101000010100000110001011 1001001011001001100111111111011000110001000000100001000101111000001000101001101010100010010101110101011101011110000111011010111001110110100100100010000010011101011001100101010110011001100111001001100100101001011011100011010011011000110001101101001000011000101100110010110111100100000100001010110100001010000011110111001101111011100011110111110011011101101100111010011011011111101001010100011010011000 1101111001001010100001010011110010001011100110110100000010001111100100101100110000011100101110100011000001100010011000010010100000000011110010010000111001011010110011011101011110111101101010000011101001001001100110100010110110011100010101110011100100100111001101001010100111100111011000110001101000100101101100011000000000111101010000000001000100100011001001110001110001100010100011010010110000011001 1101001001110111011001100111010100100001110111010100000100001001100000000011110101010000110111001101000100000101000100010101010111010011001101011010010110011011000000000100101101100010000011110010011010111011110100101100011101000111011000100011010101000101101000011011010101000110110110000001011111100001010001101110111110101001010000100010001010110101000011011000100000010010000100000011000000101100 0001001111111010111110101101001110000100010001100000011100001111001110001100000010110001010111111011100011100011000001110011000100001110111001000111101111000100100001001010100110001110111011010010001010010010100000110110000101110111111111101011011111100011011010011100111011111000000100010011110001111010110100110101001111001101000101100001001101001111011010000101011011011101001011100110111100101001 1110010110011000100010001111011100000011111100110001101101000101001101100011100101011011100011110001000001001011100110110001000111111100100001001010010000000111110110111111100010101011110010110011001110010010001110010111101010000011000011110011010101101111001001110110000001011101010111001011001011000110000000100000000000101011101110001010101101010111001110101100011001000100010100101000011110001011 0000001010101000010100101110011011010000100001110010011010101010001010111010000000001001100000110010010010011000101111001011101000100100111000001101111110100100011011110001100100001000101110110001000101111001000011000010100100111011100000001001010110011010010001011011001101001101011000110011110100011010110010111101000101111010100111010000101001001110000101011010100011100010011100110001001101010111 1011101111111000100000100011111101101100111001000011100001000011101110100011011101111001110001110110000101010100101101001001011011011110100010110000001011101101101011110100010111001111011000010011111110000001111101100101110101010010000000100110001011011100110101110001101001101100001100000110100001101100011001111101111011100111101101000000100010101011111110111001111001111111111101010010100010101011 0001010111101101001110001110111010111011111110001011000011000100010010001110101001010100000111011010001110010000001000110011000110110010001011011100111100001011010101001101011111110111011110011000001001000110010110101110100011101001111101100011100011001100110000010001011100011110010011111010011010000111111010011111011111110010110101001011101001101100011001011100000000100000001001011011100110111110 1011001101010000001000011100100110111000010010010110110011000001001100101100010111000000100100100101101100110000011000010111001001101000100010000001101001000110111100000110101011011000101001011000111011011111111100111101011011101100010111000111101101000000110000100100001000100000001001110011100010000101101101110011010001000010110001111010101011100110010001110011111001110111001010101111111100110111 1001111101011110110000010101101101001100001011011000011010110100110000110000000100010101111101011110001000010101101001100111001010110101010110001001010101011110001010010101000001010010111000011011100101111000011100110111100011110001011100001001110100100101110101001011111001001100011000110100100011110100010010100111001010000111000111100101110010001000010111001110111101010111110101010000111100000110 0100100011111111000001000101100010110100111000101100001011111101010110010111101011110011011111011101000000011101010000101101101111100010010001100011011000001001011111110011011000011110101110001011011001101110111110100010111001101001111101101000011101010100110001101011111111100011111000111001011011111101010001011101101101011111000100010101100111101100111000010101111001100101011011101010100011000100 1111100010101100000000101011101100011110110110000110000001010101110101001100001011101000010010011011010010000011000001110011010010011101101110011100010101100110100101011110010011111010111101110101110011000000101010110110111111101101101111000100100010010101111101011011111011100000110000111010001100001001011101111110111101001001111010001100010100000010110001010011110011101111010110100010010010101000 0101010000110101011100111101111000000011000110111100110100001100111110110101111000100000010110101111111101111011111001101001110000001000101100100011010111100110001101011001110010100001101000011011111100011000000101001001000011000011101000110010101100011000001011011011011010101101100111100101001101110010110111100110101111001111101101000011101111110110101111101011101100100000001111100000110111010001 1000011101111101110110010110110011110011010010110000011100100011101110011111000011001111101100111001000010001010010011100110000111101110010010110110110100101000010100101100001110101001000100111110001100100001100111110001111110110100011011011010110001011110101101111000111101001111101101011000101000011111011111010001100101010100101001010000100110011110110100001000000111101101000101001100000011100101 0111111101011100001001001010111110101101010110111010010100011000011011001000110000001001011111000000001110100010110100111101100111101111001100010001001111001001010011110111111010110100101001011100000011000011011111101111101110111110011010111111111111110001011011111110110010010001011011110110111101110011101001111001111010000010110011111110101110111111010000010000001111111010000010110101010110001010 1001101000001000010100010100000000001100111001111110001111011000011011100101110011100101101110010010011000000011011001111111010011110100000011101001110001101101100101010111101011011110010100110110001000110000010111110111001000001001001100010000110111101000100101011111001100111110010110111111011000100010111001010101011001001110110001111010111110101111110011111101100110010000101010001001010111101110 0000011101010000001110111000111010100110110111011000001110101000010010011010010110111000000111010101100010010000111111100100101110110110010110010110000010100011110110001001001011001100011101101100111100111010111101100001001110011001000111001001101000010110111010111100110001100100100010101101100001000111100111110001101100001111111101111111010101101100100100100110000010011001101001110110101110101101 1110100111110011001010000111000101111110001100101100010111100001100111000011001100100001011110010110010110010111001110100101100111101011001010011011100111000010101000111111000100000011000100001100101101001111111101011011111010011100100000011100101001110011011011001000110000011101001111000111100110100100110000001100111101010111001101100100110111000111001111101101101101000100100001000110100101110010 1101100011001000100110111001001111110100001000110111101101000001110001000110001110010101111011100000001111100110101001101010000011001001011101000001100100010111001001001110110001001101101110101011111110011001101001000000010110001001100001010000111000100000000110000101000001001001111011111010100110111101011101001101110111100100100001101011001001101111110110011011110011011111100010010010111011110011 1111100000101000010110000000001111101101000101000000010100110011101010100010011011011111110011111010000001010100111011100000100100110111101010110011111001111011100010110101111001010010001111101011010110010011010001011101011100000101111001010100010000110000110000111100010110100000010010011011010010110010110011001111111001001110100000000000010011110111001111101111011100111111010011000011111011001101 0000010001001100100111001001001111110001100100001010100101101110001101000101010101111110010110100000011101110110010010000010010100001110001011000001101001110011000111000010010000010001001011111101101110000100001101011011000010110000101001000110101010010010101111001011001001110100100110111111010111010010000011100100000110000101111101111100010010000000111011010101000111000111010110010110111011011000 1100010101001010000110010000101001100011000010000110100000001010101011111011111000101110101100010100010011111111100111000001100011111110111010111010101010000101100001100011010011101000100000010001100100111101100100001001010111000111100111000110111010001101100100110001110000111110111001100000001000001101011110111001000000010101101000111010011101110111000100001001010010010001101110010011011110010001 1101100000010100001000100011001111010110101010011101110110001110000100100011111111101010000101101000110110001101000111110000110101100101100110001111101001111110001010101100001010110100001100011011011100110101100101010011010010010101001111001110100101110001100110010000101010110011111000100110111000010101101110010100011100010110000001000101000101111000000111111011001011100011000101000000010010010101 1010001010010010001001101110001111001011000100101111001100100000011111000100011000100000000011001111010010001100101011100011011001100100101010010000110110010000000001001001100110100110011001001101111001101010100100111001101001101000111010011011011010001010011010010011100000000111101000101010101110001110101000110010100101000000100101110110101111000110100100011100010101011101000011001101110100010110 1101010100011001100011100101100001101101110010111000011100111010110010000000001010001100111101000100000010011101100011100001100100000001110111001101101001100010000111101011000011011100101011000000101011111001000000011111101100000101000111010000100100111110011001110011101011100001111100011110111111100010010010100000001101101101000111101100111110010110001000101111010010001001010110101110010111100100 0111000000000110110011011110111111100010010010011101001110110001100110110111110000101000011110111101110101100101110100001001110001111010100000101101011000010110010101001110011001110101000010001000010101101001001111101001001110010001101001100101000001010110010111000000111010010110001101100111111101100100000001001011001011001101111010000111010011110101101111110000101110001111101110001011011011110110 0101000011111110011010011100010000110000110111010000101001101110111000000101110010110001101010110010110011001001101001000110111001101111000100101100101100000001010000010100110010101001000001000001001011101101010111011101010010111001100000110100000101010111011100011101100101100110000000001100100010100011001101011001011110101100001001110100000001101010101000101010000011101110011010001100101110010111 1110011010110100100001011011001001000011111010100011101101111111011000100010101100000111000101100100001101001010100111100010100101000111000100101010011100111010010100001110010011001110111101100110010100111100101011000000110110011110000001000111011001001111000100111001000001001010011001011010111101001000011110000001111000000100011100111110100110110110101110000111101000110000100011110111010100011000 1010000101110010000110101101001011011000110110001111110100110001100011110010010001001101110011100111100000010101001101000111100001111110011001010011101110100110111011110110011010100000000001101011101011011101001001010111111011111010110111111111011001010101001000100101010111100110110000001101100011000001011011001111011101001111111000011111010011100100110010010001011001011100111111010101010111010011 1010110101001010000001110100101010111000010001010100100000010110001111101110101111011011100101100010111111011101111111100101010000000100100011011100100100011110101111111010111110011101000110000000100010111110000011110111011100110001100000100111010010100001111000001111101001011001011000000010011101000011111010010011000100110110110011001101101001011001010000001101010100111101101111010000010010110100 0111110000100010100010110111001001100001100110000111110110111000111100001110100110001101010110011011111101101111001000011001000110110101111100100111110111011000100110011111010011010011111111000001001111110010100111101110010100011111001010110110011001000010101101010101000101001001000111000010000010110001111001100010110011010111101101010101101000100010110011000011101011100010000000001001111111110011 0010101100101100001100000111000110100111111111110101000001110010111101001001111000101011111111111101000011111110001101110100100111010110111101011011011111010000101010100111111111011010100011101001001100000100101000010001101001010111101001011001111111011100011001101110010010100010011111101110011100000100111100100011100100101100011001111111101011001000111110111011001100001001000100110100001010111011 1111010010101100001011100110101011001001110110101011100001010100100111110000011110101000001001000011001000011001001000100010111110100100111100100010100001011111100101010010001010010010110100111101100100011000111110010110100101011101011100000010010100010101011100101101000100100011101101100010110110100001001000100000000011100101101001111000010011000100101011000001111000110001111100011011111010000101 1001101100011001001011011011011111000110101000001101110011100100110110100011110010011101101111001110001101100101100110100011111001110011001100111101101100010101000100011110001111111011110101000110101100000100011010010000110100101101100110011010101001101101100011101100110111011001000011010011001111011000001011100111010010011111100111100011100101000010010001101110100100001010001100100100001100111101 0000111000110011111011001001010111111110100000100110110001000110001111011010010101101100000010101100100110010001010110001101000000100110001100011100100111101111011000010111111011010011010010001001111000100110100110011110000000111101111110010111110111111010110011110100100110101001001110110110111001011101111011100111111011111111110000111010011011001001000001000101010001001110101110101011001100010101 1110010010111111110011110011010001100001111010111011000110110011100010100000001110000100000011111110011000001111110011101111111001111101001111101100010111110000011001101110110110110000001010001001101100110111010001101100110011001110101110101111110010100110100000001001101100111011010001110011000011100001000111111110101011110111100101111110110010101010100000111010011111011000001100011100001111000011 1010111011011001111111101100101110011110110110101011010000001111001110110010001110110001110100110110010111001111110100110000100000000010100000000100010101011011110110001000001001011111011100010101010110100101110011001010000010001101111001011000011101000001010100010110101101111101001011001110101110111001100100110010111101001010001011111101110111001111011010111101000100001011000101101100101111010010 0000001011000100101011101111111101001110001110111011100001011101110100001001100000101011110011011110111111101001001000110010110001001001110011101011101001100111110001010001100101100111111110011000101001101100100100110000010000100111010110011110100101011100100000010010001011001111101110101110001100011000100100101100111110100100100100000011011100001111001011011001011101101101110001000101000001111000 0001101111000000010010111010000111100111010011101001100001001111001100000101101100101110111010011100100011000000010100101111011011110111000100001001101100101101111110011101100000000011010101110110101001111001110101111010100111100100000101111011101000100100000001001001101000010101111000001101001001111011100000111111101110000111100000100100001111011101001001001110100101101010101001000100101100011011 1010011110001010001111000011000100010110101010011011110001000100111000010100011010111111100101010111011011010100110010101110111101010010110111000100101100010011001000010101000011101110001011000010111101101111011100000011110001111110001000101010010110111001110001001101110111010101011001100100111100111010110101000000011111010010100111111000100100110110010110010011101011110111011111110010111011000111 1011100100010001000000000001000000111010110111001011101011000010110101010000111101100111100000111101001010010111011111000110000000010010010111011000000001000100001111011011101111100100010101100011000100001011010101101010011010110011010101111111101011000001000010100010110101101101111110001110001110110101101010110111000001100111011111001011101110100101101000011011010001000000011101110000100011010011 0010111011111101111101111100110110111110101001101110001001000110100000101111011111101000100001111110001101011100001000101010110001101101000111011010101010011010111010010100011011000101011110100010001100001010010010100110001011001100010000010111110111110111101011011100001101110010100111101110001011001000010000101011010111101011111000101111001001000110101100001111111011100101111010110010011101111010 1001011000000010011000010111111000100101100110010001110001011000111111000010100010000110011011101100110011100001011010101100010011010101010111101101101101000000001010111011010101011100101001001010100010011111111101000100001110011100111110110000011001110000100110100111000001010101101000000010101110101001011101010010010111010100110001000110010000010001101100011111110100000001011001000101001101000101 1100100111000001010011010111001101000111000100110101010101111011010111010000111111100110000010111110101010001001110100001110000010100100101001101000001111000100101100011111100110110111100011101111001101100010101101110001000100011101000010000111111111011100011010100001111010100101100011110010000000111001000110101001011101110100000100011111101100101110011000001101001100101100010010111000010101010110 0110011010001011111101010010101011011011000110000000010000001101000010000010001010110011000101000100101000010001111111000001001001111001110001000111000111000101000011011011001001011011001000100100101001010010100110110010010010010001100001001110111001110000100011110101100110001000101100001011011010111111100001000010000111100111011100011111111010010111010011000101101001001011010010100010111100110001 0001100111111100111100101110010000101100000100110011000010010001000001100111100010100111111010000111010101100111010010100001100111010100011001101101010110111011000001010000111011010101001110111001100001010001011001001001000010001000110100010111100100111110000101001101001011101000011011101011110101000101001101000010101000010110110100011111100111101100111010001000101001000100101001110111010011101000 0110001110111011000011101001111000000010000001000000111100110010010111010111101111100111000010000011111010001101010110011100010001010101001110111101100010000110010001110100111000111001001011010001000010100111000000011101111110000110110100000100000111000100100001011101101011100100111001100101100110001011010111010010011010101001111101110110000001111011010101100111100001110011110011001001100100110100 1000001101110110111001011000111111001001110111001101011110100110110110011100010110101101001111110110011010001010001101001000101011011010110011011000110011011111100100111110111100001110111101100111111000001111110100101000100100110011110101110001111001001010011001110100101001111010011010101110000101111001111111001001011111011100111011111001111010101000000000110010111110101001100000111100110010110010 1101000010101011001111101111011000001110001100110100001100011110000010101011011111101010010100011010001100000000110111100011001001110110100111000100110000101001111100110110011100011000001111110011111001011111000111101111011001010010000011000001111000111111011011000100100010001110110000110100100010010001100000101000010101101001011101100110011100101001101101011011010100101111110010011010100110111010 1111101100111000011111010100010011101100101011010100010000110111101001101101001000101100010101011110010010110000011100110000001011010000101010100010011001110101001000011110000011111010100101110100010011001000000001010011010111011001001011100000001000001100010101011010110111101111010010101111111111100011101001000000011001101111001010001001111101001111100000100010110101100110111110000010010110001100 0000101011010101110100110000101100010110011010011011100111010010010000000100111101100010001000111000100110101101100101001001000110001000000110111111111011011111000110110010101001000100110000001110111110100111010111111011110000001110011110010011000100001111100001001011010110001011100110011110100000001111000011011101110111100101010001110010010101000110101101000110000001101010111010111100001000010100 0000101011000010111101111111001001100010010001010000001010111000111110011110000011000001101011111001011100011000000001101111101011100111001001011000101110110011101100001000101000001000000001101011001000000010100000001010100101011011011011110100100111101011010000101011001111010110011000011011001111011010110100010101110000111011111111100001111110110010111011011011010011001111000100001110010100111001 1100001100101010010011001101010011010100110111000100100001010110110001110001110100111011100100110110111001011101000000111011010001111000111010001000100110111101110010011001011010010010001111101111110011101110101011010101000111011110000110011010100101110000101110101111100010000101001110101100000110010001100110101010111100010100000100000010110001100100011111011010001101100110010100100100011010100000 1001001000111111011001100001101111001100110101010101000110011010111011100111010010000101001110100011100010110110100110100010001000011011010001101011011110000000011110010111111001100011101011111110100011010010101000110011111011100010110111001001101110000100100001010100000000011010001001100001010001100011101111011100000100100011000110010010010000111000111011011101011110101100010000001111100001010000 1011010111001100100011110001011100000000010111111011100011001010001110111001100011010000110101011101001110001001001000101010101100110101101110111100001110110100111100001110001101100111000100101111010111001010000111101000011000010000101010010111000100011000010101100011110101000000101101111110111010110000111111111110001010110100101100011110000011011001100100100011110001011011010011100011011101111001 0101001001011111011011110001010011101110110100110010011110011111101011101100111100010110001001101010100101100010001011111100111111110100110100111101111100111001101000001001000101000000101000010101110100010100000000111010010010110010111101111111010001011000101100101101101011000000010000111101010010101001000110001110101001101011011100011111001001110111101011100101101101111100101110100000000000010000 1110110111000100011010001111000101011011100010100011010001111111001111011011011100111110111110010001000110000101010011010000000110101100010000010111000100010111111111001010100100000010000110100110101011001100000101010101111111111011110100011011101001010100101000011011111111111110010110010101101000011111101101010101010110010011101001011111011011010111110001111010101100100100011000101110110001010010 1111011100101000001001101010010111100111101110010101111011111110011010010100101011010101010111101000101010010011001110000101100100011001010101011111010011100010110000111011010100010001100110000010101111001100100000000011111001110101110101011101110111001110100011100010000010101110000000011111101001110100101010110001001110110011100111011000110111100010011010101100001011111011010000101110010100011101 1110001001110111010010100000101111101011000111101000001111001011011010010010100000000000101101010010111000011111010010110100111011001111101110011000000010100111100000001010101001101010001000001000000011001011111000101101010001100110000010001111010111110111001000010110011100110111001100001111100001100111001111100011010000000011010100101001100000010111000100000111011001110001010110100111011100001101 0110011111010100100100011101110001111110011100111010000101000011010111100001010001100001010100100100101101101000001000010101010010110100001000001010000001111010101100011111110100110101100010111101000111001001000110110100110100000110001011100100101111101010011001101010010100000101001000010100010110000100011010100111010111100111101001110000100000001011011011111100010110000000101101111100100101101001 1000111101110100100001001001001111101010110001010000001010101110110010011101011110010100000010011110110010100110001000110110111010110101111001000111000101101000010101100000001110100001010100100100111101110010101001111110010111110001000101110011100110100000100010010101001011010111110011011100000101010111101100101011111110010001010010000001111100001011000010010011001101111111111000000001101111110110 0100100001010011001001100100111100000011000100100001101010110110101000100011001001000011001101001001100110001101101000011100000100000011011000010110011010110010110001110110001011101110000011110010111011101111000001010100101000111110011100001100011110010000100000010011000101000010011100101110101000111101011100010001101101000001011010101010110001001100001010100110011110101010100110011110000111011010 1011111001000100111011110011111111101000001011010110010111101000110011110011111000110101111011101010010111000101011101001110000101010000001101101000110001111000101000101100111001111000001010110111111010111010010110100101101111001101010100000011101100111001111001001101110011010001010001101100000000001101101110100101011100000111000001000110011100110110100101010010101011011100001001010111110111010101 1001100100010101011001001111011000110011010010101110000101100000110100110001010100000010010111000100001011011010011000100011011011110111001000011111100110010101110100001001011110011000100000010011111101101101101101101101110001000101011001101010101101100010000111011100101010111111000101011010000101111011110011111110111100011001110001001011010100110001001001111111001000010100111011000111111000110011 0010110100001111111100011000100111100010001011011110111111111011101111101000000011110001101000111101100100111110001000000010101001000010000010010010111010100111111000010011100110000001101101001010001000001101001111001100011100101011111100001001110100100010100000011000100110110000100110110000101000011101100011110011100011101001110110001100100111111110001011111011010010110010111110010010110010101010 1011100010010110101110110001101110101101010101111101100100111101100110011111100010010000001110111100111000101000001010101110000011100011101110101110101101111000000001010110010101011100001100110101110101010011010100011010101101010011010100000111100111101011100101100011101101101001100111011010001010001110101001000111001110100111011011010010110010100101001101011111011101101001010010101001010111100100 1001000011010010100001101001001010001101011101010111001111000000010101100111110000110111011010001100000111010010000011100001111110001010101100001000101010111101111111111111000011011001010110100001111110000111011101111101101011001001010100010101011101001011001001101000101000100100101001010000101000111000001001111011010001000111100001100110000000000010111110101010100100110101001111010111111011110000 0001111101010010101010101010011011110101110100101001111100111010011001011010011000010100111100011100100101011110100111101010110010011010101101001010011100001011000000111100000110001011011111100110011110100000101111010011001100010010101110001001001010000100001111110010111010000100110110111010110000011100110001101011000111111111110010111111000010011011011101111111110100110000111110101001001010001000 1101101011100110000100011100011100111011110111000011111100110001100010001100100000100100001000010010101110111000010111100100000100111000011100111011011111111100111011111110111110010001100001000010001100111011010110000101101100011110000000010110000101100101011100100001100111000001101011010011100010100101010100011100100101101001111101011110101010001001100011111001010000010011111000000011101111011110 1110101001111101010010001011111011110011100001001101010011100100011011101110001001101100100101000000110110110100101000101100010110010111000000001010011011111010001001101101110000011100011111010100100100111101101011011000011101100000100011111001001101001111101010010100010011110110010000011010011011111111001111010110100000001010100101010101001010111101110101101011010000100001000100001101000100110011 0111001011111110101011011100001110001110011011100000101000111011111000000111111000000111010010010001000111100001011001010111010000010010000101011001001000010100101111101101100001110110111101100110010111001100100111000111111001010100110000100010100011101101111101101100011010001011110110000101000010101100100100010100000001011011010110110110101100000010111110011110011000101111100000110010010101010001 1001111100011011100101111001011101001110100100010110011010101100010110010001000011011000100000110000101001111110001001110111011101101001110111001000101011000011110001001111110010101000100110010110011111000101000110011001011011001100001110110001110100111100100011110100010000101011010100001110110101100110100011111110001100100010100010101111001010010000010110011010111001101010010001101101001010010000 1111000000011100100111101011101000001000100001011110111000000000110000101000111011100110011000000010000110010001101010010100001001010100010110000010101010000010111110011111001101010100111001111011010100010101000000111010010000011101001011111001101000001001110111101000000110101101001011000110100110110100110100110000000011100111101000100010100101000101110010000000010001110010110101011011111010100111 0111101111010111011100000011000101011111110010010111110110011101000111111000101011010011010101111010110100100000000001010011010100101000110110010110000100110000001101111110001000011000111000000001001101000000011111011010011100100000111000011010000100010011000001100010111010110011100101110110011100110110101001111110010010000100001100000101100101111111000110010111110001110111000110101110100111010011
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