0010010100100100010011111010010010111001001000100100111111010001010111100110111110101101010100011110100010111101001100000000001011111100000110110101111110101011100100101001110111000100001101110010110010111110100000010111010111010101111011111010110111100010111010111110111101011001010010011000010010000100111011010000111100010000100010000110100011110111101001100011010110001011010100011100000000101000 1111011010111100001110110010101000011100111110101001000001001100100010001000100011111010101101101011101101100001110000101101010000011011110010110000101010011111010101011011010010001011110101110101110011011101110101010100001100001010010100101010101000001111111000110100111110011000010010101111110110100101000111111011100110010010011100101110010010100101000110011101011110010100011111000101000100111101 0000000000001001000000111011101000001010111110111010011011010110010101111110101101111011111000000011100111101111100001010111101101101011110000100110011100110100000101111001101010111000000101111110111110110100111111111011000000011000111000111010101111011100010110111000001011100101110011100100001011001111110111101101011000001011000111000101001101001111111111101000000001011100001100000101101011101110 1110100111101000100101010011100000011010111000001000100111101011010001001000101011101100011100110010101000001111011011110000111000111000110010000100100111101110010100110001101001101001010101010001100010000101001010111011010001100111001010000101110010011101000111110110111101000011000011100000111111011111001100000110111000010000101001100011110001010011101111101001100010010001101101101100000000011110 0001110110100100101110100110111111101101011101010000001100111000101111000110101111010000101010101100011100111101111011101101111000011111110111101110010100101001011111111101001011100110110100100000100111111010001101001111101110000100000010010010111111010110001001001001110001010000011001111101101110111111111001100000000001010101100010101011011011110100110011011001100111111100010110110111111110010011 1010101111110011010001010101100001000101001101000100110101011000111001010111001110101011101010000110100100111011101000000101001000010100100110000101000010011100001110100110010111000001101001110000110110100010001110000101111110000000101001110001100111100101100011111001000011010100001010001101010101110011001111011000000010011011000111000110101000000111111010111100111110110100100001001011110110001110 0100111000001010011010111000101101110111110111100100111001010110111001111101011000101111000000111000000010111000110010001111011101011010011110010111010010000111101010110000110101101100101001100001101010010101111101101111010100111001010010010000101110101101101100010011010100001011001111011111001110111000000001000011001010001100101111111000110001101100101100011010100010101001000011100101001001000000 1101010100111010011011101110000000110100010110000111101011011000011101100110010101110010101101110010010011011000100011010101011101100101000101011100100110000110111101011000000111100100100001100100010100111001100000010000001100110100000000111001110100000001101001101010101011000001100010110101000111100000111001000111101001110110101110100101000111100100011111011101100100001110101110011011100000111000 0010101011000100111010010010111000111110111010001111011000010011001100101010111010000100100010011111000010111101111111100010010001110000110001110001111011010111101101110010101110010100011010011000101100011010001000010001001100111010101111110101101011110011010110101010110111101000010000011001110100101111001101100001010001111011010010000000101100010101000010100011101110101010101010010011100101101110 1100111010110001110001110101010000000101100101100000101100100010101000000000100000100100101100101010111101000100101001000100010110110111011101010000101101100111101010110111100010001111011010011011111001101001100110000000111010111100111001011100101000111000101100101111110101010010110101000101000010000000011111111001010100100111100100010111010110010111101100111000011100011111111100010011001101100101 0101111110110110101011110101011011001111100111000010011010110011011101000000011101001111010111101000111011010010011101000101101000010000000001100001111000000100110010110001100110010011000000000000111011101001110010110000001010110101110110001110010011100111101010100110001011000101011101011001111101111000110010100011010001101110101000010101011011000110111011000110100111111000001010110100011011110101 1111010100101111101100010011000001111001011111010000111101011000111010001001000110010001010010100101001010001111001101000111101011010111100011001011110110100011000000010111010101010000111010000001001000111011011110010001100011111111001110111000011110000100000001100101011010111110010011000001000111101110000011011001101010010100100010110111010010110010010110011010010101000001110010100111111111001010 1000011101100000111011110111011010000001010100111100110001101110111110010100010010010000010001011110100001111000111110101011010010000100111111010110001111110011101000000010101111111000000011001101111110000101100111110000100101101100010110101000110001010101000100110010110101101100011111101111000010010011001010011111011110101001100010101101111110011001010000010010010111010110011010110010101110010010 1110001000101001110101001001010111111010000111000111110100011000010010111011111111001110101110111101001000001111111100110011110011000111100100110011101111111000010000110110010000001111111010101110000111000001111111100110010111101101101111101011001101000001100101110000111001110010011101000101111001011001000000111110000101111011001101101000010001000010001011101001100001011111001010110011101110111110 1010100101100110101100011000011000100001111010101101100010110100001000000011001011011001100111010000101101001110110101010110000011001101100010000011010011000010000001001011101001110100100100110011001000111111010111010000101000000010100100111001000110101001001100101010010100110110100100010000111010010000110010011100010110011010010000101001110011000001100000000010110110111011010010010111100100111011 1100101010000111000101010110001101000010001010000101110111001101101000110000010010111011101001110000010010000001011101100100000100101111000000000001111000011010100000010101001000010011100010100111010101000111110110110101101001110110011011011110100001011010110100011011000000110101000110000101010100111000111011010010000000100100010101100011101010001100100111101111111111000011001011101110000011111000 1011101000011111001000100101100010101001001100101111101101110000110001110000110010001010011110000001011011001000101001100111100101111001000011010011110011010110010101011011101010001111000100010010000110011101010100111011111111011010010010011000000010000110111110001011101101001010010101101011001000010001001001110111111110000100101100001010000010010100010011011111001111001000100011010111110111011011 1111100001110110101001101010001101000110111101110100110011110111100111000001000001001110010010100011001100000100010110001110110000111000111010110101001000100110111100100100000110100100100100011110000111001110111101110000011101000001011010111100100000011010000011111000100111001101000111110111101100000110001001000011000110111000101100101110001000001110101000001010110011100111100101010001100010000001 0010011111010011111111000110001011110001111110110010001110101000101110001100011001010000000011011111011101101110111101110100100000110000011111100011100011010100011110010010101100000001100111000100001000011100000101101100000101100010001010000110000001100110001011111111110010011011000100111011010011011011100001011011111110001101110100001110010010101100110111101001000111010111010000001110100001000000 1000111110001000011101000111010000110110001000010010001111001011001110010000111000010101000110100101001011110101010000111101011110111101000100010010100100111110101010111100111011110110110111110000011011111110011100111110001000101111001001011100101110101010100110001101001011001111000100011001110010111110101010011100011011111000111101110101110011010110101101001010000011011110110101101000111000011000 1000110011011100111001111001100110110100001101011000010011110110100111101100101101000101100101110001100000110001100000110001000010100011001100011100101010101110111000111100100111001000101110110110000101110011100110111101011110000010101011110110011000001011101110111111010100011010101110111001000110111010011110001101000111001001010010011010100110111010101100010110010110100100011110101100001111000110 0001011110010000100110001111001011011011010011100010000110101001011000111111000011000000010100001100101001010011011100100111111111000010101010101011100100001110011011011011111010001111111010010010110000100110101111110100001010110000010111111000101000101101000001111101101110101110001111110100011000101001010111111001001110010000111100011001101000100010111111110101010000110101010100101110110011011001 0100010101111011110011010100100011010111111010101110011111000101001110001101110001100111000000010101001001000111100101001111001110000010010110001000010011111110101011011000001011100010011010101100000110001111011000000110011001010100001110010111001011011100110110000001111000000010010101101110100111011000010010110000010101000100101110110111111110101000110000100110000000110010011101101000010011110001 0101001101000111111010011100001111000101101011000010100110110011110101011011100110101000100011101111001000100000011110001001100100000001010010001000001101011000111000110101101001100110110101100000110111111110000110110111011101001100010111101010111010101011101000101010001010100000101011111010100111000011111001001101100010010111110110100000010111110011111101011000111011010000100100110110110110001000 0111011110101000001100010110101010111100101111000001110011100001100101001111010011001100110110010011110100001101000111111100110000001001010101010110001010111000100100110100001111011100111111110010000100111110101001000001101000010011101011111101101010001010000011110000100000110011110000010101011010011100101001011101100000001011011111000001111000101001101100000100111001100100000001101101111011000001 0000010000100111110000011000000110101000010111001010111011110010010111000011101001011110010010100110111100000000001110101010100000010000011100100000111010101111101000010010011110111101000010001111010000001111111001111011111100100000010001101100000011011111010010110010111000011011101101010110111110101001010100001101101001101010011110011101000010001000000011011111001110010101110111001100010000111100 1001000011010010010110111111001110011100101111011111110011111100000100110011000111010001011010101100010001110111111010100110110100001110010101011111000011001101101111101101001100111100101101001111111100111001011001101001110101101101011111100001110000010110011100001101110000011011001110000111111001100100100100111101110001111010010101001110100101111101111101101111110100011110110001111100100100001111 1011010011111110000101010101101001100100101000001000100111110110001110110011011111000001100001001110100000010001110001101011011010101001010001011101010001110000110100101000011011001011100010011111011110111000011001000011111011000100100101100101100100001010001001111001001000111111100110000100000010101110010001110001001101100101000000001100110111110110011110111100110011111000111101111110111001101001 0011010001110101011001111010000011001100100101010001101100001011100100111111011101100010110101000101100001000000010101101110100010111101010010111110010110001100100100000011000011111001011111010100010101101000011000000011010100001101101000011011110011111001100010011111010110010111001110101100011101011110101110100001000111010100100110100001010001110100111101011100101011111101000000001100010101011101 0000001010101101011101000001110110011101010010101011000001110001100010001110110111100110011001100111100100001101001101001000010000111110001001000100101011111100001010010011001011011011000110111100001001011000100000000010100000011111100001010100000101100001001000010000010101010001110001000100010000100100000111110100011101010110110100110001001011101111001011110000011110000101100011110010001001100101 1100101010010010010101000101101111100111001001101101100011011011101100000100100110110011000101110001000111000001010100101111010110111000000110100110100100111010111101000001101000101011110001011000001010011001010101010010010101001100101111111101100000100110010101110100011011001110011011000101100010011011111000011101111000000011100000010000010101100000110001010000101111011110101001110011110010110001 0011011000111010001100101111011010110101011100101101010100110110101111101001101000111111001000010001111100111000100111100110100110011110011011100000111100101001100010111111011011110000101010110000011110100100110101110011100011001101111110011010010110010101110010111110010111111100001010101110100011100001111110110001000100101001100001111101110001001100101011011100011101100001100011011111100001110111 0110000011011100001001011110001011010010100111111110001011011111100000010001011000001000011110100001111100010100101001110001011011111010110010000111110011101101010010101110001101101010110011110101110111000010111000110010001000110110110101000001100011110100101000011111110000001000001111011110011000101001101010111001000001111111101010101100110101110010001101111000000011111100101110000011010110101000 0001111110111011001001101100111000110011010000100111110111001011010100110101111101000011001001001110111000010110001000101101111011001010001011110011101110011010101001111101100110111001100011010001001010000111010111100101000010101001001101110110011010110000001111100101001110111110111110011110110110011011011010100011101010001001111111111101011101010100100100001100100010011111011111110100100000001010 0011100000110010000011111000111110100010101010010000110100010010000000100010011010110111110000101111110011111011000111110011011001001101010101111000101001111110101010101100101101101101010101100101100100011000100100100101100011111100011100100111100101100110101010000001101000100100001000111110001010101100100011100101101111101111101000110110001001101100001001110000001100100110010101101000001110101111 0010001000000001110011101000011000001110001000110100111100001011101001001100101000101010011001101101110000101010110100011001110000010101101001111111101001000111001001100110101010000001110011011000110100011111011011111011111100100001111110110110110010110010101100101000111110110101000111111010111011110011100011111010011110110000100101010000010001011100000001101111110100101001011001000001010000110011 0010000101011010100110010110111111011011001000110100110101111111000001100000001101101110010110010110111100011001101010000000001110100001001100000001010101110110101010100011011111101011001011011100101100110111001001011100111010011000010000010001111001001110101110100101001110001110001011000011010010101110000100011001011110101101111011101101001101001101011101101000010011010011011001001000010110011100 0111100101011111000101111000000010101101100110100100000000110111011110010011111110000000111110100000111011000011110111011011111011101101000101010000111000110010001111001111010011100111111111000011100101000101100001101111101101101000010111111001101010010011110011010001011000111010111111001111001110011100110111111010100000100101011010100010100011110111011100011100101100010010010110001100100010111011 0010110100100011011011011000010101010000110111111001111100100010111111101001101001010101000010101111010000011110000100110111011110111111101111011001110111000000001000111001010000100000110010010000100001011110011011110011111111101101000111011111011101110010011101110100101100010100101110010100010010100100011100000011011111111101000100111100100001101110101011010010011000010101110110010000010110110010 1010001011111100011001111010111000110101000100011001011101011000111000100001011000010111100110000000110101110100100011101101110111001010011010101101000001100100010100001111000101011000001000101111101011100101010011000010011011101111011100110000110011100111100011001011101000001100111111101101010000110100110001000111111111001110011001001110011100000001001011101100011000000011101010111010110010110101 1101111011000010110001011100111000001111010010010110011110110001001000100001110000001010011000111010011011000100000011110001111000001100100101010100101111010011101100001001100110010000010111001011100111011010101011011101111111110111100000011011100101110100101100011000001111010101010111101101101110000011101110100111110011100010001101101110011111001000010010000100111110011100011001011110011111111100 1010111001000011001100110101100101100111011110100100001101100110011000111010101111011101111001010010101101101110010111000100111000011000000010011011100010110100010001111000100100001100010000001110101111110100100111001001010001110111111101110110010011010010001001111001100111011100110100010011110001101010000111110001011111010011110101110001010000100110001000110101110000111111010001011100110011111010 0000000101011000100000001111010011001001110000101111101100111011010100011000000011010100110000011011101111001100110000011001101001011010100011001110111110110110100101100110101010011001101000000011011000011111001111100111010011001010001101110000100101111001010011111001001010101100100111100110111001010100011101111100000000000100101011100010101101001110111101101101111000011011010111011100011010011011 0110101100001110101101001001101100011011011100000100010100111100110011101100001001100101001101111110101001101011110011111110111010000101101000000010111000010000010111110110101000110101000010001110100010000000110011010001101011100111100000011100010110000001110110110011101111100000111001001000111010110110111011000100111100101100111110010000010101011011100111101110001111111110000010011101000010001110 1011011010001111011101011011011001101100000011001010110111011110000001110010100010100111110010111001111111001100111000010010000001001000100010111011010101011110100000011000101110100010111110010000110001101100010101100111101111011000111010010100100110111000111001001011111101110100000000010100010101000010111011110111000001001000010110010001000100110100010001111001011010010111010101110110100111101101 1101111111001001100100011100001101010011101001011000000111101011001011000110010101011110101010110100101100010010010100000001000010011010000111111101011010011110101111011000011100000001011010000010110001111010100110001011110011001011110001110010001111101111001000011110001011010001010100111111100010110101001100101000000100110011111101111111101111000000010011001000000110110010000001100111110111001111 1000101110110100000111000000010010110100101000001111001000010110100011100110001101000001110101110101000110001010110101110110110000110000110010100111001110101110100100111000111001101111110100010010111011010010011101101000101111111001010110011010010101111111001010100001111101000110110100011100010110111100010100101101011100101011110011111011011001100111110010100010101011010010100110100100111101110000 0011010111101011100101111100011100011100111101011100010111100000110010000011000000100011100011101001101001001110111000011110011011100110001000011110010101011011010011111011101011110010100110000001100101011100101000101011111100011100100001000100110010010111000101001001001111011010111100100010010100001001010001000010001001001011000110111101011111000111011011001000110101100001110101010010010110010010 1101000001101000011110101100010111100101110101011101011010010111000010101000011001010001110000000011111100100011001010001100010000001000011000010100111010101010100011000101101010001111100000101110010100000001000111011110011101001110100110100101010011101110011010001111101010100011010010000000111100010011110101111010101110011100001011101101011000011001001110101111010011100100100100001100010000011101 1011110110101111000110101010000100011111100011100101000111100011011001101111011110110111101001011001011111010101100100011010000011111100111110111011011101001011000100011010101110001000100100101001100110110110101101001101101110001100010000011000010110110010000001001001101101111000000011100111011101100010001110011001111001101011111010010111110100100110011010101100010000110011010010100000111000001000 1010001000110000011100011110100111101000010110011100111010110010100000101011101001110000010100110001101011100100101101010000011011001000011101110111111111101110011100011001101111101010100111010110110010010000011111011111000110100011111010011010010010000010100111101110110111100100110100000001010110100100111100110100110000001001011001111111011000101010101101100110111000000100101110111111101010010000 0100111110111001001110010010010000100100110011000101111111011001000111011111100000110101010010011001111011010000110011010101100111111100110010100110101100110110110110101000011011011001010100000000001100101000000100101000011000101111000001001011001110100111100101110111100000100001000010000111111010011001100111010101110100000011110100111010101101110001111101111011100101111011111101100100000001000100 1111111001111101110000001000010111010011011010111010001010001010111101100101111000001011111100100101101110101100011110101111000011011110000101001011000100000100001000101000100001101010010000001100101011000010101000101111011110000001111010001100100011011100110001010101100010010101010101110101000101111110100100110101101100110011111000010110000001000000101000011100001110101000101111100001011010001000 0000000010010010101001111001011100010000010110011100101100001011110010010000011011010101011110010001011100000100111000001011000110000111010101101101011110100011100001011101010101001111101000000001011000000000001111010111010101000111110101110001100100010011011101111011011010110110000111110010011111000111011011101011100011010001111010100000110010100010111001100110010110000111011010011001111111100000 0111101011000011010001100101111000100000000011110010011010111111110001111110111101100010100000111000011001001000110010110010011011110010100100101011101100010110101010001000000111110111011101001010000111111001110010100011100010011011101000100011000001110000101001101100001110000110000010100001100110110100011101110100110001101001101001100111110010101111101110111110100001000001011111000011011000011001 1111000010100100111000001100000100000001100111100011100010111110111101111101000000111000110010110101010101000011010001111001100000000001010011110111000000110101100010100000111100000000001101110001100100010111100100011011001000100010010010001110100110100010110110010101011010000010101001000010011111010000101101011000000011110000111110010010001101111010000001010010100011110111011011100010111100000111 0000111001110010011011010000101110110100001101000110101101100001000001001110111010011000000100100111001000011000000011101101001001011001110110110101000100100011101101101100000100000011010000100011101101111000100000110101011110000010000110101001111100111111111101110111010010001000001001001110101011110100010100001000111110011010100100000100101010001001000000111010110111110011111000101010010010011110 0011011011010111111010101100111001010011111101100110010110010110111010101010111110010110101101011101101000010110111100100110000011001010110111011010111010101001110110001011110010000101100111101110101100001111100001001110111100001111100101000101111111100011010000111110000001011000101011001010100001011011100001010100011001001000110110000010110010110100111100100011110100110011000111100000000101001100 0111010011011000111011000000111110101011010110101001001110100000110111111111001101001011110000111100110010010011001100000110101010100000111000111100100011101011000100100101100001010111010110111100011000111101101110011000010001110010000011010110111110100111001011001010100010000110110010011010101011011001111000111100000100000001100110000011010100101010010100011000001000101111101010010110001010101001 0001000101111011111101010111110000000000100111010001011010011110110110111010001001011011010000000010000001000000111011111010100011011011000110011101100010111111111001101110101000110010101010101100110000010010000000000011111000110111100011111010000000001000100111100011100111110101010010110011000100010011000010011111001000001011001110110001010010111100000110101011110100111100100010111011101100111001 0000111011000100000011100001101010110110010110001010011010010110111011111001101100110100101011111110110101101110001100110111111010111110011101111011010011010110101010000000011110011000111001110000100000011001011100110100100101010100011010101110100100111110110001010001100110000111010100001100000011000110011001011001010001010001010110101010110101101111000011111110010100100001110101110000010110110110 0110110101101010010000111101110111100011111110011000010001000101111011110101001100011101110101010001111100010100110110101010101001011011011111111001001010010010011111000111011100000001111100010111111111111111000001000000101001100000110110001000000000110110011110101101100011001101101100010001110000011001100110101101011111110001110010001001100011110110001110000111000110101111110101100111000111101111 0001100001010010010001101101000111101100101001100011111011000000110111111010100111101101001100100001111001111010110100001111111011101100010101000001000110010101001000100111100000111111001000000110010001000110110001001110110001110111100010111100110011010010100100011110000101101111110111110001110110011011001011010111010111010010000010011000101011001111111000000110101110011110011000010100011001001000 1011011000110110110100110110100101110010110110111010100110000110111011110010101101001010101101011000001001111010110110110011110010001110001101101011010110100100110001100111001011001011111101101010001101110110001001000111110010110100001010100000011001010111101001000011010100111111111000101110111001101000000000100011100100010010100110100100010000111101110110111111101110001001101101001011111100001111 0000101110011000010101001111000110110111001011001100010011110010011110110101100010111101001110111111001101010011010101001011111000001010010011100101010100101010001101111111100101110111011110010001111110011010100011000010110100001000011000110101110111010100111110111111001100111010111110110011101010010010100101010010000001000001000000011000100110101111010110010001011000011010001000011001100111101101 0000011110011101000111000010010100001010100001100100010010011100100100110100011111100111000101111011110111010001010110110010110111011101101010001100001000101111000000111100010100100110110001100011000100011101000000000100101010101100111101000101010110100110111001111111000101010111110110110010000111010000000001101100010010110111010000100010100010100111010111000000010101111000100011011100100001011010 0011111000100001100100000000000111100001101001101101101011000110110001010110010010011101100001100011111110110001100110011101001001001010010010110011011100101101000001110110101111100111101100001010001111001001001001010011010101011000001001101111000101010001010000000110011101110010101101001001001110010010001011010001010000111101000000110111100110001101001001010001010000000000100110100011100101001010 1010010111010110111111110010001010100110110000000011101001010101011111111011011011010010110011010001001111110000011000011011100100111011101110011001100000000111000100100000111100100100110100010101001100011111010010100001101110110011011100100001000001110011101100011101110001011010101111100001110111000111010000001100111110001010010110000110101101011111001101000100101100110111110010110011101110111100 0000010101100000101011111101011100110000011111100000010000001011000111100101100110100011001010100101111011001101000001110111010111111110000110011111011101111111010011100000110111101011101110011111000110000000010111110111000000110001111010000101101011111010000101110010011001110110100100111011001110010000001001001110000001010010000110010100010101011111010000010010100100111010101111001100000010100101 0111011010100111110001111001010100101110111100110110001100100101000000110101001000011101111000111001100110110111110010111010100101001100001011110100111010011011100010001011001000010010111101111010100001111011100101001110000110100101010010010111010110010011111100110001100100000101100101111100010010110111110000100011000010000100110100001000001100111010101010011010000110111111111111001000011000111000 1001001000010011000010000100001010010111100111011000001010000111001000111001001111000001100110110110011111100101000101101110000001000010100101100001110101000000001000001001100101011111100110100101001101100111010010010011001110100001111000100101111111100111100110110100101101101001000010100011110011100100001000111111111111000110010110011100011000110100100011111100111111101001111000011101001100110100 0011110000000001101100001101111101000010111001011000101101010001011000100011001101111010111010001000000001100010011000001110011000000010011011011011011110101110001111101000011001010101010100101110100010011001101010111000000011010111001111101111111011111101010001111110100110011000101000100101111100010010100000011110000110101110010000010101111001000010111000100010101000011010010101111101001001100001 0110111111011001001011000101011000111101110111011110101000110011111100100010101001010100111011100110100011000001001000111010000000100110110000100000001111110000111010100101101001000111101101100100001100111110000000110000011010111000100010000110100100000001001011101001010000010010100001110011100110000000101000110010000101000101010001110001111111100101100010001010101010100110010101011011110001111010 1011000110100011010101100011011111111111011010101000100101100111110100100110000111001000111100110010100111101011111111110111011010110100000111100011111111111100101111111101110000101110010001111011010011110001001001101110001101000010001010010100100001011001011010110010011111110001000001010111110100111100000001101010001000100001000111011000111111010111110101000001010011000001100010110111101000101110 0001100010101001111010110101100111111001100110010101111111011101001001010010010010101110111001000100110000101000101011111001010000111110011010101000011000000111110011010010100111101001111001010000100111111010110100011010001101111010110111101111010010111010001110110000000110010000011001000100111010010110100100001001100001001100111101110001001110110111001101100010110100001110100111110110111010101001 1110001100000010101000110100100011111001011101100111110111100101110010000001111000100000010000000111001000010110110100110110111100001000001111010000110101100001100110100001000101011110001010110010000010001100001001000110000110000001010001000111111100110110011001000010010101100100111010001110110010111010000111110110011110010111000101011101110010000100101000010011000011110110111001010101110100000010 1101110010101001100011000100110100011111101010111010111000001100110010011110010001010001001111001011010110001101011011001110100001111010111011010110110111111111000111000001000001101000100011001111011010000101010111000101010100000001111100001001000111001000100001001111101011010110101011000011000011100110101001100111001100000001011100001000011100011011100011001010111000110011101100101111001101010011 1000100011100100001010110001101000101100110100001011010110011001000100110010100010111001001011110000111000110000000101111011001000011001111001110001000110000111100010101100101110110110110100110111111011100010111111010111010111000111011001111110111000100011100100001101111001100101101110000101011011010110101111110101100111010101101000110000000011010001111101101001110001110001000000010010010111000100 0110000010100100011000011101101001110110010101000011100001010000000111110101101110111111100001011011010111100100011010011000001000100111011101000000000101100001101010110001010000011001011001010101011110011011110010001101100111001100010101110100010010111011001101101000011111010001111010111111000011101001101110011110001010000110101010110111000100010110110101100001000010000011001101100101101011000010 1010001101100001011001001100101011100010100000111110100101110001000111111111000110010101011111110101111110100010100010000001101011011101001001011011001010100011110101101010111100010100010110010111010110110111000110110101011110000111110011101100111001000001011010001111101100110100011110000111011011010101011000011111110100100110110101000101011110111010111000110000010100000000100000111100010011100011 0000111011010101010010010100000011101000010111011011101010010000000101011000000010000101110111101101111100010100111100000110101000111010100110101001110011110000101111010101100111100011011110100111100101001100110011110100110011000000001001011000011001100110000100110110010111001100101111001010110110001011001000101100001100011111000010010100111001110000101110100101111100010001011001000100111100010001 1010111011000110100110011111110010110010000011100001110111010101000011001110001110010010001011110111111010100110010111110100111100001111001111110111101010000111001110010110100001010011001011010101000011001010110001000100000000110110110100011101100110001010011111100011111100000100101010000010011000110111100010001000001000100111110011110110110101100000011010011001101010110111100000110001010111001100 0100011001000011111101011001011000110111001110101001010000101101100011110000000110101100001110001100110001101110111000100001101011000000001111011001000000101110001110010010001000000011011011011100001010110101001011000011110001101011100001001000100010110000110101101110011001011000101111111111001101001001101011010010111010110000111101000100011100001101101110001100101100110111011001010011100010010111 1100100101111110100001100110110100100001011010010000001100110010110010111101010100011100001101101001011111001010010010000111010110000101001111101010100000100110010111100101011000001010011100001101000110110000111111000011000000101001111111100000010100010000010111101010011111010011100101111010101101000011011011111000111010011101000010101100010100010000010111100010101011011010110111000100110101100100 1000001011100011110100001101100000001110101000110010101000011000110111100111010111010011111010010100010101011111010001000011001110111100010000001100110100000110101011111111010110011110000010010000111100110010000011001110100111000010110011100111011111001110100110101101000010010011001010111000000111011010010011101111001101010110011000101101011001100011000010011011110111111011101010101010100000110101 1111011110010011010000100111010111001110000011101001010101100011001110001100001000111010011110000011001011111010000111110011101100000000000101110100011011010000010111010101100000001001001011010101010111011010111100111001011111001111101100010110011000100001111000111000010000111011100001101010111110010111000111011100001110010110100110011111100010111111110000011000101100001110011100000000001110110110 0010111000000100101011111101101100101110000100110101000100110000100101110011110011110110001110001110000100010001111111001011010011110110110001100001110100110000001000010000011100000010011101111001001101110011111100000110000111011100111110110111011100011000001010001101000100001011000010111001000111100000000010101010010111011000100100100111000100101001110101010010001011101111101000010010111111111010 0100111110001100101010010011001110010111010000011001001100011100110011001000100110110101101100000011011000010110001011111001001010100101111011111100101100101010011001110110110100000100101000100010010001101110011111100010001101110101110000000100100001111001010101010100000000101001000110001001110011011100001101110110011001000010111100100100101001010010000000111100000000111001111110011001010111000101 1100001110010001101000110001001101010101011110111111111110101110101101100110011101110101110000011100010001101111000010101010111010000111100101110110101010011111111010001000001000001011011111010110100011011011000100111110011011111111000101000101001111000000011011010100101100101010111111010001011110001111010010011010010111111111100101101100010111001001000010010011011100010101111110010010100101001000 0011101110110011000101000110011100110100011101110111111101110100010111001111000100101110110010111101111101011001110101100001001000001101010010100110001101011010100110110111001111000000000101000000111100100101011000000101101101000111000101111010000110110110000100111000110100010101000011101100100100100111110110100001010000001010101010100000011100101010100010110111100110001000111101011110110011010101 1110100101101100000111100001100101100000100111000101110101100001010011001100011001110110111101010001100101000000100100011000111010100101110110100010101010101011111000011100001110111001001000000100000000100011010110111000010001111001111010000110000000100000000010100010011011110000001000001010111110001111001100011101001110010100011000100110010101010110010110010000010110010000101101001000010100011101 1111111000000010100001110100111110011011000111111110000110110111101110001111110100011110111011001010111100101101110011011101011111000010100110010010001100111111111011010010100001111110111000110000001011000000111011110000111101000110000100000101011100011101010110110101110010110101001111001110010000011110101001000010010101011001101101101011101110110001100011010110011001101111111111111101010000110001 0001010010001111101101010001010001110100111000110001001001101110110010001001011100100101100100100101100011111001011101111000010111100110111010001011011111101011110100010000110001110000011001111010110110110110111100001101111111111100011001010111101100111110100001110001101110011111000111110000111110001111111100001111100001010010011111101100101010101001100000001101110110100000101110000111010001001000 1111111000101101011011010110011111001000000101001101100110111110010000100011100000100010111001101011101010100100000111001110011011011110111000101110101011100011001100101010010100000101101111101100000001101001110010011100110111101111101101000011011111010100100000101101100100110111000001011100110011000000010110010000100010001110110000110110111010100100011000010000100100110101001000001010001011101100 0001101001111100100110011000110001000110000010101001100000110011111010000101000011101000000111101110101000000010111101100000010001101100001000011001011110101100111111100011001001100000100100101110011010010011011001110100001101111100000011101110101100110010000110000000001000000000110111110100101010011000010111010000101001101110001011111101011000011101110010100101010111110100000100101010111001011000 0011110110000001010110000110010000100111111001001100100001001011001110111110011011011111111111101100010111101101110101110000111001010100001001000011000011000000111010110100001101011010101000011010111000011111110011111101010000100100011100010001010110011100011111010010111111101001110101110100111110110101111010101000110010110011100100110010010100110101111000010111100111110100100001110101100000011110 1100111000000010101111010001110100100101101001011010000010000101100111100111001010101000011011100110100000101000001011010101011101011000001110101110010101100101101100111111110101100000001101100110000101011101010001101110000110111011011011111100011010001001001101100010011011101111111010110011001001110001010110111100011010110011000001001101111111010110001111110010011000111000001111101010101000000011 1010101110100110111111001111100011110101110011011100001000000101101111001111001010010010110110100011101111110110110011100100010101110001110101001001010111011010110100100101111001110001010010010111010011101110000100110101010001001111010110101110111011000100100111101010011010010000101110111010110101010001111100101001001111110001110100011001111001111010010001110010111101111000100000100000100110100100 0100111100010010011111101100010101011011110001001001001111010010100101100000100000001000000110001100010001000001000111011001010010000010010110011000100011001100101101011111011001110100100011101000110001001000011010001110001000110101011011111100001100001001001111000000000010101101110110110010100010110101110110100111101101001011101001000110010011100111100000101011000111111000001001010110100011010101 0111010011010001000010110110101110000110101000100110110110001100110000111100011001001011110011010011001100110111010111100000110110010100011110001001010100100001110011010011101100101110110100100101101100111111000001110101100010011011101011000011101111101010001110111111101000110101110000100000111101100001101000111100011000111101011110011001111001011100111110101110100100111100100111010000011110111101
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