1111001010111000000110101001110111001000101000011010110000100000011011101011010110101111101100011110100101110100110011110001000001010001101001110010000111000101000000101111101100100010110011101110011010101101001010001001111001011100111100101000001101001110010100111000111011111110100100101101001101110000101011110010001000011100111001001111101011100111010111101011011001101011110101111111000111000111 1110110110010100001110111001001101011000001101101100100000000010100100000000101010000010000110111101111111001001110000001101100101010101010100111100100001000100101110011010100101010010111110011111111101010000101101010101000011010000110000100111000001101000010011000111100000000111010010111101000110111011010010001110101000001100010100001000100100101010001100010100001001100111111101010111111001001011 1011010001101011111010010010101011111011000010001101010010001011110010010101001000110101110100100111111100001100110010111000011011000001000101100001010000111101000110010000011111111110001011110101000101011011100101110001010111101010000111110101111011111100000010000001110000010110111010010111100101111100100101111011110010011011011011111011011010001101001001101101111000111111011101010000000100000010 1010010111000010000110111010100011011110010000010011100000110111111100100000100101101111000111101111010100101001110000101110110110100111110001010000010011011001010101010110010011000100001010101101011101100111010111011101011010100000000011000001001100001010001001011110101100000100000110001010001101101100110100010000111100111110001011011011111001010010101110100011101000001110011110001011011001110001 1001111000000011101111111101110011100000010101011010001101011110011011001101110000100100111010011000111000111001000001010000110001010011100010101101011111010100010111101111000111110010101001110111011000110100101110001111110011100010000000011001100010001101011100101110100111011001010000101000001011111011000100110001000110101001101010011010011111101000000000000000010000110100101101110000101110010100 0100010011111100111010100010100000011000010110000011110110001111111011011010010110011001100101011110000000101010000101000011100111111001111000110101101010100101011101100010000111110011001000111100011001111001011111111010111101101001001110001000010110010111000100111011000100011101011011100110011001000010010000010011001000100100110001101100000111001111010011011101101100110110100110110100101101110110 0100011111111001011100001000100010000000001101010011110011010011000000100000001111010101110110101110110100101001111110011111101111111111011000101011110000101001001110011010010000010111001010111110010001101111000110100011001011110101010110001100000111101011010110010001000000011101111101111100110101110110000001100000000110011011011111011110010010110000000101100111110100110111010010100111101111010010 0111110011100001101101111000110001011110010000001110001011011011011001110111110101011011001101001111000000101100001010010010110111010101100001011010101110011111101101000010010101000011000111000100110100001010110001100001011001010011000000111000011101100100101110010100101001110100101000111011111000100000100100101100100101011001001100010000101100000110000110111110001110100100101000101111100110101011 1011011111011100011000111000000011010001100001000001111111010011001000000001101100001001100000011111011001011101110110111110100100000100110001011001101101000011001001001110100011110001110000010010100100100010001111101101100000101000010010010101010000001111010111101111001000100110110100101110000111110111010111101000011001010111100100001011100010110110101111000001111110110110101100011010001111111110 1000011101000000000010101111011100000001011000100111111001111001010000001100100111000110011111000101100111011001111001100111110100101011011100001000010010100001101000110100000010010011011110100011101100010110010100001001011111001011101111100100010110110001001001110110100101000011101001110100011000111000101011000101100110111001000011111100001100000010101000000011011100100110100110100100001101001100 0101110100100011100001100011101010001001100111001101000101010001111110101101001000001001000100100101111001101010011100000001100101111000011001001110100011100001011001000011010000111110111100001111111001010001110000101110111110001000011100100110100000011110110101011110111011001101111010111011001110001111001100111101100101100000001001100101111101101011110001011101111001011001111010111001101110001000 0111111110100010100000101010110110100000011111110000100011001011100101100001111011010100000000001011011011000101011001011110110001000001111010100011000011011011010111111001010001100100000110101100010000101100111100001001100001011010110001101110101000100101100100111010010111010010101010100011110011110000001100101001100101001110111010001110110011010101101110000100110000011010100111001111011110011101 0010001111010111011000100000001100000011110011100111110001110110110111111101111011101000010101001110101010001000111011000000011010000101011010011110110011101101001101001001111111001111011111001000001000111000111101000011100100101110010001101011100001100011111101011110001011010110110110110011111001101110100011010001111111001111011000001110000100010100000010101111111000100011111100110000101111000000 1110010100110100000000101011000001000010100001001110001110111000100110110111010011011110101001101101010000001100101111101110101110011110001011001101100101111000111011101100011111100110111000000011011001111110100011110111011110011011010101100001101110010100000010000100001110010110100000100000000100010001101101001010111100110101000101101110110011011000001010000110001010101000000011110110011000111110 0111101000011100000100110001111100000001001001010001101001010001011101010001010110101110011001010100110101010011010011100110001000110100101000001011111110100000001110000111010000110110110100001011000100010000011111001101110011001010011110110010010010100100000001001100000111110110101010011110100011110001001010110101101110000101100010011110100110000111000111101111101000010001100010110100101101110110 0011110011010110011010010011100101001111000110100000001011011011100001101101101101101010111111111111100101000010100111001001111010110110001111001000110111111010000111010010010100010111000010001011000110010100011001101000001001001100111011001000111001100111100100100110001011001100000111110100011000101000000010111110001101001011101111001011001100011110110111110011110111110011001001011010011110111101 0000001111011100110101110011110000011010001010110000001110110101011100010111011010001110001100100100000111101000101010110101011000111000001110011111111011011110001101101001111000111010011101111100010110100001000001100010000110010001011010000001000010011001100011111101001100101101000001011000010010111101000101101110111110011110001001011100111111001111001000001101011010011001010111000001011100000111 1011101000010111110110011110111000001000011011011000010111111111001010110001010010010100000000010111100000000011110011001101111000110101010110000110010101011101101011010111111010011110101010011100111011000101110100000110100110111111110010100100111100000111100100011101011000000011000000100101110111100000111001001011111101011100001011010011110000110010101010111011010111001010100110111011001010000110 0010011101111010110110011110000101001111010000010110110011000010000111100100001110100011111010100101110100100100000010010110011011111000010110111000001011010011011111110001100000010010111011010110010001100000000001101010101100011101100011001010011000110000101000101100011000011000111011011100011001101010010001100100111111001110001011001110011011011011101000010001011000100110010010110111010000111001 0100110111011110011101000010101011001011001110100011101001101110110101110000110010011000101100010100101111100001010000101001110011110100000110111100010100100111110001011000001001110110110011001011010101010100000111111111011101010000011111000000000101111011101000111110101001010011110000010111001101100001101011101111010011101111101111101011110110110000101101100100100010101111100111101100111111000000 0010110111011100011110110100110010101001101011101011100100100010111010001101111101010100100110000101000111110110111010000001101001011010110011111010001000001001010011111001010100001001111010101001101000100101010111101100100110110010101100001110110101110101110110010010001001011011011010101010010010111001111011111111101001001101010111001111011111001110101110110101001001111000100011001101110000100010 0011011011100011110010100101111011101010000001001010111110001000100011000110001110100011100110111100110101000000110110011101001111111010111000110011110111000100010101010100010010110111111100011011101000111110111110001001010011011111100101001000011100100010001101100110110111101000100011101010001000111010010101100000001100101010000110011000100101000010001111101111011001000000110010101001110010001011 1101110101010011001010101000100101110011110000000111000010110000100001100110111010110011010101001011110000111101000011100001011011000100111011101010100101100100011000010110111100001001000111010101101010011000000000000011111111010100000110011101100011111011011101000100110101001001010101001001010001011100100011011010101010010111001000000011010110100111100100110110010000100110101010100010111001011101 0101000011100100011100000011011011000111010111000011011111010001110010000100011001100101000100010000100110101001010111010101101000101011000110111111001010000001100100111010010101001111110010110010101110101110111000100010110011010111111011011010010100111011010110011101101000011100100010101011110100010011110110100011110100101101001101111111010110000001000010001101010101001000100111001001011011101101 0101100101010000001000100101100010101110110110000111111111100111011011011010010001110010100000011101100111000011101111101110000000110000000000011000101011101001111111000110001011000011100101100111011111100101100110101101010111101001111111111100100000000011101100100001001101100011110000100110110110011011010010101000001111001001101101001100001011110001110011010001000010000000111010010011111111000110 1000011100010001111110101000010010100010011100110100010100000111001010100011101000110010101111010110000001001101101101001110100111001111101101100011000010001101001100001101001011001111010100100000001110010010000100100000011111100110111111110000101100010000100001010110111011000101101110010001010001001101001000010001111001001110110110111100110001001010100111111101010001010001110111010010011001000110 0011001001111001011001000001000100001001011110110100000010010000100011000110110100011000000010101011111011011101011001100111010011011101010100010111011111001001010011111110001101001001001101011001010011000110010001001010000011001110010001000010001000010101101001100110010111000110110111011010011011010110110101100011010000110101101011100110101111100001000110110010110110101100101111001100000100010101 1011101000110101101010001001111101011000111110001110000101111011011101100110110011001110101111001110100100100000001010010101000010001010000000010010001011111110010100101000011110101111011011010100001100001101100111110111110110101011101101011111111001010011111100000101110001001010111101111100000001010010001110000110100011100110101000000110100001000110010100000000011001110010001011101110100101101111 1011001100100000110101000011010010010101110101100100110111111101010001000010011100011001011001100100010100101010011011011010010111100101110000001100000100100100001001000110110010101011001111011100100010110000101101011111010010101011010000110011010001101001001011111011101001101000110001000110101000001001111111111100111100011111111010000001111010001101110110010001000111001010101010111101000110001101 1110010100110100100111111001010100100101101011001111111011000000101101011010111011111100001101000010001101001100101101010100111000101000001001001111111000110111101011101111000000001000101110100111000001110110011000111110010010010001110111000010001011111101110111000001011100111000010110110100000001010110100110111110100010111101100111011010111101101000101010001100011111110110000100010001011010110101 1110000000000100011010110100101110001101001100111011101101010010110010000011101011001011100010110001000010100010111111001111110111110000000100001000100011010111110101010101011101011101000101100000000000111000010000011110111011010100010010100100101011010100000010100001110110111111011010110111110100000010101000001101011110111001010011111000011000000001100010101000110111100110001010001001100110100111 0111110001000111111011000010001011001101111100001100000100111011010000101011110001000011110000010110101101100110110111101100010011111100010001111000111000011101100000001010000111110000110110011011100100110001101011001111100010111010111110010110011000000100001101010001000000000001101000010010101111111011001100001110010100110010011001001101000111110001100101100111101000110111010110011000011010011100 1001110000100111011111100011101001111110111111001001110010011010011000000011011011100110010000101111011110010010101011111000100101011011010011110110000111010110000001010110011011111101010101010010111100011001011001100000010000111011101000100111111101001111101010101011000010100110101111011011110110111101011100110010001011000000101000111100010011001110000001001011001001011010110010111111001000011110 0000111011000010101110101011100011100010001101101000110011110111010111110001101100010001100011111001110001110011100011101100001101000011100011100000001001011001100111100000101010110011011110000100110010000110011101001010100001010001110010100010111001010110101010111011110010001011001000010000111010011001001011111111011110111100111111101011010011100111111011010001110000010010011010001100100001111100 0011101010111010010000011101010100100111100110001000110011010111111001001010101000000111101110111110101101001010101100010100010101011100110110101001010001111011011001111101010101111111110010000110111001010010001110011101101111111111001001111011101010011001011010101110001001110011111101000010100111010111000011000100101001000110100101011000011011100001000000001101111100000110110111010010101100111110 0100101000110101101110000111110111110011101101001110111011011100111010001010110010111001110111111110100111011110001011000011010100011000110101000010110101000101101010100010011011100001100001111110011111011111111110101010001101100111101000000001000111000001100101011001010111001100110101001100011110101001010110100000100011110111101101010110000001101100010101110111001101111110101011011000000111010111 0101010010000100100000110110001111101110000100010100110101001010000001111111110001110010101110011011011100000010000111101001110001100000010000011000101001100000010011001100001101110010001010101010110000010000000011101100010110001011111010010110111010101110011110001111110001010001000001111001001101011010100111011001010010111010111001001001010010111001101100000001001011000111001011111000000110011001 0011001000000010110101101101110011001010110100000100011100010111000110011011110101011011000101111001000000110101001101101000100110110100101111100010011000000001001010010010110110110010111011000100100001000101000001100000111101001011111100101101001100011111111100101001110101101001011010011011011101110010010100101110101111100111100011101001000001001111111101011000110000010001010101011101111101111000 1100011011000001101000111101111111010001111100010011100110101101001001110001101110110001001101101010001011010010011010101000101101111111100000110111101100010101111010100111010100110000111010011011011000001100000000000101101010000100111000010110010011110011000000010000011001001101100111100010110011101100100011001101100101011110110111010000111111100101100010100110100000111101110100000011010110010011 1011001110010010100010110010011110111110000100110111100010000000001111010010100111011111000011000011110000111001100001011111000001101100110110000010001111110101000111100001111111110100110110001000011001000100110101101110010101000101000110011100110010111100001001111100100110101110101110110011011100111011101101010000110001011000100101011101100000011010100000100100011011101001011010100110001111000000 1100000110001110100010100101001111101000000100001110010101110010100100011001101001111110101111111110101100101011111001101111100001110000111000011010011001111111001111000110100001011110011001011100001101101000001000001110011111010000000110111110011110110100111100010000100111011000001101011100000000001110101101010001101110100001100001001100010001110001001010011001000100110111111011010111011000001110 1100011110011101111110101001100011100001100101000100010011001010101100010101000110100111010010000000101111010110110010101110100010110010100001110011101000011100001111101101001101001101100111101110011011101110111100111010111110011110111111000001010101110000100011110001000110100001101000110101110010010110000111111011000011001110001001111101110110011101100111100110110011111000010000101111110101010100 1110000100110001000010101101101100110010010101100001001111101011111000000110100101110010111110110101001101001001101111101001001111011001110101110010110001111010100101000101010010011110010101111001111011101101101011100110101010010000011000111011110010100010011111001011101011011001111100111100101110001111010011111100101000001100010000010110100100011111110001001001100111101111010010110000110110001000 0111100010101011111110101101101110100101001110110111110000110011111010110110010110100110100100000111011110000010100101110100100011010101101011000000101100110110100001110001010010011110111001011110111101100010000001010100100110110011011111001110001010011100001000100101110010010100010111110110011100000100110010101101011000011100100010100011011101110010101111000010110001011001110010001011101100001111 0001110010010111000100101111011100001001010001000101101000000101000001001100010000010011100000110011100111010100000010011011100000111111111000111111100011101100001010111010010001111111010111111110001101011001011000011111000110101011001111001100110101010011110011111000010111101110011111110011001111001101110011010000011101001010101001110110000010101110111010000001010011111101100110011001111010110110 1111001101000010111000111111010101110011000000101010100001111100010101000100101111000101000111010100101011001101010010111101100100011100010010110101110011100101110001000011000011110010110101001001001100110001011010010000010110010001000001000010110110000110010000000100101001011100110110111000110010001000101111101010110011100010110101111000001011010001111000011001111010011011100111100010100101011011 1001011001001011111110110100010100101111011101001001111111111100111101101000001111110101000001001100011011000000110010101101010111100101101110100011100011000011111111010101011001111000110100100111000001001110001111001010111110100101011101001100001011100000100000010110001111011110100000010110110011010001110111110101010001010010001000001101111100110110110101100010101000011110111000001100001000101100 0000101101100111001100011001000110010101000000010111111001001101110100101101001101110111110000000010011011001100011101111111011000101011101011010011011011101110001001111000011110000100001000110101101111101101110001010010000111100100010111101011011111111111100110110101110010110010101001011101100100110011011001000100001111001011000001000011001000100111000111000111001011001011111100101100000001001011 0110001111111111111110110011001110110011011001000101001010100111100101101011001110110111100100011011000100000000101000001100000110000010000001110111001100110101111010111011000010011001001000111110000000100100100100011000100010100100100000001001111101111110110000011100101101001110001011000001110111111011101110000110101011011100000011101100101111001100111011010010111101001000010100101111000100001110 0110110100111000101111011110111011000011011101101101101010001110000101110000101000101010111111110000101101000111110011000101111010011001000011001100011000111101101110010101001110010001000111110001010001001010001111110001110001011101101100000100011011100100111011111001010101110010010100001100001000100000011011101111001101100011001111010100100100100011100110011110011110000000110100001110011110111110 0100011010110000011100000001110001110011010001100000000100000010011101001110100010100100001111001010111001101011001000111101011000001011110000010001110101010101101110010100101010110100010001010011010010110011000100000111010111010101001111010010001101100101110000000010111101000001011100001011010101000000110011011011001101100010000110110101101101011010110001011010110010100100011010001001100101111100 0100100011001001001110000100000000010000011000001000101110010011111011101101100101010101010100111001101001101111010110000100000001100000000101101101011010010100110100001100011011000111101011110101100000000010011111100100000001100001111001011101010110011001000100010000111000001101101110110000011011101100100010011100001011000000001101000000110000110111001100100111010100010101010011111101101011110100 0111110100110000110100010110100111111000100000110111011111110001010101110111001001001001111010000011011111001111011111101000001000011011111110011000101100101011111000000000110011111011011010101100101000011110010100101011011100110010100001010110110100010101110100100011001100110000001001010001010010111011001110001011101011101001001111110101101001000000000001011100111110101110010000000011100101010000 0110011000010101011000011010110101000011010001001010010001001111000100110011011100001011000010111011101011111110001110010001100010000001001111100010110110010100001011100010101111001100001001011001100011001001111110101111101010011011100100100101111001011010100010101010000001010010010101000100100100100111111100100000101100010011001111111010000011111101001111001100100000101011100110111101111111010110 0011111101110010101110110111001000110010101100111101110000001111011000011111000110011010010110101111110111010001110001101110011101001000000000010101101010101110100010101000101011111110110111111010011011111101100100010000001101001100101110111111111000100110101001111011100101010101111001010010000101101000000000011000110010000100100001111000111100010001111001111100111101101000111001011010000001101111 1100101101111001111010100101101101011111110001111000111010110101101110100110101001000011001111111000110110101100000010011011100011011001100101101000001000100111111001100101100101001000101101111101010001010100010011101000001101111101110100111010000111000010010000000101000100001010101101010001001101101101011100100001000001110110000111111101010010101110110010110100110110010000010010111101101000011001 0110000111110001101101100001010000000100010110100001000111101011100000000000101101101101010111110111010100011100111001010010110111000100010101111111111001000100011111101110000111100011110010100010011001001111011011100000100101000101011110101110000000100111110101001010000000011110100101100011011111111100011010101011011011110110001100100110000111010010110001111011101101100001011110010101000010010010 0101110010010100101010011100001110010001011001001011010101001110101000001111011110000000011001100001011100100100001001010100010011100111101100010110110000100001100001011000011110101000101010010100011101100000010000011001000010110011101101001000010010100101010000110100010100001111011001011101011101100001010111010001011011000100010011001110011101101100010001101010011010110001100111010111110101011001 1100100000001111101011001010000110101000010010000101111111001011111110100100001000111111101111000000001110010000101010001000100011101100000010110110111001010110100101101010001010110101100010000000110101100100101011110100011100100100111010111101101011001101100100011011001110010011000100001011010010000111010010001000111110101001010011101101000010100110011000000000101011111000010001101101100100011110 1001011100101101101101111110110010101110101100001101110100110011010110000100101111110000010110000001111110001001001010000010111100101001010010111101111111100100110111100010000001111001011110101011010101110100011101101100101001010110010011010000000111000100100001010110101010100001100110110000100101001000111000001001101111010010111001011110110110001110001110100010010000101101111110111000001111011001 0001100011101001011011000001101010010001101111100101011001000111111110101010000010000110010101001111001110110000100001110010100110001001010000011001110101100001111010010111110110001101000100010011111000000111100010100010000111100111011110010011001010101100001011001110000000111101010110110110110000100011000110001111100100010110111101011001110111000010100101011001000010000111001010110000000100100101 1011011000101010101111010001110101101110011111110011010110101011101011101100110100101110100011100100100110111000100000100111001110100000111010111111110011000010000000110111011111010101111110111111101110000110101110001101001011010011110101001000001100101000100010001100010010010010100101001010000001110101010000011100110011011100101100101001111010111111011001111101111111101110001101100000101100110110 1111111111001111111001010101111010011100001011100011111010100001111010100001001000011001011111000010110100001000010110000111001100101010010010110101110110010110110011111001100111101001110111110110101101011000101011011101011000100011001111001100000011011000011110000100011000111100001011011010111011001100011111100000110111001010000011100011010101111000110111001110111101101101110100111101110001000100 0110010110110110011000111100000110110011110101111100011010010111000011110100110011100111000110010001100001000110111110100010111011010100110000110010001101111001011011011001101111111010101100010011010001001111010001001010101011111000111110110001001011010100000101011100000001100010011111110001100110110000110000101000001101111010111101010011001001110110111110001001010110000111111000011111110101001111 1101011010010100110000111101000100000110010111101010110010100111001000000111010101111111001011011110110101111010001011010100110000101001011011011100110111010101111101101011001110001101010000101101101110010111011110010010001011000000000110111000000100011111000011001100000100000110001110101000000001110010010100000100000000110101100011000000011110100111011001101101011001011001011111111101001001110110 1110011010001001100001110101100111101000001010011010101100111111001001100000110111000110111110101110010100001010010011000001000100111001000111001000001010111111010111000001101001101111001100110110001001010001010111011110110111100010000100110110010010101011100010011110100011000111001011110100100010011000100011111100111000110110100011000100110000110000001101011001111101001110011101010111111111010100 1111001110000001110001110001011101101101110001010010001000010010100000001110111100011011010000111110011111101010001100011011100001010001010101001101000110101000100100010000111110001111011000101110101100100111001101010010111101101101101001101010011111001100100101010011100100101110001101111111010001111101000100111101111100010101000000110010100001110011000000001010000011010100010001001000011101010100 0000100011001011001011001010100100001001110100100111000010101010101000110000100101011111111001000100000100010111111001110111110101000001110001110110110100001101010101100101100110110000001001100001011111101000010100010001011100000111100001011010111000010100011110000011000011111111011010010000110101010001101010000011000011001110110001011110100011000110111100101000111000111100110001111010010100000010 0011010110010111001111010011001010010110101100101000101101100100010111001011001111010101110100010000000010101000111100101001100111101011110011100100001000110001110001100001000001010101010101000001001111011010000001001000011110010011110001000111010100110111110111011000011100010001111111111011110100010110011111010101110101110111011001000001010111101101100101001111000010000110100101010101010001011101 0000010011110001100010100001110101010001011111000111100100001100100111010100000111010011101100011010000101101010110111000111000001011111001111001100010011101001001000011100100111010100100100010101111100100100101011100010001110110001011110100011110001011000100111000010011011000011101000011010010010000110011110010010010100010001011000001100110010111011101101101101010001010111101110010010011011001110 0110110000010011100000001001011011111101110101001000010100101000101011110101100111111010100100010101100101110001101111100001100010111010010100000111011010100100000010110010110001101101100000101110010011100011000101011000111011001111001011001010011110010010110111010100000100000100101010100000101111010011110000111100110100000001100010101011001100111000101011111001011001010100111010110001100000010111 1100100001110101001111001001001010010010010010100001000001011110000001000101011000000001110001010110101000001001010010010000000011101100100101010001111100110001100000101010101101101001011010011111011000111011010110101011100100001111000010001001111111100010010000101101000100000111100010110110101011111110100101111101111001001100011011011011111000001100001110010001010010000010101001101111001110001001 1000011010110100000011000110110101111110000101011110110011111110100101101001001111110101010011110011100100010101111001101000011010010011000111111011000101110110111010110000001001001000110110001010111101001111110101011011000011010110011011000011100011101001100101011011110101001010111001100110010011100001100110011010000100000101101000110000011000011100110000011110010100010110000011000110000001110100 1011100010110101111101100001001101000011101100111001011000110101001111101001010111000101101011001000111011101111100100001001110110011000000101001100100100000110000000000101110100001010000011011100110010010011000010110101101111010000011110101111000011010111011110111111110001000100011011111110100000100101001011111001111010011000100010110100100000100001110011001000001011011010011110000011001100100111 1011101110010111011100010010011110000110011011101011011110100101110001100100101100011010101100000001110110100001001011100111110011010100110010001010100110000111010101001011100011010101110101011101001100111011000000101000110011110001010000110110110001100110100000100100101101011111001000101000101111110111000000011011101111000000110111010000110111011010010100000110001001011001101100000111001001111010 1111110000010010111101111001001110100011011001111000100011000100111001010110010000110110100011000100111101101000110001100110101001001100111000101000110011100100101100010011000010000001000111010110001011110010101011101100111011111110101100000011011001001001001000001111111101001011001000010011010010111001101111000111110001000000110011110010000100101100001100110101110001111011101000110000010001000100 1110111101111111101001100011110001000000110000010000100111000110011111111111111111010100011110111010110101010000001010010010011101111111010101101110100110111110011100110010011110100110010100001111111110111100000001000001100011010000010001100111001111111100001001011000010110111000101000100001100011011101000111111101100111100100000110010010111001110110101000011101111011111000101000000010011000101110 1101001001001111001111000111110101100000000111011000000011100101110111001100010010011100001000110111110000101110011000110001111100111011011011011001011010101011110101101010000101111000111101010101010111111101100100111011000111110101000100100001010000000010100011110101011010110001001110010100100010101001000001011100110101100011101010011000001001001000101101101110100000010011000101000100100100001011 1111000110001001110111100000110001110110011100010000100111010000010000011000100110110010110011011010001010000100101010100011101011101010111111110010100100111000100110100110101100110001010010101101010100111111110100000000010010101100111001001010011001101000101000001011111110110001101011000100001010001101100111000001011111100010011101111111011011001101110111100000001110101000100010101111110010001111 1000100111001100000011001011000001110011001100111100100010110010101010111010100011100101100111100001011101011101101000000100111111011110011100000111101001101100110010011000100101011101010111111000110010010001100011101110000001110101100111100110001110011010001101010101010111000100011111100000110001100111010101000100100001101000110010110100111111100100110100110110101100101100111111111100101100000000 0101011010001011011110100110001010101011001011111011110000001101100001010100010111001110000111001001101110111100111100001101111101010111100100001010110011101101100101010000101110110011101011001000100101101000010110001010111101000111101001101110010110010111011011101100001010110110101010000111011110010011010000110110100111010010110100100111011110001111000101111111111100011011001101011110000100110010 0100001100100001110110101010111001011001010000000000011010000110011001101001110101010100100001101011110111000011001110100100110010010111111100101101110101011000110101001100010001110011000000011110101011000101000110101000110100010100001110100101010110010101101101111111110011011011010100010101111011101101110110011101111000010111100111000011110001100010011101111101000111000110101000011111110010010000 1000000001010110110110011010111100101100011111010001010000000010011111100101001101001100111110101110100000010010010011000010110001101100011111010100101011110001011110111101110010011010001110110100001011000001011000111100011100011100101011111110110001000101001111010111111110101000011001000010010110010010101001001011100111000100101100111101100011101001110111001010000010011111110101110111000010101101 1100000110001101010100000100011000111101101001010101010011100101001011010011101100011111100000111000001101010001101110001010101110111000010000100101111001011001110011001111000000001000101111101000001010101111111101101001101000100110111101100001110000111100000000101010100101000100110000000111111011010001110001101001110111000010011010110110110110000111111001101001101001000011100011100001000100111001 1000010010010110001111101010110001001001111101110010100001010011111101101110010111011111101000010100100101011111011001000000000001001101010101011000000110101111000011001100010100110111111110001010110110100010111011000101001000011111110110010011000101011111000000110101000000001001111001011111111010110111111011000000010100010101110010101110001100110101101010001000010101110110010010110011110000111100 1001011101111000000111011000110111001010100010111001000111101000000011011101101111010100100110011011100100111101100100100100100110100001101110001010110111000010101100110110101010000100111100110110100100110001111110111001110011100111000011111001001110110111111110010111101100010010111100110011001110100101111111101011100100101100001111010111101101111011110001011000011011001001100110111000010001011111 1100000111110101010011100001000010011001111111101110000001001010110001000101101101110110000011110100001110111101010010001010010001000101011001101001110110001011111000011100000101111100001100001111000110110010110001110010111000101010110000110100010010000011100100011010111001011101101111100101000010101010001010001111001001101101010010100000001111011110111010001000011000100001011100010010001011001111 0010000101011011100001110111000101110001100000001101011000101110110100000001011001111001101101101111110001001010000010000000010101000000010001100100111011000101100101011010000011101001001011001011000101100101101110000111001110100011101011010001011111011100011001010010001110010111101100000000100100111101111101101101000110010101100101000001100100011001100111101101110010010011111001100100001001010011 1001001111111111111110110111001011101101110000100100100100001011110111111000110000010111010110110111011000001000101100001001011111110010100000101111111000101101011110110110000000001010000110100000000000110010000011100010000010100010010001100001111011111110100101010000100000011100101101000111111011000101101001110100101001100111100000011101111000010000101110101001100000101001100100100100110110011101 0101010101100010011110001011001111000101111010011101000101001011100001101110110110011010011101111001010111011001101111110001001101011100111001000101011000000011110111101011001000110000111000101000010010000010100111001011000000110001010000001011010101110001000110110110110000001010101010100011010001011110110110010010111110111101000110100010011000000111110110011110011001101101111001101000100110010001 1011110000111111111101000101110100011100111101010000000110101101001001100110101000010001000001100001000000011100001111100001001100001101100010101011101010100101101000110101101100000000010111110011110101100000101010011000000010001010000110101011101011110010010010101101010101101011000110001001110100110110110101000110111101100101110111110100111111101010111110101010100011000011111000010000001000110010 1111010011110101101001001101111100011111100101000110111101011100110000110010100000110101001101101011010011000010101000011001011100110101010001010011010000111011100000100100110101001000111100000110100010100101100010111000100000100011010100000011000100010011101010000001001010001010111011111101001010010101000010000000001001000101101001111010101110011101111000110111111100101110011111100100100011111101 1100001110011100010110001101000111111010111001100101001101100101000000011110100100100001111001111101111010111111100010010000000100010110110001101100011000001100101111011101110101111010000010111010101100010011100000000111000110111111100001110110100001011110111011000101100100111011100100001110010000111001001011100100011101010010000111101010110110110010010000011011001110000011100000110000010001110000 0100001010101001011010010001100010000110010001011000001110000101110111100011010101110101101110010110000111101010111011110101000010100111111101011111100011000101001100111100110000011010001101110100000011001101101101111010001110010101001100110111000111101001111111110011011001111110000101011110001000110010010111110001001001100100101110100111000000011101001111010101100010001000110101101010110010100100 1011111100100001000011101010010101100111111011010101000111001010010100010100010000000011010010100000110110000001110000110110010100010000000101111110101101000111011100101101110111101110111110011001100011001100101111001010101010110101010110000011011001101110000101101000101110000110001010011100011001011001101111110100010000001101101011111011100010100011110001111001000011001111010111010110100100001011 1110010011111101001010010001101011000010001110001000001010000010110001011111100001000101011011000111000101010110101010100101000111001010101101100100011110110000101000110010100111101010010110000110011010011000111110101010000010110111000001000110000101110001100000011000101010101100010110100101010101111110110011111100111111111111011111110111010101101011100001111100001100101011101000111001010010000011 1000111001111000111100010111110011110111100100100111100100000110010011000000110101001101000101110010110011111100001101111111001001101111011001010011100111010110011101010111001011110010101010011011000000011101110101011011101010100100110001100011011011100001111011111101001000111101010101100010100001001101001001000001001111110011100110100110100110011111001111110011000000100111011010111100100100011110 1000100100100111110010000010100000111110010110100010100011101110011110110100010110110011000000111000011010001100011010011010011101011111110111001110011110110110001110011100100011100011110011011111000101000011111100110111000111000110000001010110111100011011111010100100001100011100001110110100010010000111110110110111000110000101101010100101101011110010100001010001000101101000000100111011010010110101 0010011000111111011110111010010100001000111101000101011110011101000000000001011100100010111001000100111001100111010101010010011101110001110011000000110101110100111001111001101000000110111010001100010011000001111100100100100101001011000110010000101101101101110111100110100101000110100110000100011000011111111010001101101101101100000000001001110100010001010100001000011001111000000100001001011101010010 1001000101101001000101001111101110010111101110000110010100011111100110110101011101111111111010111101110111100101111001001011001000110110110101000001101000100000110111101001110110110001111100101100000001111000000011011110000100110001111011000000010101000000011101011101101001101110101000001001010111100101100000000100010000011111001101110101110001101010110010001110011011111100111001001110110100010010
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