1001100001110001111100001001111001011000001010011101001000110001011111001000101100010001100101100011000111111011001001111101100100100100110111001010101010101100110100111010001101110011000011010011110010111111100010001011110011111000001001101011000100011001000000001101101011011010101011110110010110110010011001010000001001001111101001110100110110100010001100101001111110011010110011100110110000111101 0100101101101001001010110110100011000010011010000011110011101010000111010110000100000101001110010001000111011110111000100001110101111101000011111101111100000001100101101100101101100101010001101100010010101011101101100110011000111010110110001100010111000001100000101010001011011001010100100011011001010110111111101101010110011001111010010010101001000101110011110000101010101101000010001101111110111101 1001100010101111101000101001101100011110110110000110011010100101101110101110000001111100100101001001000110011010001000010010001001110000010100000100010011011110010100010100010101100100111011110000100101111010010000101001100011000001101011101000110101010101011000101101011011000100101000001011100000010001111100101101001111111111110110000100100000110100100001011110101110110010011110111100101011101111 0110101010001101101000100010101000011111011011101001001001111010011001100010110101011100111011010001010001010100011010111001011001111000110001010011110011011111010100101010011001001001110110011100000000101010111111110011101001001101110010000000001110001001011110111111000101001011011110110011101111000000001001010000101100000000001001111100110000000111110100000111001011101011101101000110110111100001 1000011001111010111001110011011000001111110101100001100111010111110100110001000010100101111111010111100110111000011011000110100110111000001101110110111111100011100001111000111111110100000101010111010011000010011100011000010110101001000101101110101110010110111011111011100000001111100011000010001000000101001011111110100000111110000010101101001100101111101100110011101100101001011010000000111101010011 0011001010010111100001110100010100111100001010000011110100110010010100010110101001010100100100111111111110001000010101011011110101100001010001011111101111100110100100010101110010100100101111110100110001101000100001111010001111111101001111101011100001001000001110110011000100111001110100011110000100001010110011111001011101110001100101001111101100010000010010010001101001000101001101001001111111011000 0111000010100110110010001001011001110110100001010111001001001010011101111100010110110101011111111100101001110011100001001110100101001110101010010100011110001101000010101111001101100010011111100010011011111101111010000110001111001101001110100010100100000110000011101001101001100011010001011001101110010110100111011010100111000011010011011000111000000100011100011011101000000000111101100111100011110111 1011111100011110000110101010010011011011010000010100000101111000101100001011101001011001000100001111011010010101000001000000100100011101100111011110111111111111010000011011111001010010000110100011000111100110011010101111110000101111000110010111010111100101100000001110111000001000100011100110111010110011111000110010000000110111010101011011001111100011011000110001010001010111100110111111011010110111 0111011111011010101010011010001000101010110011111011010101011110001111111101111111101110100000111010010100101101111010110110011100000000011111101101100000011010010000010101001001110111100101011001010001111100100100011100011100101001100111111111110000000111011101111101101001000001111100000000010111111001000000001101111010101101100001111111011111000001100110001111100100000110100101001111000001110100 1000011000110010100110011110100001011000100101111100010110011000000011000011000010101011011000110111000100001001111100100011110010010010010010001100111101111111100101110101000010000000010000110011001110000010010001011111010111000000011000111001001000000011110000011110001000101100101110000010111011101001001000100010100000000011011111110010110101000001001011010010010000110001110011010111000110101100 1101100101111001101011100000000010011101101111100001000000001100001010010000011101101000011011101001000011110011110001000110101110011101101111000101110110110110110011000110011010011001101011001111101010111100001110101100101100001101110110010011100001101100101010110011010101101100010101011011100000000001110001010100001101110101011011001001001010100101001101011101010001110110110100001010011101010001 0110000111100011010110111011101101000101100100001110110001111000001000111010011010001101110011110111011100001001100001110100001100111001001111111011001100011000100011101001101010110111001011010010111001101010001001110100011100100000101111110101100101001010111001100101100000100011100010001110000100000011101110010001010000100010001000000001001001001101001000001100111111011110010100001011010110111010 0000000101100000110110001101010100101101110100011011101000100101100101010100001001001001100100011010111001101011011100010010000110010101100000100100100110110000110111001101100101111100101110001011100010101100000111100101010110110111011101100011110001010011111110111011010010101001111001101010100000011001111111111010101100100010000111000000001100110010110010101111100011111110101111101111001010010010 1001101001011011010010011001011011001110101100111110010100110000111101000111100100110101101100011100010111000011001101010000100000100100001011011001000100001100110111000011110011100101001011111111110000010011011000100100010111110000000010111101000011000111101110110001111101110010110011010111110000001011100111111000000010110110000100100100000001100110011110010101110000101101001110000001001111101110 1111110000001110000010100010110011011000011000100111110111000001011000110011100100101110011011100101111100111110001111100001110110100110101001101000100110101100101011101100001011101111100100111010100100110101100111000101010011001010011110001100001011100101001010111011110011000111010000000110111110100101010001011001111001100010001101101111000100100000111100100010011110110001111100000000100011100000 1100001101000100101110011100101101101001010000111001100100010110011110101001101010101001011011111111111001000101000000010110110111000100010101111011001111000000111001101111011111001110110100000010011101010001111010111010010010111100000011101000000100011000010111101101111000110001101010000000100001110001001011011011100010001110101101001110001000001011011000111001110111011100101000110110100001011001 1000111001010000110011111111110001101000010101010111000100111101110010111010011101000010110011111000010110000011111001010010000101110000010001111111010101001101100001010101011001000000101011101100000110011101001111001111000110001101011111110100010110000101010100111010000000000101111100000111111010011100011111101010111010011001000001010111110011111101110101100000000000010101000011101000111100010010 1101001000100100110100011101111110010101101111011101011001010000001110100000000011010101101100010100001101001111001011110011101100100011111111111001110001011001010011000000111011110100111000000110000101101000111110011110011011100011100100011100011100001110101000000000101010010101100111011001000110100001100000111111111000001101111001100110100000111111000010101101011110000010101101011000011011100000 1100100010000110100100111100101011101011100011001110110111110101011101110100010001011010100000101000111111010101111011011111000110110101110101101101110111101110001111010010110111100110011100111010001111100101101111111010111001001010001010100011001101001011010000110001010100000110010011001101100000100111001001011010110101001100110001011010011010110111000110110110101110101101001111001001000010011010 1101101000100100001001100110100110111011011010101111010001011010000001011001011101110101110110011001010101001110110101010110001111010101001001001101011011111001000111100011111111010101100100000111110101101010101110001010101001000101111101010110111010110100100101001001100110001111001110010111001000100100010010110011010010000010111100110000101110100111110010111111110101000000101101110011110011111000 1110001011110110011010001100101001110001111001111111111011011111100000000010001100011001000100111101001000110101011000001110110100010100100000100001111100101000110111010111000110110011101000100011111101101101111000001001111010100001001001010101101110010111001111110101000011011100011001100110011001101110110001010001100111001111001111100011001100010010010010110110011101110111011110001110110111000111 1111001110110010010001100011001010111111001001100001111001011010110110100101101111011010111110001100010100100101100010000100001011010001001010000100011110010001010110001010100101000000011100111100111001011101000001100110100101100101010101111010100010110110100000101111010000110001101111010101110110101110010100110111111101100001101000101100000100010110110111001101011110110001101000110101100010000101 1110010100001001101111010111011110110111101101110100110100100000101111000111111001101110101000101010100001010101101110000111110100000011110010010110011010100011101001111100111000110111111110111111111010110010101001111110111110000110001111010000111010010101100000101011101010101111101011101111001011011101011110000110111010000001110111000000001110111011100101001100101000001100111000110100101000010110 0101100010000010110001011100100111001101001100100010111000000100010010011010101000100100110110101101100011010011011111101101110010000110010001101011000010111000011010010101111100100000000000011010101011010011110001010000101010001110000010011111111110111101011011010001011111110100011001101001110100101110010101101100111111101001110101100001100000100111000000001111111001100101110110101100011001111111 1100111011010111100001111100001001101101111000011111100001100100010010111011111011001001001111100101101100111010000000100010000111100111000101011010101001011101010101010100011110011011010101001101111110010000101010010110001110001101111001001010010101111010010101011100111110111010011010011101000001000100000110011100100100101010111010101110001011000011011111010101101011001111111111100110001010111110 1010101110010101001101010000101000010010010100110001100011100111011001110111110010110011100010101111001110001000010010110101001011100111001100110101110100111001010111000011111000010011011011010011011000011011011110000011100001000101100101010110000011101110010001100111100101111010001101000101111100000110111011111100010001001010110000111001100000111110110100101110010111011010101100010111101100110110 0010001001111000110110011000011001011111000101010000111110001100100010110100101101101101001000111000000100011110010101101001010000100101110001101111101000100111101001010000101000001110001011011101101100011000000101111001110111010011000111100110000101111010000100010001110001101001001100000100001011011100100011001001000100000011010110000110100100001011011111010111010101001010010010100111011000110000 0100101011111100011000110010101111001000000100010011110010000011100010111001110101001100110111100010111101111100011100010101100111110011100000111110011010111011011011110101011110110011110101000101111100100010000100000100011010010111001011001111100001100111000001001010010011010111100001000010000101010010010100010010001001001011001101000000000010001110111000001011111100110110101011100101100110001100 1100110011110010001100100001110100110100011011110001101001100111111001000110110100100010100000110101010101011101111100000111010001101000011101111000111011010001001001110010110110000010110110111010100001100010000111100100101111100100111110001101111011101000000000001110111110000001110000111100110101010001101101101000111010010101110011011101111000100001000111010110011001100100110110011011011101111101 1011110111111110111001000110010001000000101110111010001001101100100011001011010100010000001011111011010011001100001110000111111111101101010001001111010100100011110110111110101101001111000011000000110001100010101011010111100011110000111111011100000111111100101101100111100101100001101010100110000100100111001100011101111100001111101110011010111111000000000001111110000011010110010111110011101001101110 0001110001010000001010101000010110110111010001011011011000001111011010011010101111101101100101111001000111000101011000110010101010000101001101001010110100000101001110001001001100001001100110101000100101100001010010001100011101100010001011001011000010001001111100010011100110110010000100110110100111101101011111111011001010110001011111110001011111100010000010101001000100101110110010000100010101110111 1011000001010100001111110011011001100010111010111101101110100001101010100000110111111101101100100001010100101000101000001010010001000100011101100011011110100011000111001100101011100100001010100100101011000111110001010100011010010100101100100010011101101011101010111010010001001011110101101110001010010100011110001010101111100111000011000100000101100001000111001100100000000011110111001111110001100011 0011110101000000111010111111101100101011000100111011110000110100101011001111010111111111110011100010000000011110100000000110111100011110111010100101100000111010100110100111100100000110101001101000111101110000000110100001111100101000111101011110100011100001000001011110100111010100000110100100001000001011110011110110100011111000001010100111000000001001010000000010000011110000001100000010110101000100 1011011001011010100010001111110111001000111111100001011000010000111010011111111111001101000000100101111111100010000000011001110001101000100110011010011000011101100001000110101101000101110010000000001001101111010000101101010011010000001101110101111010101001000001100110111100111000000111111011101010110001011101111111100010101000010000110001101001001110101001010011000001111000011010000100010101110110 0101101100000010010111011000100000010001001000010101000100111011010100111111010100100110110010001110100110111010011010101011111000001011011011001111000111101011000101111011110100101111100001101001110101001000011101110001101001000100000100110011000010101000110111111101111001111001110110111000101100011101011010111110111011110111000001001110011111011100001010010010010000011100001111101010101011111010 0011000111011110110110101000001001111011100100101110100001100010110010011011111101000100101011111001001011011010010110101111110111100011011101111000110001001101111010000100010000000100110001100010110000011110001101001010110001100000010000110100010101010100000000000011011110001011000000010011110001001110101000010100010100001010001111010001000001111101110101101100001111111101000111101100001011000110 1100011001010100001010001111101011100011000110011001101010010101110011100010000001001000110100100101011100101011100111111010011110110110110011001110110110011011000100101101000010011011111100101000001011001111011111001000001001101011001010010000110000011011011110100011100011001100000101011111001110100110110010111010101011000101111101010000111101011011000101000000000101010001011000000011111111000100 1010111110110011111000011001100101111001101111101001101110010001101010100110010111000000101101111000101101010110010011110110000111001000101010010000110010010010101100001101010010001100000001110111000010100100101001110111110101101100101110101011011011001101110111100110000010100110111110101000110010010000001000100011001100111011110110010010110010100110010110011111110100110010101001000111011000000011 0111111111001110001011110100011011110001101010110000110110010001100100011101100011110110101010011100001101011111010000110010101100101111010110001000011001010011110101000101010101101000011100101011011010011111100111010110001010100110111011100010001000111001101101000001000010110101101100001000001011011100100110111000000100011101111011111011111011100100101110110101100000101011010010010100010100100101 0010001001011001010100101101110101001001001011101010111010100001101010110010111000001010100010011001110100010011110011011000100000001000010101000110101101111010101101000110110111111011011001011001111111101011001011101111010110001111010001110000000100010101001000001111111101010010111111000000010001111011001100011101011101101010001110110101011011000101011010000000010111111110110001101011001101101101 0101000101110011100111111101000011000110010011100000111101001001011111100111110100101101111100000100011100011101011010100101001110011011000001000101100101111011001110110011101101001000100100110000001110010010011101100001111101011110000101010001011111100110111010100111011010100001111001011101010101001011100101011011111101111101010011100101000011011011010010010100110111011011111010111001111001110101 0111101000101010000010010111101111011100111000011100100110111101001110111001100011110011101000110010101111110010001111110010010111001001100110011010100010100010011101000110001011110011000001000111110000101100111000011100100110110111001011000011101001000001000111000110110100001110000011110000000000001000011100101110010110100111110001000000011100010010100111000100011100111011100000010000101100010011 1110111100110110001001010110010101001000000001000011011011001000111011110111100000100110000001001111001011001010111110001011100110111101011111101111011111100111011011100101111100001100100111001010000100111100111101010001000110011100100001010111010000010101101010010011010100110110100101001001111010101001000010111111110001101010001110110000010111000000100000101011011010100011001011110101010001111010 1110000110111111110000010111100001011101101000000111001000101000100001001101111011110101110011110000000011100001110011101011010011001100101001000001000111111111101000000010000100100100000100111110100101010101001101001000101001111000001011000111010101111001100000101001111010100111101010011110111101001001010110110111101100011110111101101011011110101000010110000010010001111000100110101001011110100100 0011100111100101100101110010001111010100001001101001011110010001010010101100010110011010001011101011100101001101111111101110111111101010001101101001000100101101100111101100100011101110111101011000001100001110101000111110011111101101101110011101001011011101011100100101110110101000001111101000011101010000111111101111111111101001011000101101100000001001000010000100010101110011001101111010111110110101 1000101101100001010000111000011010010010100000111110101100111010110011011101100011101111001111100011001101110110001011011110010001101011110101010000100000110010000111111111100011001011101101011110010001101111010000000110101100100101010011000110101001101001111110110110000011101001111011101000100001000000011000010001100011110111010011101001011000000011100001111000011110001010000100011101111010111111 1010100000001110111000110001011001010001110000100100100011010100101111000110100101101100110100010100100001110000100010000110011011101110101101000001111111010111101000011110000100111111011010010000001001110000100011111110001101001111110000001110111001000101101101110001110000100001100100111111100000110100011111011000001000101011111111111001111111110111101110001010101110011111000000111010111111100110 0000111000100110000111110101100001010100110111111101011000011111000101010101011101000001111011001000011110111001110000011101011100010001010100011110010101111000010010011001111101110101010011111101010100110100011010011110110111001000010000010011001000001010010000100010000000111000000101101001100100001110111010010100011001100101101000010011010101001011101100100100000011011100011101010100110110100100 0010101011010101101111100011010111000100110110010001001000001001011101101010111001011101001000000010101010011101101000110011011110111111000000110011111000110000001110101101011110011111101110011110011100000000110111010110011100101100010001000000011101110010001111011011111010011011011010010101010101000111010100111011011000110101000101011011100111100101011111001100111111011010010110011001100000101100 0000111100110011110010000001111000011100101001111000010001000010111110011101010001010010110010101011110011011101111111110011010011111101000011100110111011001100000101001000111110010101110110100001101010111101100111111100011111001000010011011101100010111101011001111110101101010100100110000100111110101001000010101011001101101111100010100110000100011111001011101111100111100100010111100111100000000111 0000111001000100101001000010010101001011111001001011110100110000001111001011000110001110001001010110100001001001001011000010111100101000010100111100111100010111001001110011000001000011110010110111001011010011101001001110010101011111110110010011110101100110111000110010111000110110110000101000001010011010100000100011111100001011111011011111100010100001100110111000110001010011110000101011001101011011 0101100111100001011000101111001111001100000000001000101100100010101011110011100001110111100010001101011110001010001001110101011110011000100110110011010110110011101000011001001000110011100010000000001100010010100011101101110000110000111100111000011100010011011110111011100111111101010110011010110001010001111011001001110110101010110110011110000101101100111010000110000001110110110110110110110101001010 0100010010111011011110001001010010101101111111110001010000100001101100111111100000011110110000100000011000011010010000100010101100000111011110111110000111010001110010100000000011100010000101011001000110001111101100101111100000010000111110011110010000000110111110000101100110001010010110011010011010110111010001010011000111011100000000110101010010101000001011001001011101100110100011000011111011101001 0001100110100100000100011111100011111001101001101110110101100100100100010011111111110001100101101010110111111011000111001111101111000110010010000100000011011110000110010110101110001001101011001000100101010010110011100010111111011100011001110011100000011100101111001101100010110110011010010000010110100001010010001001100000010011111111110010010110000100010011010011000110100100111111010010100100111010 1100000110011111111100000100010111000101010110010011111111001001111111101111100000111100111011000110000000111100111111101100011000000010110000010000100000000100001110101100101011011101000000101101111101011111000001011110001001001001111100001000100101110111100010000100110111111101000100111010110001100111000100111100010000100010100110100000110001010101001010011100111011101001111000100100010101110000 1101010010011110100010100110011100001001011010000011010111100101111100100110001111000100111010001000001001010110010010001000111001001100011110000101101111001110101111001011011001000011100101110000110111001101010000010010101101011000000011110001111010010111011111011001101000010011110100011110000110001001011010111110010100111001010101010011010111010110011001100011101100110100111011111010101111111111 0100111110100011101101010100111110111110011010010011111000101010000101000001010101001111011100011001000110110100011010011001001100001010010010111001001010000000100000101011001111110111010000100100110001000110101111111110110100111001001000010010010000010000111101101010001101001101111001111101011011001001110011110001111101101111110000111010101001101110011101011110100010100110001001111010001111110100 1000010001111100010110111100000000100101010111000101100001111011100110010100001011011000100000010001010000111110010000111100100010100101100001001111101101101101101000000000001011010011110000001010111010010000000000001001000010000101100011000111101111110001110010010111011011001000000011111001110100001000001001000101101011011000011101010000011000010110101100100111001011111110001010110010100011001101 1010011110110000111101000110100110001001010101101001100010000000000000011001110011000010001110101100011001001010110011100011110100110001001001100111000000011101001010110111011000011010000101000100000101110011010100001101111100100001111011011000111011011000100001000110010011101110000011101111100001000001101101011111000110100001111001000110100111101110001000000001010001110000010100101011101010101100 1010101010100011111000001101100100001111000110101111000111000100010011111101100101100011011011101001100010011110011111101101111100001110011011011110010011001000101011110101101101100101101110011000101001000000010000110101010100010100001010011111010101101110010011010001000000011001110111110001110101100110000100110100101100001101011011000100011001100010110001110011100110001000110100101101110100011001 0000001100110010000001111000111101000010010101111111001001110110001010111001111110110110110111110011000101001110110110111011010100101100010011101100001101100111111010000101000000111100100000000000011111011000001011011111111110000100001010010101111000011101000101111111110100100110011100111101001010011001100101101110111001000101110110101001101001111001101001101101110110110000110000111101010001010110 1101101101100100011000110001000101110011011111111100010001100010110010100010100110000010111000011100101010111011011110110111111100100010001110011001011000100101101101000010111010000111001001111010001010011100011011010000100011101101000100110001101000100110001101110000101001111101100010110010100010110010001100110101101001100010110110001110111110111100101111110101001011010110001101001000110100001101 0110000000000000101000101001011100001110101000011011101101100010001110100100001100011110011011011001010000001101101000101010000001011000000111011110011101010010001000001011100000010000010110100010110010110100010101001100101011011011000001010100101111101111001000001001001001001011001111011000000001011011000100110011010110111100100010111111000101111110100110001010001000000001001100001101101110111101 1100100001000110100010001101110011111000001110111010100110010101000010000100100110101001010111000100110111101011011111100001011110001101111111110011101110110000110100001101010011010011110000001110000000100101001110000011100110111001111001101000001001011010101000101001010110101100001100111111011010110111010101110010011010011110010011000010110110011110110011010000100001001110110111001100000000000111 1000000000000101111111110011110101010010010001100010010010001010111101100111101000101010100111001010101101111100001010100001101111011100010100101000101101100111100010001010000110001111110001110001011110010001111011011001011011110110111011011110000100000100010001000001100101010011100011101110100011000111010010010010100101011110101001100000111101100001011111010100000101100101001110000011011000000011 1101101110101110010110010011100000010100001111111000101111011100100000111100100001011010110000111011001100010000101110111101010101001001000010110111101111000110011101011101001111011100001100101011000000010110010010001100000101011010111000101100111010010011101001100010110111001111101011100010100101011001100011101011110010001011110010001100011010000100101000100000010001010101100000100100010110010010 0111001011110111100011000000111101110101100100001001001000101001100110001101000010101101111100001010110100000000011000100000100001011011000101100011001111001001110011111000010101111010011011111000101011011011100111111111101001100010111100110111010010000100000001101101010000110000001110010100101000101111000111011010101111110110100110000000111001010100111110010011010111001100001000001101110010101100 1010010001010010010001010010011001011111000100101010100001100100001100110001111011111011111001000100101110000110111011010100010011000111100111000110111110111111011110000011100000011101101101100001110111001000001001010000000010001011000101000000111110011000001010011101110100100110010110001110110111111110001000111010001011010000011111111110000001010000110100101010000011100011000110000111010101111110 1110100000011110101000000000011000110110010000110000011001100011110010011010011110010010100001011010100010011111001101001000010010011000000101000000101110010100110001100000100111001110101010101001110101101011010011011110000101110011101100101101011000010111101001001001001001111011110100111101010111111110010110001001110110101011101100010110111010100101011101010110011100100110010001101000100011101100 1011001001101001101010011101001001001110100010001011001010111001111010100111011000010000100010100111100011110101110110110101010010011001100100000111111101101000001100111111111000011100011001001111011010010000100101011011111111001000000000001001100001000100000010110110101110100101011000101000001101000110001010111011011100101100011001101110101000110100000001011110100101100101101000100100101101010000 0000001000001010100011010110011110100100011111101010011011101000010001101010000110001011010010111010001111001101110101111011110100000100000111000001000000001001011111010011010110100010101000111000001001001100011010011010000110101010000001111010111100010110011010101001011100000011001100111001101100111000011011100011011010001011111101010011111110101001000010010001100111000010101101001110010100001110 0110011010011110001001001000000010010010000111101010110111011111110011001001011111111100010111001010110101110001111000111111001111000110001010110101010111011101100100111011000011111101100010001010000110000111000100011111111111101101101110001011111011000001011011000110101100011111110101110001101100001100101011110000110100000011011101011000011111111011011001011001010010011100111000100101110010111110 1100100111110001101101000101100111001100011110111101111011100001101011110100101101001010011010010010011000011000110011100100011100001111010110111110101111001010010000111111111100111110101111011001100111011010100101101101011011101010000001110000111000000000100000010100011111001111110011000111100001100001110100011010011010011010110010100010101011001010111110010010001110101000000010100101101101110101 1010110100000001010010110101100100101111010111000001100001110110001010111110011110000000101011110000010011100000001100110101100010111011011111100000011100111100000100100101100001001110001101000010110110101111110001100110111101101001100110010110001111111100000000010100110000011111010110100111001001111010011100001101111110100101001110001111100111010110110111111010100111110000010100111010011101000100 0000100001100010010100110010100111011010001100101100101011111111101110000000101010000011101011111110111100000111111101101101101000010001101000101100011001010100010001101001001011011111111011101010111111000101011100010001110111101010110000010101110111001000111111010100010011010001101111010110011000001110100101110110111111111100000000010110000010101101001101111011111010101011011011010101000101110001 0100011110000100011110101000011000100010111000101001111111001110000010010110010110101111001101011111001100111110001010001101001111000110100111111101110001001000101010000100010100110001100000110010111101111011011100111000100011110111010000001110111010110011110100001100110101100011011011101010111010001010001011100101011110110001010100110111100111011100011011010001011111010011011011001010100011111001 1011100000011011001101000111010100101111000010000110111011100001100000111100110110110110001010001101111001100001111001000000011000010101110010101001110100100001100111111100000011011111110100011011001001110100010001001001101010000001001101100101010100001101111000111100000010110001111000001000101110100101101011000011100111100100000000110111110110010100010011111110010000010010000111110010110110001100 1010010011001010011110100111000000110100011100000100110001110000010010000010110101111110111010011110110000111110110110011110010111110110000000011111111010111100000010101101101001111100101111110001101001010100010110001010010001101101011100100011011011100110001000110001001110110100001001001011001011101100101010100000001011100101001011100110111000001000110011010010000001110001101011001011111011001100 0010111001111011110100111110101101011111011111010110111000101010011110111111011110010010110001101111001000011100000101110111010111010010111000100110100001111101001001000111110110000010100110010000011111111001100101001110111111110011111011010110001001000110101111010000000100010101000110100111101110111100101100110000101110011101111110111000010100001000111111100100011011010101011101101101100100110110 0101010010000101101111100111111000101100100001110110001001110010100111110011001001110101001101000101111101111010010011001011010110010100000101100010010111111011100110011011110111001011100111000110010010000001011011111110100101101111111100111111011100001010110111001101111000100000110101000111010000111000101001110110000100101101010101111111011000111000100011010010100011111011110100100101101000001100 1100010010111111100011100101111100101011011000011010000110001010011000101001000101110111100100001000000111001011010010101011101011010101001010001001001100010110011010111101100011111110110010101000000101110010111100100110001111100011101001110010011011110000110100101000100111010100011001111110000101110010100001000010001001000100001110010101111111001110100001110111100000110110100010000001010110000101 1000111111000111000101101110101111100011010100100010000000111101111010011111011010111101010101100001011011011000011011000111001111011011111001010111101110011011110010001110100010100011011001110101110001010000001111100000110101110101001011000110110001010011010000010010111101011001100011110111100010011000001011101001000111000111010110101101000111010110110000011011100000001010011101010001000101000110 1111101110101001000100001100111000101110001011000110101111000010111111101110110100001000001011111011001011011110000011000100101010100110001001100000011001110010101101011000111101100101101110000111010010001110010100110101101010100100110110111111101010111110100000111110100001010001000110001010010001111110100011110111010001110100110100100100111110100110011010010001110000000101101010001100111101011100 0000100001111110110100001000011011010011000110010011101101101001010110110000110101100111111101101000010101100011110001101111101011101000000100101111101100110110101011101111100000001111110010101101110010001000000010101011100110000000100011110001001101110110000111010111001110111001111110100001110001011001000000101010000100110101001000000000001000000110011011101110100011000111011111011101010001100001 0100101110111011010001010001000111101100001010001110100111001110111001000100010100001110010100010011011000001011101011100010000100101110000010111100110110100010100100111000010100001101010000011000010011100010111011011111111110110111010101110111101101010110010100011101111000111110100111111100000101110100001110111000001110110011100011001100001011110011000100110111010011101000100111000110011111100001 0000101101100011100001101001101101011111001111000001110001001001111001110011010111111100010100101000111100011100110110011000110100001001011011110010001000001111000010110000011010011100001011000010100100101110111100101101111011100110111010010100000000111011111111011110100001011001000110001001000110010010111010000101000000011110100011011011011111101010111000101110100101001110001110010110111010011111 1100000110101100100110100101101001100101001011000011111001001111010110001011001100010010110011011100000001000010000010010000010110100010110101101011011000000010010000110000101000011110100100101101010101110100101111001000001110000101010000111000110101110001010111000100011100100011110010101000010111001101110110011001000000011000000010101101001000100000111111110001001111000111010101011111110001011100 0101001100111011100001110010001000010000111101010110001101010110110011110010001101111110110001001011101011101110000101101101010011001001001110011100000111111011001100000100110011101100011111011110001100000010101001101100100010111010111000110101010000000110101000011011111001010001101100010101100010010000110000010101110111101100110111101000100011100101011100011010010110101111010001010101011011111101 1011110001010000010111110000010010110000100000000011111001001100001101001010000101110010111110010010011011000000011100000010010100011001000101110000001110110000111010111100111010101110100111110101101110110110110100110111010000000101111010101101101001001001001001111101100110100001011100101110001101110110011011001101011000011000001011100110110111100001100101000001111100100000001001001110100111001101 1010011100011111110110001111110110100111101000110010010111011010000000011110001101101000000101010001111001010001110111000110010100100000001111111010000000111110010111100000100100010101000101100110110011011110011111101000001111111111000001101010010110001000001001110001011010011111100001111001110011000110010100111000011110101011000000111110001111000011010110000010010110001101100111101011100100001111 0100110100011010100011100110111110110100111111111101111010110011110010111111100111110010101101101000111001101100000010011110101111100010001010010100100011000010001011100010110110011001110100110010101011100000000010110101000001000000111111001111111001100110011101110111000011000110010011010011000000001011010110001011010101101010101011100001000101110000000101011000100100011110010100100100100000010001 1100110111111010110100110011010101000111001111111100100101010101111010011010001000110111001100101001100101011110111111000111100011011100001100010010010000001101100100111111001010100001100001000001011011101111001100000100001000000100001100110101010001011011110100110101111001000110010100100011110111011110000101001111010111011010110100000001110100101011100001110010000111111111111101001111101001001010 1011000000110110111111111001010111111010011010010110011100000000110010110111101100000010101111001111000000111111111011011110011100010110100001001000110111100000110001001110010100110111010101011010010010010110010101101011011100001010100101010100100010100010011000111110000000011111011111000111100110010100100101101000100101011101101011100110110101111001011111101011110110010000100100101111110000110110 1011111000010000110001110000000110010110010101000001111100111100111001000011001111110101001000110100011101001100011001001000100000110001111000111001011101001000111111101011001110111000010111100001100010111100100101010101110010111100000001010010001111011011100101010101011010100111010111111100110011110100111110010110111110100001101111010011110011111101110000000100000100000111111001000010110110010101 0100111101010110011011101010010110111100110110000000010111100000001000010101110101001101101111110000101110011100010000001101100110010101011111110111101110101100111111001010011001110000100000111111000110111001111101111101111100101010110101101111000100100011001101010001001000100111101110000111110000101100001100110001111011101101000110010001101000011000110011111010010011101000001001100001011000101111 1001110000011110110010111110000000011111101100001010001100110110101111010100111110000100101001110010010000101010000000111110011111111011001001001011010010011011111110000001010010001011101111100111111010001110101111011110100101111001110110001101001101101111011100000010111101001001011111101000000001100100100110100110110101000011100001101101010101001110010011011011100011111101010010100110010010100100 0000010110000000101000000110110010111001100100111000100111000000011100110000100101010111011110000001011011011011010001111000111011101010111110110111101000011000010010001010111001001011011000001100100111011011011011000010000111000011101000001110000001101010100100010101111011100001110001001001100000110011100001000111000011010101101001000010011011010111100111001010000111110010110001000111111110110100 1001111101001001010110010010111101011111011111011010100000111110101000110000001011001101101000111111011101010011010010001000001101111010010110111100000100001111010010101100110101000010101110111011000101101000001001100001001000100000111011011001001100000100000100000011111100011011101001000110111101010101101100101001101111000110000110010100001111011100011000011001011101111000011100100000010111111101 0101101110011010001011001101010111001101011101001101011110101101110111100000011111001100110000111001110101111010011001000101110110110101001111011100010100001110010110001100010000110011101000010110110111001101011110011001011001001000000110000000110100110010101101111001000110010100001111101010001011100001111111001000011000010010011111011111100111011001000100010000110000101000010101110101011111011101 0010001110110110110110110011010001101111000100010101111100000101011110000011100001100110001010010100001100100111110001010011110001010110111100101000010011010010101110011100101111101101010100100000101000010000010101110100110000100110001101100001001010001111011111001100101001011011101011110000111010110011011001110001001010011100101001010000011000001101111000110011101110101000111110010001110001001100
cTrader Algo

はじめてのcBot その2

11/8/2020 1/8/2021

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

プログラミング開始

前回はcBotを新規作成し、ログに出力させるプログラムをためしに動かしてみました。今回はこのcBotに実際の売買ロジックを組み込んでいきたいと思います。

売買ロジックを決める

プログラミングに入る前に、まずはどんなトレードするcBotを作るか決めておきましょう。王道のゴールデンクロスとデッドクロスで売り買いしましょうか。

短期移動平均線が長期移動平均線を上抜いたら次のローソク足の始まり値で買い、下抜いたら始まり値で売りとします。ストップロスとテイクプロフィットは固定値とします。

外部から設定すべきパラメータは下記5つにしておきます。

①短期移動平均線の期間

②長期移動平均線の期間

③エントリーボリューム(通貨量)

④ストップロスピップス

⑤テイクプロフィットピップス

テンプレートを見てみる

ストラテジーが決まったらさっそくプログラムに入ります。今回はまず最初に自動で作成されたコード全体を眺めてみましょう。

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 HellocBot : Robot
    {
        [Parameter(DefaultValue = 0.0)]
        public double Parameter { get; set; }

        protected override void OnStart()
        {
            // Put your initialization logic here
        }

        protected override void OnTick()
        {
            // Put your core logic here
        }

        protected override void OnStop()
        {
            // Put your deinitialization logic here
        }
    }
}

まず1~6行目までは使うパッケージを書いてあります。最初はいろんな機能使うためのおまじないだとでも思っといてください。

8行目のnamespaceはこの場所に名前を付けてるだけです。気にしなくて大丈夫。

重要なのは10行目から。10行目はHellocBotクラス(cBot本体となるクラス)にRobot属性を設定しています。今回はいじる必要ありません。

13,14行目はcBotの外部パラメータ部分。デフォルトで一つ意味のないパラメータが作られてますので、ここを上記5つのパラメータに変更します。

あとはメソッドOnStart()、OnTick()、OnStop()が自動で作られてます。コメントのとおり初期化時、Tick受信時、停止時に必要な処理があれば、ここに書き込むだけ。

なお、今回のロジックはTick受信時ではなくてローソク足更新時に動くため、先にOnTick()はOnBar()に書き換えておいてください。

protected override void OnBar()// ←もともとあったOnTickのTickを消してBarにした

 

パラメータを用意する

さっそくパラメータ部分をいじってみましょう。

[Parameter(DefaultValue = 0.0)]
public double Parameter { get; set; }

この部分ですね。Parameter属性を使用して外部パラメータとして設定しているのですが、今は深く考えなくてもいいです。

とりあえずコピペで増やして型と名前を変えてあげましょう。

// 短期移動平均線の期間
[Parameter(DefaultValue = 25)]
public int ShortPeriod { get; set; }

// 長期移動平均線の期間
[Parameter(DefaultValue = 75)]
public int LongPeriod { get; set; }

// エントリーボリューム
[Parameter(DefaultValue = 10000)]
public double Volume { get; set; }

// ストップロスピップス
[Parameter(DefaultValue = 10.0)]
public double StopLossPips { get; set; }

// テイクプロフィットピップス
[Parameter(DefaultValue = 30.0)]
public double TakeProfitPips { get; set; }

移動平均期間は整数なのでint。他は小数なのでdoubleです。DefaultValue = の部分にはパラメータのデフォルト値を設定します。適当で構いませんが、ここでは25、75、10000、10、30としました。

これでパラメータが用意できました。これを利用してプログラムを組んでいきます。

 

使うデータを準備する

まずは、使用する2本の移動平均線を持っておくための変数を用意します。

class ~{ }内でメソッドの宣言でもない場所に、変数の宣言をすると、それはそのクラスのメンバの変数となります。

先ほど作ったパラメータの行とOnStart()の間に2行書き加えてください。

//2本の移動平均線を持っておくためのメンバを用意
private SimpleMovingAverage _shortMa;
private SimpleMovingAverage _longMa;

Robotのメンバとなる変数を用意しました。なおC#ではクラスのメンバとなる変数のことをフィールドと呼びます。

privateな(クラス内からしかアクセスできない)、SimpleMovingAverage型の_shortMaという名前の変数を使う、と宣言してます。

SimpleMovingAverage型というのはcAlgoが最初から用意しといてくれてる単純移動平均線オブジェクトを扱うインターフェースです。

OnStart()内で変数の中身を用意(初期化)します。(前回のthis.Print(“Hello World!”);の行は消して構いません。)

_shortMa = Indicators.SimpleMovingAverage(Bars.ClosePrices, ShortPeriod);
_longMa = Indicators.SimpleMovingAverage(Bars.ClosePrices, LongPeriod);

Indicatorsというのは組み込みインジケータへアクセスするためのオブジェクトで、Robot(=自分自身)がもつプロパティの一つです。自分自身を表すthis.は省略してます。

ここでは終値基準で指定した期間の移動平均線オブジェクトを提供してくれる機能を呼び出した、と思ってください。ShortPeriodとLongPeriodは先ほど用意した外部パラメータです。

データの準備はこれで完了です。

 

売買ロジック部分を作る

肝となる売買ロジックを作ります。今回は「ローソク足更新時」のみ動作させるため、先ほど書き換えてもらったOnBar()内にコードを書きます。

移動平均線のクロスを判定するためのデータをまず用意しておきましょう。必要なのは直前と2つ前の各移動平均線の値です。

double lastShortMa = _shortMa.Result.Last(1);
double preShortMa = _shortMa.Result.Last(2);
double lastLongMa = _longMa.Result.Last(1);
double preLongMa = _longMa.Result.Last(2);

SimpleMovingAverage型のオブジェクトのそれぞれの値にアクセスするには.Resultプロパティを使います。Resultは移動平均線の数値が過去から現在へと並んだDataSeries型なので、そこからLastメソッドで最後から1つめと2つめを取り出してます。

if文でクロスの条件式を書いていきます。

if (preShortMa < preLongMa && lastShortMa >= lastLongMa) {
    // ゴールデンクロス時の処理
} else if (preShortMa > preLongMa && lastShortMa <= lastLongMa) {
    // デッドクロス時の処理
}

if文は()内の条件を満たしたらそのあとの{}内の処理をする、という命令です。最初の条件を満たさなかったら次のelse ifの条件判定に移ります。 &&は「かつ」という条件を表すときに使う演算子です。

一つ目の条件式を訳すなら「2つ前の短期MAの値が2つ前の長期MAの値より小さく『かつ』1つ前の短期MAの値が1つ前の長期MAより同じか大きい場合」=ゴールデンクロスした場合ということです。

後は発注処理書いたら出来上がりです。Robotの持つ発注メソッドExecuteMarketOrderを使います。this.は省略してます。

if (preShortMa < preLongMa && lastShortMa >= lastLongMa) {
    // ゴールデンクロス時の処理→買い注文
    ExecuteMarketOrder(TradeType.Buy, SymbolName, Volume, "Sample", StopLossPips, TakeProfitPips);
} else if (preShortMa > preLongMa && lastShortMa <= lastLongMa) {
    // デッドクロス時の処理→売り注文
    ExecuteMarketOrder(TradeType.Sell, SymbolName, Volume, "Sample", StopLossPips, TakeProfitPips);
}

完成です!Shift+Ctrl+Bを押してビルドしてください。(組み込み環境の場合はCtrl+B)。

もしエラーが出たらエラー一覧を見ながら直します。VSの場合は赤波線の場所がエラー部分ですので、タイプミスなどないか確認してみて下さい。

 

コード全体

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 HellocBot : Robot {
        // 短期移動平均線の期間
        [Parameter(DefaultValue = 25)]
        public int ShortPeriod { get; set; }

        // 長期移動平均線の期間
        [Parameter(DefaultValue = 75)]
        public int LongPeriod { get; set; }

        // エントリーボリューム
        [Parameter(DefaultValue = 10000)]
        public double Volume { get; set; }

        // ストップロスピップス
        [Parameter(DefaultValue = 10.0)]
        public double StopLossPips { get; set; }

        // テイクプロフィットピップス
        [Parameter(DefaultValue = 30.0)]
        public double TakeProfitPips { get; set; }

        //2本の移動平均線を持っておくためのメンバを用意
        private SimpleMovingAverage _shortMa;
        private SimpleMovingAverage _longMa;

        protected override void OnStart() {
            _shortMa = Indicators.SimpleMovingAverage(Bars.ClosePrices, ShortPeriod);
            _longMa = Indicators.SimpleMovingAverage(Bars.ClosePrices, LongPeriod);

        }

        protected override void OnBar()// ←OnTickのTickを消してBarにした
        {
            double lastShortMa = _shortMa.Result.Last(1);
            double preShortMa = _shortMa.Result.Last(2);
            double lastLongMa = _longMa.Result.Last(1);
            double preLongMa = _longMa.Result.Last(2);

            if (preShortMa < preLongMa && lastShortMa >= lastLongMa) {
                // ゴールデンクロス時の処理→買い注文
                ExecuteMarketOrder(TradeType.Buy, SymbolName, Volume, "Sample", StopLossPips, TakeProfitPips);
            } else if (preShortMa > preLongMa && lastShortMa <= lastLongMa) {
                // デッドクロス時の処理→売り注文
                ExecuteMarketOrder(TradeType.Sell, SymbolName, Volume, "Sample", StopLossPips, TakeProfitPips);
            }
        }
        
        protected override void OnStop()
        {
            // Put your deinitialization logic here
        }
    }
}

 

 

次回はバックテストでちゃんと動くか確かめたいと思います。


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

新しいコメント

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

cTrader's Life

© 2026 ajinori