1011111001100001000110000010011101110100000001001000100011001001011111110100001101100000111001100110101000011011000111110011001011101100101101110011010111111011001100100001110010000101000110000110111010100011111111111001011110101101100001000010011010001100000001111101100101001100011010010010110011110000000111001100001111010101111010000011001100011011001001110010100101100110011101110101101110111101 0111100000011100001010110010000110111110001100100010100000110101111101110011010101000000001000101110110011100010011100001110111011001010110000100101100100000101101001111000110101001001111101001110101001100100010001100101101001000100110101001111010101000111001100001000111001010110100101001101110000100011110100011010100000100111011001100110000011011000100110101110010011111001111010100001101000010010 0110110100000110110110001110110000101000101100010100000101100011111101110100001101110100000011010011000111111101101101001001110100000001100110001000101111111100100111110011101100011001011110011111010110110011000001000010001110101010111001011110111111011011011000010101010100100010100011101110101011001011000100000000100100100100110001010000111001000111001010100000000100001001001111000110011010100011 0011000000100011111001010011101100111110001101101011101010101110110001001101001111101110010010101110010000101111100101101110010101011110110100101001111011110110101111110000010001011111010111100110010100110111100101101001110111001011111001110011001110010100011010000010101111111000001110101101100100010101011011001111110010001001110111110010010110011010010110100011000101001010100101100101100000011001 0011010101001010111001011000101101000001101100110000101000101011011110100001011100010000011100010000001010111110110110001000011111001001011110010001110010101101001001000010011100011101100011001011000001111111001000010110111001101100010101101110010010010111001110111101110111100000101101000011010000001110010111100101101110001100000000101111110100011011001001100110101110001110011011001000110011111010 1101111001000011001101110000100100101110111011100101110001010010011101100100110110101111011000010010100100110011010001011111101001111100101000011100110011101011111000010110100100000110010101100101001101111101010011001110000111001001010001110110010010101011000111111101000101100100111110010001000100111000010100101000010000001110011011010010000111110011101110001100000011111101000010111100011011011101 0010000010111100101001101101101010011111010100110000110000010011001110110100011010111000101001010100111111101111001101001101111011000011010100110010111010100100100001011010011011111110000100100110101010111100010100000111100000001101101111001100100001011001010010101010100100001101110101100111110101100000011010010111100010010001001110110111001000101000100110111010011010011110110110010001011010100100 0000111110000000100111101011110100000101011100101001111100010000100100011110010100110011000100110000111011000010100010111101011111101100001010100001101000000011100011000101000100011010000001110001000111010110110110111010100111000011111111011001101001010011010000111100100111001010000000111010001010101100100111010101010110100000011100001111101110001100111000100100001100101111111010011101111000100011 1011011110111001001010110101000011001100101011110110011001011101011001011010001100010100001110101111101110001101011011000011001011111001010011110010010010011000010110100010010001010011000111011000111001110001011101010000100100011111011111110011001100111110111100100001000011100000100000010000010100011000000011010001010110100110011111001110001000000001011011101001101000111000001100000111000111100000 1101110011010101110101111000110010010110001010000111100000100010010100101101111000111001011111001011010111101011011010110001000111111010111111011011111000001111100101001011110101010000110001000001000110100001011111110111111010100111100001100010111000110101111001110001110101011111010110010010011101010111001000010101101011001101100100101101001010011001011111101111100010001110100000111011101110101110 1000111111100001000000110110011101100010100011100010011110101110101101111001111000010010111010111101010011111001111111010001111000100010100101101101010001110000100111011111110101001101000101010100100011000101000000101111010100111101110101011010111100011100100111110011111111011000101100111000110100111000111101010001000100111001101101001100100111010111110110011000010110001011111100000001100101110100 1010111111110101101010001011001100011011011011001001100000001110100000100111001011010111010000111001001001000010010001000100000101111010000111110001000101000000010100011111010011000001111111100010101111001100111011000011001001111010110001010010000011101011100111000111011001000101100110101011000000010100001011011100110101010011011011110101101101100000010100101111111000111110100011010101010100000101 0010100111001101101000110011011000100101010001001110100111000111000111000101000100001001001001000111111001100010010000111110100101010011111000000110011010011111100101011111001000000100100001011011110001110101111000100111010001110001011000011011010010010100000110110110100101000101111010001000110011000001110101110100100101001011100100010111100100110110110110011111010011010101100001111100000000100110 0111011100011111010000010100101100111000010100110000010101101101100110011001001101100110010000110101010111001101111000010011110000000011001100011101010001111110000000000100101110011011001111100101011110000111010100001110011010110111101110100101100111100010110010001100010011110111110100010111101111110001011011001010100100101101111001011001001000011010110010111000101101101100101110100000001011101111 1010011100001101110001101010101110010110110000111011101000111011001001100001101001110000100111111001100100001001011101011111010101101100100010001001001110110011100010110111110000010011101011110101111000000110001010000011000010100000000110001001011110110001011101011110011110011100010111100111101100011101101011110101100000010010110010110110010000100001101010101100010001001011010000101010010000010000 1001010110011111000000000011011000110001011101111010101100100010110011110111010111011000110101011000100011100011011110001111110001110000100001111001100111111001000000100100100011101111011100000100111000011110101011110100111000111110101101010101010011110011000101010101011111010101111101010101010011100001101010000111010000110011110110000011111100110010011100100101111101110100100010110111001101010001 1010001100100110010011001010101111100001001010101100011000100101000101100000101101110011001010101010000100000110101000000100100110011110111100111101111011111110111111100001010101101001111100101101101100111101110010101110101100110001010111000100011010101100100100000001001000001101101000100110100001101000010100000000001001101000100111000100010101101011010110000101100110110011010010110001100100010010 1011111000111001000001101010011000101011010101000101001000111011011000000100110000000100110001001100001111100011111011101011101011011001101100100110011111000111110011101011111100111011101001110000011110011100000111010010110000100001000001001011000001011111101101001011010001111101110101111010110010110010101111000000001111001110010111100111001110110000000000101011011000011010000100001100011100010001 1110101110100001110001011101010111011010110001011111011101110011011010010111110010101101001101001110111000110101110110011101011000010001111110010110011111101111000111101011111101111101001001110100001000110110111001101111101010001101010101101001111011011000100110000010001101010111111110101110111001011010000010111001111110101111111010110000110000101111000111010001000001001000101111011101111011111110 0100110001010101011001001011001101100011000011011110111001000011111110001111100000110000111010110110110010111111111001010100010101111101111011110010000010000011111001010110011110110011110110001110111101111100111001010011011010011110000011001100010010010111000111100011100001110110110101001001000001100101010110011100100111111011001000011010010101011111000100000011000011010000011111011111100000101010 0001101110010011001110000100101010001111110000111010100011101111101111101100000111011010100010101001010111110000100001000011001000001110110110111110110111010000110100100110111011111101000011011111101010100110000011110100001100000111010000001010000001110001000000000001100001000011000000011001011100001111000111110000101100111011111011001000100110001010100000011101010011001010010101100010000011010001 0101111010111100111110101110000100011010111111010111001000101100001010001010001010001101111100011100110000100010110001100111110010100001001001010101101110001001101100000000000100101001111011010111100011101110010011000110100011100101010011010100001111101100110111110101110010101011000101110011010011101110010100001001001110001110011110001011010110000010001111110111100110011100100010111111001101000011 1010000100000100001101110110010111101011010011100000011101111111010011010000010010100011101100000111011101101010010010110011010111111111000101010100011111101111100101100010110000001011011100001111011111011000101000111010100110010111110010110001111110111111111001100010011110010010110010101011110111100100000100100101010001100001011000011010011001100001111100110101101101000110101101110101000101100110 1110111111100001011100110001010000101100000011110000010100011001001010001100000111110101011000000000000111011010000000000000000010100000011011111000101010111101010001100100010001110001111000011001010001110010100001111010011110010100010111100101001000010100001010000111000100010001101001011111000001101011000101000101111010110111110100011100010100101101110100000001011100110111100001101010111101011011 0111000111110000111111010100111111101011111001000000101101111011100101111001010011101000010001011001010010010011101000111101001110000001001100000110011100100110100001111011001011111011001011100100000001000110001001101000101011000100001110000101101111101001010000011010100101011101010100011110001000111001001111100100101110011110010110001111111000001000111010001010101010100101000101000001101110110010 0011110100100100111111011100000101000101111001111011010100101101100001101001011111001110101011111010001111110010100100100110100000001010011001101111100110100011100111010110100100110010111010010010000101101100111000111001000111100100010101110001100010001000110110011011100010000101001010010111100010001101000001101000110011100010010010100110000100111010010110000110110011000001100101011101110110010101 0001010101000101101101111110010001000100100101010111000101000011000110101010010010111010010110101110010000001011000101001111000010010100011110111000011000110110011100001100110011011011011011011110111010010010000111100101010001011110111000110101001010111110010100010101110110111010110110001110100100011110000001101010000100011110000101110000010101010111000011100011101010110010110000110100111011000100 1011001110010011001111011111111011110011001100110101100101001101001010010100001100111110111101101111101001001100111001111101010101000110010011001110100110001001110001111000100000101001011010110011110110000010000101001000100001000111100110101000110000010001001101001010010111110001100011010001101000100111010001111010111110001101110100100010111011100110100110011000101000110010101011111000100100110001 1011011010000001010011001111110000100011010100001101100101001001101001100001010111100010111111010010100101001000011111011100011010010100100111111011100000010101001010000111000000011111111010001001000011110110001010000011001101001110111001101010011100101101001000110010010000111100101111110100111101001110100010110111011101001000111011001101100001110110011011110010011111001001101100110000010110111101 0000100001000100001011010110011111000101000000110010011010010101101000011100001100011000100111100111001100100000101000001101001000011000110110010100010000101110111100100111000101110111100111001011001011000001001000100001000010000000010100110100000001101101001011111000001101000100100001010111101011100100111101100011101000000000001001110100011010110001011000000110011110001100001110111101001010100100 0001010100010010111110111100011101110001100010001010000011100000110000000101000101101101100110000101111110100101101101001010011100011001100011101010110110000000001100111101010111111101001111101000110010001001101000001101001010111110011010101100110110001000001010111001001001111111001010010001000010111101100001101000100100111010001110001001100000000000000001111000011100011100001000011110001011001100 0110000011110110100111000100010110110100111000111000110100101100111110001011010101100010010111000100000100011011110110001010100110001001000101000100111111000001111001111000100000001110000000010001010000101011010000001111110000000010010110001111110010010111001101001101101100011000001100010111010100110011000000100010001010110010101010001101110010010111110000100011011001101010110100000101110111000101 0011001110010100101001100000101110101110010101101110010111100111001111010001001110100011101111110000101100011111101111110111010100101001001001010111001011100111001111111111010011100101101111100001101111001011011010000010010110010001110101000000010010101110011100000000000100010000011011000100010110110010011001001110111011010101100100111001100011111110000001101001110001111111110001011111110000101011 1100001100110100111111111000010111101001111111111111000010001010000001000000010001110100000011001011101111100110110000010000100010001010000001011001000001100110010111011001010000110101000000011111111010101001100101100010010100110001111111111111010010011111010010111010100110100000001110110010011011010110110011101111101001001011001100110010110110100000001001101010001110101100101000010110001101110011 0010001001101010100001011101010100110010110110100011011101110011110111011000001101010100101100001010011010100001101110101000010010001010111001111011110000000101111000010110000010111110001010111110000001000011010011101110001110000011101111100101100111111110110100101010110011110111010100011001100010000101011000001101001010010111110010000101010000101011010001001110010001111110000000000101101100001010 0011000000111101000101001001001110110001001101000110110110100010111100111101110111111110110100000001100010101111000111101101111110011101000100100101011000000110100110111001000001001111110110100011000010011101111010011001101111111110001001010001001000010110110101110111010000111100101110011100101011110110010111100110011010000101010110101111010001101100001011100110100101001101001001011010111110111010 0001111000010101111011011000000100000110101111011111100011010110011011011011001101110101010010000011101011101111100010010111110010000110101000101111110010010000111010011011000011011011100101101101110100000000000011111001010011010011011011100100010010011011100010000110101000110000101110111100000100000111010011101010110011000001000101111101101000100001101100001001011011101111010100001101011000110100 0000110001000010101011001001100011101101011001000110100001010111100000010000111110000110111010000111111001100001001110100010000010011110111110001111000110111000001110001110000100110100011101001000011111001110000110011010101111101101001110101001011110011111111110000011111110100001000100110110101001001110000101010101111011110010100010011010100001110110000111011111110100100000101110001100010010001101 0110010011110111110110010100111100001100000100111000000110010001011111101110010101101011110001011111101011010001011001000010001110110011011110000001010100000011001011010010010100101100100000000100001001001111001010010111100110100011011011001111011011101100100110001111001111100011101100100011001011001011111100000100010101110100011100110111000101001111110111011001110101110101111110111101001101100000 1101000011100010101101010011011011000100101001010100101100000110000111111110110011000101111010100000111010001101001100111100000100001101000101010010011110111000101001001011111110101000000001100010110101100011000000001001101110100111100001010101100110101100111010011000011010010100010000111101100010100111010000101010010001111111111111101101110011000111010100111010001001111000000010010010111100000100 0110011001101001010010110101010001100110000010011101011100011111101010100101011001011101100001110010001010001111101101010101000101000100000000011111011000011101111000010011000101001100111001101010010010001111010011011000111111011110100111101011101101000000100010010110110111011110100000110010010011110100001101110111010011001100100101111010001001110001101010000011001100001100001011111011111111001001 0100101111010100110111110001011110001111101010010001011110100110010110001000100101100110110011011101011011101010010101110110000111001001111001000011001111011100100100011010100000101101111100101011101100011001001000110011111100111000100010011010101000010010001001101100010110111010101001100100101100000000011100001111001010011111101010011000000001100010101111011100110000010001011010001101111101110110 0111101100101000011100000111001111110001111101011011011111010110001101000000011101011010101010110001000101000100101000110110010110010010110100010011111000100001110010000110100000000101010010101000000110001011011100001001100111000010101000110010011000000101011111100000011100110101001010000110011001001011010011001110110000101001101101111001110000110001010111011110101101101001001100011010100001110110 1101000101101111111010001000111111011100010101100010100011110110101010001011101110001100000010001100100010010101000000110100100101111001010011010100011000010010110011010101011001000110101101101100011111100010101101010010001000100110011111111111110100110001000001101000111011011000001001100111000110000110011111010111110011010000100010101000000011011111000011111001100001101011010110100000000110011000 1000110001001110110101111001001100111011110111100111001010100101010010110111100011111001100000010101010100110111011010101110010101111001000101110111010001110010111110001100000011001101100100001001001011011011011001101101011111010000000010100100011011110000111010010010001001011100100011100100011100000000011100100111101101100110010100011101101001011001110101011100000110100001100100011011001000010000 0000000000101000100111001000000000110111100010111010100000011010111100111111111101101010001011000000011101011000110001000111000000111011110101010110000100110011000000000110101101010001110100101110111001011100011100110110111110111111001011001101101010000000100000000011010000110000110010010101110110100101000111111000100101101110110111010000010101010011000111011011011010111011111110100010100000111011 1110111000011010010101110001010100110110100000000011001011011110111001010001110100110100011100110001110110001111100101000111101001010101100000000110100101011010010101001011100000110001101001101101101000101100011000000010000100010110000100010010101001001010010101001001101100010010111011111100001000010001101110100101010010110100001111011100011011011001000100101000110011101011110011100100100000100101 0000110100000111000100100111000100000000001010001111011011111101101000101111101101010000101000100000001111000011011001001000100000101011101010001001010111000100100111010011011001010000111100011101000111001101000011001111110010101101101000100001110111100001101001101110111000000110011000010000011111101100110110101001001100010011000001010001000001100100101101000110010111111000101100000110101001111111 0001010110001001001100010000111011000100000101110011110111110110001100001110101000101110111111001010010000101000000001001100001010110011111111011110011010101110110111001001001010011011100011101100100100101100000010111010011100000111010101101000000010111110001000100111101001101100101110100001010100101110100011010011001001111001000110001111100011110000100111100000100001100111010011101110010011000111 0000000100010001111101110011100100011100110100010011000100011000010001110110110010010000100001101101000011110000110001010011111111101001001110001001001111010010010111100011011110111010010100000101100011000000000100011101000110001001101011101101011000101001010110001100100101101101111001111011011001110011100000001001011100110001101011111011011111101111111110101111110001010000110000011101011100110000 0111100101101111010001110011110101110001101010011100110010110001010010111111010010001100110101001010011101010011100100000101000101111000001001000010011111011100000111101001100010001001100110000101110010010011101110110101000001000001101011101101101101111101101001100011100111110100100101110111011000110011001000101011010101010110100111110100010111011101100000111101001001111000010011101110100110001101 0000100010100010010011010011000010001010101001001100000111100100011100011011101110001101110110010111011111000010000001010101011110000010001100101101110010001101001000010110001111000100001101100011111001110111010111011110010000100001110101010010100001010001101000001110110010000010110110000100010110000110010001010101001101001100111110001111001110100001100110111101101000110011011000011101101001010101 0101100111001000111101001000011010011010001010000001110000100000011010111110010000111110110011101100000111110011111101111110000111110001011001101100011000000100110101111011001011000100100010110111001011110010010011100111110111100110001100100100010011111111000110101010110010110111011011111100101100101100011010000010110001011111000110100100000011011111111011101100000000110111110111100101001001110110 1011010101010101110001001100111110011000010010100011000110010101101010001001111101010000101100001000010110010001011001100011011001110101101111100001000010101000110010011010110001100001100010101010111110000101110100100010010111100111000111001110111001001011101110100110011010001110001001001100000111010110100111011100111000101101001000011110011011000111111010011010011111010001000001101010001111001111 0001010101000011000010110110010100110101101101110010011101001111100000111101001001000111111100010000000100001011100111101101110111011101110011100000110011100001100100001101100101010101010011111101111100001110110100110001001100010111000101001000101111010101010101110001000111011010011001001000111111101010110110111010010111110111100110011100111011011110001000011111101111001110100001110111010110100100 1110011000000011011101010001011011001101000111111111010100100010011101111101010001100010010000011101011001001100010000011110101010001111101001001001110011111101101111110101001101111011011101011000100001000110110110000101100101010111000111100011111010000011110000110000110011011101110110000110011011110001000001000000011000000001101011011011000000110111011001111001100101000101110000100100000001100001 1111110101110111010100101100111001010011111100011010110011010010000110010111011111111101001111100101000011110011100110011111100010001111000111001000010001111110101111111110100010001000011001100100001001011010010010111011010111000110001100001101000011110001111101010010010001100111111010101011001000100101000001010000110111001001111110110111100011110101110000000111100101001001010110110110010011010010 0101001101100110111001110111110011101000001100110010011110001010111110100010101100011001010010001001010110101101101100111011011111000000111100111000011110100000010011000010110111110000101101000001100010100001111100000111100011011000000110001010101111001101000001000001000011010011100000010011011101011101100111101100100011010111110101101101101110111010000111010111100010101110000000110100110101100001 1111011000110100000110011000111111001100001100100011010001000100010000110010111111101010010111010010111111001001001110101000111111000010110110001010101011110000001011111010000010000100000100000001111011001001000101010110110101101100001001110111111100001101011011010100011101011000100001110101000111100111011001110100000010001011111101000000011101111110000011110100000110000110110001100001110110100001 1100110111101000001010100110100010111100110100111101101001000100001010010111000111011001110001101100100010010000001011100110111010101111110001100010010010001110001010111100011110000001110101000010010010110110100011010110111001111001000110000110000011101010110101100011101101000100100001010011000110000010011111000100100000011011101000001001100001000001010110101000100101100011101000100100000100111001 1000110101100000000010110111110001010110101111101110010100011101101000000101111001110101111011100110001011111011000001011010110000011100001101110001010001000000100101101011101100110011100101000111110010111110101000011000110100011010000011101101111000011000010100110110110001101101110111101101101100011111011101001000100000111001110100111100100000010111111000111001010101011001000110110011010101010011 0010111010111111010000000101000111101111111110001100101100010000011110111111110100111011000100010110011100110111010010101100100110011010101011000101010000000010011001111101111000111111011001100000110001001110011011000011111110110011000010000100010110110010011001110101000011111001110001000000010011111111010000010011100111101011010101001100110101000100110001010110101111100000011111000001110100111100 1010100010101001100001011101001010001010010110101100011111000101111101110100011011111001010101000111111110110100110011110110101100010000011110000111110100011000111110001000000100000000001101001110011010101111111001000101100100010101101001111101101111000010011101001010010101101000000001111000111101100110010000010001101101000100010111010001111001001000100010010111001011010001111000010001101001000010 0110101010001101000000110000010011001011110011011111010100110101000011000100100111000001111011011111101110010111110011101001001100010100110001110011010010001111000000101011010100010111000001011101101111000010010110101000101101101010101010000010000010110011011100010000010111000001001111101110010110010011010000110010010100101101100011111000101001010010100011001100100000110111111100110101101111110100 1011011011100111110111001001011000111100001001110000011110000001000111100000011110001000111001001110101111010010111010101000011101100011110000111000011110000010100101010110010100100011101010101011010111101010101111000011111001111010011110111000100001101100100000001100000110010011100011111101100010101101010000010101000000110100101000111011011111011111011011010011001000010001110110000011000010000000 1101010110100011001100101101001000101000111110010001000100011111110010000100010001100101100101101111001001111010011000111111010101111100011010101110011111000101111000000011100110111000100001000110001011110001111010000001100001010011001111000101001110100000001110010011001101010100101000010111010001010000101001111000100101110010101010001011110111101011100010000011011011010011111001010101111110110001 0100001100100101100111101010001110010111001110010100100101110111101110001010111010111010110000111010110010110011110000000011110101110101111000100001110110011100000010111001010101000011010100101011100011011010001111001001011110011100010100000010111010001110010100000000100000100101101101110110110111111100001000010111111001101111011011101100001100100001100101001101000110110001111010000100010101110100 1001101101111110001111101111101000100101000100101011000010111010101101001110000001111101000001111010110110110010111110000011000111101110001100000111100111110111101000000110101000000100001110010111010101000010010011010011110110100110110100111011100100100100010001100110100110100110100001100101000101011101000110110000110111010100111100001000001110110010001111100010010010000111100010011010100110110011 0111000111010111000100111000101010100110011010100011010011111111011011000000110010010010110110000100010001101000011011100100111011011010000010101010110101111011111101001101100101011001111011000000110011000011000001000111110000110100110101010100000010011110110011001111000011000110101110010101100000001101001101000111010010011001111010111100010011100101011111001001011101010000001101001100011111110110 1110001011100100001111011000011010110111100011100011011101010001101111100010110001010000010101010100000110111111011000001101000001111001111111111111101111111101100101000111010011110010100101101100111111101001001100001000101110001011011101000100001000010010110100001000001001000110010111000010111001110111000011010110110100111100010101100010000111011001011010110110111000011011100000011010110101001011 0001101010000001110000100001011000000011001100000001110110110011001000110001111100100010011101111011110001010000010110110101001010000100111110011110101010101001011101111111001010001000000010000110011000110101110001111010110011011110110100010111001111110000101011010111000101010011010110111001110101001011011111000100000100110000011100001100001111111000010100111010110110010011100000000100000010101011 1000111100101000001100011101000010010000110111111010001000000111000111100111101011011010010110010000001000010011101010111101000110111101110100110101101100011100111000101010110011111001011111111001100011010110101011101100010110111000001010001011011110001000011000011100000100001101110100100110001011010000101000001111101010011000001010111000010111111110101011111011101100000000111001011010101101001110 0010010101100001110001010001111101110011011110010011000001000101101001001000111011100110101110001100000010100001101100111101011101110110010100100010101010010001101101101000110001100010100100100001000001101100110101011000100110100100001101101011110011010111110011011111000011000100100100000001101001010101010000100110110101010101001001001101000011001011011010101001000001001011001101010110010100100001 1001110010010101100000111000111001000011001001000001101011111101010111011011111101110111011011001011001111111000011001011101100000100001101100100111110101000000111011000100110111000110111111111110100001111101100101001000111110000101110000100001010101111000010101100001110111110101011010110100010011010110111010111001001001001110000001111001000001111010100000101011010110110011100100000101000111100110 0100110100001100001111110110000110001101111110110010101010010101000001110111001101110110100010001100001110110100000001111110011001111111010011010110001110010110110010000101001110100111111001110010001101001000101100001000010110010010011100110111101011111010100011010111000101010111100100000110000001111010010011010101101010011111010010001001111010100101100101010011110010101101100101110011011101010100 1011110100111010110001000010001000001100101010100110000011100100101111001101010111110000101000110110001011001100110011001101011000110000101001011110101000001001000100010101011101110001101000001010001101001010011010110010111100100010011010011110001101000010111010000101111100111010001000010010111001111000011010000011100000001111011001100100111011111001110001110110101110110110001001001001110111100100 0110011101111110110110110000110010110101000000101110111101101100101011110110100001111100000101010010101010101001100010111101000011011101001011101000110011000110111111011110001101111001001110101100101001001100100010011001001110111110010111011001100011001101010100001111000010110100111111111111010000010001001110110101011011011010001001000001111010000110010101001110000100010011001000001110000110001010 1101101110001001110110001101011010111100000101101001000011101111110011110001000000001101010100101111111101001111011101101001100011010010001000101010010100011011110111010011100011010001000010100011010010101011100111000101000010010111111010100111100001110001100011010010000100101110110101111000111110111100101111101110100101110011100010010000100011001001011011110101000100001110100111011010000001111111 0000100100110000111010010101100001110011010101000111001001011001100011011100000010101000100010100100001111010101010010001110000001001101101010111110100100101000010110100000010111001100010100101011010100000011001010100010010010110101011001101110100011101011111001010111011010111100001010000101100100110101101111011000010001100110111001111001010110000101000111011001010001111001101100000000010111000011 0110010111001111101110011110010111000110100110110000000001011101100010111100101010111001100001000000011010111011110001101010011000011001010101010101001011110011111101111100011011011010000101100101011110110000001100011011111010100111100010101101100101011000000001000001010011100011001111110000011101011111101100010011111000010011000111110010111110010000001001101011110110101001110000010010001010110011 0111000111011001000000000011010011000001110100011001010101010001111101101011111110001000100111111110101011010111110101001111001101100011110100010001011000011001111101110000011110001011011110010000100000100100111000100001010100110111111000010011100000111101010011101111111110001111000011000010111000110010101110110110110100011111011111000101100100011001100100111010001110101010001010101110110101010110 1001101110011010000011001111010011011010100010010010101001101110000000101111000110111100000111110100111101100001101000100111000100101010001110000000011011110100111101111100001001100101010011100000000110111101000101111111111110110111110110110100000000100000111000111110110101010000011001011010111011111010110100000001001000011011111011000011010000011111100010000101100010000001000010100000011001000111 0110011110000110011011001010111111011011101000100011110011111100011011000000111001011110001010001011010011101110101001110110111110100101011001110000001110011000111010000010000100000011001110001001100011100100111111001010001111101011011101010001010001111110010101011110011010011111000111011111000011000101110100101110100101000000000101110110110100101100001100111001101100010110001001011011110001010011 0010010100001111001011110100000110010000111101111011011110110111000110111001000011110000111111011100111010011001010001110001011001110110000100000001010110010110001000000111100001100110101111110100101110110000110111000111011011011010011010111000011101001101100000001011101111111011011111101101110011100001110100010010010100111100110000100010000100111110110010110100100100000111100100101001011100001000 0111011111001011010110100011011101000100111101010010111111101010100001011111101110001111110101001010010011000110100110011010011011110100001010110110111011010110010001010100011010011100001010000100111100101101101000111011100010101010101100010011001011000010100011011100110001100010011111000100000000100110000110100001001110111010110010111011110011111101010001011111100100110111011111000111011001100001 1111010000111110100110101000010100101000110110000100000000001111101010101110001011001101010111010001111000101110011110001010001000110111011011011001100110001011011001110111101111110110000111111010000110011010110011010010100101010000000001010100110100111111111101100011100001100100010111011101011010100011100111010110011011101001001000000110100100000101011111100000111010101111101111110111100101101110 0100000010000011010011110101111110100010000000000110111110111100100000000000010111100000011000101001110011001011011011101110101001010000101101100010010101101110111101110001001100000110011100010100110001111101011100000101111101110111010001010111111001110110011011001111111000101111101110001000111111001111100000110011100100110011011011100101001100001011110110010110100010111000111110010111010000001000 1001100011111111100001110000101001000010111001100000000010111001011011010010010101110001111011111101011110000100011000101110101110010000010011001110010011111011011001011101011000000110110100101111100100011111111000100111110010100000001001010001001111110110101010100100111101000010110100100111111000101111001000011001011100100000001000000101111100101110111011001011011100011111011001010000101101010110 0011100100111101111111110010011101011011110010011001101001011101100111000011001110010100100001001011011010000111001110010000101011010010111110110011100001110010111111101011010000101111100100111010010001111110100110000001111101111111000110101000001010010000101011000110011011010100100001101111000110010101000111110011011100010010001101010110010011101101110100011101011111010100100011111010011011101011 0001011110011110001000001100010010100100101011001110110100111001011110000010011010010000101001011000000110101111110100001011001111111010110001000001010011111101010000111001011111010011001010100111110011000110011100111100110110011110011101011000010100111011010000110101001011011111101110100011101100011000111010010110001001111001101100100110001101001110100101101000010101000110000100001101100110001011 0110100010110010010101010111001110011011110110011010010100101100000111010101111111111010111110111010100011010000010111111100111010110110111100010010111111001000111001011100010111011010010001010110001011010000001100000100010001101001100011011101000011010000101111011001010000001101110010010110101001110001011011001110110110100000001000000001100001110000010111111001101100101110010110010011110100000001 1001001011011110001101010110101001111101010010011100100000001010011000010011001011010101011101010110111100000100011000110100111010100110110011010000100000001101110011011001111010011111111001011111111000011100101000111001000001111000100110101010000001011110100110001100100101000110111100100000110111100110101110010100001110111111000111001001011111011111111001000010111111001011001111010100111111111110 0010010001110010100000101000000101100001100101100111001000001011000001101011110100111110110010010111011010011010101110011010001101101111110000000100001110000110111010011000011111110110101011100010000000001101001100000110110011000111110010001000000111101000010011111100011001101101010000110111011010011110011011010010010111100100011010100110100110000101100011000001100110111000011000100111011000001101 1110100010011101110110111110100011100100110010101011100100100010111010000000110101110000100110010111101001100000011111001111000111110010000101011001111000101000011011001000000011010001010101010111011000001011100101100011110000011110110100010100100011110001010000101110011101111011010100111101100110111000010011111110100010100100110011000000000010010101000111101101100011100010101010101111011011111001 0010011111111111110010100000010011011001110111111001110001110110100011010001000100010001110011101100011001011101100001111111010101000000011001001011000100010000110000100110010010111011011101011101111111100101110010000111000001110011110101110010110011111111010110111011100010001110010110111101011101001111111101111101000110100011001001101010100100111010100111100000010000011101110110110100101111100111 0100000101001111101111100000110110101111000111100011111000011111100111111001111000011001100011100100111011110000101110100101111110001110010000101000001101010110101111011011000000111010011001100100101101001110001000100011100011011100111111110001111000100100100000011010110101101110011000010010110111000100100010101011101001111001101001101111000110000100001101111111100010010000011101010001011111011100 0001010010101100011111100000100000111000101010100100010100000110011100010110011100010001100010110110001100000011101001011000010110001000010100011101010100100011111010010010110001101000001011110111001000001110101111001110100100010001110111110010110001001010000011111010101011110011010001011010010000110100101111110010000100111011010111101100000100001000110111110100000001011110111000010010100000010010 1011000111011101100110110000111010100010011001110100111001011010001000100000111011001011000100011001000011110100001111100111100001101011110000000001111111001101101001011001010001010001011100110110111111101000000100101100110001000001100110010000100001010010001000010000000011100100101000101001110101101111111101100010010100110011110100011011010001000011010010001100100110010001110100000101100111001010 0011001111010001001010010111000001011110010110000001000000110010011010100010100001111101000010101111000000010110100110111111001110111000101010101001111101000101000011001011100110010100011100001010001010001101110110100010100101010011110111001111100011100100111101110011011111000000000001100100000011010001111000111011100111100001101011011100110111001111000111011111111001111000001101111110011100011111 1001010111000100011101101011000110001101001110010011110010100001101111100101000010100111111000011101101010111001011000001101101111101111001100000101110100111011010111111001100011100100001100101000001110110101001111111100101001111001101111101000100001010000110111001011110001000110111000111000100001110111100101011011010100111110010000000101111011100001011011100110100111001100000101010101001100001011
cTrader

cTrader5.4の新機能

8/30/2025

cTraderがアップデートされました

お久しぶりです、ajinoriです。しばらくcTraderから離れてたのですが、久しぶりに見てみたらcTrader5.4で面白いアップデートがあったようじゃないですか。

アルゴリズム開発にpythonが利用可能になりました!

今回はもうこれだけです。

他にAPIのアップデートはあったようですが、そこまで大きなものなさそうなのでリンクだけ貼っておきます。

これまではアルゴリズム(cBot,インジケーター,プラグイン)の開発にはこれまでC#しか使えなかったのですが、これが pythonで開発できるようになりました。

今回はこの件について語りたいと思います。

使い方

新規作成画面からすすめていくとプログラミング言語選択の画面が出るのでpythonを選択します。

最初だけ必要なものをinstallするか聞かれるのでインストールを選んで進めてください。

設定が終わると

pythonコードが出てきました。最初の数行は動作させるためのおまじないだと思っておいてください。class ~ がcBotクラス本体です。

on_start, on_tickなどpython風の名前に変わってますが、そのままC#で書いたときのOnStart, OnTickに該当します。その他、on_stop,on_barなどなどそのままC#で書いてたときの名称をスネークケース(小文字+アンダスコア区切り)に変換した名前で定義可能です。

pythonで書けることのメリット

いまいち何が嬉しいのかピンとこない人も多いと思うのでajinoriが思うpythonでアルゴリズムを作れることのメリットを上げておきます。

習得しやすいメジャー言語

pythonは比較的わかりやすく習得しやすい言語と言われており、あらゆるところで使われるようになってきています。最近だとpythonからプログラミングに入る人も多いようです。

cTraderのcBot開発を他人にオススメするときも「C#の勉強にもなるよ!」というより「pythonの勉強にもなるよ!」といえたほうが魅力的です。

データ解析や機械学習のデファクトスタンダード

さらに、 データ解析や機械学習,AI関連開発などは主にpythonが使われています。

cBotがpythonで書けることでこのような手法を取り入れたcBotが作られやすくなります。

pythonで書くことのデメリット

じゃあもう全部pythonでいいかというと残念ながらそういうわけには行きません。pythonにも・・・というか cTrader開発でpythonを使うことにはデメリットもあります。 うん、試してみたらメリット全部ぶっ潰すくらいたくさんありました。

遅い

pythonは遅い です。普通に使う分にはあまり気になることはないのですが、マイクロ秒単位で少しでも早く発注入れたい!というときに使うべきではないです。そいういうシビアなプログラムはC#で作っておいたほうがいいでしょう。

とはいっても大抵のプログラムでは気にするほどではないと思います。

ビルド時のチェックが効かない

pythonにはそもそもビルドという概念がありません。

pythonで書いたcTraderアルゴの場合、本体はC#なのでビルドは必要なのですが、pythonコードは単に中に埋め込まれてるだけのため、中身がどんなにおかしくてもビルド成功 してしまうのです。

当然そんなもの動くわけもなく実行時にエラーをはいて止まります。

pythonコード部分を別にテストする仕組みを作らないとめちゃくちゃデバッグがきつくなりそうです。

開発環境は整ってない

これはpython自体のデメリットではないのですが、 cTrader周りの開発においてはまだまだC#のほうが開発しやすい 状況になっています。

というのも、これってpythonnetというライブラリを使用してpythonコードをC#プログラム内で実行させることで実現してるので、いわゆる普通のpythonプログラムではないんですよね。

私は普段VSCodeで開発していますが、この辺の事情によりpythonでcBot作ろうとするとインテリセンスがうまく効きませんし、エラー表示だらけになります。もしかしたら頑張って色々設定すれば解決できる部分はあるかもしれませんが、そこに頑張るくらいならC#で書くかな・・・と。

今のところ「一応pythonでも書けるようになったよ!」という程度で決して開発環境が整ってるとは言い難い感じがします。

いくらpythonが使いやすいとはいえこれは初学者には厳しいです。

pythonだけでは完結しない

もとがC#なこともあり、現状pythonだけで作り上げることはできません。

パラメータの定義は結局C#の.csファイルで行う 必要があります。

別にC#を知らなくても決まった書き方さえ覚えればできるので、そこまで大変ではないのですが.pyファイルと.csファイルを両方編集しなければいけないのはちょっと手間です。ついでにcTrader組込エディタだとそもそもどこから編集すればいいのかすらわからないです。

サンプルコード

ぶっちゃけデメリットのが目立つのでサンプル作るかも迷ったのですが一応・・・

MAクロスで売買するcBotをpythonで書くとこうなります。

import clr

clr.AddReference("cAlgo.API")

# Import cAlgo API types
from cAlgo.API import *

# Import trading wrapper functions
from robot_wrapper import *

class py_ma_cross:
    def on_start(self):
        self.label = "py_ma_cross"
        # 期間は UI から設定(FastPeriod / SlowPeriod)
        self.fast = api.Indicators.SimpleMovingAverage(
            api.Bars.ClosePrices, api.FastPeriod
        )
        self.slow = api.Indicators.SimpleMovingAverage(
            api.Bars.ClosePrices, api.SlowPeriod
        )

    def on_bar_closed(self):
        # ゴールデンクロス: fast が slow を上抜け → 売りを閉じて買い
        if self.fast.Result.Last(0) > self.slow.Result.Last(0)             and self.fast.Result.Last(1) <= self.slow.Result.Last(1):
            self._close_positions(TradeType.Sell)
            api.ExecuteMarketOrder(TradeType.Buy, api.SymbolName, 1000, self.label)

        # デッドクロス: fast が slow を下抜け → 買いを閉じて売り
        elif self.fast.Result.Last(0) < self.slow.Result.Last(0)             and self.fast.Result.Last(1) >= self.slow.Result.Last(1):
            self._close_positions(TradeType.Buy)
            api.ExecuteMarketOrder(TradeType.Sell, api.SymbolName, 1000, self.label)

    def _close_positions(self, side):
        for p in api.Positions.FindAll(self.label):
            if p.TradeType == side:
                api.ClosePosition(p)

パラメータの設定の仕方

移動平均線の期間など、外部から渡すパラメータですが、これはC#のファイルで用意する必要があります。組み込み開発環境からの編集のやり方が見当たらないのですが、直接ファイル開いて別のエディタで編集してもいけます。

.pyファイルがあるフォルダを見てみてください。

windowsなら"ドキュメント/cAlgo/Sources/Robots/{cBot名}/" にあると思います。

ここに{cBot名}.csというファイルが作られてますので、その中に定義します。ここは普通にC#で書くときと同じで、上記サンプルだとこう。

using System;
using cAlgo.API;
using Python.Runtime;

namespace cAlgo.Robots;

[Robot(AccessRights = AccessRights.None, AddIndicators = true)]
public partial class py_ma_cross : Robot {

    [Parameter("Fast MA Period", DefaultValue = 10, MinValue = 1)]
    public int FastPeriod { get; set; }

    [Parameter("Slow MA Period", DefaultValue = 30, MinValue = 2)]
    public int SlowPeriod { get; set; }

}

3rd partyライブラリの使い方

サンプルでは使用してませんが、pandasやnumpyなどの外部パッケージも使用可能みたいです。公式

これも同じフォルダ内にrequirements.txtが用意されています。

この中に使いたいライブラリ名とバージョンを書くことでビルド時にpip installしてくれる・・・はずなのですが、私のとこではなんかうまく動きませんでした。

誰か試してみてください。

(書き方はpythonで使う普通のrequirements.txtと同じ)

pandas==2.2.2

まとめ

pythonで書けるようになったぜ!という喜びのポストだったはずが、なんか愚痴みたいなのが多くなってしまいました。

まぁC#ですでにアルゴリズム作ってる人があえてpythonに切り替えるメリットは少なそうですね。慣れてる人は「どうしてもpython使いたい部分だけpythonで書く」みたいな使い方がちょうどいいのかもしれません。

それでも 「公式公認でpythonで書けるようになった」 というのはcBot開発の裾野を広げるという点では大きな意味を持つと思います。

cTrader使いの非プログラマーだけどpythonだけならちょっとわかるぞ、という方はもしよかったらチャレンジしてみてください。

すみません、触ってて気が変わりました。使いにくすぎるし思うように動かない。これはまだ人に勧めてよいものではありませんね。もう少し成熟するまで待つことをオススメします・・・


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

新しいコメント

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

cTrader's Life

© 2026 ajinori