0011011111010011010001010101000100001110010100100111000101100011010010011011100100111011000011010100010000101100100001111111100111001000010011111001111011100000100011100101010111111110111110001001110010100001110000011101100001100011001101001000100100001101110000111000001010101010101010111110101001110010010001001011111011111100010100100010110010110011100100000101111100110000111100001000110101111101 1101110011100101001011001110000010110000011100100001000111011011010111000111100101110010011000100111101011010011100101101001010110011110110000010110100010110110010111100000110110100100010011000011101001000011100110001010001000011000011011110010100001011101010000001010010100111011010111011000010001001011001000010100010101010110100010010001011010000000100100001111100000010100110101010101111100000010 0000000101010111000110000011000111100111100110101111010001001000011110110111011010010110100111100001101110001001000000110000111100111100111001000111100101101110001100001001110000011101111001010000001110101110110010010110010011111011010111111111000000000110100000110110100010100101101011111001011010011111001011000001111010101001011111001101010000001100101101010010001001000111100110111011011001100100 1100001100000111011011100001011110110001110100010101111011010111111100111000001000001110010111100010001000001001001001111110111100000100111111111100011100111101101100001100010101110011110011110001101000110111101000110101010110110101000011001000101000001011010010010111011100000010011110001101110011111100110001011100000100000011011001101111000100001101111101001110111101101100111010010101100110101111 1001010101101010101101100001001110011101111110110110001001111100011111110100110101001111010011111111001001010100110010001100001011001110000010001111110000101001000010100011110100110011101001101001000111111000100101011101000000101010000000001111101101011100101000100000111001100110001111011011000101111100101100100101011010101001001001000101011101111101110011010011011111101101100010100100000100001101 0011010110110000001101011001011010101001001011000000110110000111011000101011100000001011011011011000100110100011000111111110000000000100010000000011100010100000110110010000000010111111101111000110000110011011111001101001010000111111000010001110101001001010110111110010000111011010100011011111110111010111111010011000111010010110001011000000000001111001101001011001010010001100000000110001100101000101 1101011000111101111100110100000101011010101001011011001111111010001010110010100011010001001000111110001111011111111011100000000000000100000111101011101000000011100110010010111100010110110001101000111100001110111111110000101010101010001001000001110011011100100000110001000101101111010110010001001000001011000110011101100100111000010010010101111011101000010011001101010001001010011010000100010010000000 0011111001010010000010010110110101100111101010010000010010110111100111000101110000100101011111000010101110100010101100011001000011101101101101001111111110011000011010000011000100110110000111110010100100110010011100001101111100011000010101011110110111001001111000011101010100100010100101111011010110001110001011000011111011000010110101000100111010010100001000000100110001110111000001000100010111101100 1101111111001100111111010111100101001000000100100110001100001010011111000000011110101000001000110110101000100000010100111010111011010110011111011011011101011010011000001001010011010101110110101110111001101000010100111111001001010110011100110000100010111001000000100111110011001001110010110010100110111110101000001110011001101111001100110101111000001100001011110000111001011000101111001010100101011101 0100001010110011100011100010101110010010100001110001111110000110001001101001011100000101110000110111000101010011001000101100111011000010000110010111110100010011010101100001000111110001000101011101100110101011001100100110110111111010001001001100011111110000100010010000001111100010101010100001001010000011100110111110111001010110011011010110010110010001001000100011011011111100000001100010110000001101 0000010111001101010001000010011101010001101010100000101010000011110011110101101100110000110100010001001110010100010001101000100000010111101011101101010101010000100100101001000110000110001101111111100111010110111100001101011010111001100001011110011110101000000111010010001101111010001011111101000000000100111011110000100000101010111000000100100000101001110010111001101100100111110010100000100111101010 0010111001111011010000111100101110100111110001001010010110010010011000011011110101000001011001011110101111001101001101010110110001110011110001000110000010101011000111011000101101000101110001011110101100001010101100011011100010111011101001111100000111111001101110110010111111100000001010010011100101010110010010100101110101111010110011000101111001110010000100011001100010110000101101001101011011000110 1001110111101000100001100110010010010111011010100101100000001111111111101010111001101010000000110011010001000000110001101000011010010101110000111111110110011111001010101110111000100001111000001110101000011100111111110101111110010110000001011101001111011111110101001101100000111001100110111100111100110110011001100111000111101101011001110001101011011110100010010110001010000101000010100001101111100000 0101100100010000100011110000101111100001010101110011011001000010011010000010010100000100000001100110000001110100111101010011010110101100101101001111000100011101111110011110110000110110111011101001100111011010111010011000100101011111000100111011110000010100010101110101111010011100001000111010000000110000001111001111000001100101011000100000010011000100110001000111110001011111001010001000001011110101 0011000111111001111111110100110000111101000111111001100100011111000000110100110101111100001110111110100010001110100101001100111001010100110100011010101111000001011100011100000111111111111011111110011110000011111010101000000101111100110100010101110010001111011010110101010110000011110010110101010110001111010101001001101101000010011000001111011100011111110110110100000100010110001111000100110010001111 1011101011111101011011111010011110110000111000000001100111100110011101100000100001111110100000010011000011011101101000001100101100100001100111101110101010000001001010000111000111011110100010101110011001110111101101101101100010110111000101101110101111101000010111011000101010000011010111110011010101100001001101011001001001100100000010101100100110100111011111000001010111110110000110100111010000110010 0010001001011011101111011010001100001011111010010101101111101000101001001110001111011011110110101011000100111111000010001001010111000110111100001001110001011000001100111100001111100111000100110110001010000000110110010001111110111101110111101000101110000000011100011010011001110010010001010100110000110010000001110000110000001001111000101101010110111011000001010100110000100111010000010110101111110111 0111100010100111011010010011010011011011111110111101111010111000001000010000001110000101001001110110110100101110001001100001000011100000100001011000000010100101101111000001010011010000100100011010000110001010000010111101001011111111100001011000010111011100011111100100100111011011100000111101111000111111111111000001111100111001000001001010101010011110000000101111011100100110001101001011100110000111 1100011100101001010000110100101011011111100000000100110101011111001101110000100101011100100100010101110000001001011110000000001110111101010010100101100001101011011101110010110111110011000010110011100000011011100110001110000110010110000101000110111001010100010100001110101100010101011111001101111001001011011111100011001111011000001001101000010100000101011011111111000010000000111000010001010110001001 0100001110110001100000110000000000010111010011000110001011100110001100100100100010000101011010111001001010100111000011110101001011100101110110111110100110000111111000111100011010101000000000111011111000100110011110010100010110011000110011111011010001101011100110001001100010100111011010011100100011101010001000100110111101110100101100011101010100100101001010000100110000101010110001101101000100000010 0111010110101001100000000110011001100010011100001111110101101001000111110010100101100101111101000000110101001110010001110011011011101011110001000111100011000110111101001110010010100100110110010111111001000001011101110000110001010110001111111001100110000010011001101000101100101010100101010010010100000110101000011110001011010110110010110101111011010011001110100100110110011101000101100101110111111110 1000101101100000011010100101000001101111011000010011011110010010001111100100001010000101100111110011111001111101011000011101100011000110000000000111000010111101001101010101011110001110110101111001000010111101111110011101011001001010000000010011000001010000011001000101000111100110101011000011011000110110010010110010111000100101010001100100101101011101110010100100010100100001101001110000111110100001 1001001001000110001111000111010000011110001110010001111011101100111110011101110110001000010100111100101100001100111011101001100110111011111100111111011111100010010001011000101101101001111100010110010100011110000111011011000101100101100010011100110001011001100100111010010001110001011110101010101100010000101011011011000011101011110001001010000001001110101000011110011001101100101101110000100000011101 1001111001001110001100000000111010111100010010101001001100100011100100011001110110100101111011011011001100110000010000011010100100011010011010100000111110001010010110111010010101001010010100001011110010101010101010011000011010011100001000111011110110110101101101001110100111111100000101110110011101000010000111011100110011010010100010101110101110110000010011010010001100111101000011001101000011100011 0111100111110011011001000001110110101011110011100101001100110001010100000001111000010000111011100101101101000111001110100000000001011011011100011000000111100001101010001011111101111010101010110000111110001110010000110000011111101110100001011010111011110011010101011110101101101110011001000110111011010000110111100100010111110101001011101111010110011100010100000110110000100101101011000110011010110100 1101110011111000111110001110010110111101110110101100001101000011010000011010001000010100000110001000010010100001110110001011001101101111111100000010000010001111101011001100010100100101011111011010010110010001111000010101101010101100110100010010000111010111111010001111000010110100110110010000101110110001111000001110101000010111010110101001011000010100110011000101010000011001000001101001101010000001 0111101100000111000010010010111100011110010111001010010101110001111001010110011010111000111111111011111000000001000001000001100011010001000111110100101011011111111101110011000001110000011000011011111100011100110101000000110111011011100101111100111111001010111000111101011011110101000110101100100011010001111110110111011001010011110010000100010111001101110110000111011101010011000101110010001111001111 0111001011001101010000101111110000101001100010100110110100001111101000000100010011011111000001101111001100110101010111110011011100111000011111000010011110110010111001110000100111010001110001100001101100010000100011001101100010110011001100011001011011101100100000001010011101011100011100010000101000011001000000011110011101001010111010000101000001110110000100101000111100000101011010000001100010101111 0101110010001010111001010100010100111010100001111100100111000101110011001000100000111011000100000100100111100011101010111010111101010011001001000110000111111110000011011111110001100100000000011010011101000101001100001010111011110001011001000101011011011011011000010110001101101000100101101001111011100111001010111001101110011000011011100110100001011101001001110000001000110111001001010011001100010011 0101001000000000011101111001101001100110100010000011100101100001000001101010000001111000011000110110000011001011111101000000110010111101110000110000011100100010001111011110111010011000100001111011101011010111011101110101010010001100101000001001111110110100110110111010010011111001111110101100101000100110110100110100111100100011110011001111100011000011011001100101011000010111011010011001111010010110 1001110110000001111000100100011001110111000110010100110010100001011011001101011011110101010010101100001111111101011011101001011000011111111000011000101011100111101110110110100101110001001110010110100000000101010000010010111000101110001001010011000000100110001100001100101111111101100000101000010110011111001100101110001110101010111101011110101010100001001010010001001111110100000001110100110001100001 1100011111110111101110010101100010101110110101110000101000001000111011000110001101010101101001100111111001001001100110111001001000100011111100100110110010101001111110000100110000001101001010101101100111010111111001101101111100110111001110011111100110011011001101100110100000111000000011110100010001001010100110100000110110001100111000101011000111011001100101000101011111111110010010100011100101110111 0110010010101011010100000101000100100001000101100010010100010110111011110101110010010011010011010000010000001101101110111000110100011001100000011101101111011011101011000000111001010011100101011110101101101001100110111000011100111100001100011010001101001111000011000111010100100001001010100100011100000101011100000101111011010110000001111111100000010110101110111101001100101100110000011000110110000010 0101111010111001100111000001111011000111001010011111101101111011010010101100011111000111000111011011011111110100011101111110001010100100000001011010010000110111011100001011101001010101000101011000010011111001111001010011101100101101001011001011111001101111111001000000001100101111111100010110000100010000101011101001011101010111101111011001110100000010001101001010100000000000011111011111001011000001 0110101110000011011011001000111111111100010111110101001011011111011001110001001111101101101101101011110011101011011111010100000100101110010010001010111110111100011101000011111101001001000100000000001101100110010110010111001101001110110001100111001010110100111100110011100100110010010111000101011010001011100011001111001000110101000110011000010111010001100001100110000111110110110101100011000101001001 0011101100011011010111001100011100011101110101000010100001111000100001000110101000001111111100110110110110111011111100111100100100110001111111000111110001000101100101101001100110001100101010010111111111100111110000100101000110011011110101000100011011101100000000010010110110101011110110110110000110110010011010011011001010110110110101011111100100101110101110111000111111101011100100000101110100100011 1110001100111011000001101001001010101000101110111100011100001001110111001010000101010001101000111001000100100010010111000101111110000000010101001000101011010010001101111000011001111111100100001000011001010011101100100110111110100010100010001110010000011001001101001101010100001100111100101111101100011101000000010100010001001110001100000000000010011110101101100100000010000110010110110100111000111111 0011001010110100010010110100101100100011001110001110111111001101010101100111001011000101111101101001001101010010101110100011000010000010011110001001000000101111101011001111001110000010010110111001101101000101110100000111111101110101010100110100100110100111100001011111000000011001100110100100011010100111100110001001110100110010100111111101010101110111011000010010010110101110111011000001010110111110 0100110011010101000100110110011100001011000110001111001001000110010010101100000101111110110000111101111011101001101110101001011000100101110010101011111010011101101101011100001000011101101010110101101010111100100101000110001110100110100110100101101000000110000011000010101110111010100000001111001000111100100101001101010011110100100101010001100111110010110011110000011000000010011101111001111100010101 1010111001111111001001000110110111101111000111001101010101010011001001011011111111110000001011100100000000111101011100011011111100010000000111110111111001011100101000010010001101010111011010110100110110001001111111101000111010011100001001101100011101110010100000011101000000011011100011011011110110010011001111110110101010110010111110110111100000000011110110000011000111100101101000001001100001110100 1111010000110100010101011100100001101001111111011111100111010101110110010111001000111001011101110100001001001100101001001011001111011010100000111101011111010001001100000111101011100111111111000011101110110100011000000001110010100010110101000000110010110100100011001100101011111000100110111111111100000110010000100100100001110000100100100010101010101011100010011111010110100010111001101000001011110111 0110100110110101000011000001110111101110101100001100001000100010110110001001000010010111010100000101100010000001111011011000010101100001000001001101111100100010011011001110111100110100010100100000010000001000111010110011111011111100010111100011001001111000001101110010010001000011100010110101100110110101100010101001011011100010001110000111110101001001111010010111010001011110111000001111100010110100 1110001010011110010000001111011010000100001111111001010000000100100101111010101000100011011011101101011100100101111011100110000110001110000111000100010000000101011100010111001111010011011011100111010000100000000110000010100100110100011011000110000011101110110010010100111000010100100001000111111110000110111001011110101101100100010001110101001111000110100010001000110001000000110100101000001110000110 0010010110000100101010101010110010110110000011011111001010101011001100010101111000010111101100101001001110110110100011101001111101010000011110101011001101001000001010111100111100000000011010111100001110101100001110110110100011110011010110101010100101101010111010010010001110011100010010110111101011010100100010101010111111010010001110000011100110001111010101010001100001010111000010111101011100111001 1010011101010100111110000010001110110110110001011000011001101101001001111001000011000110110000111011110100101100100000100011111100110100001100111110011010011100110000011111010000111000110000001100110001010101010100101111100001000100001010000111111100111100010111110010011101000100000000011100001111001100000111010101011011000101011000101111001110001010100010100011111011001001001000101010001111111010 0111101110010001101110101110000101001000100000110011100111100000101111010100101000000010001100100111101010101011011101100110101011011100111101111101011011110011011100101100100000111110110100101101101110010001000111011100000110001010110010000100001011101000011101010110100110111100010011000110110001001110001101010011001100100100100010000111100001001000111010100011001011011100111000101100110100100000 0011100001001101000011111000111110001011101011100011100110111110000100010010101111110111101011010001001010000010101001000001110000101001010100000001110100101100110001010110011111001001010100000001001010011111010100001110111010100100010010100011001011010000011101000011001101101000110100111011001001110110000001010111000111110111010010101011100100101000101010111001011000001010001001110000111100001111 0010000101101000001010110110011011001111111110100010010101110111001001100001111110110011001011100000100011001010101100001011000100100111110100100000101011010001001111010010011001010000100110011010010010110000001000001100111110110011101011000001111101100010010011101011111110001010100001000110010101010011111110011101100000001011000011001101010101000011000111110001000100110101001111001000111011101011 1011111110110111001100111001110111011011000100101010000110100100011010111010101110011111100001110111101101110110100100000011001100011110001110110000001011000011111100100001011111101110001101101110110100011100100110111001011110010101010100010000000101100110011001101100001100100111110100000011011100011110111100101010111111101011011110110100101100001101001000111100110010100000000010111110100111000010 1001001010000010101110010110001011111110010011000101111100110100111000011100110011101010111101111110000111101110101011111011010111001111111101110000110110110011000010110010000010001000101101100111000000000110110010010011000110110100010011001000101100010111111100001010100011111111011110000101000000111010110010100000101011000100001100010110101010111110100101110100001110101111110111101110000100110011 1111111000110001110110000100011101011100001001010101000111111100000101101000111101001101101100100000111100010100000001010101100011110100100000111010101011000111000100101111000100000011001000101011101110000010001000111011010110111001011010111111011011111010010100001111101111101000101101110110001000011010111011110111100011111011100010101111010111000100100100110100001110000101011110101001110010011101 1011000001011101100101010000010111110111011101011110110010111010000000110100010011010111010111011000110000111111001101111001100010011101100101000010001100110101111011100010100011001010010110111010100000000011011110011001111000111000011101111100011000011001110110100001001101100100100101111000101010100101000011111010100110111100100111001100010101010100000111110000000000000110010010100000101101011110 0111101110100111111000100000000110010011100001110001100110110011011001000001001010010110000111100111011011100101011100101111110110101101110110001010001001111000101011001101011001000101000111000100101111001101000001011011001001001010001001100001011100011011001101000001000011111000111101000100100001101010100001110100111100101100100111100101100110010101100110101111111111000110110001011101010100101101 0011010101000111101011000001110111101010100100001010110000110100001000110000001010110010010000000101011110101010011010110010010110110101100001101100011001000011101100100111000101001111000101111100011111110110011010110110011001010101000011101000001011011011011011111101111001011010000011110001100011000000101001000000111001100110010000000101100001101010001100101000010000000000111010010010100001110000 1001101110101101100011001010111010111011101110110001001100000010000011010101000001101001101011111011011010101100011011010001010000011100100100010000010000100111110110101000101000000101000000101111000110110010100011111100010111000011001000101011010100110010011111010001011001101101011010100100100000000010011000110011101111110111110011001001001100101101100111000010000001011101001000000100001110001100 1111001010100101000101010011100001111111001000100100101000000000011111101101001011111111111000101110100011100110111000010111000011000111101010000100111000000111011011011101010010111100110001111101111010111000001100001001010100101100101101100111010000110101001011101101000010001101100000100111001110101110011111110000100111011100011010111101100000010101110001010101100101100110110111010101010011100000 0111101010001000000100010101100010101010001100101101011010011000101000101100000111100100110010011100101101111111000000010110001100001101010011001010010011110011001001011111111111110011100010011011100000001101110000110111011011101001010011101011100000110111101100011111011000010111111001100111100100111100000001001100111010011100010101110110001011001011100001110110100110000111011101101010001110100001 0111100000100111110101010011100101101011001100000000100001101011010011010000000111010010010010001001110100111110000100010111110110111000110101100001111110100000001111111011110110100101001000001110101011001011011100000111110100110010011111101101000111111110100001000110100011011010011001000000000100011111110010010010100101011110100000000111000010011100001101011010001011100011001100000110101011111010 0100100100001111110100101001101100011001101101100011101000100110000110101001001110101000000010001110001010010111100011011001011010111010001010110100110101001101011111011000011010011111000111101111011010001000110111000100111100000011101101100010101011000010011100000011111100010101010010100101010111011011101001110100100001101111010000010110001011001011100100110111001000100110010100100011110011110100 0001100001011100011001011100110011100101000111000111111101011111110110011001110101001000011110111000100100000011100011101000010000101100000000010101010111010101010010011101101110011010111001111110001100101001100001111001010110111100001100100110111010001110000000111110100110001001010010001001101011011111001001010101010001011011010101001110111111100011000100101011010111100100010110100100000011101111 1101110100101010101000100101100011010100110100001101010001110101100000000010010001101101000100101110100111111010110001001010011111000100110101001010000011100010111010100011011010011110010011001101001011101001111111001110101101001100010001001101111111111010110001101010101101001110101011001011000011111010010001011100010100110110111001111001110100110101000010110001111010000000100100001100010101001110 0011110111011111001001100100111110100011001010101010001010011000001110010111110011000101101110000110000101010000010000011001001111101010110111000001111101010001101101100010000010010011011001100110110110110000100000001010111010110101001001000001100101101001100100011000111100010100110001100100110111010100001110010111000000101101010011110100101010010011100110101001111101100010001011001110000111001110 0110000110110001000001000111011001101111000010010001101011110101110011100011100111111011100000001110001010010100110011111110011100100000100011101101000011100100110001001001101010101000100010101000001111000010000011110011101011010001001011001010001010010100101011011101000111010001101101111010000101001111100011010110110101110101010000110011111111111100110100010000000100100000101100101111101010111010 0010001111101111010110000000101001001100111000000100000011110110101000100011001010100111011110110101100101110010011110010110101001010111011100011001000010101000011001100101010110011000100111111110111110101011100110100011100111011111110100010011110101010011001100010110010100110000110000101000110111100000100000111001101110111100001001110010110101100010111001110111111110010010011101111100011001010100 0010101001101000100010010111000101111101011100101000100001000011001000011001010001000010011000111110010000111111000110001111101111101101000001110010110100000010001110101110101100000110101111111011110010000001000100111110000001101100011011001110110101001110010001101101010100000101111101101011000001111111000110101101110111100000111101101011011010111111011010011110000111011100000111011110001101111111 1110001111000101111100100101101101010111100010100001111100110000101110010011111001110101100101001001000011011011111100001100111000111100111000011101000000010010100010111110011110010111000001100100100011100110101000100010000000110110111001101010000011000001100011100010110011010010010110000011101010010010100110100000001001001101000011101100100011111000100100100110111010110100101100111101101010001100 1010011000010111101010111110110000110100111001100111101100001011000111100010001010100011101111111100111001111001010000110111101001100100001100101010100000100110100001101001101111011100000110101111010010100110000100001010110000111000101000010001110011000100101101101111101110010111000010100010011010100110001001010100011001001101001010001100000110010100110111010000000001100011101110111010001110001110 0010011010000110110000100010110101001010101011000110111100000011010001010011111000111001011111000101010110111001010101001101001011001011111011011011110010101010110010011110101011000110011010101111100101101101111111010001010011011001101100010011010101101011101100111101110101010100001011101111011010011000100011101111011100101100011010000011111110010111100101011100110110001101110011011010101110001111 1001100111000011111010000001111001111001101000011110010101000010111010111000110000100111010010010111001110011111011100111010001001110101110010100000111110000100010001110000100101010010101101000101110101001001010100100101001001011001001111111011010101111110000000001010000001101010000111011111010001001000100101010000111111111001111101101110000001000110111000000100010010010110101111101111001000110111 1111110100001011001110001101100011101000100110010110100001010001010001100110111001110110001011111001110000100010011100001111100001100111110011111011000010110101011010100000000101101110010100001101001011110010110111001110101101101011000000000101001000100100010101010110010001000010010000001111000111110001001100011011001000000000110101111010000001001100011111100101010000110011110000011000100000111111 0110101111100101010110010110001000010011000111101010001110100001100111100111001111001010111100101100111110111111011001001111011110011010110001111001110100100010101101101011001110001100010011111101101000000011010000010001110010000010111101110011111110010001110110111101111000110011100010101001001100000001101011011101100000010110111000110011111111111110011110001101111011001010011000001111010000011110 0010010011111000000101110001001001010001011000000110010101001101110101101011000110011110101011000101101101100000111111100100010111000100110011110101111100101000111101011100101111001110001100100001101111100011111010110011010100001111010101111010011001110011011101100101010111100000000001110000100111011100111110000111101101101001110100101110000001011110000100010101100001111110010100000110010010110110 0000000110010111000101010000101101010111100111010111111111111110101101000010001011111001010100001001001100111100101110010010010001000111111000111100111100101101010010101101110101110111111110100010001000100000011111011000101101010001111101010111101010001110010000000111100111001100000110100100101011101000111011000111010110000000011011010011001101001000101001101111000110101101011011011101011110100111 0011001010001001101101110000011110010101000000111000000000111011100111001000101001001110001001110000101011100011010000110101111111010000011101011010000011111101000000011100010111110010010110110101100010001100100111110000001000101100111100111010011101011101110011101101011000000000011010111000100010010010100110101000001100010010010110010010101100000100000111001011100010000110100111100011010010110001 0010101001101000101100010110000110011111100011010110011111001001011011000111110110111011010100100001110111110111010100100101101011110111010101010010111010001000011000111101001111011000110001111111011110110101000111010000000011111100110101100111101001010110011000111001010101010011111010000110100011111000010001111110111110000101101111000100101001100010001101000100011100100001000101011101001100010001 1101111010110011100100111010111100000000111010101001010101111000001010111100001010110011101010100100100110111010000101101111100110001100110100000100001101100110111001100100100100100000010100010000111100111110010010010111011010101001010100001011010111100011110000111000110011100110100000110010001010010011010011001100100110001000011111001011111100011000101010101011010001100100000001010101100001001000 1010111000011001010110010111001010010000011011101011011010101011101110110101001110011011000110000100010011000100010100001011011001111011101101110001001011011111010000100000000111011011010000001101101011100100100000111100101001100101100011100000111010111001001001011101000101001001010001000100001110001100000110110110010000100101011010111101100010110110101001000010101011111011010011001110011010101111 1101100101011111001010101010110100101111110011011000100110101001101101010110101110000101010100001100101011010101111000000100001110100100110101111010100011011101010111011111100011111100110001111011100110111000011010001010101010011000001010000000010101110010111011100111010111011001001100111101100110010100100010010001000010011110101011001100010000010011001000110010101100101011001010101011100011010111 1111010100101010010100110000101001000101010101110001010011110101100001001100010011001010110011100110001100101010011111000100111100010101101100011000010011001011101111101001000110000110011010010010010011111111110010110110111011110010010100000011010010101011111001010000100011011011010100011000001111001010110101001001011000011101101011000101100110111111101111011101011111101111011100101010000111111100 1100101001100010111011110101110111011110101110101101011111100101110011001100011011001101110110110110010110101000000111010000001101011011011000000010001110011101101001011010111101001100111000111001001011100111010101100010101011110001111011111000011001111100101111101100110011111100000001010000000001111000101000010101111011011100000111010011101101111010010111111101000010000001001111101010100111111001 1000001100001110111001010110001111111100000010001100110101100101011101010011111000101111001011000111110000111010001010101011101000110010101110111111010111000010111000001111000101101001010111001110001001011001000111010011110010000011000110101110101111000010001111001110110011100111100100101100011000000110111001100001101011000000111001111111101011111101101001000110101010100001101001001011100100011101 0000100011111100111110110011111111010110000000001111001000010000000000110001010110111010101010111010000101010101000111010111100101010011001011001011100000100111111110011110100101011010111101110100011110111010010101001100001000100110110010111100001001100100111010010010010001011110100111101100010110111010011010001110000011110111111001100011010110111111101011010110111100110111111101010011110101010011 0000011000000100010100111000100010111010111110110000111000111101111011010101101010001010100010010111101111100111101111101000110001001110111010000000111111000010001111100001000011100110011000001111010100100011111001000111001111101111001000100010100111110111100000100100110101000010000011100010000111101110000011111100100001111111111110101010000011001010100101111101011011001001010110111010111011100101 0101111111010010001011010001011110101101001101011111010001101010111000101101011010101110100010110000011101011100100001110010011100110111101001101010110110111001101100001100011000111111000011001110110110110000001101101111111000001011010011101011010010011011110010001101010111100100110100010010011000100100010110011111001011101011111100111100001111010101001110110110111111010110100000110001010011000110 0100000010101010011011111100000110100001001101111000101110111111000001101001000110001001001011110111010010001111011101000111111000111000011101101100000100111100011001111000001101010010101001100100110011001011010000011001011100001111000110010101101110110001001110100111101111101110000010001110011010101101010011100101111110000111010101011011001111011111100010100110000011001000100100101100000101001101 1000111010010110010111000000110100110100110010100110111111011011101100001001001111111010111101010111110111100011000110101001011000000011001111101101010101010110001011101110100011001111001101010101110001111110010100110110011100010111001011111001010100001001111100101001100110010000101011010100010110100000011000010110001111011011011011000000001010011000110111101000011111100111010110110010000001001001 1100010010001001101001101110001111111001010100100010100100010101011101101101101101001101000101100101011100101001110110100100100100011110111100111100111011111001001000011000100110000110001011110010011010100001101001101110110100010010011001111111111110111001010011110010111111000101000100010101101100110101111000100001001111110011100000011000010010000010011010011101011101100011000101000110100110101100 0010111101010100101101011101010101011001100101011110100111100000000101011000110101110001001001110101111010100101001011011101101010101000110011000111110001000101110100001100111100111100111001100110100000000111000000000011011111111011000101111011100011010010001110000011010011001110110110010010101010011011111000100100111011111000101010111100110000010110111000100001010100101011100000001001110101100100 1001010011110001000001011111010111100010010100100110100101010111010011111101011010000101111010111100111111010000001111101101001100011000110101011100011101111110111000101000110111010111101010110000000000011110101011100110011100101111000010100110100111100011100101001100111111001101101011101111000110000110100000001111101001101001001010000000111101111101100110000001111101010100101100011010001001000001 0110011010100100011110101000011110100111001011010111001011111011110001110001010011010010110110000101111000000011001101000111011011001000110010110111010000011101111001101101100111000110001011101100101001000001101110110011101000001011011101110101111110110001011101011101011001100100000111110010110011100111010111101001001111011111011000011011011100011110110110111110001101001111011001101111010111111100 1110010111111110111101011000110101000001111100101011111101011010111001101011100000011000000011101100101111111010100100111010111100010101110001001110100011011000010010010100100001011010111010001111000110001000101111010111000010111101100000011100100110111010101110111111010010101001011101000110101001111101000111010101010011101110001101011111100100101001101101011001100010110011100001001010100100011000 0111111000001101101100001111101111010010000111000110001010001001100000110110011001101011011111111001101100110011100010010000111011011111010101000011011000001010001110110010001011110011111010110010001001110110010100111111111111010001010111001000000001010100100000001100001110111100000000111101111111010001010110101011010010100000001000101110100101011111011101110101000000001011011011011101011110010110 1011001010011000010100110110001000110000011101100100111101011110010010001111001001010000010001011011010000011011111010001110011100011001111010101100110001011101010100100101001000000011101101000010100001000110010111111000001111001010000101110101010000001100001101010110000001011010011001001100000011000100000010010101111110000101100011110011101011001111110110000001101100011100101110000001101010001101 1101100101000111111111100101011011010001110011011100000101110010110000010010000110111101010001001111011110110001000111110000111011101011100010111101000110010001010011010111100011001000010000100000111000110011011100011011010111001110111100111011100011100010011001100110110010011100111101010100101010010110011010110010110000110011110110110011010110010000100110000100110100100000101010110001010111001111 1110000011101101001000111111101110111000100010110001110111110000111000011101000101101111010100111110011110000111110110110101000100111001110110110010110110001101111011110001100100101100011111010100010111010010110000100111011111101110101110101000100000001100000000110010101100011100000010001000011111101000110110111010110010110000101000001101010001110101000001000001011011001110111011110100101111111001 0101000011010111000101010110100111000000000011011010111110110000000000011000101001011100010100100101001110001100111001010100101111010010110101111101000110000100010111101001101010000001100111101100110010001000110110001100011011111011011000100001001110000100111111100101001111111101010101110100000101111011000100101011011000001000101001100100100011001100101100011000001010111110000011000000101101000110 0100100011110110101101110111100010111011000010000010110011011110100010010110111010000111010010111110110100000100100100000100110011011101110001000101101010110101010011100110000100000001111010010011000101101110000001010010100101001111101110100100011000111101111001000000110110000010101101100011010101011111001011101110101011111111011011011001010110100110110100100111010101101100000101100101001101001111 0000100110011001101011100011111011011111110010011011111000010011110110111011000000111000100000101001101100100000110001010100001101010111110011100111011100001110000011010100100101100011100101010000110111011101101001011111111000110011110011000100010001100000101111010110110011001011011111111101000001100110101111110111101101001111110100001010100110110110001000011111000000111100001001100000010101011011 0111110000111101010010100010110000001110010100110100000101101101011011011011000011000110010110000001001110010100101110001110111011000010001111100100011001000111100000110000111101100100001010101100001101110101100011110111101011110100100000000011101101100110111101010011100101101101111011011001000100111111110011010011100010011001010100111110110001010101101111010001000101001110010010001010111111011101 0010111001000101111010111111100011110000011100010100001111010010010110010100111110111011110101001001101000110111010000100101110100011000001100101111011111100101000000000111010001010111111000100011011100001100100001010010110110111010001000010011111001010101000011110000000011000010111110001101110001111100010100101011101100110101011001011100011100011001010011000010001010001100011010100100100011010001
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