1000101101011111000101100100001011101101001100011111000110101011110101111111101000000101010101101000010011011100010001111101011110001101000010010110000110110110101001101000001000100000011011101100011010100111001001010001101100101111011001010101110011100000011010000111110110001110100000001100011011100000001001000010101001111101110111110100111000110111111111001101110000100011001000110001100100111011 1011111110011010110100011100100100100001100100101101100011001001010101110100111000101000000011101001001101000001000111111101010110110100110010110110101100010100110011111100011100000001111011000101101101001001000100001010110010111110000001111011100001000111000111101101011000010110001110110110011111110101111110111100111010011111000101101101010110010001111110110110010000010111011011001000011101101110 1011010010010100001000000101011010100100000001111000001011010101110100110110110101101010100110110110001000001111110000011110011000000110101010111101001111001110011110101010010110110011010000111011110001110101000001001111101110100100110000000001011111001111101111110100100011100001111010110001111011101101111000110101110101001000010110101110110010101000001010101100000000001010001011101000110100101110 0000101011000110010100111010001010100111110111011110011000011000110000101100100101011100000010101101100000001000101010011011011101000010011011000001110111101011010011001000001110000101100000110110010101110111011111000000011111010010100110000100011000101010110001011111110100111001010000101111010100011100101101100100000111100011101100001110100011100111011111110000000010110100011000101111010100001110 0011001110110100000101011010111111011001110001000111111101010001011100000010100000010111100011101010011111101101101011010101010010111000011110110001000001001111111111000100111100000000001100001100010001000100100011011010100011110101010100001101011110001000110001111000110111010001011111100010101100000010100101110111000100111010101111110100001000100100001101111111010001011000011101001101010011001011 1000011111111001011101111000011111011010011110101111001000110001110001100001011101001011101100011110011100101010110001111011000111111101101110100010100110101101111011001000000110000110111000010001111000100111111000111010001111011101111110110011000011000110001011011011010100001111011101101000001110110011100001100001101010100010110001111001000110011101101011001110110100010011000111110111100111001011 0100110100001110010011010110101101101000100110100000100100000111011111010010111001101100110110010111000100000100001001010010111000100101101011000100010010001010010010101110000101111010101100100100100011010101110011011001001101010101011110110111010111100001111110001000011000111010101000000110000010110000101111011100001111001111110001100000111110110011011111001011110001000000011000111011010111011111 1010010000110101111001111010101001010110100000011001101001010001111001110101011100000011001100000111010001111010100100001010000111110101000010001001011101000010001011001011001010000111111000100000001111111101100101010001100010111101111001010101001011000000000001000100101100011110000001101000111001111110001111110011000011011100000110110101101010000011010001010011001100000111100011000100010111001010 0010100000010101100001010110100000010101011111000001101010101000000111100100010101101010101101101000011001111110000010001110111110100110011100101000010011111100101000010010101100001101010110110111100100100110110000010011110001001000011001011011000101010100000101010111100111011101010001111101100100000000001111100010100010111111101000101101110000110101111111111101100111010110010000100111100101001001 0001001110011101111000110011000110111011011100110010010100101001000010110000110010101101001000110110110001010010010011001001000110110111111011111111001100111110101111001100000001000011011011010101010101101010010010111110001010101101000011111011101110010100111100000010010011001100010101100001010001010101101100001110100000101010000110010111010101011101111100110001011000000101011100101101001101010101 1001111001000110000001101100010010101001000111101010010110001110101101011010111001000011101011010101111100000110011100000111011001010100001111100101100011011101001011010011100110010101111000011110010101010000100010000110110000011011001101110001001001000001011001101111101100100101011100100101010101011100100010101000011010101011011101111101001010010011100101010011011100001010000111001011111001000111 1100010100100101100011000111011010010010101011000110001101001011001011101001011110010110101110011011101110111110110111001011010001000100011111100000001101010111010001011111110001110011000010101101011110110110101100101111111111100010111101010101001001010110111100101001110110110110100111000010100101100111011011111001101111111100111110011101011001100010110010000010000011011111010100010001000101010000 0111101010000011010010001101011110000100000010111100000011010111001010010101001111110101101000010000100001110100001100010000001110001100001000101101110010111111101010100010010011111001100001010100111001100010010000111001001011010101000001011111000100010101101111101010001010100000101000011001011000010010001000100010011101111000010010001010000001111000001101001011010011110001001110000000111101000101 0100001101111000011101100010001101000010111011110000001110000111111001110101101001101001100101010101100000011011010111010100001101110110000011101110000101000010110101111111110111010110101110100110100000010111100000110011101010111101110011000110010011010111100001110011000000111111100100001111000011011001011000001110011100011101101100001110010111100110100111001100101000100010010001101010000011001100 1111001000011111011010011111001000110101011000001111000100100100100110111101001011001111000011100001010100101011110011100111000001100100000010000001111001101010001111001000010110010001010000101000100001000110001001110011011000010000111110001001001010000011100010111010111100100110001101100100011111111011100011110001110101010010011001010011010101111111000011010001000010101011100111011110110111100000 0101011011010001101011111100101111111101000111010001100100101011101110110111001110111110101111010100101111000110111110111001001011100001010100000100000001001011011111111111100010011001101100111010100000001110111000011100110111000111000110001000111011010000100100010110011100100111100010001011100100001001100011000001111110111001011000100110010001110111100111001101110111111010011011001000100011001101 1001101011011110110111111010011110101001001111110011001001001011100011010000001110010101000011100010011110110111100000010101011110101111001000101100011000111101100110011010000100001010100011001111101100011110110011111100011011001010001110001111011110111101010000111010101111100100011011000110111100010001101100110000111100111001100000101011000001010011011000111010010011001111001011011010010100001000 0011100010100011110011100101100011000111000011010001000111110101001110111100011101001111110101000110100010111110100011001000010110011000010011011011101100111100000100000101100101010100101000101011101011100101001010101101000100111110111111100100101000000011100111011001011111000001010110000110111110011100111110001111010001101101100111011110100110001000010001011100100110010100011011110010100001111110 1011111001000110101000011000000001101100111010100010011011110110110000001110001101000111101010100010000101111101011010011011001011110010101001011110110110001110100101110011101100011000011100010100101010100001000101000110111010000101111000001010101101010101000001111111011100011001101010001001000110001101001110111110100110100110011101010010101111100001101010111011100010010001111111110110000101100111 1101110011001100001000101110000110000001110010111100101100001101001100100111010000010000010111111001010001111110010010010001011100000011101001001010001011011011111010010010001011000100101110111010110111011011101011100001001110100000001101010101011110101000100001000010101011010111100101110000101100111000011000100011110100110101101010111000011100001101011001010011010100010011011011000010011011100101 1101001100111000011100001010100110110101011110101111001011100010110110110101101011111001110101000001101100011110111000010001111111001010111000110101100010010011111100001100110110000001001110101111010010000010110111111001111011111000101110110010100011101110011010100010111100101100000011001100110110000101001101011000100101111110100101011110101001101010001010010000111110101011001001111101111000011101 1101001010110001000000100010111000011101000001011101101010111010000011100000010011010110000001000011101101011110011011000111000001001111111110111001111011101000010100111100010101110000001101001111100000111111001000011100100011100111010000001110101010001111111011001011000111100001101101101000011100111111001100110110011000110111010000000001111011000111101011011111001101011100101111011000001111110111 0000000010011111111111011001000010101011110011010110101011111001100101110001111011111011101011111000101101001010011110101001010000110100000010110001000101110101000101001111010110011011010000001000100100001011101101001011011011000101110011000011111011100000100111001100000100011011000111000000011001010101100111001011000010010101001100000000101111010011100111100001111001010000110011111110110000010101 0010011100110100000001110010110110000011110010001111111011101111001000100011100110010110011011100001001010000101111011110011000111110111000110111010100010010010101011000011010100100110111001110100110111110001100001100010010010001100101111011110000001000010101101100100011010110111010000001001001111010001000000111001100001101011110010101010000111000101011011101101110000100011011101001100001010000110 1000100001000010111101110010011101001011011010110100111000001111100001100111111000101001010011011101101111111100110101000111100111110101101010111011101101000011110010001100111101010010111101100110000101100000101000001111111001010001101001001110000101111000000000000110011110101001101000110100001011010001000001010010110000111111110011111000001001101011011101011000000111111100100110001011011010011001 0001110010011001111011011001010011100011100111001010101110100001101000010110111101000000000111101111100001010111000110010100011010011000011001000100101011100101011100111001001101011110010001101011001111101101001001110011000111100110100111101100100010000001001101100010000011111000110001101000011101101111010101001110111100101010111001010001110110000100010111111010100110101100001100000011000011000001 0001100111100100101010000010110011001111100111001010010001111011011010000010011110101101010011100010111001111011110110101101001000110011011110011111010000101101111011000001111000110110010110010001110101011101100010010111011111101011010100001101111011010001101111001001100010111101010100010011110010010010000100010001010011011101000101100101111010001100111001011100100101010010010111000000101111010001 0011010101011100101011000101000010000110101100000110001101111000010001110011111110000100111001011011110000110010001011100100100000111100110011101101110010010101001011001110011011100100110101010010101000000100010000000010011010111001101111101010110110010010111110110001111001110110111101100011100100110011101100011110011110110111011110000000111110010001000110110010010011000000101011101111000100110000 0101010010100111100001001101100011011001100010011100011100111111011100101011011000010001011100110000010001010101111110101011011100101011000100111111000101010100111000001110010010101111111001110011001100111100100001001110011110110110011010111001110011101011110011101101100101011110010001001111001111001100011000101000000011010010010001001001110000010001111001100011001010000010010011000100110000010110 1010001011001101110001110111010100110110111100001000100001110111000010101001011110111001101000010101100000000010110100101000101001100110101100100001101010111010011101100100000110001100001011110110011011101100110000001110101111101011000011010011110011111001100100011010001001011010101110111010110101011101010010000010001110000010010111101010111101101101011001100011010111010111001101010111010101001010 1000100001011011110010010011011110100101100010010111101100111100100011111000101101000010100110011001000111101101111010000110111110101000000000110000111101100100011010010011010010001110111111001000011000010001111000010110111100101100101101000101111100011101010101001000000111100011000011010111111101011000101100110101010110100101100101011111111111000001110100001011111000010111110100111001111010010100 0000000101010001111100100101111011001000110110111111101101101011000101111110010110000110111001111011001010100001000010000111101101000110110010100001000000010010011101000100000110101110001101010110101100101101010000001000101011011111001011100010100000011101100000011101000001000101111101100010110111100001110101000000000100110110010001001010011001000001110010111111001011011111100100010100111110001101 1111111000111000101111111110101100011111010000011111110000010010100010000110000101000100100110001010010011001101111110110000101011111100010000010100000001111101001111111010110110000101001001001011001100000010011000100001100010010101000010001010010101010110000000011110000101100010110011100100100001011101010101110111011000100111100001100010010100011111010110001111010011010000011100011001111110101010 0110110011100000100100101001101010101110100111110101110000110010110010001001101100001111111011010110011110011111000100100010110001111011010010100011100110010110010000101011001001110010001011111011000011110001111110010110110101101101110101010100010010100111011111111100011111100101110110011010010001010000010001100100010010001010111011001001100110111000101010100100111011010000101111111110001110001111 1001010010101111001001111011001110000101001011000100010101000011010100011101111100001010001001011000011001101010011001001111110111110010000100101101100110010101111010100011010010000101010110001001100001101010111010011001000100100010100010111000000000001111000011010000000101100110001110100111101101111001101011011001111001001010100000101011001000010100001100110011000101101000011110000011100111010001 1100000001100001100111000010110011001101111000110000001111101110101000110110010001000100101011100110000101010110000101011010011000110100000011010010100111100011001010011111101100000101000101011111110010001001110010010101010101000101110100100100000011111001001110111000111110001110010110101110111110111101110001110000000110111011011001110110011110010101001011110011011010110001001011010000110000101100 0110011011001010100000011110001000111111010001011100011111100010100101101000001111010101010001011100000110010010010111110010100011111010100000011101100110000000011111101100100011110000011111111011000101100000000011010010110001000001100101011100101101011001010011110110100001000101101011101000111110000110111110110111110010100011100010010111110000001010000000100010110010000110100000110010110010010101 1100101001010011011000111101011100011101111111100101010111111110100011001101010111010101000100111100011110111111111010110111010011001100001100101111010011011111101110101100010110001110101000100001110001010010001001110111000001101001101001000010100000000011110000011010001000000010111110011111111111101000110110011110111110110100001001000100101101000101000010111011010000101110111010111000111010001010 1101011100111101111101011110010010110100110111011001100000000110001101010010100010011101110111010111010110111001001111000001011000001010001010110011011101001101111110000010000001011011101011110001110010101010011001111110110011001110000111111101001100110101100001001100100100010110110000001001111010001010011110010010101001111111101001100001000001100101000001111100000010100001100011110110101110101100 0011011111111011111110110101110100101110110100101000110001110110000000000110000010000001000000111110110000010000000010110111000000011000001010110101000011001101010010111110100010000010100101010010001001100110001001010000111010010100011011011101010011001100000100000111110011001000010011101001111110011110101111011101010010011100101100010000101100010110101010110100010101101100110011100000000101000001 0011101010101111011110001000110010010001011011010101110011111010110110011100000100111001110011010111101010101100011111011000011110001001110110011100100010101010011110101100001011000110111011000100101110001001110011000110001010101111111000100101110010101010001001001000100100001100011101100101100000100111000001000000011111000011000110111000100010100110100110010001000100011000010101000100011011100001 1111101100100100000101001011000010010011101011111000100001010100111011101101000001100000010100010100001110010100000010011011110101010001101010110110110001000001101100101010110101110011000010100110100001101111111101111101111010011000101110111110101100010101001001110000111000110011100100111011010000010111111100011100010101000101001100111101001111110011001010001100111100100100111011101101000010100000 1111001011110110000010011111001001100010100100010011101010100001001100010100000100011001010100011011000001111101001000110000100010100101111110000100011000101001001001000001100101100111101011011011100100110000101000000011111100110111111111111011111000000110100110000000111111100110001100111011110110011000110111010101010110110000011000101000001100110001011101111101010110101011000110001110011100010011 0110111011111000011100000011111110101001000110010010100111111011100101001111111110011111010111000011011011110110110100001000110110010111000011100010101110101110010111100000100000010110010111110010010111001001011010001111011001110011000011010111011111100101001011100101111000000011010011001110110101111111111111101011000011101010011000101100011000010001101000010110101100110001111000100000011111111111 0010110111001010111101100101100111001110110100100001011000110110010100110110101110100010000101100101001110000111001101001101100101110010011001010001000011100110100111000101000100101100110000110001100111111000001110011111101101010101011111001000110000000101100100011010100100010100111100001110000000100001110100111010101110011110010001101101010010100100100110011100100000010110010001110000010101001001 1100111010111110011100010011000101100010110101110101100011010000100010011111001010011100010010001001010101010000111111100101011101001101111001100100100111110100010101010001000110111001111100100001000101100110010011111110001000010111000001000110000001111110011001000001101000011101110001000111001100000101010101111001010101100001000101110011110100110110110100000011101100101010011110101100101000110111 1101011111111110001101100011111110001000100011100100010111001001111110101010100101001110000110101001101100010011000000110101111101011101010011010111011110011010000100010001001100001010011011011001101101101100001000101011011100001000010000010101011001110100101111001111000000001001000111001111101110101111111110100100011100100101011010111101100111111001111100100010001011011000011110110001111100001011 1011101101010101110110000001011100101000011100101111001110011101011110100110011011011100101111100001001000001101101011100111101010100110100010101000000111001101010001101000001010101001111101100010111001110010100010010111010000100010100101010100110011100101111111001001101100110111100000010011101110101100100110110001101111010011001110100011101110111011110101011010010111010010100110011110110101100010 1011001000100111010010010110000101100000011100101000010101100111010001010000000111111000000110000010101001001011000110011001000011111001001100001111010101011100100001010001010001010011100011101110110010011110101101001101110000011111011100001101101111011000110110000110001111100111000100010010100110010001001100001011111101100111110110011110001100111101001101011111100111001010110101011000111001110100 0010001000001011000100111101000001010111011011100001100001001110100000111011001000011010001101101001010010100011000000100010000101001001010011100011100100010101010101010101001110110101010001000000000001110000011111111001000000010010000101010001000011100110110110000011101111101100000110010001011100111000001010000010000000001001001000101110111101111111000110001100111101100110011100011010010011110000 1110000110110110101110101011101011100110101000101111001001000010100100000011100101000110011111010110010110110000010010001101010010100001010001101110100011101010100101011000100110000001110110000000111101011001011100111101010010100001001100100000011111111000100011000001110100100110110010011010001001110001101011011101100101101100100111110101000110101111001100001100001001000111011100110111000101011111 1110110001011011000101110101000110011001000011010111110101100010111110000011100100000000100010000001011010110011001001010010100100011110100111011011110010001101110010101011101110101000001101100010001010011011010010110100101000111010101011000111111011000000101110101011000101011000110010101101011010111101001011001100110110110010101010101101011100010000011000110010101101111001111111100011101001010000 1100010000011010001000011111100011101011001111001010101110100000111011111000111011011100100111001111101011000001101010101111100111110010110000100010001001001101010001010100110110110100001010010111111010011010000111010000001011000101001000001001100110110100111000010101110101101011010010100100100011010001011010001011010111111111001110000111001011000001111100110111011011101111110011100101011000001101 1001001001111001000101100001000100011100111001101100111001000011100101000111001011011010010010110111010011100100000100100000111101000101100110010001101110101101011000011000110010000111001011111001001111000011101011011000000000110100000100000001110000010101001001100111101001111100100011010101101101111110000001010100011010100100001111011101011011111000000010011100011111111011010010001000001011101110 0000010011010011111101100010110101011011110010011111010101010000001000110001001000101101101101100001101111000000111001000011011111110000010000101110001000000000010000111110011100010100010100101111110100010100010000000000000011001001110000010010101100000101110010101101100011011001101011110101010101111000101110010011011101111110011101110110111100010011101001011011110110000100110000000111011000000001 0111101100010000001100010101001111010111000101111100110011101001000111000101000101101101111000001101010011110110111100010010110010000101111111000011100111000101001100001011110011110010010010100010010111000100111111100000010001000000101100001111001111111010100110000101000110101000101000010101001001001101001100011101101100000111100100101001111011111100101111001100100110000000001100001001010100011010 0000100110110110011001000100111001111101111100100101110100000101011110101010000011110011101000110010011010101101110000001011001000011101011001001101001000111110001000001111100101010101000110110110001011100000010111100000111100110000000101010111011010010001101100001100110001100001111010010111000101111000101010011111111101100000001010011100011101111100101101111000010011111111000101110011010111101101 1100111111110001001010010100101001001100111100100110001011011001101000100110100101011000100011111100101111000001111010000001000001000010111011010000100110011101101101001110011101010111101000000100110101101110000110011111000110101001101100011000111001111111001000000101010100011110111001101001111101101111101100011101101101101100011011101110100001010101000100100000010001011100100111100001000110101100 1110110010111001011111011000111000111100100011011100010111101010011001110001100000011111011000111110101001010101110111011011111001100010001001010000100011001000011110110111111001100011010001011111011111010010111100000001111010110001000111110000100101000110000001000010010101100110011011110000101001011100010111010001011000100010110010100001011111010011010111011110100000111000001111010100101001110001 1100001011100001011111011011111010110001000000010000110101111100101011010001001101011010110111001110000111101110101110101100000011111011111100000100001111111001010110000010001010000011010101101010001111100000010001000011101010010110011101000001001010101001011100101010001101000100011110011011101011111101011010110101001010101001110001101000001010001111000111001101101001010101110011101010100011001111 0110100110100000110010101011000000001011011100110100100111110110011010101010000101101110110110110110100011101000001111110001010000011111000001011001010110110101111001010100111110100110000110011111000000101111001100111011111010101101000010010101010110110000010010011111001110100001011100101011010011101011111011000111001100111111000111100001111011000100011010010100010101000110011101100110111000101011 1010011011101110101000011000010100000101101110001100101100010101001110110111100111000100000011101101011010011010101101111101100000011100000111001010001110010010100000000001011100110000101100110011101111010110011010001101100001100010000011010001111100111010001110111010000001000110011001110110010100011110001000111000000001101101111100000000011111001100010110010010101001000110111111100101111101111100 1110001101010000100001011000011100110001111101111110110001101001000001100101000111000011011111101110000110010001011010001010011111000100011001110001110110000010000010111100001001001011000000100001011101101101110000010110000010001101001011011011001010101111010010010011011010010101011100100011110101110101110101100010001000010000001101100001101110011111000101110101010011111111100100001111011111101100 0001000100000111100010000001001000100000011011001100000101011101100010101001000000110110100111001100011100001010111100111011001101011110110101011110011011101000110011110101001100100101111010001110001011101001110101101100000110111101111011000111110110011110100001111110100100111101101110010101101000101110100000001110100111001100101110001100100001001010010101100010010011100000000111110010111001001011 0101110001000110011111110010010100011010000101000100010000011001001111000000000000110000101001111110100100100111011111111101110110001000100010000010011110011011011001001000000001000000000110000001000100010001100010001101000001011010110100101001001011000010000110001100110100100111100110110001101110001100101010010110101010010011001101010111010100011011010110010001110010001111011111110111111111011111 0110101111010101010010101010100001010110100010010000010001111010111010110001100000110101011001011011001011001101101110111101111011101001001010011110111111011111101010011010101000100001010101000010110101101101100000010100101001010011011011000100001010111011100001110011010110101011101101001111001010100101000001010000010010111011001101100011010100000001111001111010101101110010100001000110101110101111 1110001001111110000011011111011100110110001101100010101101111000000000100110101011000011001001111011111111000001011101010101110110001011000100111001010110010000000111110110001010111111100111100110010000011000110010010101010011111101001110110001011001100010110110100110001101000110100100110011100100011101001010111101111001001101001100111100001110000001100001111100000001000100111010100000010001111111 0111100010000100101001000000001110000011100001010001001100110111100011001001010011001111110111001101111100101110100001110001001000000101011101000111001001001101000101001001011010001111011011110101011111110000101100101110111000001101101001111010011111010001110010000000000000110011011110100000101101001110111111010111111111001110110000000010001110110001111101001001100101110111100011011111010000101101 1000010010100000010001001011101001011101001111011110101001001011000100101011000010110001001001011011000100100111101100111000011111100101011010011100101011111110011010001111110101010000110011111001000101011110000101010110010000111111100101011100000101011111011011011111100110101100011101100010110001110100101001010010011001111111011011111001110001100101000000001001101101101001010110110111100000011100 1011000010000110011110100001011101101011110101001000111100111001011100110110111011001100110101111100111011010110010101111001111110100001111010000001101110010010011110111011001101011101110010010011011000101011000100100101100111111010001100001110001001010011000110100011011110111111011000111010100111000000010110001101011101000010111111010010110011011011101100011001010000011100011101011101000010011100 0011011110100101011010001101100110010000110110000100101101000011111001110001000001000010101011010011011100010100011011000110001110011001111001110110000010010001101110111010110011100111110011000000011100110001101101110010110000110001011001101110000111001111101111100001010000001110100011110101100100011101101100101111110011110001001010111010001110000110000000011001010011100110101000010101110100111100 1101010000100010011000011101011110001101111110110110000110110010110100101100100101101100101011011110110011011100001110110110100101111001100011010000100010010111100001010101110100000011000101001111100110000010010110101001010110100100000011110000111110010101010001101010010100010010011011100110111110111011010110111010100100100010010011111111000010110110101100000111101100101101101100000000001010111000 1000111110001011010001001001110000011110110100101111000000000110100010100101001101111100101001111101111101010101100000001100110011111000110100111011010101010111010011101010011101001101011110010100101111000000110000101101100001000010011010000100101110110100110000000010100000111110010001101010001010101111011100100011001000111100000001011111010111000001011001111101100000011111100001110001110010101000 0000101000101000111110101000101110111110010011010000001010000011000101011101011000110101000011011100000110010100000010101111000011011010001111011010100100001001101011011000011000000010100111000001000101101111001101100001010101110001100100000000100101001000110101001001101110101011011101010011101100110000000011011100001110010000111011110000010010011011110010111100111000001010000010010001000010010110 1110100110011010111011001011000101011101000101110011100111011101110011101111010101111000101010110110010111000100000100101010011100110001101110101101010111011001010001101111111100001000111000110010110011001000110100100100110000000101011011000000001101100010111111000010011100101010011001011010010010010110110001110100110101001110011111000000010111101110111101000011011111011111111110011001011010111101 0101010000010111011101001001010101100011000000101111010101011100010001101111101000000000100010101100111101101111010000100110100001100000001011110101111100111001111100000101011101101111011001100111010000011101010111101100000111110100011000000000010110100011011010010100110010100100100111010010111101111010101010010010100010111000111110101001111111001011101000000000100111011001010001011101011101101101 1111100001010110110110100000101111000100010011000011010101000110001000100101100101110000110101111101111111111001101110100010111001100000111111010010001000000001100011001110100011111100101101110101101111001000101101001000111011011001010111011101101101000010010100001010101100011000100110010010110111001110011010101100000101000101000100100101110010010010110010111010001110010010110100000010010011100010 1001011110100111001011100001010011001001001001010000110011001101001100010100011010111110010011000100101100110010001010100111011111001111011110111001011010011000100011100110100010100001001100110011011010101110110100101000011010010000000001010001001001110000110000000010100010101101111010101101101001100101110100001110110101000110111011100011011110010010011001000010100000001001000101111110100101110101 0110000000011000111010100100100101101110001101001010100100001111010110010100110000001110010110000111110001010011111010010001000101010010110111010010010011110110011100111011010001101110100101110011101010001101010000010111011001100010100111110101111100101100011001001111110011001010011001110000010001110000110011001010101110010111100110100110101000010010111100000010001000111110000101010001110001110111 0110100111001011110011100100101100010110001110101001001101110000101101010110010000000001101011100101111000100000101100111100001111010011001000011011011011011100101010000001000101100100011100100000010111010100011011000111101001101000000001011110101110101011101000011100000111111001100111000001101100111000000101111000010101100010100111101011001001100111110011101100000110010001111001100010111111111011 1001011111110110010010010001101100000001001100000010000100110111001001010010011001110000111100000101110010111001110110101001000010001101010011000001011000011000011100000001000001010000011111010011011010001010001100110101001010000001101111000110001110011011111011101101100010110110111111000100110100101110111110000110010101001101001100111110001000000001100111100111000010101100110101110101111010101011 1111010011011010000011011110110101001110100101010101011011000000101101010111010001100000110010111011000111100000011000010001010010000101000001100101110111101111001111101010001100001100101100100011110101110010010111101110000010101111010001100010100011010010101110010110010111100100010100110101101111011101110111101011001010011100001000100100001100010100100011011001100111100111000111000000010000110110 1100111001101110010110111111101111111001110111011011011111001111000100011110110000010101011011001110001100110000000101010101000111011101101111000000111011100011000000010010001000110111000100101101000100001011011101001100010110001010001010010011011100110001110001100001111011011101011110100100001111010001010011110011101010000110000111000000110001101100001100000111100010110100100111010111010010111100 1100000101111000110110011000101111011101101010101010101100000010011100011011110000110110000111110111001101110000010110000000001100001000101111001011101000110001100101011111000100000100001011011010001100100010100001110011010110100100011001100001000000011011001010001100001101101000000000100001111010110010011010000110010100101001101000011101010100100010111001110111100010101011100101000110000100100010 1100111101111001001001101000000011001100010011111001101001000100011111001000101100010111100100011111001001110101000010111100010000000100101000111110011110001110011011000011010000101100110110100000101101001111111111010000000101001100110100011110011111010000101001010011010000000100010001011100110001110000010000000010010111100100100110101100011010101101010011101111011100101101001101101111001000110001 1110101100001010111010010001001011100000111110001010000100010001101000101001000100101100111011100110001110100011101000110100010101001111100000101001001100000010101011111111011011110110001111011010001011101001001110100000000001111000100010011101001011011011110100010000011111100110001011111111101111011100110001100001111011100110101010000101100001010111101101001000110101011000101000111110010010001110 1001111010001101100111110100100101110001001101010110000111000011010111001110100011001100110100001100001111000110111110010110110000101110001000000010101000011110101000001100111100111110001100101111111101101011000110110001111110011011100010110100010000100010011011010100110001010010010101101111111011001101110011000111111101001111011000001001110101001011110011111111011111001100110101110001100101000101 0111010001000101110001011110001010011011110111001010000000001010001101000000001010101101101010111110101011010111101100000001010010000000110010001100101111000001001010111101111110011110010010000101011010110001101010101100010101011000110011101011101100110111100110101001101001000101110001110100001100111001110111000101100111011000110001000111001010011010011110000000111110100100000000101100011101110100 0011000000111111001100111010111011000001101011111111001011000001011111011111100111101101000100001010101100000111000001100101111101001000101001010010101010001101110010000001010100100100001110100100010111011110011111001001001101100001010011010100001100000010000101101000111100000111001101101101111101100001111100101100101011110011011100111110101111111001111011101010111110011111011100000001111001001101 1001000000110001011001110010110110010111001000100010011111010111001111010001110111101000010000111111110011000111001001110110111101110000000110101100110110000011011111010101011101011010010011110001011110101100000101110100110100010110010111010110110110100011001011101101011100000011101010101110100100110100010010011110110101101110101010001110100010101001110000110100111011101110111000110011010001001010 0000001011110100010000110110010100011001001111101111000010010100100000001001110100000110111011011101100111100010010011110110001001000011110110111110011110001111010001111010101110000101100010100011011001111101010110001101111111111111011011011100001000000110000111011100011111001111101101100111111111100101100111011010001001011010000110000110111101010011100001110001000110000010011110000001111101110110 1100011101010011010010000101000000101111110011110100101010010010110000111111101011101111011011100011011011001011101101011101101111010001110110001001001011111010010001011000110000101011101101110010001110111000101010011001101101011000110110111011000000110011111001111000000011101101010001001011011101011100110111011010010110001111110001101101111010111011110101110111100101100100000111010100101110101010 0010011110010110111101000001110011101110100100101111111011100101001001000011110001010000111010111111101101110110100000100111110011000100010101011110100001010011001101010011110001000000001011000011100111011010111101010110001101110001111101101100100010111001101110101101100010011101101111101111110001100000100100000011000011001100011000001000101111110011000000101100110000001110100111100001011001011101 0101010000100100000111011000000001000001001110010010001111101000000100100110110000001101101101001101010010000110111110111011001111010000001111001010111011000010011111001010101011100101010111110000111010100011011100011111100011101001011111100111100010000001001001011100000010111001101111011101000000010001100011000101000101101010011100101000100101101001000001101001001010000000011000010101000111011100 0001110100001011000100010001011011010100101100100101110001111111100100011110111111101000111110100001101100111101000100011100101011101011110101010001111110001100111111101110010000111110100110001000011010111001100010110101001001111001001000111110000001111101000011110011001010101000001111111100101110001010000110101100110111101000101001000110010011011000000001100101011101011001010111000111101101100001 0110101011010111011001000001011010010000101101111111100111110010111111000011101010100001010100111110011100110001010011100010001101000000001001011001100110000101001011001100110100111010001111011010100010001010110000100000100101100101010110011010011101000100111001101000000101100111001010100011101111011100100000101100001001101001010111010001111110001001000100100111101010011010101000000101101000101101 1111110011111111100111010000100111100101110100011110101110000111111111110100000011011000101001100100101010010110011100010001101011001001110011111101100111011100101111000111100100111100011011000011010110001110010101011010101000001001110000100011100110001000000011010000001011011011101100101001001010110111000100010010110111011011001000000000101101101110110110011111101000101000110111111011111000011001 1100010010110011101010001000111010010001011111001111101100000111100100011110100011000001000111100010000101000001100101101001011000101101111100000000110000000000010010001110010101001100101110010001101110010101100110011111000101111001101001111110110010101011100101101010001000000001110101101000110001100100110110110100100011011111001101110000100001011111101101111111011110101110011111111000010111101101 0001000111101101001001000011111101001011001000110100100001001001010101101011010110110111111101011000111000100110110100110101010100101010001001100110110010000011001111001101110001001110010111110010100011000100011011100010111000101001011001101000000101000010110000101100100011111000000101100010111000100100001101010101010111111000011010100011110011110000011010001000010001100111011001000100101000110101 1011000010101111011101000100001011110110111111101000111000010111101101100110011001110010010001010100101101100100111010000000001110010010100011001011100010101001101000010000101101000010010100100010010010011101000011101010010101000101010000111111101101000100111111010000110001100001100101000111110111110010101011110100101000101101101010001100111000101101011010101001110010110010100100011001100011010110
cTrader Algo

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

1/2/2021 1/8/2021

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

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

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

© 2025 ajinori