1010100111001110110011100111111111101110001011001010000010110000001001101001110010101000100110100100010101001010100101100101101111100000111111101010101100001011010000001011010101100000010001110111001100001000000100110110010010111000000111000100110110001100110010111011001110001111000000100110011011110101010101111000010011010001011010001000011011110110111000100101001111011010000100011111000110110001 1000010001000111111001011110101010011111100111111101000110000011010000100100010101111111101000110111010011011101001001000000110110010100001111010000000001010111001101111000101000001110111110100001111011111011010101101001010111000100111100001100100110001110110100001001011110011111000000110000000110111000110010011110000100111010001110001010000100111110101111001011001010000011011001001110100110001110 1111001001001011110111101100010111000011110001010001010101010011011110000000010001001001111111111111000011010010100001110100001011010001101001000000110010110011000010010000100001011111100000111101001100100001111010101000101111101010011011111111000000111000111000100001010110010101110011100101011111001100001000101010000101111101110110110000111010000101100111100011111110101000100011011101110100000010 0010010110010010111011011011000110101111000010011100111111001111010010100010101101000000001001010010000011111011011111101001001101010000010110001101000110010001011001010111110011001111000101011100001011100011010101010101100101001100110101101111010100001100100000100101011110001101111000101001000001010100101010100010001100111101101111110111111010001100111001100100000110010010010000011111011101100100 1000100101001101110010101100000011101010000111010010100110010111011111101011001001000100101010010010011011011010101100111011111111011011001111000000111000000011011011101101010010001110111011101001111001000101000111001011001001111000111110011111000011100111011100011110110100101101110101000011110001000011010111110111100101110101111010100011011010100110011110011101101000101110100111111101001011011101 1010011010011000111010111111111001110000101101001011101101011101000001001100111001001110010000001111000101011000111111111111110100111000001000011010000111111000010010100100100011111111010001111010111101100110001100010010101100110000001010101001011010000011001101000110010001100010111011110101110111011101011100100110111001011000101010110111000010000000100101010101000101011000011011101111101001100100 1011100100110110101010000101010110010001111011010000000111111001101011000000100110001110001011100111001010001101000100110100011001011110111110100001111110000011110010100011010111001111111011001000011101111101011001111100011101100100001000101000111111010100000010010110000110101110001010001110110010001101101000100111111101101001101001010011001000100001001110110100111001111011000001101110011100011101 1111001111101100010001100011011010111110111001100001101110111001011111001101101101100010110101011111101110111010010111100011110111001001110011001001011000110010100001110111010101011101001001001010110001111110010111001110000110011001001100001101001101101011111110110110111000111110110011101111100100010011100110110001101100010100101010000001010100000000101000000111000100000111010010101001111111100000 1001011111100110111100010010110111011010001000100101101100110010011111001001110011011100001111111011011111001111111000100100001001110111010100000100101000000000110100010001011001010000110010001100110010011000110100100001100000011000001100000101101000001000001011000100011011110100001010010001001101001101000111011110100110101001100001101100010010110001011100010000001010001010111010001011101000111001 0101110110011101101000010101011100010000111000100100110010011000010011100000101000111010111000000010100000001000011100010100110001101010110110010001011100010011110101110111001010000010011000011100111101000000000011111110010010110001110101010110111101001100011100010010010110100101000100010100010110000010011011001010001111000010100000000111001100011011001110000011011010110100100001110110101100000001 1011000110000011001100001010110110100001101001111010000000111011010000010011110010110100101010101001010101101110010001000011001010110010010010100011110100101110001011010000100111000011110110001001010101001000001011010101110000111001010011101101101010100101001011001000010110010101011101010011111011011110110111100111100011001010001110000100101100111011010000100011011101011011001100000111111100100010 0110010001111001011101111101111110100101001000110010100011101100101010101101101110010110010111001110111010010111101100010101010011101100011000010001010010011110011000110001110111111111011111101010111010110000111101111010010100001001010011101100111010001010111000000110100110001000111110101001001001000111010111000100001100101001001110101000011100010101011001011001000101011011010000110101111010001000 1010110100110011110100010101001001100110110010100010001011011101111111000001010011100111001110001101101010010001110110100110001000101001100011000110010101101101111001110111111001011011011001000001001111001000001111000111011011010110110011011001110010000110100010001101101001100001001101000101101101010101010101010000100110001101001011011011111010010101110011111100010110001000100001111100001000010011 0110100010111010100100010110101101101010111010100111100111011011111101000000010110111011110010010000111101101011111001100010101001100001111110111100011001011100111101001011010111011011000001001000000011001101010101011101101000010100101011100100000000001110000100011000001111100111101011001110100011100111001111101101000001010000010111001101010100100000100000010111000100001010001001000100001010110111 0101110110010010101001100111100100000000010010101000111010000001111010000100001000011110111101000111100100010100001011001101011100111100010011110100011111111100001100111000000011001101101101101111001001000101001010101001010011111001011011101101010010111000001110010110010011001010101010010001100010101101110000100010000001110011000011110110111100011101100110000100011100111101111111100001100101111101 0111100110011011010111010111010010101100000100010111110111001000110111111010011101000100001000001001010000001111000110111101110011010100000101001010000010110110111011110100111010011110111101000001000100000011011111011000110000010011111110001101010001101101110101100100111000111010011110001011011101010101111100110100110101101100001110111011000011000110111010100011000000100000110010110000000100000010 1001101110000011001010010101000110010101010101111110100100101101110110010111101100000100011010111011110011010010001111101100011011000101001110011001101101001111001101100011110111101101101000001110111011010011101101111100110111001010111100110110100000111010100111100101111111100110111110100111010101000111111101101100011110100001010100000000010110111001100010001100101001100001111111101010100001001110 0100000100110010101101000110001001011001011110111010100101100101010111111101101000011111110110010111011011001010000100110010010010111000111001101000101110111000100101110011011101000101111010111100010111001001100011100000111010000101010011111111100111011100011001111011001000100011011001101101100001001011111101100100000011101111011100100111011000110101001001000000101111111111110010100001001010011100 0001100011001111111111010000110010011011100111011001001001011010010011110101100111011111001101111011111111111001101101100001001111010010011100110111000010000110010111100011100100001010011110011110011110001011000011100000101001110000000100110000110100011010000010101100001010000101001101110100110011011011000010010000010111110111101101001101011100110110110101110000010011111101111011100011000101010010 0010110000111111010011000100010100100010101000011000010110100001001101011010011010001111001010011000001010110001001001110110000000110000101001001000011111111111101001100001101111010111001111111110101100010000011110111101101000001011001101101010011110011011111011100011111011000010101101000000111011111011101011000001100110101011001011000000010010101110110101111011000001000000000111110101101010011011 1111001100001000010010111100100010000000010000110110000001101000010100111110100011111111100010010011111001000101111110111011100000011011111110111110110001101100111000110000110111110111010001111111111110110000101001100101111100100110100001001100101100001110100100111011010111011000101010001010100101011100111001000110001001000111010101101000111100001111001011100001010011110000011111101110110111011101 0110110100100111011101100110111101101111100010100101001001001000001110100101110110110101010000100110001101110100111001001000011101111011111101100100100111000100000111011111010101110011101100011111110010000010111011001101010010101011011110001100100100000000011111001111101000100000001111001000000000101111100001000101010010101011101001000010001101111111001111001111010001100101111111011101110100000100 0111011011110110110110001101000111100000001001100111111011100100110000100101101001001111001011100100010111011111011001101111111000110000110011001111111110000100111100111110110000000110110101101000000011111001101100110110011010001111010101100011001110011100111000000111100100011110111011100111011001101011000011010010010011111110000101011111110001101010100001001011011101110111101010010011011100010000 0100001010010101001101101110110011000000100101110101101000100111100101110100000110101010101010001000010111100011111010001010100100011000000000110010100011010011110000100110110001000011010001110000100001100001001110001111001110101100010110000001101001010000110010110111100000110001110111000000110010111111011100010000100111110011001000101011000010000100111000001010010000111111101011001111010011010100 0101100010100111010101110111111101110100011101101000100001100110110100001001110100011111100011000001101111001001110101100000000001101111111110000001101001011110010010011000000100011010101110100110101100100110010100001000100100101011001101001111111001010100100011100011101000001000001110000010111110011010111101010001111111011011010111001110010110101001001110101100101011111100101111100101010011100000 1001010111011010011011010011110110000011111100111100010001111110010011100101000001111011010110000011000110111010110111001111111010101110111100000000100001101111110111110010110111100110001111001111000011011110000110101011111000001110100001001101001010100011000010101000100011001011111101110000001001100101100011001001110101011001011110000101000000010000101011000001101111000011000000000101000011111100 0010010011111111011011010001111011100101110010100010100011100010011101110000101010100101111100111110101110000001010110101000010010100001010000011100111001001011101101100010001101100101010111110010100111111001010111001011110100001010111000010010101111001100010101010110100110000010101100101100111011101010000011111110111000111111010011000101010010001000110010000011001000010110100000010011101010001001 1011010001111010111101100100011111110001001010101010011010000001100010100010101010100111100111111001101001010101011110111100011011100011110101101000100001010101010100111010100011111111001111110000111100101001110110101000011110100101011111011110111010101001101001100110111110010010011101001000101101101001101110111110000110010000000101000011001001111011100100111110101110000001010011001001011101000001 0111001011010001011011010001110101010000110111010000001111111010110111101101001000001101111110010011110111010000001100101111011000011111110110111000101110101000101011010001001100110111111000001110101111100001101001001110111000011001000100100111110110101100101001001110011000100100011011001010001011000000101001100000111111000000100101000100101011101010100111010110110001000101111011101000111101011101 1001000111001001101011010010000101110110001101101011001000110000111010000100010100011111001011110110101011010011110011100110100101111001100001011001101100011000010000000011110100110000011001101110100011010110101100000001100101000100100001011100101111000100111101000000000000100011110100000000001101110111001111000001101010000011101100011101110010010010110011011101001110101110000000011101010000111001 1101001001000001011101101000101100101000001100111101010001111111010011001111011110100011000100000101111010100100000101111010001000101000000100111000011100100101011011011011111001011111101111110011101001111100000010000100001110001101010010000011001101100101000011111001011111010110110101011001011000111010111000110001110000000100100000011111011111101001101011110000101001011011001010010101001001001001 1110111101011100011111010100011010101000001011011011000011010101101001100010010110000111101001110100100101000010111110101010111010111111010111101011010010101111010110011110010100100010000010101000001100000111101100000111101100000000010011110111101100111111111101101010101000101111001010111111010101110110110011010110111111101111101011100001111001001011000010100100001101100000000101110001110110010011 0110110001010001010011010100010000111100011011101011100010111011100001001100000000000000100000001110001110101011011111010011010000110100111011010001111010110110100010111000101000011010110010111000001111111101101110101111000010000011100101011010011000110001001010010001010011100010010101001001000000011011101111000110001000100010010001111101000011111011011001010100010011010011110000110110000100010011 0010100110100100001001011000000010011111101111010110100111000111100111110110011011110011000111011001100100100100111011000111111101110110011101010111101001001111100000000100101001111000100110001010110000001101001100010010011010000001001001110011100010111001001101111110110010101100111001100010010110010011000010110011000001111011011111001011010110111100011100001010000100001111001011101111011010010111 0001100111011001111010001100010011110001001001001010000111011000101100100000101001001000010101111001100000011000011110011100000100101010001011100010110011111001110111010110011000111110001000111100101100001011001111110100010100101110110110010001100110011011001111011010110000111111011000100101010111001001100110101111010101010011001011001011111011111000111001010011100110100110010111001101111111111110 0011100111000000101101101001000001010101110000001010001001010111001110111100000101110000101110000000011111000011111011000000101001101000001111101111101000011111100111110011111000110100010011000010110110111101011110101100010111010010011111101100101101101111101100101110100101111000110100110111011101001000011000010000010101101001010011011011001010000001111001110001110011100010011100010000000110000011 1110000011001111111000110100011001000100000011101000100010010010101000110111011110100100101111111101011010110001100000110101001101101011001001110010000101101000011011011101101100100100001110111111101011111001000110100011111101101100100011011111000101111000011111010111101001111110111110010100110111100000110111001011011100010111010000111011011011001000000010000100101111100101000001110001001011101011 1101100000100001011110101100100110001000001101010100010101000000110000001111101011100011011001001110100100011010110011111110110011110010101101110100001101101001010110011011100111100010110010100111110010001010101111010000000001011011010101001001000101001100100110001001101111101100000001111110001010100101111111000010101100111100001000111100001000010010111101101101111001110000111101110110110001101010 1101001000111001001111010100111110001110000101001001001111010000100000101110101110111000001001110110100010100111110111000001111110110000000101000111001000011000001011101100100000001001111001010111001100110000100111101111101000010110110011010010011001011110111010001001110110011101000100110100110000111010100101001110101110100110000001111110110111101100101111110001011111011110010000000111011011001001 1111000001011000001011011001101111100111101011101100100111100110011110111010111101011001010111010110110110010100011011010111100001000001110001100001010101110011001111101001111111010101011110111110010011011101111000001000000001110110010101010100110001010011000000110101111111010100011100000011100100010010100010001001001010010101001100001000011100000101100010100101010000001111001011101010010010111100 1100001000010111111101011000001010100001100101010110001100111001011100011011011100100000100111001011000101011011101100001011000010101010011111101011000000011100100101000011110010011000000010110101001100100100010110000100010111100001101011110110001101010111001011101000111101101011000010101100011100001111000000011001001101110100100001101011111010010111011001011010101100110101001011111000100010110110 0100000000101001100101101110111101010000101011001010001010101001111101100101011011111110011101010110011011000101000011100001111101101110110010111010011110010011000101010000010011100101001011001110010111101101100100101100010001000100100001111110110010110010001100100010100011110010101000110100100100111001011011100110001010100111101001001110111011101001000110111010000011110100110101100011000001100010 0010010010100001010001010111001001000000111010101100101111011010011100001100100111000111011000101100000001010011110111111011001110111100000101101110111000110010100100110000110111011011011010011001011100100111010001011010101001111100111101101001110110011100100010111111011011100101001010100110000110011101011001100110011011101000011111111101001001100100010010111010100111101110111111011100000101111100 1100010011010110011000000000000011010110110111000000101001010000011110000011100011011101000110100111110101001110111011110001011001100111111000011110110101100101000011100001111011000011011000011010100110001010101111001111100010011000011011101010011111000010010110001000110111000000001101010000010001110110101101011011100111110011101100010000010110001110100000011011100110110110100010110111010000001100 1010010101111000011011000011101110011100001111011111000011101001110111001001111100000101010011011101010011110101110011101010001100100101001011000001110010100000100001101110010110010010001111101010001000000011010101001000101001010101001001001010100001000110000011111101100110010001111101001000101010000001001101111110000111101110101111110001110001011100110001101100000100101110010111111001101101010010 0111101101110110011000101010000111110000000110111111100100010100010101101010100111101011101001000110010110100011101011111101001011111010111110100000111110000001000001101010010011011110100000000001001110101101110100111101100011010100101100101010110001011110011111110010010111000100001010001111000010111101101010001101111001111011001001110101100111110100101110110111010011011011100111100001100100010110 1000001100000001111111100110000100000111000001010111001001010001101011101100000100100010001001000111110101000001011100101111100011111110001111010011100110111110111010010001001000100111000111000101110000100001110111010111000000001010011011000000001010010110001011110000011100011000100101000110001001000101011101010010011110011110010011011001100011001111100111101111000100000101000000011101000011000001 1100100100100011100100001011101000110111001001000100111110000011100010110001110101100100111111001000110001001001001000111111011110110100111001101000001111111000011000000110010001011111100010001101000011110101100001101101011101101011100111010110101100111000111110001101110000111100001010001001101101110101001001100100001000111000010101011011010101000110000101011111101111011010111110110011000101010010 1100100101111000010010101010101101000001000111101000101111001100100110101101010101101001001000010111000100001001110011111001100101110010010100111011111100110000110010111111000100111001100010011000010000111011111111001100110001100000000000000110010100010110111011111010011011100010011110010111011001000000000101110010010111101000110001101110100100110010110011010100101111011111100101010110100000111110 1110001110000011100010101101100000000011110010010000110100000111101110111000001010001100101111001100100111010010110000011001100010101100111110010111001111101010011010110101011100011010101100101111011000111101000000011100010111101111101110100110001100110011011110011101111001001110001011100000111001100111110011001110010100101011100100101001101011111101000110000111110101001001101110001000110000101111 1101000110101000000001001001010100011100011101010010011010001010111111101011000101110001110000101100101111111011100010101110101101001110001101000101101011010010000011001000100011010110100110011110100011111110000110101101011001011100011010000101100001000010000011110001000111111110011000011111011101110111001110100000101000011010101100010001110011011010001010001100011101001110010011001011110110000000 1110000011011001011001011010110111011000110101100010011000011010110011101111101010001001000000000011010010001111000111010000000001011010011001000110101101111110101100001010010011111001101100110001100011011011000010000110001101100110100110100000001101100000100100111011111101101011100111001101101101100010010111111010111000101110101100000100110001111110100010111000111001110110101101001110100100010111 0011010011110111001111000001000110111101011110011011011010011101111110110111000110100011011100101011111101000000111110010100011110010100100001000001111101100001001111010011000011011101010000110011011011001011010010101001101010110110001000100100111111001001100111010100110001101110100010111001011100111010011110010111001011100111111111011010100110101111011100010011111110011101011010000111100000001011 1100110001011001011111101111011001000011011011001110101111101010001001000101111111111011000001100100110100011010001011010101111100010100001101100110110111001011110111110101001011011001010001010001001000101001010000011000100110010001010100101010110010000111001000010011111110110001001110111101011110011011001000001010001001000110110011100010010011000111110100111111000100001010010110011110100010110011 1011100100110010001011100111101010010100011100001110010100110101011101100111001100101010111101010111110010111000010001000001101000101110000010100110001010010110001110101111001111000110100101000011011100110110111010101110000111010000011100000110110011100110101010001010100101100101011010101101011101010110011000111101000111101000111101111011000010100101111000111011101000011010100011010000010101000110 1110001111010100010110011010010001000111000010000000000111110100011111101011110110010001111000001001010111010010111001000100110000011000011011011001101111000001111110100100100100101111001101011100000010001101011101011100001110001000100001100010110111001101000101101001011001010101011010110110100110011000100001100011001110001101101011000011100100101101001001001111110101110011100101011011011111101000 1111000001001110100000011000110101001100011111010011100001100000111011101111111000100001100011101010100101111100101011101100011100110001110101010011111010011101111010000010010110010011001011010001011111011011100000001100101111111111011110011100100000100101001001011011001001001001000110111100101100001000101111010010001000101011011110001011001110100111011101111010011001100110110110010010000101000010 0010001100111010001010010001011001101000100100111001001110101110110111111010001101000111010100000111110010100110101001011010010110011010101010010111000010101011101000110101111101011001100011110110010011010110110000101101001101101000010001011001110111100111111000011000011010110000001110000001011001011110100100101001010111111011001001011100011001100110110010101101110011101000001011101011111000011010 1111011010010001110010011101100101010011010101001101001101100011010011111011011111100011011010001001101110000111110011110011001001001010100011100101101111000101011111101101000010111110011010001110010010110100110011001001010001010010010100000010110100011001000101001110100000110111110010000100001010011101111000101110110101100000010101100010010001110001011101000000000010100000000000001100010111110010 0010011001111000011101001010011010101111101100010011011000010101111011011001100000111111110010110111010100111011101110100011000010001011000011101100111110111011100111100111100000100000011000010011110100001011000000011110010000101011111000001011110001100101100101111010010010000000000101111111011001001101000100111010000110000101010111100110000001101000100100011111100101101010000010000111000011100101 1001101101111101000101001011010101011000010101001000100111011001101011110010101011011010110111110001011011110001111101100101101001011111000101010111011101111101011010000011110111011001001110110010100000111101100100101100000011011010111011100101101011100011010001110000011001010100111011110100000000110000111011001001110011110010010100100001100101111100000000000110110011011001000110110100101111111101 1110001000111100000010111001010011110001010010111000110001100101101000111100100010001100010000111110111001000000111101101000111010110101101100011110110100110000001100101000100101110101011101101111000101011011010111110100111111100010101001111101000100010111001101111101001011010101010111100101101000101110100111010110001011000111000100101100101000010110001110110000010010001111010110011110000111000000 0011010010000100001101000110111100101101010101111110001110111010010111111010100010000011010110101101110100011000001001001011111010101100100110110000001111000001011101011000010010100001001110100101000110101100110010110010000111011000110100111011111011001010110000000111000000010111001010110111100001000010110010101111110100010010110100011001110011110010110011000011101100110101011000111010101100010101 1010101101100001011101001111101011010000010110111101111000010000101101110001011011001010111110010001000010110101101110101010001011101001100001100011010000101010001000001000111000011000111110010101000111011010000010000000011000000111010101111011101010100110101011111110110111101110001101100000000111000101101000010110111001101010101001110010000010001000101000111001001000101000010001000001001010000111 1110000111011111010011101011111010001110001110100100011011111011001101111001001111100000001101011100100000110111011101110001110110011010001011101100111100000100111101100001011100010000111100111110101010001101001001010001000110101010011100011010011001001111110001111100000010001101001000010101100101100001101100101001010101011111101010011101100011111011101001111010010001000111111010011001101010110011 0001111100000101111101111101010010111001001011101011110101000110101011010011010100100001011101101101100000101111001011001100011110110000010010110011010010100101011101001001001111011010100011010010010000010000010011100000011101001001010111101000001110100100000001011111110010010111010011110110101101100011000101011011011110100111111000000011101110001000010000111100111111010100011100010001001111011110 1000100000110111100101100001010010000000001011111010111000101001001010001100100011011000010000010110110110000001000101100010111001111011000110000111001000000011001011011000100010101000101011010001010101000010101000010000000110110011011100001110001111010111101000110101110000101000001111001111110101001000010111010111110000001010100011110010011011111001000010111111010101010011011100000110011001001010 1110111110111010000101100000011011001000010101000011101110100010100101100010101011001010110101010111011100000011010100000010011010100101010111010000101001100011100000000010101110110110101010000011011000010100011110101011000010110101011001000001110001111001111100010101111111011110001111011011010110111001000011001111111010101000110001101001111001011101101000011011100011001011110001110101001111100111 0111101100001100011110110111001000110010100011010111101011000110000111010100000100110010110110110010100100101110100001000000011010110001111001001100011000010100110000011001001100110001011111101011000101110110111111100111010100010101001000010101110111110010011100110100100100001010010101010101000101100111001001000101001011000110101101000100011001011101011101000111010001011110100100110101000001001100 0101101011110001000010111001100001001010010010111000010010110010011001000000001111000011000011110010001101110001101111010011001001101101000100000011100100001100011001110001011110110101011000001111111010111001101101001100000111010110010111000011111011110001000011101100100000110001111100000010010010110000101110100111000100000001111100010101100100010101101111100101101000000100110110110111000110001110 1111011101100011010100010011100000100111010110001001001010000110110011111111100001100100111000111111110111010010111010000111000100110111010100010100100001000111100100111011111110100010110101001011010110010001101000111111100001011101000110110010110010101001101101000010011110110000101110110001010010000001010000110100100101111100101000100001010111010100010000001101100110101011010111001101011000000100 0100000110101110101111000111100111001100000100010110100010100001010011111100101001111101000111100111101100101000101101100010000110011100010011101011111111101100111001011001000011001011010000110111000001110110000001111110011001110011010001010110110010001001000100111110000110000100001101010100111001100110011111100011001111001100101011000110101101001011110011011101100100101100110001000001001000100100 0111010011110100111010011010101001100100111011011111001010001000111001010111011101011010010101111001001000111100110000101011100001010001111111010011100001011100111111111101000010110001010101000110101100110111001010001110010000011100001100001010100100000011110010000001100111110101111111110010010100000101101000000010011001101010001100001100010001111100001010011000100001111100110110000011110000111110 1010010110100000110001111111001001010100000001110010001101001000010111011100111001100001100010010110000100110000001101010010001110011100011110110011011110100011010010110011001110001000110010100010101111100100011010100001011110100011100101000011111010111011100000001100010100010101011011111100101000011101101011010101000000110010011000001011101111010110101111000110110100000011101111011011100011110100 1010110001111001000010101110011011011010001101001001111100011010000110101100110110101011101010100000001001101100000010110011101111011111111101000010100110000100100010110110110011001110110011001101100100110000001100101010110001001110111100101001101010010101111111110100000010100011000110000000011100011101000100100010111101100000100110110110000001110010110100001110011001100110000001011110100001110111 0111111000111111011110110001111011110001110001100110010010100000000110011101001000011010000110001101111101101000111001111011101000100111000110010100001110100100100001000110001011100000110000011000110100010010111100011010011001010001001111101011111101001000111110001001110000101110010101000011011100101110001100111110101010011101011100011100100000011000010111001101110101011000110011100100111110101100 1010111000010010110100100101001100101101101001001110010110110001101111010001111100011111011101001011011111101110100001001100000111110100110000110101011101000010100001101111011101011100101100010010000111111100001001101111001000111110010010010011000100111110001100100010011111010101001010111011101111101011101101101111001010101111001101111001000100110001111110110000000010001100010100010110011101010111 1010000011111100011011110111001000000111000111011010100100111111100000011011010100010110101001110111101100000110100011011101101001000100100101000010111011110000110011011111101110000100001010001001010010101110011111011110001101011011110101000110101110000010000001001100101110111100001010110111100101110001101011011111101001001111111010011101100100001100111010111011000010010110000100011100000001001000 1000110110101011000100100001010001101101111101010110011011101101111010001001001111101110100101111001001010010111101011111110111100111101110011100111100100111100110010111001100011011100101010011111110011001010010001011011011001100100011110111101100110111110010011101010100001111001111010101110111110110011011111011000110001101111001001110000011111110011100111101010010100100101011010100111111111100111 1101111110111100111111111000100101010011011110010000011101011001001010000001011001111011111101010001001110011101000110100111000001010110010000101101100011111110011001101010000000001100111011011101110011100000101000110000010100011000001001101001010100101011011010010111111011011001101001000111111001110010001011010000001000000001001011101010100100000010110100101101101100001110110000011100101111111001 0111011010011000110110000001001000101000001111100011101011101111001010001100101101100100100000100100100100111000000101111011010110000000111010010111110111001011110011001000001001010111011000101100101000111001010101111101110001100011001010110110101101111111000111001111111010110101001010010000101010101000000111111001001010101011101110011110010111111110110100001100000001100101011000101001110000101100 1111100011000011011111011110000011100100011111101001101100000100000111110111101100100011100000101001110010010101111111010100100000110001100100000001010011010011111000010100010011110111011110110110111111010011010101100111111100000100100011100100010011011000101111110110101100100110111000001111010100110011000011000010111101000010011111100111100111101101110000010011001000010001000001111110111010001010 1000110101001010011000011001001100010001110111101010000011000001100001000110010111001101000000110010000111000001100011011010011110101100100110101011000100100110100101100100111110111010100010001111001100100010100101100010010111110111011010001100011000000001111111000000111011110000110000001100011100101100101001110000101000011011001100100000000001111000000000010100011110111010110000101101100100001111 1000001111011001110101000100101111001100010000001000001000000001110100001101011111011010101111010000110101010001001001100010110110110001110110111001011010111110001000011110011100110111010000011110100101110001100001100001011000100011110101101001001001100100011001101010000110110100100100001001000010000111001000000001101111100110001011001000010100100111110001000101101100100001110011000101010000011110 1011011101010001100011011000011110011000001001011111100110110011011100100111110010110001010110100110000111001011000111010110101011110000000110110010110101111000111111110101011001101011101001100000010010110010001101101001001010111011010111011111111011000110111100010011111010011001100010100000001011101100010110011101110110010101010100000010001100001110100101011001010001001110010110000001100001110110 0001001010101111100000110011110001110100101010110010111010000000010010101000110100101011100110011101010110000010100110001110110100111001101100110110100100101111101001100111011111100000010100000111000010111000110000010101111100000100010100000011011000101101000010111110001011100111110101110000000010101100110111111011111101100000100110111100100110100000101101001101011101000010011011001011110010010111 1010010010101101101101101111100101100011101010011101101111111000000010000011000100010011000010011011101111000110011110011001000111011011010001101110110000100001101011011101010001001110101111000100110011111011011011100011101101001100000001011100100111110001001000101111000010110101110110101100011101011010010010101100000111001011000110010110101000010110110111010001000111000101101110010100110000111011 1000110110000100001101110100000001011100110111100110001010000000010100000010100101001101001010110000010000000000011100000111001100100101101000011111101011000000000110011110011111111001010011000110000101001110111111110111010110000111010001000000001010011001010001001111111000100000110001011000000000000010111010010000000000100101000000111101100111111001101110101000011011111011110001110001001100010010 1101000100100100111100100100000111000111010110010110010100101000001110101100000111111001111100001110110100100110101111110111101001001000111101101101000001100101010001000111011000010111111111001100101000011001101101100010010010010111011100000100111011110110011110101101110011101110001010110110111111110101000111100101010010001011110011011100010101001010011101010110111000001001101011001011001101100100 1001111011101010110110000111111001001010001001010111000000110101100110001010010000101100110011011100101101000111011110000111101100101011101111011001000011110000111011010100110010010101010010000000010010101011111001101011011010110001001111100110111110000101010110101011010110101001000100110001111000011111100010011110001010010101010011011011010010110011010110001101011100101011011110000100100111000110 0101100111110100100111011010001000100110011101000000101110011111100100100101011011011100010000101111100010101101100100011110010110000010110101100111100001100111111000011010111000011000100011110010111110101100100110100000011001110000000001010101011110111001010101011010101001001101100101010001001011000110100001100010001100011100011011011000100101101011100010110100101010000011011100101001101100111100 0001010101000000101010010101001011111100100001001111101010111011101011111101000111101001100000010111111010010001100111100101011110100110011011001100001110011001001111010011110001011111101010011011001100110101011110010010110001001000101111101100100111011101101011101111000100011011110101111011100111001001011000111011000111001001101010010001110101101100111001100011011000110010110000101001000100110010 0011111101011110101100110011011011100000001110000101100011010100110110010001010111000101101101000111100001101110100101101100010101011010111000010001001001010001000111100101110001011001011001010100101101101011001000010001011001110100110111000111010011001110010111111101111000111110011001010101110110111011111010111000001000011110010011010100101101111101010111101100001101100010101110001000111000101011 1111001001010110111101011110111000000010111111001111011100010110110101100110000111000010000001110000011111000000010011011101101011001011010000000010101010011111101101001101101001010101001010010011110110110000000000000000001111110001010001010101010001011111001110010000101000010111010001000001011011001111110110110000110000001011001010100110010110000001100000110100000110010111001111010011011000010011 0100110111001101011001000011110011010110110100001101010010010100001100001000010011011110001001100001100101011011001100111100111100000100011001010000000111011101000100110000000101010100111000010110001101100011100011010110011111111100101110111001011001111000100000111001001010110000101110111101110010110010100101101101000010110101111000101011010001101010111111101001110010001011011001101100001101100100 1010110100000000111111110000001000110001100011011101011111110100011000000001111100110010011100101101000110110010110100111110010111001000100001011000100000000011110001000001011100111110011010110010111000010010001111101101100000111110000101001101111000100010111100000110101011100101010001100111000110110110100001110101101101010011001101110101110111000001010110011010000100011111010110010001110100001100 0111111001010110100010010111110101101000011101110110010000010100111011011101111001001110100000111100010101110000111111101001100110110011010111010101010010010111111001101001010001101100011000010000100001010111100011111010111011100000000111100110001000010010011001111111010010100001011101010100010110100101110010100110101110101101111010111111101101110111000010100100010001110000111011001000000101000010 0011100010000011001111001110010111001000001101110100111111111111110011101000111001100001010010111110110001110001010001010110111001001001010100110111100101100011010010011011001100011100000010110001111101110111110001000001000000100010100110011111001101100110101101011011110101110100100000011110000010111000100000101110100100110001001111111111110110111100101111111010011011011000011100111011100110011001 0101000000011010010001110110010100001010100011000010110011011100110100101000011001010100100011101110110110000110100010101101110101011011010111100000010010110001010000110001111100101101111000011001010010110000001001001011011110111010101010011110010010010000000101111011111010000011010010111101110100101011111010111101110111100111010010011101011010010001100110111011110001100001111001110000111111101100 0011011000111110001000000110011011111100011001101100010000111011100000110010011011010101011101100111001101100111010111110000101000110011101000010001101011000110110100000001001101001101110011101001010000100001101010010111111100111000111100001010001110101010000111100001010100111000101001001001001011111001010101110011111110010010000000010101110101111100101110000001101100010011000101001101011011111000
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

© 2025 ajinori