0001110000010010111001111010110111001101101111101101010010100111111010110011110011111110100100011110110111011000111110000111111010001101010101100101011101100000010100110111011110010011101101000001001110110010111011111000110001110100111101100101010110011001011100011010101000001001010111001110001101101001101000011011111011000100100001101000000111111110010111011111010110010111110111101000101100001011 0001000011110110000011001011100010101011001011000100111111011011111000000110100000001110010100000110011000001100000100110000111010111011110100111111110010100000110100101011010001110011010100001011111000100011101111110010000010110000111000100101000000000100101011000110000101001011101000110010100010101100101000110111011111000101111001011101011011001111011011110011101001010100000011011100111100101100 0101011011010101100000000101110111101110111100111000011000111110101100011110000110010000010100001000110110101000000110011101101011110101001001000100110011110110001010100000100101011000101011011110101000101111110001111100101010010001000100011000001110011100110110100000010000101100100100001001101111111110000101100011010110110101001001010111011110111001010001011000111010110000010010110001000011010011 0000010011011111000111010100101000101100010111101101101101101011011110100001110101111000001110011001000000010011101000101100011110000000011000111000110000001100010101111001011001000000001111101100111010001100011110100100010001001001101000000101010101111111110011110000111011001110111011000100110101100100111011011110110110011100011010100000111011001000110010101101111010010110000100110111101011001110 0100000110001100011010101101101010001001010000011111110110010000010100000110110011101010010010001000111000100010001011001101110111110011000001001101011110111010101101000110101010110101001111001001011111011001001001001001011000001100110100001110111100011001110100101001111110101111000101000110010000100111001001111101001001100000101010001001001101010101011011001000100100111001001110001001011000100110 0010000010110000000101101100111101111111001100110111001000101101101110000001111101110001000011111001101101001001110110111001011100011010101000111101001110010000011001011001111111100101101110010101110011000111100110011011101100110011001000011110001101111011000011000000111101101011100111101011101110110100000101111111000101010000000111111001010011000100110010001111011000000110000011101001111110000111 1001011011011100111111010110110100000101101000101010111100100010110101110001100101001111100110110100000110100110001110100111001000110100101110101000000001101100111110111111011111110010101000011011101110110100011000000111001010110010110011001101011111010101000111001001110001011101101011011110001101010100101110001000101101001111100110100101011011111001001000111011011111100111110011110000100000000111 0001010110000001010001100100101110001001100100100111001111001010111001100010010001001000011010101110111011100000111010011111101111101010101110110111111101100100000111000011011010111010010101000001011101100010011111011000100100111100011111000001110000110010110000110100101111000110100001001001101011011110110000101101100000111110101101101010101110011111100110111000111000011100011000010001100101011011 0110000110100110101010100010101100000110011100000100010111001011100101000111010101011111110010000100110101100110000110111000000000101101110000100001000101100000111100010010101100111111010001110101000001000110101000101001011100001100110001000100111110101010100111110011000100100001100000011100101100000001011001101001010101100101100001111011101110101011100110111101000010111100101110111110010100110010 0000100010001000000111101000000011100011000011000111110110101110101110101000001010111110000101101011101000000010100101011111010011001011011001101101000110111011101001111011110001101001111011000101110110101111100010100010001100111111010100001000101010110011110011110010000001001101001111101010100111001100111101001000010000100100001110100010000111011101000001111110010100010011000011010111010000110011 0000010101001111110100000101011001110110101100001010000110000011010010101111101101010010010110110101000111111110000011011110101110100011011011110011100100010001100001110001110101100000110100111101011010101001100101011011000101011101011100100110110011000010111101011001001011011000101010011101010101101101000010100111001111000010111101000010111100110010011011100111000011110001011111010110101111000111 0000010101011011100100001000000010100000000110011011101110000110000000001110000111100000000001001010010110101010110001010110011000001001001000001101111111101100001100100100011111011111011111111010010010000111000110100111111111011000100100010000010011110000100000111110011010000010010100100101111100000111000001101000010000110100010111011001000100000110110011110101100010010000010100100111011000010000 1111101001111101100111001011011100001000110101110001001001010111111111000110110111110110110000000000000101000111100001110011011010010010110001010010001010111111110001011110010001111111010111011010001011011010111001111110001010010000101111000001001110101000111111111011110001001110100001101000010100111010010110010001101100011101010011011110010100000011010110001000100101000100011000010000100111001001 1010111000111001101001110010010010111100010000111011011001001001000110111111100010010101010111000111000101110010111000111000100011110100101000000110011011000110011110111110110010011010100011010011011010010100111101000010001101110010010100100010110011101110000000000100100011011100010011100111111001101101000101000010000011000011011010000111111000000101101110111110110001001100001001001101101110101011 1110011101001111000001011000111110101101111011001111111010011000011011101010000001111110001000011100111011111000000000101011110010001110011010001011011101100101001111100110011000011100010000000010110110000000001001011101011101010111011000010000101010111110011111001001001101000001010111101101001001001111110000100010001110011111001001100110001110011011010010111101101110010011000100101101001100111110 0100111001110101100111101010110011110001111111100010011110101000100111111011010100100001000000001010110111101010110110111100000101000101011110010000110100101100100000000111000110101000101011010001101001001101000110110011000001111010010100001100001111100101011001001010100000000110101010110111000000010011010110110000110000101000100100000001001111111101011000000100000101001100011000100111000010101010 0010110100111110000111100111110101100000111000011010000110111010000100001111111011010000111100100110111110001110000101110000001111111010101111001110110101101010100100001110100111011110000000111011011101110100000110100100001011101001011100101110001000100001110111000011101111111000101100001011101010111001101010110101011101011110111010011000101001101011111111000010010011111101010000010001001010001000 0110100111010000001000100110010111100001000001110011000001011100111010111110000000110100101111000111000111110101011000010001001111100101010100100000001101100011000100101110000001110010110001001000001101001011001100111111110001010000101000101000010111000111001111011000110111111011001101001110101110110110001001011101010000011110001000110111101010111110100001001001110001100011010001100010001001100100 1001000000100010000101111111101000001111111101111000110101100001101001110001101110100000111010010110111010011010001110010110010000011001111010100000111110110101001010101100001100100101100101000101011000010010010111011110001100000101111011010111110001100111001000110001111101000110101100010011000000111010111001100111100010111000000011110000001011011110011101100001010110000010000001111111011111001111 0000000011110001010010101101001100111100001010111101001011100011110110010100011000110111110100001101101000011100110001111111001001111000110110100111011000011101111011000001010000100100000111101111010011111111011010101011101111100100100011000001010111011011000100100010011000101100001011001101000000110010101100100011101100010010010110111110001011101000011100001110010111110010000110000101100000010000 0010111011011111100000100100111111100101111000110111010100000101111101100000011001010110110100001001101101111011111101100111101011100111011011100100001111000110111111001100001001001100000100111101011101101000000010000010000000111111100100011011110001111100110001100000011110101100101011111110000010101111110101011111111110100010101110011110100010100010011111011011101010111101110111111100000011011001 0001100100100100101001111111000010010110000110111011101110001000110000101011110111000010001111100100001010001100111000100100101001010101101110110111100110010010001001011010001010011011011011000100011001010111100011001101010110000001101101111000011010110100000011010010111011001101010110111110101101010011001100111100010001110010100001101010110011110000100010010101110010111011011110100100110101001101 0100110111110001101001001011101111001100111111100100111111111011001010010101001011010111100110011001010010010000111011100011001110001010100111001101110001010010010000101111111111011001011100001011101010110010011100000000011000101101110111110101011110101111111011010100100001100011001010000001101000010101101110001011011010100011100010010101111101101100001000000000010110001011001011100101010100010111 1010011101110101111011010010100111111001101101101110010111011011001101110011011110001110010101011011110000111100010111001001000010001011101111100100011111110001010011110101101101001010110000001000100010000100100010110110111101101110101100011111110101101000111111111110010011001101011101001100000111101100011111111111110110100010011101001110111110010111111100010000100111010001111011110100001000011011 1001011001010001110111000000010000000101111000011110001011010100101111011011010011011101110010101001001010010000110110001100100011110000110110011110010001110011100101000001001111011001000101111110100100001001001111101100110011001001010011111001101110100000000111100111101110001001011001101101001000110101100001110001100101101101010100111011011001101000101011111000110101010000110010011000101001101010 1000010000001110100010111100111000101101110001110101110100011010100110100111100110011011100101100111100001100101101111111010010101011100101010011011001010100100101100100100110001110110110100001001001101111100011100000100011111000101010011000000111010000111011110000010110100000010100111010100001101100011110011010110111110000100010110100100010001000111111110001011101010000111001101110100111011101110 0100110011010110110010000001010101110110011100011001010110010101000111110011001100010001001010101011001001011101101011111011110110111010111001100100000101100101010011111011101011001110000001000100011111001111111101110110101000011001011111001111110001011010010101001001010110111101100100110100000101000000011100111001000000101100010110111100110100000011001111000011111000011111011100101101000000111101 0000010100000100011010010000000011010110110011001100000111100100111100111010001000110001101010101101101001000010000100011111010000100001011111001000100111110011010111111001100111011100001111100011011001101010101101100010010011101011001110110111010010101111100111001011101010100001000000001000001101111110111111000110100011101000101000010110011000001011101010011000010000010011110011001011100011001000 1110101110111001000100101101001010111001110001100111100101110111110110101101101001000101001110111110010111001010010111000000100100111100101101110001111111110111101011111010010000111010011011101010111001011010101001000111011000011110000010100100010100100010001111001101000000100100011110111001101000011100011000101011011111001011011011010011010100100001001010011011000000100010000100000110010000011001 1110111001110001110101001111010001001001101100101111100000111000000101111100101001010111110000110010000000100011100000001011101110011010000110110110100001011000001100110011010100111100100100001100111011111100101101111011011111100111100000000111110111000010101010110101000001100111111001101001010101011101101110011111010000101111010010110000010110111110011010000110000101101000100101101110101101111000 0100000010111010000000001110010101110110001100100111001001100111001101110110010110000011111111010110111010001110000111011100101110001000001110010110111010001101100000010100100110011011110100000110100011110110001100101111010011111101110001001000001100001001001001000001010111001111010110010110001100010101110101001011010101010001001111100111101111110010000100010111000010000111101101100110100101110010 0101101111011011100110001000101101111111111101110010010101100011011110101010011010100100000010101010101111001110111110011011010001111101110011100110111110001000100000010010010000110011011000111110000101110010100111100100111010110010101100000111011001111100101001001000100011111101011111111100100011101110011111100110101011111111010110011010111011011101111110010000111011010100000010010011011011011011 1110011101000110100110001011001101101110000110110101100110101101101110000101000000101100111011000100011001100100000011110010100101101110110010010000011111011111010000100000011000100100101111010101001000110111111011011100101000110001011100011111101100010111110100110101110011011011001000010010001101011100110001011101011100100011100110100101111101111010100001111000001101001000101101001001101100001110 0011001110110100110110111000000010101100011000011010011110111101000101000001111100001110100111100111101001100110111011111001000001111010101001011010111101111110101011100000101100010111110001111111111101000110110000111001101101110000010101100111000101011000000001001111000011011001001011111111101010111110011000111011010101001010100111000110010111110011010100000011110000001011001001011100011010000110 1001101011000101110101001010110111011101000111000011010001111000101101011000011101001111100101000001111110000110111010111101101001101011110011001011010111010011101010110011110100110001011010011000111011000110100111001101110001011000001000111101111101010010100111011110010101001110101001011000001111110011000001101010100001000000110001011010000111000010001001111001100110010001011011111110011010100110 0101110000011001010111010010100110111010011011110111010101100101010110011001010000110100101011111000011111101101101001001001111101100010000101111000100110101110001010100000110011011101000101100111001110100100010111000000101010010001101111010111010111001000111000101001000101010111111011001011001110110101100010101010010011100101110000100000000000100110101010011100011101111111110011010001110010101101 1010111101011110000001000011110001000111010001110000111011001010010100101100101111001011010100011010101111001100100001101010101000001000111100111101100011111011001000000000100101001101000111011000100000010001100101111010111011001110110101000000011111010111010010001100001010110110100111111011101001111010011000101110000000101101011001111100000100011011100110010000011100100101000111010011111110001010 0000111010101001101011001101010101001100011110001001000111101011101001011101101100001010100101100000011110100100100001101001001011111010001101101101101100010010111001110100111110001010011100111011111100100010000101100101001110001010111011100110111110010010111111100001000001010001110100101011101011110001011110111101001001010010001100000000110011010110000011001001011011011001001101001101011010001101 1111001100101001110110110010101001111110010101001011111101010011001110100110101100001010001110010110101101000111111001000001011011100011111011111110100100101110101100110000011010001110110111001110101010010010010110111111101011000101011111001110001011110111000100110011000100110000110110001000000010011000000100001111000101100101011001111000101111010000000010101101011100111000111011100110101110011000 1110100010010111111011000000101101101010010110001000101111100101010101000010110001101001111011111010000101000110110010110110011011111100010110010011111100010000010001111001001001101100100110111011000001100010100011100111001011000110100110010011000011101011111000001111000111010101111000011000100110000010111001000010011101011011111011111101001001100010010000110101100000000101010110010011010111001110 0100110011111011000001010011001001100111111001110111111011111010011001111000000001101000001100010000000111111100000111011011110011011110101000111100110111011111110010100010101001100100011100111011010010011111111100001010111100010110000101011010101101110011001100111111100101001111011110100011100001110000100010001111001100010000000101110110011110011111000000110011101001110110010000101001101011001100 0010000110010111101100110001101101100110101111001000110101100101000001001110111110001101010000011111111101111100000101000100011001110001000101001111100011110000011100101101000011010011010011110011001000101100110001011101101011000110111111101111001010100001000100100010111001111110010000100110111010100001010111011010010100110010010111000001110000101000011110110110111001100010110001001100010011111011 0000010101000011011011101011001000110001110110110110111110100011001001010000011010001101011111010110000000101001001001010100001000001000101100000100010001001101010100000001110011001011100000010000010010001110001111101111101101000001011101101111111010010000000010001110000010001111001111001000100110100000110000000101111100110011000001000110100000101101010101101000100111011100101111111110101000001111 1111100111111011010101111001111010011111001011101010011111001001110011001000111011010000000000010001111101001100100011101011101110010110000110101111010000111010010001000110111010000100000001010101111011111111100110001110100101010110101001111001010001100010000000001011101010010101011111000001110111000001010110110000010001000110010011101111010010110111010111100000010110000101000100010110101001111101 0101001101101011101100010010000100111000110011011010010110011000001101100011100110010011000011111100001111111111110100001110001011011000010010110011000101100101100010110101000111010011010111011111001110101011101110000001001110110100000100000110101000110111111010001110100001100010000001100010101000000101000011110111111001110001011000011011100101011010101010101011010110011100011001100001001100101110 1010100010101001001010110110001100010111100111101011001111010100010001010100010101110110110101110111101110111000100000000011000000101001000011010001101010110111000001100101010010111100111011001111101001001111101000011001001000000001111111010010001001111011111101001011101010010000010101000011100000100010111111100100000011100001001000111010000110011011010000010111110010011110000010100010111010000011 1110110001111010011000101011000111011001000110001011100110011011001000111000101000010011100011100101110001111110110001101100100100110111110011111100110111101101010101000001010001001010100101110100111011000101010000001011100100110000100101110110101111000100110010001000100001110011000001111011010110110001101100011100011111101000111011011111001100101110001101111110111111011010001110000110111010111100 0001101101001000000100010001110110001100011110110110001101101010011101110011001010000011000110000101010011100110010010010111111101101001000111010000101101101110101111111101011011101100001100101000000011011000101101001101101101100011100111100111101011100110000111101110100001110101010100000010111100010001001010001111001110111101111101110100100100111110000110001010100110110111011101110001100111000001 1011101100001011010011100110000010101010011111100101110111001010100010010000000011010011010011111101011010011100011001100110110101000001001000101101010011100001100101010010101000010110010001010110110101010011100011011100100110001010000111011101110110011111111111000000101110100011110001100010100100000110000100111101111100101110100101110111001100000001011010001100111100111100110011111100110010110100 0110011010010000011101110110000001001110110001101111110101101000011111011001010111110001100100011011111100010111100100001100110111011001111011010011110000010111100000011011100001010110001101110100000101000000010000010100000110001101001101010111100011000000110001010010011010010111100111000011010101110111001010100010101101001001010001111001011010100001111001010001001100000000011001001100110010001110 0101111111000000010111001010000110001001001111100001001100001111010101110010111111111010001000111100110101011001000000110011010001000101101000011000111100110100001000111011100001001100100101010101000111110101101101001100110111010001111001110011111101001001101110100010110011000110111011110010001011001010011010011011011110100010101000010101101001001101101100111110111111101000101010110000011000110110 0000011111111000101010101001100011001000100001001111010110000110010101001101011000101011101001000001011100001111001011101100100011011000010111000110011010101111010110100111011001000000001011110001011001010010001110000010000011011010110101011100101000000100101110101011011100101000100111100111100111100000000000001000110001000011001100011011111100010110100001101001000110010101100010011101010110010101 1101100100101111001010010100110110111000001101010111111101100111001011000100000000000001101001000010111101010101100000111110100010001110010001110010011101011101111001000101010001011111101100000100000001001111100011001010000110000100001010010010100011110011001000110101100010001010111001001111010100011011110010110010111001011100110101100101011101001111110001100111000101101101001011010110010010111010 0011110000001110001111110000100001001000100001001000000110110010100001110110010001000100110111100101101101101100000101001001111101011000101100100011110111000011000000110011000101001011001110011000111011010000010011010110100101001011011100001111000001100101011011100101111011100100101000000011011010101010110011100011111000011001000000100110001100011011101001111000110101001100111001010010100000100001 1101000101101010101110110101011010010110100010010101111110100111100001111111011001100110110001011000111110011100010101011010001111000011110001001100101100011011000111101111111100100110011110000011000011001101101101010111001111100100110110100001101101101000000111100100101001111000101111110001010010111000100011000001100010001010000101010010100111001001000100011010110111011010101111011110111111010011 0111110101011001100101110010010100010011111000111110110011001011001101010110100011000000101011100100100111100100010010110100010111100111101101001000000011000100101010010011110010010100111111100111111001001110101011011101000011101111101111000011101001010111001100101101000100101011111100101011110001101101110001111011101000000100010110100110000010000111001010110101010101001011100111000101011000111111 1100001111001000111100010000101100110100110011000101011000000100011101110101110101001100100111000101001100100100101100100101111010011100000100111111110000000010010001010100101010110000010111010111110001001100001010001100111110000010011110011010110011111111010111000111010000010110101000010111111101110101000111111100111011000101110110100110101110011001010011011000111010111101100100001001110001100110 1001101111010110111010111111101011000011001010100000110100001010110001000011111010111001001001111110111110101100101100111010100001001011101000010101110110001010011101011111011000100111000100111100000111111111100111100000101101111010101010010001010000011000100101000110100010111110101100111011011000110101100110001010011001011000101110110100101100000010001110011000101001001001001100111000101101100100 0000100111011110001000101110111011100000001001111111100010011101010011110111000000010011101111111111111111101100101000101010101110010111001110111110100100001111000011100111011000100011000001111011010011111111001111101010101110110100100000000111010010011011000001000000100111011110010011000001011010111010100111101010011010000000001100011111000011100111101000000001000011011101011011011000111010001111 0100011011010010111101101001010001101110110000011000101101111000101111000001101111101100100001110011000011110110001010011001000010100001100111111010001111011110000111010001110010010110111100111111110011100110011101000011110000100110101000100101000001001100010010100001101110011000010110010100110001011000001100011110000000010010111000001000010111011001000110100111100110111010110110011010000000100011 0000110111110000011001011110010111000111101000110000101001101100011000000001010110110110001010011100000100011101011111000011101011001010011111110001100101111001100010111111101011000000111001101100000110101001010111001110000000001011110111011011010000000101100111100010100001101100001010011000111001000111001110111100101110000100010000000111101100100111010110101000000000100010111110100111101100000110 1011110011111111001110100111111000000000011110100111000110100110111111000000101010001010001000010111011111111101010010000101010001011010111111101001101110110101010001000000000000010100000100111110011110101111010001111101000001001010011010110000101110001100110010111011110110010000000111110001111010000111111110111001011101100111001100000110010011000000010100000010010111001101110110111111011010100011 0111111011100100000101111010111000110001101101101100001100100011011100110011110011011100010100001101111100001001010010110110110011101111101011111111110010010100000000101111010100000111000111100100110001100101100001111010101111111000011001100011111011001101111111001110110101010111100100001000100000101111111011011111011111111000000100111010101010111000000110111111001010101011001110101110110010101111 1000000111001101100001111011100010010000011011111011000010100000100111000011110010100100101110100010011000110000110011100001111010000110110100100011110111010001101110111010101010001001111011010001010001011111110101111100111110100010101101011011111100111001101111110010100011000101101111101110101011010011111110111110001110011010001101010001000010010110100001111011101000110000001001011111100001100101 0101011111011100010111000101100111000000001111100011011011000010101101001101010001001110110100111011011011011101110110000101100101100000100100100111101011010010111000001101011110111110000010101101110111100001000101100101100001100101111100100011010110001010101010110101101100010001000100001000011010010110001100101100010101100001101100110000010100110010000001010101110110010010001000000001100001001101 0010001011101010010110011000000010001100011101111111011111101111000101011000010010111101000011001011101101100111110001111010010001000101101000100011101010001001000000011011101011111011000010010110001100100011110100100001001011000100100011101010000111001011110111001100111100000100100011001001111111011000010001001010001010111000100111011110001101101001010010011100110100000110110110010001110111111010 0101011001010111111100101100111111011111101000000011110111000011100100101101011100100000111010011110111100010101011111110110100000111100010111110010111001110010010111110100111100100111011010000001011011100001111011001010010000000000010000000001011010010101001010011101010110101000100101111011011000000100011010101000010001101101101100111010010111110001111100010010110011100101010001010010100111111110 1110101101000110011000000100000110110011001101100001011011001011111101100110011010100100111011000000000001010101001001110010101010110101100011110010101100001001010101110010111000000001110110101101010000101001000000111010111111110100111110011001011000111101010001100011101000000100001000000011110010010011010101011010110100111000011100001001110110001000100011101001011000010010011010010100111001100010 1000011001100101111010011010110101011100010011101100111010010101101011001110010010101101101101001101111000101110010000101110101111100110101000010000010010110011001101011000010011101001001101011101111101101010101101111101111101101100111111011111001010000100101101111111010110111111111110110011010010011101010101100111000110011111110111001001000101100010000111001000101011011001110100100010110110110111 0100111110111100001001100101000001100000111101000001001100011000001010010001111010101001101000100101011011101100011000110111010110001001100011011010110011111111000101010101001111000111011010110011100000000111010111001100111101010100010011001011111011100011101101100000010001110100010111000100010010000000110101010110110101001100011001111011101011000110100101111000101100100111100000111000011001011110 0001101011010101100111011101000010111011010101011101011000101100100001111100100001100110101010000000100100000101010000011010100011001111101111000001111001101011000110010000000000110111100100001110111000000011010000101001000001000000110101100111100001000101111101101110010010110001001011101100011111100011100000011101100111011000110110110001100101000101010111010100101011000111100001110000100100010011 0010100110100101010101101001000110110111000000000011110011100010001000010000010100100011111000111010000101000010010000000001000011110011110100010001010110011000110000001000100000100011001110010001100111101010001100011101111010001010010101100110100001001000000111110111001110010010001011111101111110001101001001110001111001100011011001101010100010101101010010111100001101101110011110001111101101000011 1001000101100000111001001011100111111110110011110111011001110100011000110011110001011011000100001101001100111100100011000111111010000111011111100101101100000011100100001011000100101000101100100011110111000001110111101111111011000001110100100001111111100001010010101101111011110010000011110001101111011110111111101110011000111010001011001001110100101011011111010100110111111110110110001111010101010000 1110010010000010010100111001111001010001100011101011000100011000001011111110100011110110111011001100101001000011111100101000011100101000111110011110100001010101100010010110000000110001111000010101011110011100100110111001100111001011010001110111100010011000011000101110111111111101001100010100111100101011000010100101000000111111110001001110110110001000010000001001110001100011110000000000001100011110 0110101011010000100100000101100110110011110000110010010101111110110011110101110011110111011110110001111001011111100010100111111100101101000101010011101000110001010001100001111100001010101110110111010010001001100010101100000001001011101000110100000010001011010110001111100111111001110001000100100010110110010100000110001110000010010100001100001001011111001010111000111101100111110101010011100100110110 0100000010000001100011000011111011110001011101001111011010100010101011100010101100110010001001111111110111101000110001001011111010001001010110100010100001010011110010010000000110111100111000111000000011111111110110011000100000100010101111110110111011000000100110011101101111000101010001010010001100011100101101010001010010000010011010010101011001110001111100000011101001001101001100011000100001101101 0011010010000100100110111101111111111111001001111100100111101111001110111011000001000111000011110101010011001011000011100010000010010001000111010101110011000111111111010111111101010011100010001100011001000101111000100101001011101110010000101111110101010010101001111111011101110101001011101101100100000001011101000001011001011111011000100101000010100101101101011100001111011010101110101011000000111101 1010101111100110011011101010010110101101111100010110100001100010011111101100101101100001110000010000000000111111000101111001001000100110010110010101101000010000101010110100011110000100110011011000011011001010101100000001001001000100011111100110100000000000110010101100001110110011101000100111000000001000101110111000101001011001110110101011101101001100110011111101000011000000010010000101000001001111 1101001101111011001000101010110001111001001001011110011001000110000001110000110100111011101001011100110011111100011100101100001011000111011010000111001100100001101101110011000000111011101000000110111110101111001010000010010101001110010110010111111000000011011001100011001001101000010010011000100000100001101111111100110101011111101101000010001010011110100001111101011101111001111111100001011001000110 0010010001110110101011101100000010000110110101000110110010110100111011001010111101100101011010100001101100111111101011101010101001011011110101110101001000000000000111010111000101011101100011000110010001000010000010011100110110011000110000010110011100010100001011010100000011111100111100101110001100110101010100100100000000000111011001110101110111010100111000010011110110101110010001100011100101000101 0011001111010111101110110100101101111101111101101100110000010110101010000100110101110000010110011100010010100110000000000101001001010100100101111000000010001000001010110110110011101011111110001110001100100000000111110000101001100000010000010100101100001011010110111101110000101011101001101000111010110011100111010111101001000011110000011111101001000110001010100110110101111011110011010000100100000000 1111100101101001111110101010000000100110101100101110101001001001110101010011111111011101010010101101110100010101000110010100101100101001101011011111001111010000101011111010100110000110011110001101110101010000110001110010111011011000110100001010011001000100011001011100001011100010001100111100000000000101101101111110101100000111001011101101100101010010000010101001011001001000101010101000100100011000 0000000100111000010000010110110000110010011001011001101001100000100111100010010001110110100001000000010010011110010111000011000100010111011010001101101001010010101011001111100100010100010011110110001101110000000110010000000001101110110000101010100100001011101000011010000001000100011100000010111101000111000101011001101011110011001101011100010000100010111110111001101101111000110010101011100100111101 1000100111101010001011100111011011101111101110000101111100101011100001111100001011110000100111111100010101101001011101000011001110001101111000000111001101110001101000111011001111100010000110001111100011110011000110001111111100001001101010111110111001000010011111001010110010111000111000001011011010001011100000010100101110011110110100010010011001101100100110100001001000000110000110111000000001101100 1000110110000111000010000111010101010000100110011000110001001000010111000110111011100011101110100001111100000001000001000001001000111100100100111011000101101000110010111101101011010010001100110110100101110110111100110101000011001101011001101100101100111110110011010011000001010001110111001001111000101100000010010011011001101011100110101000111100001010111011010001001001010000100111000011100100010100 1101101001111110000001100100011111110011011000000100011100001101111011101101010110001010000010100000000100100001111001001010011000000010000100001011001010001000101101000111000000100110001110110010100001100111100011111111001100011011101111000001110010100101101101101000000100110001001000101010101100101010000010110011011000010001100010011100111110011011001111101001110000111110010101011100011001011101 0000111110100100001111100010001110101000001111011000110110110001101110110000001001001010011100000000101011011011101101100100011000010000010100101110110010110100000011111111111110111101011011011100000010100000001001100110111111001111000110001010000001100010101010010110000010010101011001111011101010101100000011011011101110001011101100111100001110101111110110000000100111110001011000111011001010101011 1000011101001000010100100000111001100000111101011011010110000100111100111011000000101101101011101100110101100011001001001011101101010011101011110001111110110100101111010100110001101101001010110011110101011110100110011000000110111001000010010001000000001001000110001101100110001101101000000000001001111110100010111001001011101101100111100011100101110100010011101001001011010110010001010100001110000000 1101011010110101001000101111011001101011001000001010010001001011101010101101100011110000010011110010000010110110010010111110111111101101110110011100101011001001011001000010010111000110110011100110010001000111110111011110100001010110001001010001111000011000010100001101111001011000111111011111111001010011000110111011111001011001100101100001010100111001110110000001101101101111010010011110110101100101 1100001011010110101011110001000110000000101110110110001101001101001010011111101011000000111101111110100100100110001101010000101111100011011111010100110100111001111100100101001011101011101000001010101101110001101101000101100001100000001000011100000000000110101101110000011001010010101010100010111100000111110001110010110001100010110001111111011001101010011011101010001100111101011111110100000101011100 0011010110110011001110011111011110101101100011011000000010001011000001011010110111010101100001110101101110101001101011101001101011101110101100000110001111000111000101100100111000011111010110110101100000110110000000001110011001100110010111010011011111000111111101010111110010110011111000110100001011100011000110110001010111011101010000011001101101101000001110100010101001110000010001001000111110010001 0101100100101110100101011011100101110000000110110000110000011111000010001010000000000000000011111000110010011010101111110110111100000010101100110110011101010101101001100001110111010110101101111011000000010110011011010110100001111110111101110101000011001000110010011101110111101001011001010001100010001011011110011010101000010010011011001100000000111100101110111001100111001111100000111111010111110011 0011101101000111111111010000100011100001010011111000001011011101000110110010011010101101101101110011100001000100110001110101001010010100101010110000000011010000011111010100110010011100101000101001110101001110000110000010110010111000010011111010101111101011110110010111000100011100101011110001110101001101011110100000010000111110011001000110011110110110010100101011100010111001111110000100000000010111 0100011010101001100110001100100010100011010010010110110101111001110111010100101011011100100011000100100000111011110101010110011011101111000001010100100111011010100010011000100011101010110101101011110101011110101000010100100001100100100101000010111000110110110001001011001110100111110110100110011011011101011001001010001101100110111001011001000000100111100010100101001101001111100001001011100110000000 1111110101000101000001100001000111110000001001011010110100101010011000100010101110110001110101011011111000101000110000111100011010101110111100111110011110111101000011110011001001011000011111000101100000011101010011101101111101001101011100111010111000111100100101010010011110011000101010101001101110010101110010010010011010100000101111111001001100101110000111101011000101101111000111011100101100010110 0011101101010101000100111001100000100001100011110101110001000100110011101010111100011111101111000101010100001000001100001111000010100000000001000111100101101011100100000001101011100001110011111011000110010010110010111011111000110010000010001000100110010011000010010010110001100100111001011010010000100111111111001001110101101000011111000011110011001001010101010001100001110000000001000010100001000010 1010101110010000101011010001000110001101111011110101001100101100001000111101100001010010011100001100101011000011001000111101011011100100100110110010011001001000011111111001011010100011001001100101000000101000100010010100101111101101111011000111010110000111100101011100100100110100001101110011001001101001110101100110111011100110010001101000010111110101010001111001110110100100000011011000100010101101 1100001100101110010101101010110111010001101000001111110110101100111011101001001011101010011111011100000110101011001000111010101011100110010001111101101001001101010001010111100001100100100011000110001111010001011011011111010000111101011010001010111100010011011001000011001000100110101110110110010100011011001010010000101111001000010000001110011001100001001000111001010111001101101011101101000001100111 0110100001110101110010000101111100011100101010101001110001100100001110100000111010110000110110100000110010111100001111000100101000000010000001110101111110000100011000110101101100101001100000010010100111010100010010101000000100111011010111011011101111010111111000100010000001110001000000111011110110110100010000100010011001111111101001010000110110000111110001101000100011011100010110001101011101110001 0100111010100000000101010100000010001011110100011111010111000011011100111010101011010110000111111001010111010011101110101111010001101110111101110011100100111001110101101100011110111011100000111010001100011000010011010100001000110101100011111010011001010010011000000100100111101000011110101110100010100111110110010100101100110110101111100100001110100010010111001110011101011111000100010001000000001111
FXプログラミング

【FIX API】cTraderでFIX APIを使ってみる【サンプルコード】

4/16/2021 6/29/2021

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

FIX APIってなんぞや

FIXプロトコルとFIX API

FIXはFinancial Information eXchangeの略で、電子的な金融取引に使われるプロトコルです。もとは株式取引に使われていたようですが、いまや為替取引でも事実上標準のプロトコルと言われています。

もともと銀行間など大口取引で使われていたプロトコルなので個人トレーダーにとってはあまりなじみがありませんでしたが、最近では個人でもこのFIXプロトコルで取引ができるFIX APIを提供してる証券会社も出てきているのです。

国内でもOANDA、デューカスコピー、サクソバンクなどの大手証券会社でも提供されており、だんだんと身近に・・・とか書きながら調べてたんですが、以前提供してたはずのYJFXはなくなってますし、サクソバンクは使用のハードルが高そうですし、OANDAも一応あるものの現在はREST API推しみたい・・・身近どころか、前より遠ざかってる気すらしてきました。

・・・ま、まぁとにかくあまりメジャーじゃないにしても、個人でもインターバンクで使われてるのと同じプロトコルで気軽に電子取引できる時代になってきたというのはすごいですよね、うん。(グダグダ)

 

いろんなFIX API

FIX APIとか呼んでると、「そうか!『FIX API』っての使ってトレードソフトを作ればFIX対応サーバー相手ならどこでも取引できるソフトができるんだな!」と思ってしまうかもしれませんが、少し違います

というのも一口にFIX APIと言っても各社少しずつ仕様が異なるのです。例えばOANDAであればOANDA FIXなんて名前で、OANDAサーバーとやりとりするためのFIX APIになっており、そのための仕様説明書があったりします。(参考:OANDA FIX 仕様書

FIXプロトコルに準拠している以上、大枠の決まりごとは同じなのですが、そこに定められてても、「うちはこれは対応してない」とか「プロトコルにない機能使えるように拡張する」とかなんやかんやあって少しずつ違ってくるわけです。

もちろん大枠は同じなのでうまく作ればいろんなFIX対応サーバーで取引可能なソフトを作ることは可能でしょうが、基本的にはFIX APIでトレードソフトを作るならどこのFIX API基準で作るかは意識したほうがいいと思います。

 

FIX APIのいいところ

FIX 自体は単なるプロトコルなので、プログラム言語の縛りなくトレードソフトの開発が可能です。

たとえばシステムトレードをやりたい場合、メジャーなやり方ですと、MQLでEA作ってMT4/5で動かすか、C#でcBot作ってcTraderで動かすか・・・などと、プラットフォームと言語の縛りはどうしても避けられません。

しかし、FIX APIであればプログラム言語は自由ですし、プラットフォームにも縛られることはありません。自分の得意な言語で好きにチャレンジできるというのはメリットかもしれません。

まぁ、実際はFIX APIのみでシステムトレードというのは現実的ではないですし、FIX APIの使い方学ぶくらいなら MQLかC#を勉強したほうが早いような気はしますけど・・・

しかし世界標準のプロトコルで市場に注文を出せるというところに魅力を感じる方もいるのではないでしょうか。ここではそんな人のために簡単にFIX APIの使い方を説明したいと思います。

 

なお、ajinoriもわかってない部分も多いため、変なとこあったらツッコミお願いいたします。

 

 

FIX APIの基本的な仕組み

決まった形式のメッセージをやり取りする

仕組み自体は特に複雑なものでもなく、こんなメッセージをバイト配列でサーバーとやり取りするだけです。(下記で | で表してる区切り文字は実際にはSOH文字が使われます。)

8=FIX.4.4 | 9=133 | 35=A | 49=fixserver.10101010 | 56=CSERVER | 57=TRADE | 50=TRADE | 34=1 | 52=20210416-02:21:25 | 98=0 | 108=30 | 553=10101010 | 554=password | 10=008 | 

これだけだともはや暗号にしか見えないと思いますが、ちゃんと決められた形式通りに情報が並んでます。ざっくり説明するとこんな感じ。画像が見づらくてゴメンナサイ。

headerにはメッセージの基本情報が入ってます。メッセージの種類(メッセージタイプ)や送り主送り先、時間など。headerの構造はメッセージタイプによらず基本同じです。

bodyには情報本体が入っており、メッセージタイプ(headerの35タグ)によって構造が変わります。Trailerはチェックサムが入るだけ。なんかIPパケットみたいな感じですよね。

それぞれ一つ一つの情報は |タグ番号=内容|という形で表されており、タグ番号を見ればそれが何を表しているかはわかるようになってます。

例としてheader各タグの意味は次の通り。

BeginString 必須 FIXプロトコルのバージョン
9 BodyLength 必須 メッセージの長さ
35 MsgType 必須 メッセージの種類
49 SenderCompID 必須 送り主。ブローカーIDと口座番号を含みます。
56 TargetCompID 必須 送り先。メッセージを受け取るサーバーです。
57 TargetSubID 必須 送り先追加情報
50 SenderSubID   送り主追加情報
34 MsgSeqNum 必須 メッセージの番号
52 SendingTime 必須 送信時間。日時は上記の形式で記載します。

35タグの示すメッセージの種類は以下のようなものがあります。

Heartbeat セッション維持のための信号
A Logon ログオン
5 Logout ログアウト
2 Resend メッセージ再送要求。
V MarketDataRequest 価格など市場情報要求。
W MarketDataSnapshot/FullReflesh Vの返信。全部入り。
X MarketDataIncrementalRefresh Vの返信。差分のみ。
D New Order Single 注文。

ちなみにこれはほんの一部です。メッセージの種類は全部で100種類近く、タグの種類は1000種類近くあります。詳しく知りたい方はこちらの公式ページをご覧ください。

もちろんちょっと使ってみるだけなら全部覚える必要などありませんし、私もさっぱりわかってません。

 

プログラムでメッセージを作ってサーバーに送り付ける

実際の使い方はというと、上記のメッセージをプログラム内で生成したら、普通にSSL通信でも使ってサーバーに送り付けるだけです。

ここでいうFIXプロトコルはアプリケーションレイヤーのプロトコルなので、メッセージさえアプリケーション内で作ってしまえば、あとは既存の通信方法で普通に送ればいいのです。

利用の流れとしては、

1.最初にログオンメッセージを送る→ログオンの返信を受けてセッション確立

2.定期的にHeartbeatメッセージを送ってセッションを維持しながら、価格取得なり注文なりやりたいことする

3.終わったらログアウトメッセージを送って終了

メッセージ作るときの注意点としては、ヘッダーにいれる34番タグのメッセージ番号は必ず連番でふるようにします。

番号飛ばしてメッセージ送るとサーバーからResendメッセージが返ってきて、間の番号のメッセージ送るよう要求されてしまいます。

 

返信のメッセージタイプも決まってる

メッセージを送ると、サーバーからも上記の形のメッセージが返信でやって来ます。送ったメッセージの種類に応じて、どんな返信が来るかも決まっています。

例えばクライアント(こちら側)からサーバーにログオンメッセージ(“35=A”)を送ったら、サーバーからはログオン成功ならログオンメッセージ(“35=A”)が返ってきますし、失敗ならログアウトメッセージ(“35=5”)が返ってくる、といった形です。

受け取った返信内容を読み取って成否判定をしたり、処理をしたりすればいいのです。

 

 

cTraderでFIX API

やっとここまできました。本題です。cTraderでFIX API使ってみようぜ!的な話です。

 

cTrader FIX API

実はcTraderアカウントをお持ちであればだれでもFIX APIを使うことができます。FIX APIを使って、cTrader口座で取引をすることができるのです。

この場合はcTrader 用のFIX APIを使ってcTraderサーバーとやりとりする形になりますので、ブローカーごとに仕様が異なるということはありません。参考までにcTrader FIX APIの仕様書はこちらです。

 

cTrader FIX APIでできること

現在の価格や板情報などの市場情報をとったり、各種注文出したり、ポジション確認したりということができます。逆に言うとそれくらいしかできません

口座情報を取得したり、過去の価格情報を参照したりといったことは一切できません。もともとFIX API自体がそんなに多機能ではないんですよね。

なのでFIX APIを使ってシステムトレードをする場合は別のAPIを組み合わせて使うことが多いようです。cTraderだとOpenAPI2.0というのが用意されてます。

 

 

cTrader FIX APIを使ってみよう

クライアントソフトを用意する

さて、せっかくですからFIX APIで注文でもしてみましょうか。

FIX APIで特定シンボルの価格を取得して、ボタン押したら最低単位で注文するだけのテスト用cBotを用意しました。ソースコード付きです。

ダウンロード後、ダブルクリックでcTraderにインストールしてください。

ちなみにAccessRight.FullAccessが必要なため、起動時に警告が出ます。不安であれば実行は控えてください。興味があればソースコード読んで理解してから実行すればいいと思います。

なお、cTraderの開発元SpotWare社が公開してるFIX-API-Sampleを参考に作りました。こちらはWindows Form のアプリケーションです。ちゃんと学びたいならこちらのソースコードの方が勉強にはなるかもしれません。

 

接続情報を確認する

まずcTraderの場合、設定メニューの一番下にFIX APIという項目があるので、ここを開いてください。

接続のためのパスワードが必要になるため、ChangePasswordを押して適当なパスワードを設定してください。

 

接続情報を設定する

それぞれの項目をcBotの同名パラメータにコピペしてください。PriceConnectionとTradeConnectionはどっちでもいいです。一番下のSenderSubID以外は同じ値だと思います。(違う方いたらコメントください。cBot修正しないと動きません。)

 

起動してみる

正しくパラメータが設定されていればcBotを起動すると、チャート真ん中下部分にBidとAskの価格情報とSellBuyのボタンが現れます。(価格情報がcTraderと微妙に一致しないのが謎なのですが・・・何かプログラム間違ってるのかも。誰か理由わかる方いたら教えてください。)

ボタンを押すと最低発注単位で注文が入ります。本当にポジション持ってしまうのでライブ口座の接続情報を使う場合はご注意ください。cBot動かしてるのがデモ口座だろうが、バックテスト環境だろうが関係ありません。接続情報がライブ口座ならその口座に本当に注文が入ります。

cTraderからポジション情報を見るとチャネルの部分に”FIX”と表示されているのがわかると思います。

また、(価格取得以外の)FIXメッセージを送信受信ともにログに表示させるようにしてあります。トレードウォッチのcBotタブでどんなメッセージが飛んでるか確認してみてください。

 

ソースコードいじって遊んでみる

たぶんここまで読んでくれてる方は少なからずプログラムにかかわっている方だと思います。是非ソースコードいじってみていろいろ試してみてください。コメント多めに入れてあるので見ればなんとなくわかる部分も多いはずです。

今回はUI作るのが面倒だったのでcBotの形にしましたが、cBotである必要はまったくありません。プログラムのFIX通信部分はcBotを起動させたcTraderからは完全に独立してます。

例えばAxioryのcTraderで起動させていても、パラメータさえTradeView口座の情報で設定すればTradeView口座に注文できます。Indicatorに組み込めばIndicatorから発注させるなんてこともできちゃいます。

FIX通信クラスにcAlgoの機能は一切使ってませんので、コード中のFixApiBaseクラスとサブクラス丸ごと自作アプリに移植すれば自作アプリからでも発注が可能です。

あ、一般的な例外処理とかエラー処理とかもろもろ省いちゃってるので、もし実際使えるレベルまで改造してみたいならその辺も追加してくださいね。

 

あくまで勉強用として

いないと思いますが、本格的にFIX APIで開発を始めたいという方はこれをベースにするのはお勧めしません。

FIX APIでトレードソフトを作るのであれば、おそらくQuickFIXなどのライブラリを使って開発をする方が一般的だと思います。

あくまでFIX APIの勉強用プログラムとしてご利用ください。

 

 

疲れた

「ちょっとやってみようかな」のノリで始めたわりには、思った以上に手間をかけてしまいました。

今回はじめてFIX APIを使ったプログラムを作ってみたのですが、作ってみた感想としては・・・あえてこれ使わなくてもcAlgoでいいかなぁ、と。

「いやいや、お前はFIXが全然わかってない!」とか「FIX APIはこんなにすごいんだぞ!」とかありましたらコメントお待ちしています。


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

新しいコメント

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

cTrader's Life

© 2025 ajinori