1011001000000001000010011001101000101111000011000010010101100000101111011011110100111000111010000001110100011010101011111010010010110011001001011010101000101100011110011110000100110000110100000011010011010011010000100111001011001100011001000101100100101011011101000000110110100101011111100010000010100111001110101000100101001000101101111001010111000101100000001111010010011001010000100101001010111000 0101111010001111110110101010011011101101010101111100101111110010111010011000010100101000100001010011011101101010100000011100011111001110101000011010101101110001010001001010011100101001100110001001010010111010011010000110011000100101101111010111010011011000111000010110001110101001100101010010110001000110001111010011111000001001000001001100011000100001010001001101001010100101000110110011110001011001 0000000011101000000010010000111010110010001001110100110001110101010011110011001001010000000100011100000101011010110100000001011011101101000100110000000101001101000111100000001111001000111111011000010101111010000001011010101111110000010101011100101110111111110001100111001001111110110010111001001101100111111010101010011101010100100010111110100101010011000110000111000011010010110101100000101010101111 0001000010000111110000101000100110100111101000111001001001110111010001110101110001010000101011110111100011000100111100000111111011100011111100110000001001010111010111111010101100011011000001011011000001110110110001001100010011101111011001101100101001001110001111001110011001000110111110101001011011001110101001111011000101101110001010011101101010100011110110110010110101000100110111110010010010001100 0110001011101000111111011010100101101101010001111100000011001100110001011111111001100110111001000010111001010001111010011000011000011100000010111011011011011100011000011101010001110100100101100100010110011001010111000110100000010101111100001011110011000100111010011110100110101000111010111100010001001111101111111010111001011001101110101100101100001001110001010110011100101101111010000001110111000010 0100011010100111111011101101010010110010010000110010101001001111000000000111011111111111100111110110000111010011101111100011100101101001110110000011000100010001100001101011110010111111001001101101111101010000001111110011010010001111000000011110000010011001110010100110010101111100101110111101111010011011101000110010000011110100111111101100010110011011111101011011100000010001111010010010111111011111 1000100011001001111100110110001100001100101001110011010100000110010110110110111110000100101110111010010010001111001110011111000110011111000100011100101101101101111100001011010010000010000111000001101111110011000100110100110101001010011000011000000010011100011010000000100101010101011000111000001110011001101010011011001101000101111101011111000101010100010100101010101101100000000010000110011101001011 0110110101100011110000100000011010101111000100011000011111001101101000111111100100110100010001000010001100101111011011100110000011011011110101011110000101010000001011110011111111001111101110110101100110001111001011100011010010110101111101010101001100110101001010010010011010010000100101001011010101010111010001011010101110100100111000111011100111011111010000011010101100000010001101001100100100011110 1001110000100010001110100101110111011110101101000000110000000010100101110001110100100101111011010111111101111011010111010100011111000110111101001111011001011000010111110111111110101110110110110011110110110101110001110111110111011010111110101100010111000101010010101011110101100011000001001111100101100111110110110101010010011010110101110000111000110000011101111110010001001111000000001000110110101110 1111000100010011011011111000011100101011100010100000010000001110110100001000001000110110100101010110001111011011101010100110000000100001100011111110101111110000101100101011100111101111010001011010110001110110101011001001010111010000100111110000011010001010010100011011011111001100110010111101111000111101010111000010111011100010011000000100111000000111000001100110110011110100100111011100000111110010 1010000101001101000110010111100100110101111001110010001100010001100110001110010010111001000011011110000011001110001011001100010011100010001000010001011001011010110011001100000010111100011001111000001101100110111110001001000011101011110110011000001001001110010001100011101001011010010111111010001100001010011111100111111010010001110110110001010101100010110111001000100011011101101011011000101100010001 1100010110000111101110111000011110001101110111011101100001011100011001000000000101111110100101110111011110011110101101101001001110010101010111101111011111000000001001111010100001011110000000000100101111110111001101110110111011110010110100011101001111111000000000101000100011011010110100111010110111000000001110111111011001011111100100011001010011010101111111000111000001110111110010000100001001110101 1110111001011101001100010000000000010101111001110010011001000011001110110000111011100010111000000011011001111101010000010111110011110010001001000010100010011010001011110011011011110000001101010101001001001110101001010010011101010110100111110111110100100001011011101101101100011010111001100011110000000011011110001011001101101110110010000011011101011000110110110111111111111010110001101111110000000101 1000000111011011000010001100111110001101010011110010110000111010000011000001001110111011101010111100111111101010011101101110001000100101010110000110101000010011100011010010001111001110011110101110101101101010111001000000111001011001110111100100010000100110000100001101101001100000110010100110110000010100011011010010111110001010110111011011000010010111111101010101101110110011101000011010011101111001 1001100001010000110100000010011001010000111011100011110100001000001110101001110010011010000010111101000110100000100100100100100110101010100001110010101010100101010010101110100001110010010100011000101000110111100110011010010010100101111110111000100011001010101000010100011010000000011010011111100110100101010100000110101000010010110101111100111001111010101001101100011101100011110011000011100011111100 1000010110001010100100101100111101100110011010111110100000111111011011000100000110000111000101010010010101101000100011101000001101011001000100001100010101000001011111001100011001101111011000110111000111101101101001110101111110101101010011000011001001100100000110110001010101110110111110001011011001100100010110100001100000100100111110001111011111001011101000110101011010010000110011110001010001100000 1100010000001000111011100001010101111100110100101001110001111010101101001000000110010100001101000010101111001101100100011000000110100111111100001011101000111010001100111011111100101111000001011111001010001011110111010111100011100111111111111101110000000011000000100110010100010011100101000100111001000110011000111110011111011110111001101100001101111000011010111000001010001000010001110111111010100001 0100101010111000000110110111100100101111110011100101001100001100011100001110010011011000110011001111010100111110101000100010010101100010011111110110101111101111011101011111010011110010111000000100001001100010100001111101011110001010111111100011010011001000101110001001011110101010011011010100000010011110100100011111000000101101111001100011011010001000111001111010011011110100011101110100000000100111 1010001100100001011000011000110001010000010000010000000111101101001001111000100001101110111001000000110000000001011010011011000110111111101100101011011101010010000000010000101001001001101100101100001001011111001101110111000011101011011110100101010010110010100111110000101000010101101100100001001011100011101101010010110111010010011110010100110111101000001011110001011100011011100111011100101110000010 0111010111000100101110010001111100101000100001000001100011001010000011001001111110111001010100101010110001010000000101000100100010101001001101110001010111000101010101001110000000110001010101001001100000011111100010011000111000001111010111011000000010010100110000000001100111101110010110000010010011100000100100100101111110111101100100011111100011101011110011101001000011101111010100001001011111110110 1000110011010110111010100100010011101001001000010010100001101010111111011101000110001011111001100110011110110001111001010111001011001011001011001110000001000111011001110111101111100100000001100101101111011011110010110001010010001011010110110100100111000000000111001010100100001011110101100001110010011011100000101101100100111010110011111010011111100001010100000111010111100100010000010111000111111010 0000000001101101100000101100110101010111010000101011110010010011100001000001001110101110100011011011111010000001000100011100110100110111100001011000000011110101110100001110110110100011011110100111011000001010011100101001101101101101101011110111011011100110111111101011100111110101011001010101011000111010011001110001010111000110010100011111100100100110100011001111111001010110000011001001001010101001 1101011010011110000100000110000011101101000100111010010001100100010001000001110110000000100111011010100000010110011011011111111001110111010100111011001111001001110110011111100011001101101011111110000010101000011000000100101010010010010111011001101111101000001010001010110111000010011010100111011111000100011111110001010110001110010001110101000100001100101100001111110101110111010100010110111110000110 0101111010001011101001111101111100111011010110111011100010011011000110100111101110101110010011000100000111010100101101011101001101010010001010101011001100001110011101011100011010011111011100110011111111100011000000011111010100001100011101011101011000001011000011010110001110100010111110001101110011101010010100101000110011110100010001010111110010010111010101110011111100010011101011001010000101001010 1110001001010101110001100101010010101001011000011110111010011101000001101001001010011101101010001001001000010100110110110100001111100111010001000000011101110011101011110000111111100111000101001111010010101110010001000011010110000010111100101111101110110110000101000011111001010101110010111100100101101001010111010010101111010010110110000001010011110110011010100000111100010100101100000001000111010000 1000011100101010110011101010011011111000000010010001111010110111101100111000001011100010111101111011101110010001001111100110010001011011110000011010010111100111000101010000001010111101001100000111000111111110100000000110110000100100110101101010101111100101010011010011011110010001011111101101100100001010101101000110010100011110000111100011011010011101110110011110101100000110010100110100011011110100 0000100010001011010101001011011011101110111010101100101100110010000010000110010111101111111111101000000101001111111011101011111010011110001010110011100000110101011001001010011111110001100100110010100010101110011000110011110110010110110010001101110011000110010100001100001110011010110110001101110001010100001010101000011011011111101110000101111111100110001110011001000001100111111101000110101111010100 0011001010011101100111110111111000011010000010011011100010110001111011100111100111110001111011111111001011110001111000000101111010011000001100001001001000000101101111001000001001111110011011001101000011101000000001001010111000110110101100100101101000100101000101001111100010010101000001110111110011100000111110110110110011100101100100010101001101000101101111101010100101001010100110111001101110011001 0000010110111001111110111101101100000001010100111011101000111011101001101011010001111101110110100010101100101011011011100111111001001010101110101011011111100111011000101100001111000100100011010100010100001000010010001110111000011111111000110010110111000111011001001110010111100011111111010011100110101100011101100010011111101101001000100110001111100010111110010000010100111101010010011111011110101000 0011010101110011101000001110111000111101111110011011110000111001000011100100101000110001010110001111100011110000111000011001001000010011101001101010011101101010110101010000011101111011000000000100011011100111001100011000110000100111111001001100001101111001001011001101010011110011101110111011000001101010110110101111000110111110000010011011100011001000110011111111010011110001101100100111110100111111 0011001000011001111111000000000010001101110111000011101100100101001110111101011100011101001011100101111111110100110001110011101010101011000110101000100000001101000000001011000000111011101100010100000011000101000101101010101111000101111100011010110100000011001111111111000011100000111011111010101001001101001011110111110101101100111100110101011110010111010011010111011010001110011011000100101100001110 0110011011011100011111111000111000100110000110000000001011011011010000010001011110011011010101110101000111100011011101000010011110010010100100001100110110011010011100100010100001110100100101001111001110111011000100001110000000100000010111110000101000001001110011111010100001110110010110010100111111100011100111010000010110100011111011101111001000110111010111110100000111000110110011110001101101001101 1001111010110001001000111101000100011111001010001101101011011001111001010011010010101110110110011011100000001101100111101110101000010101001111011101100001000001001111111110011111001111100111101000101110111011001100000110100111100000011010100010111110010001111001000110010110001001100100111010111101101001001001011011011110001000101111110011011001011011001100010100101111111010111000111110000100110001 0000100011101011101110001110100100001111101111010010101010101001011111100111011010100001010110110011001000010110110000100101101101010111010011001100000011100110010010011000101100000111111010001010100011011001110011011011101111110010111010101101110010010010000011000100110101100000110010010111111010001000111000010101110000001110111011111111000001000010010001011110100100111110111011111100000110000001 1100101001100111000110100011101010001001001001100100100011011011101010010011101010101101010110010100000010000110111010100100111111010110001010000000011010100101101110100100111110101011000000101010001001010110111001010100011110010111110010010000010011101110100010011011100110000111000100010101111110010101101001111000001101101000001111111011110100110000011010110001001101000100110111000000100000100111 0001011010111001110100010111110100111111010111010111111110011101001000001000101010111101100111010000101010000000001111111010100001001101111001100011010001101101000010101101010100101100101001111110100111110101111000011011110000000101010011100010111011100010110100101001100000101010011101010001001011110010001000000111001011110001110111111000101000010100110011101011000101000001011000100001011011100000 0101000001101100010001101110101010101001111101001100011110001111000000011100011001000000111110010000111010001110101010110100011010100100101101000011011000000100011010001000000111101100000110001000001001010101001100110111011101000111100100000100011110010010001010011000010011001101001000001101101011110101100100000110100001101011110001000011011100000101100101101001111010111100101010111100111110110111 1001100110011111101011000101111110110110101010110010110000111000111011110111100101010110100110001110110001011101011011011010010111011010011010000110110011100111000010111001010010111101110110010001010010101111001000101100001110100110000110101110101000101101001010001000111110010011010010000101011110110011100100011001101110000011101011000000010011101101110100001100010100010100100001100110000000110010 1111000110110000001101011011010000100111011010000010011010001111101010000100000101101101110011001111000100011001000000011111100000011000110100011000101110000001111001111011111110110011100111100110101110110001000110010101100100111110100000100010010111010000010011000001101101100001011010011010111101010110111101011000110000000010100001001110110110011010000011000111101101110001010111001001011110000111 1000010001101000000000011110110010000100100000000010101110111100110110101101011000010011011010001001101110111101010010100111100110000000001100001100100110010100011110010111100011010001001000000101010011010111011110001111111011010010010111101000111001101100001001110011110011010111011101010001001001000010001011001110010001100111100100011101100010110010101011101111010110000010100111000001001010110110 1100010000101101010010110000000111111001110011101101010010100010111001111100100000000001111001110011100000010001000010111110110001000000100011111011010001000011010011001101111001111110011011100101100010111110111101111001010111011101111000101110110000111010001000000010111100011111100010011110100010110111111001100010001101000100100010100111010011001011101110000010000111100100110110011011011101001111 0011010101100001011101001011101001000001111110111010110011010010111111000001100010110111100000010010010010000011111001111010111001101111011100111100010110001010100011100101001100001100000011010111001011011010110101011100000101000101101110011000101111111100011000000110001011010110100001011010011010011011110100100111000110111111001000000110010010001110101111000010001111111011110001100001011101111010 0111111011100001100011000000110110001111111010110011111011110011000100001000001001101001001000110101110110001001110000101100110111011110001011111110101111110010011100101100101011110011010101000101001010110100001101001001111111101111011001111100101110001011110111010001101111011111010101100000101010001000000111011101001000101100110110100100011101010011010100100111111010111110101101011010101001011011 1110000111001110011100100000001011101001010011000100110110101111101011000000011011010111000011110000010000100010011111000111011011000111100101000000110001000111011010000101001111000101100011000010011001101011101110110011010001000100100100011000110011110110101100111101110111101011101010111101000111011111010000000001001110001110011110111001001100001110011100100100001110010111000011011100100101010100 1101010010001001111101111001100000011111011001011111101010101000111000100001000100000000111111000011010000010110011111110001011011001011111001010000010101000001111111110100010100100110000001010110000111110101110001111000001101001110001010100000110010110011111110110000000011101110001000101010000111010010001111011001101000110010100000110110011101101000011001011111111101001001100010110111110000010001 0011111000000101101100110001000000000111111010001100110110101100010000111000110110111000000001100100011011011001000100111011100000010101001010111111110000000001000101010001011001110111110000011101010110010110111100101110011001111010111001111110001101110011111111011000101101100111101001010000100101001011111000101111010101010111100011110110010010110101110001110100010101111101110110001011110111000000 0000000100111010010011001000101110000001000001111000111101000000001011110000101011000101011111010101101010101010111000011011110110010100010101000111111000000001000011110000101000110011010100110000111000100111000011100100010110000101110100111010010000110100000001100101011011100000010010011110000100101111010000111100100001100100001100001011101110010011001010001110110110010111111100101111001000111001 0001001100000010101000001010000010011010010110110011001000001000001111001100101000001000000010011010111110111101010000000101000001010101001110001001010100000001001110111001000110111001110110110011110010100101001011100010011100000001110100000001011111001110000110101000000100110010000011101111101000000001010000010011001001001001111111101100101101110100001000010000011101000001110110000100101001010011 1010111001001011100010101011000000000100011110011011101101100100000101000010000011011001010010011111110000000100110100000011010110110111110001000101110011100011001010100101100001000111001111011111110100101011111010000011110100011110011000011001010111000001110011110100101001101000001001101010000111011010000110111100000110001001001001110111100100100000000001000111101000111001111000000101100100110111 0111010101101101110011001000100001001011000010010110110010110001010100100100000001101110110111000011010000101111010000001110101010111100010000010100100000001011001011100000110101000111010000011111100000101110011011100011010011010001010001011010100001111111011011001000011110110010011000001010110101001111000001100110001111011001010011100001001000010100111101101000101000010110000001001100110011011000 1110111111000111011010100011110010111100101110010101001101100001011101101110111001111001110101011111100010111101111010000110000010000001111011011110100011100011110110100001101110010011111011111110111000101011100101000110000011101101011110011110100110110111010100110111000101010001110100100001101010100011010111011100100101111110011001001000011100001101100110100001101001011000110111111111010011000011 1101010001011000000010111001111101000100000000100111010110000100001111001111010100101010101110000010010010001110110110000100000110101101011100110101001111000100000100001000010101011110100010000010100001011100110100110111111010101111010000101010000101111111001011110000000111101001000000001001101100110011110111000000110010000111001001101110000111000010110111011001011011110001001111101000111101110001 0111000010001101000000000000000010100010101000001001011010100001110111000110111011101100100011000111110001100001011111001110001010000000010101100111110110111000010101010000110001111001000001110001011110001111001010110101011001110001101001010111001011100000010110001011111110000100110010110001101111101010110111001110010010011010001001110000011010011001110100001011100101100011011111101001101010100111 0010010111001011000101101100100111001101010010011110111111011001011111101010111100001010101100101000011111001100100010000011001010010011010010010101111011100101000110110101111010100111111110011101010110101111110011101001110100011101101010101101001001110000101000011100000010110000011101001111010111110101101010111101000110111010100001001011110010001111011101100101011110101011000000010001001110111111 0101101001110001011011000101101011010110000010111100000110101001111111100010101110111001010101011001000001110001111101101011101010101001000100111000000101100111010100001110110011111101110100011011100111111010100001011110010111011101101000000001000100110110001001100111101011101010101010001000001101000110101100001101111110010001001010010111100101000000001010010000011010101110000011111010101001110110 1001101100011100100110110011100110000001001000110101101011000111110011111010011100110001000001000101011110010001101110011110011000110000100100010100111011110011011001011000010101100000110111110100111111010101101110011001100100000101101001001001000100100110010001001011001111000110011000101011000111110110010100001111111111101011111100100111101011111100101100111101000011100111000101110000111010111001 0101110000111010010001011100110101100010101100010001001000101000101000101001001110000100101010101001011111110101010001000101101101111010011111001101000101010011010100001010110101100110001111011101101001100001010110011101010011011000000101010101111011101011010010100010011100100010011000100010100001011000011010000110110010011010111000000111010111010011000010110111011111110110110011101011001011001001 1010011110111101101010011011000101001111010000110110101111101100000010110000110110011100111010100111111000110110111101001110000100011111011100001101111010101010110101001110101110010001000000110001100000110101101111111000110001001111100100101100010010011000110101100011101010111000000010001010000100110010001111010001010101011100001010111001000000111111010011101001100110011001100110000111011011111010 0111010101101001111000001110110001100110100111100100001100001110010101000011100110100111010100101001011000101110011011001010000000010101110100010000000101010010110011010110101011001110101111010111110101000101100110110000000100111000110010100011000010111010000110100001001100100010111010110010010110000100110101101011011010111011000010111111010110001010100111100011010010000010111100011011000110010000 0000011010011010010011110110000010111001010010111100100010001101101111101100100110111010110101010010100000111011001001011111100110010111000011111101001101011011000110110000001111101001011010000001110010000100001001000000101100101101010011101100111001010110010111101001101000110110010110011001011100010101110011111111110010111000100010100111010110010110000001111000101001101101111010110111001100111100 0110100011010011100111101000001001110010001111111010101110111111110100100001011010011010101000001101000101110111000010000110111001101111001111000100010001010100011111011111101111010100100100000001100011100101010010100000001111011011011000000001011110110001100011100101000101010000101000110110111000000000100011101011000110111110110101101000000100010100110100101010100111000000010000111110011011111101 0011100010000000100111100100011110100001101010000100111100111111111000100110101101001111110110001100011001111101100000001010100110101110101100000111010110111001001011010100100100100101110010010010111110110111100010001001101011101000000010110100101110101100110110001000100101111110010100011111001001111011001010100101111110100000000111001000011111000000100111111010010101010001000111111101111110111001 0110001000101100101110110010011011101010110100001011110011011101001010010100011110101100010010010100000100011000000001100111101100001111100100010001011100101010010110000011011001110011011110101101001111001100101101111100110100000100010100011010001111100110100101111101000010001010111110101111000000110000001111111000000110011011010000001100010111110000011000010010100001001111100111001110010001010000 0000111100011001110010000001100111001111010001101011100000100010010100000011100001010110010010001101010101111101001110101101001011100111010011111010111100010100111010011001001011100011010110011101110000100110110001011110001011101010111110001010010001010110100111101110001010101010101001001110011111010101001100010101010001111101011011111000100111100001000000101010100101001100010011101110000000010100 0100000100111100111110101000111011110110110101110000001111011110000110000010101000111101111011100001111100001000011101001000010111001111000011110001010000010001010011010101100001110011110000110001001110110101110010010110101100011010000110010111001101011011010111010100011110011101000101010101101001100011111101011101111111010000100111010111110100010111000010010101010010001100010101111100110101111000 1010110011001101111011100110001100110011101110000100010010001011101010101011111000111110010100010011000111110101001010011101001001110001100010011100110111001011100100000111111100111101010010101111101001000011000110100110001011000011000010111000110110000010010101100001101100110110110011010010100000101000100111101000110011110100111011001011101011101001100100111011100000111110111110100000110010111011 1101001110010100101000100110001001111000010111110100010000101011111000111000101101001110100011111010010000110011010111111101001001000001100100110101010000000100100111110000010100011000111101110101111100101100110110000110000011000110101110111011110001001000111101010010001010100110010010110110010001011010111011111010000101001010000011000111001001100010100110001010110011110110101110001100111110101001 1110101000001111111011110110000100001000101000100111011000100100110110000101100101000110101000001100111011110110100111011000011111000100000100100011000000111111001010000001101110100110111111101001110000001000010111010011000011111100100111101001001111110101100011111100101101000100000101101000011101100000001100100100111010111001101110110101110101101111010001010010110001011001011011111000111000111001 0101011100110110000110011001110010110100110111100101001011111100000110101111000111111110100010000101001010010100000011100110001000010100001011100011011010111011001000110001101110010111110010011000100000110110100101110001100111000110110111111000100101010101000011101100110111010011110010111011101101101110010101001100011000010011110011011000101011101000010011110100000111001011111110000000110101000110 0001101110101101111110101010111111010010111110001000011111111011000000110111011011011001110101100101000000111010100001100000011010000011000001001100001000101110101010010110011100110010010010011000100011010110110100110001111111000100111110110100010101110000010000100111101001011001001001011110000001011011011111000010110010000100001010100111101100011101101000010100010000001011011000101000110101111000 0111010000110001101000011110011011100010011000011100110111110110111001100011101100110110111001000110100100000100110001011010111111100111010000101010000110011111000100101111110110110111011100110100001010011111101110011011111100100110111011011001010101111011111001010111110110010101100110000110010111011111010000110111000110001111000110001110001011001011111101010111010101110111111001011011100000010010 1111110101001110110111101111100110001000010010100001111111110010000000110111000111000110000010010011001000100000010001101100111101110110000011100110100111000011000010101101111110100010011001111101101101111011101111110011011001101001001010001111101110111111001101000110011011010100011100101111101110110101110111100110000101100110110000000110010110010000011001010100000101100110010101000001000001001010 0001010001101110100000110010101111011001000001101010111010111111101111110100000000000110001101011110100110010100110000000000110011000111011100111000110100010011010011101101001011111100011011101110100011010011001110010011110011001001010111100111000101101111010011101110111111101101011111011101011111111001111011101000000011101010010110011100101000011000100001001001101100011000010101010101110100110000 1111011010001000100111100011101010101000001000100011001010011000110110110111011110110000010110111001100010000110110001100010001010000111110100011011010101101010011010010011101001100000011010001011100111100010011001110101010100011100111100000111110000001100101110100011010110110100101011110000001110011010111001110010000011000010101110010111111111100110011111010100010101011000101001011000111011011101 0011101011010001110011111111100001100011000001010001101111111110001010001010000100010000111000100100110001111001100100100101101111001101111101111001101110001111000111011011000111100001010001111100110000011001011010011111001000110001100001110101000100011101010100000000100000010001000001101010000111001011010111000000001001000100001010001011011111110011011001000011001101011001010000001010000001100001 1111110010110101111000100110000111010011010100100110001001010101111010111000100000100110011000110011010011010110011111001010100101101011100011011111110000000101101001110011101010110111001100110011010000110001011101010100001100101101011111010101101111110101000000111101001100101010011111101011010110011001011110011010001010011001101011011101101111110001111101011111110111010111100011010001100011101111 0010110010011011110011010000110111010001100110001001011100001000101011100010000100101110111010100111001110101110000101100001001100000110101100100111100101010111000110100000000101110011110100101001110110000111001000001000000110100111001001011000010011110101000111111110101011011110000010001110010011011100010111110100001100011101100111011001000000110011111110110001011011001100010010000011001001010111 0111000101101101110111011101101010110001100010100111110010110111111010011010010000010110010001000001001111101110011111111101111010110001111011100101000100101000110100100000011010100110100000100010111001110001100100100001010101100011100000101001101101101010110001001011000001110011101101010110111001110010001000001010001110111000000010010111100100100011100101100011101010100111011001010001100111010111 1111100101101101100101011001101000001011000100111011000000010111010100001111100001100011110000010100101010110000010010000011110001001110001000010111101010000010001011001001011011000110010100101010101011011100001001110010000011110101001111100011100101001101010100110101001101110000111000110001000001111011110011111010100010110100010110100101011110000111101001101001110101011101000111111010001111000011 1101011000011110101110100110110010000010111000100011001010000100101000111011100001101111100000110101010010001011111100110010111100111010100110010100100100101110010111100100100101010011100001101100011011101100010111001010001101111011100110010010001111001010101110111010001111100011010110001000101110000100110000110100000111011100111001111010110111111100111000000000010000011011000000100001011101111100 1110000101111001101100110110111110001101101000001100100101100110000111100010001101010010001011101010000000111010110000101010100101111101011000100001001100011111101111010100010010101010111110011100100101010001000011001100101111111001000000001110111001110010110110101011101001110001101101001100000111011110000100001010110010101001011000100001000001010101100110011011100111111111010100000001101101111110 1100111111100110010000111011110110100100110110100011101001001110011110110101000000001101011011011100101101010111110000011100101111011010100000110111111100110011000000111010110110000100011101011000010100010110111101010010010010000101000111111110001011000101111010101100001100101011110001011001100101011000001010001011011001010100011101010100100001001011010101001110101000001010011010101001010000110100 1010010010111100010100111001001001110001110010100110010100000111110010001011010110011010001110000011010101001001100011101011000101101010001000100101101110101011101011001101001000100001001011110111000000010111110100111110110010011111101111100010111010111001011110001010000111101001100110000110111100010100110101100100101001111110101101011100011010011000100111011000000001011100101100110000000001110010 1000110111010100101111101100000111100001100001100000001011001010110111011111101101111011000111110111011010100010100110011111010010001010110000110110010110011101010110010111110100011110100001111100011000100111111101000101100011101101110111011001001110111110000110100001001101010100110111000010000100101011011000001101010100110001100010100000110001010011001101111000001000111010110100101010000110010100 0010100110001111001100000001001011000111111000101010100111010111100000110100011010011010100001001110000011111000000110011011100100100001001110000001010001100111000111001011111100010111001010000011010011101110100011101101101000100000100111011110101110011101111011100010011011011011000011011100101110101100010000110011101100101110011100100111101000101101111001001001000100100110101011000010101010000010 1110010000010100010111000001000010001000100000001001000011011011100101000010011101000011100011001010110100010110011101111110100011001100000011100010011001000000011010100101100110111111000001110010111000011111111110000100001111101010000101000110000000111011110000101011110000101010001010101111010010011101001011111100000100110100001010100001111101001101010110000111111001010010100010100010100111010011 1110010111100001100000010001100000011001000011100111100110111010111000101101100001010100110000100000011010111001000011001111000011110100001100010100100010011010100111110110100000101010111000010110001010001100011111000000001001011111001101001010100111011000001110000100010100101110111101111101010010111100101011110100001011000110101011100110111110000110010010110000111110010100100000110111110000110101 1011101000000000100000011011110000000111110110001101101101001001010000010000101011010111011011010100001100110101001001011011111011100010110011101000011000101001101000101010011001010011110001010110011001010110100000001101100000100010001101011000100110010100010110000011110000001011101000101011101101000111011110101100110100000001010010101011101111000010011101100010100101111000011101101100111010111100 1011110111100111011011000110110001010101111111001100100000100110001110111101011101111011000000010000011000111100111110110010101011111011001101011000100101011000101101011111111011100100101110010010110110110110011101001100111111011011011011010010010011000001010001110000010001001010111111110100110011101101110010000111101010100001001010011100010100001010110111001011110000001010110011101001001000110110 0001001010101011001000011101110000000010001001001000111101110110000001010000101110010001111110010000001101110110001001110001000001111100000010100101111100101100100000001110010011000000111111111111101010011101001010010111110110010100100100111111101001100111000001001010000100101100111010100100110101101010100111101111111101001000000001110000001001000011001011000100100001001101010000101111000110110101 1111101010101010011111110001110010011111110000001000000101101000001010000100110001100111001001010011111111101001010001001010101011101101001111111011111110100100011010000111001101011101101001010011001000101010000011111010110101110111010001110011011010000010001001001001001001111000010000010010101000011010110101101011100100010011110000000111000100111000011100101000111101011100011000011110111001110100 0101111100111111000010110001100001110010101001110111000100111011000100111011100100100001100110110101100011011010111000111110100111111011010010001111001011000001111000110010001011110011111101000011000010100111100011110010100111111110000111000111111000010101100110111000010010100101101001000011000011000010100100100110100000100001001110101101011001001110111101101001011010111010110010010101111001010000 0100110111100110101100001101001000001101011010000101110000000001001111111100100000110001001001110001000001101001111011011111010111110101000101010100011100000100110011000001101110011101001101110101100000011101110110001110010111001011000110100101111011100001110100101011100011100101100110111000001101010000101100011001111100110001001000010111000110011101011011101011000000101100101000111110011011001101 0011100010000001000001111001000011011000111010111110011100011100011100011110011010000011011100110111011011111001001110110100101011011001000111011010110100011100000100000001001010010110101011010001011000110111100001110101100110100100000010101110011001010000000011011001110100110100000010111010101001001001111000001000011011111111101110011110101001011110101000110000100111100001001011100011001101000110 0101011000010001000100110110010111111000100011100011101011011011010101100100101101011010010001000010110101011100111101010101110100000011011000011110011010000000001101100000011110110101011010111001100101011110011110111101111001001011010011001000101110100011100011001000110010011000110110101011010001001111001110110100111001010000010110110010000001101001000100110110111001110010100101001101000010100101 0101011111000101010011010011010110101111111010001100110111111001101011001011000100100100111011010100010111111111001110000110110100011010111110101101011101100010110111000011010010101010010100001111000101001100010010101000111011111001010011111110001011101010001101011011010100101001001111000001001000000100001101110111001001100011100110001001101110010010000000010011101000110011001011100011101101000010 1110010000110111100111101000111100010011111001011011000100000101111101000001011001001000101011101110100001101010100110000011100000000010000111100101100011111000011111001000100111101111100011011100100000100011001100001101101011111000110010101010011000010010010000101010101111000001010110001110110001111001111001010000101111010110101001110111001101001111000110100110110000100011011111111001010000111010 0100100101101000110000110100001010001110101100010000100111111000001001111101111000110011010111000110111001011110111001110010000100010110100110011100101010011111001010000100100110001010110001000010100001110010000101001110101000001010011001010111111101001010001100000010101111100100100010001001011111111111101011110010111101111011110000010011100110100011100011100010001111100101100011110000010000110110 0001111100111001010110110001011101011001111110011110111000000101000011001010111001101101111100001111111011111010011000001101000000101000011011111100101110010011111001111100000111010101000000101001000110111110101010011010111000000011001101011011110001111110010101100110001011110001001001101001011111010000111010101010011111010011010001101100011001111000001111110111111100011011101111100110000100010111 1111101110101010010010011011111101000000010001011101110100010001101101110000111000110010110001010111010100001011110011100001111100001001010110001100001001000101010010011011111100011000111110010010111111010011000111100110000110110110111010011101010101011110111110111111010100011110000010010100001110100010100110111011000101000011101110010100110101011111010100001111100110010110010100101000101110110111
cTrader Algo

【cAlgo】サインツールを作る【SampleCode】

5/1/2021

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

サインツールを手軽に作りたい

サインツールってあるじゃないですか。こんな感じで売買タイミングを示してくれるインジケーター

もちろんサイン通りに機械的にエントリーするなんてもってのほかですが、決められたルールでサインが出たときだけエントリーするかどうか検討する、みたいな使い方をしている人は多いと思います。

今回はcTraderでこんなのを作ってみましょうというお話です。

 

単純なサインの出し方

例えば、終値が20期間MAを超えたら矢印でサイン出したいとしましょう。こんな感じかな、と。

SimpleMovingAverage _sma;
protected override void Initialize() {
    _sma = Indicators.SimpleMovingAverage(Bars.ClosePrices, 20);
}
public override void Calculate(int index) {
    if (Bars.ClosePrices[index] > _sma.Result[index]) {
        Chart.DrawIcon("buy_sign", ChartIconType.UpArrow, Bars.OpenTimes[index], Bars.ClosePrices[index], Color.White);
    }
}

ただ条件判定して価格部分にChart.DrawIconでアイコン描いただけです。

でもこれだと少し問題があります。このあと、値が戻ってMAを下回ってもサインが残ってしまうのです。

おそらくこの類のサインであれば本当に知りたいのは「バー更新時に前の足の終値がMAを上回ったか」だと思います。

であれば、バー更新時だけ条件判定しましょうか。

SimpleMovingAverage _sma;
DateTime _lastTime;
protected override void Initialize() {
    _sma = Indicators.SimpleMovingAverage(Bars.ClosePrices, 20);
    Bars.Tick += _=> {
        if(_lastTime != Bars.LastBar.OpenTime) {
            OnBar();
            _lastTime = Bars.LastBar.OpenTime;
        }
    };
}
private void OnBar() {
    var index = Bars.Count - 2;
    if (Bars.ClosePrices[index] > _sma.Result[index]) {
        Chart.DrawIcon("buy_sign", ChartIconType.UpArrow, Bars.OpenTimes[index], Bars.ClosePrices[index], Color.White);
    }
}

IndicatorにOnBarメソッドはないので、自分で用意してあげる必要があります。(BarOpendイベントやIsBarOpenみたいなプロパティはあてにならないので非推奨)

とりあえずこれで更新時だけサイン判定ができるようになりました。

しかし、これだとリアルタイムでの判定はできません。実際はリアルタイムで条件満たしたら未確定でも一旦表示してほしい、ということも多いでしょう。

ついでにいうと、これだけだと過去のサインは表示されません。表示させたければ、Calculateに別にロジック書くか、過去分判定用処理をどこかで別にする必要があります。

 

いろいろ考えると結構面倒

ただサイン出すだけのツールとは言え、作ってるといろいろ出てきて結構大変そうですよね。毎回サインツール作るたびにこんな共通ロジック部分に時間かけるのもばからしいです。

というわけで、これらの要望を簡単に満たすべく、サインインジケーターのテンプレートとなるIndicatorを作成しました。

これを使えば面倒なことを考えずとも条件判定ロジックのコードを書くだけで、サインインジケーターが作成できるようになります。

 

SignToolsTemplete

主な機能

・サインはリアルタイムで表示されます。未確定のバーでは出たり消えたり繰り返します。

・サインが出たら音声とチャートに色付けてアラートを出すことができます。(アラートの色はチャートがアクティブな状態で何かキー押せば消えます。)

アラートを出すタイミングも指定できます。「その足で最初に条件満たした時点」か「毎回条件満たす度」か「サイン確定時 (足更新時) 」かのいずれかで指定します。

・検証用に過去チャートでサインが出てる場所にボタン一つでジャンプできます。(冒頭画像の右下のボタン)

 

ダウンロード

こちらからどうぞ。サンプルとして2本のMAのゴールデンクロス、デッドクロスでサインを出すツールになってます。

Indicatorクラスの中身を自由に書き換えて、お好きなサインツールを作成してください。

 

使い方

ダウンロードしたサンプルを見ればなんとなくわかるかもしれませんが、一応解説します。

仕組みとしてはSignIndicatorクラスにサイン表示やアラートを丸投げしてるだけです。作成者がやることは判定用のメソッドを作って、SignIndicatorオブジェクトに登録するだけ

 

①判定用メソッドを作成

まずはどんなときにサインを出すかの判定メソッドを作成します。このメソッドで受け取るindexはCalculateのindexと同様のバーインデックスです。

ダウンロードしたサンプルをそのまま使うのであればBuyOrSellメソッドの中身を消して、ここに判定ロジックを書いてください。

//-------------------------------------------------------------------
//  サイン判定メソッドはこんな感じで用意
//     必ずindexを受け取ってTradeTypeかnullを返す形にする
public TradeType? BuyOrSell(int index) {

    // --- ここで条件判定を行い、買いサイン出すならTradeType.Buy、売りサイン出すならTradeType.Sell、サインなしならnullを返す。
    if (index < 1) return null;
    if (LongMA[index - 1] < ShortMA[index - 1] && LongMA[index] > ShortMA[index]) {
        return TradeType.Sell;
    } else if (LongMA[index - 1] > ShortMA[index - 1] && LongMA[index] < ShortMA[index]) {
        return TradeType.Buy;
    } else {
        return null;
    }
}

自分で作る場合は返り値と引数の型さえ同じメソッドであれば名前は何でも構いません。

買いサインを出したいとこで、TradeType.Buyを、売りサインを出したいところでTradetype.Sellを、条件合わないとこではnullを返すようにします。

 

②Initialize内でオブジェクトを作成し、各種設定

Initialize内でSignIndicatorオブジェクトを作成します。コンストラクタにはthis(Indicator本体)と、①で作成した判定用メソッド名を渡します。これだけでサインツール完成です。メソッド名を渡すときは末尾に( )を付けないようご注意ください。

以下はすべてInitializeメソッド内に記述します。

// --- サインインジオブジェクト設定
var sign = new SignIndicator(this, BuyOrSell);

設定は特になにもしなくても動きますが、色やアイコンを変えたい場合はプロパティで変更可能です。

// --- 色やアイコン変えたければ変える
sign.BuyColor = Color.Blue;
sign.SellColor = Color.Pink;
sign.BuyIcon = ChartIconType.UpTriangle;
sign.SellIcon = ChartIconType.DownTriangle;

また、デフォルトではアラートは作動しませんので、サイン出た時に音声ならしたいならSoundFileにファイル名を、チャート色変えるならAlertColorに色を設定してください。音声はNotificationsプロパティのPlaySoundでここで指定されたファイルをそのまま呼び出します。

// --- 画面色替えアラート。色を設定すると有効化
sign.AlertColor = Color.Yellow;

// --- 音声アラート。ファイル名を設定すると有効化。フルパス指定の方が確実。
sign.SoundFile = "C:\\Windows\\Media\\Alarm01.wav";

// --- アラートタイミングを変更。デフォルトはUpdate(バー更新後のサイン確定時のみアラート)
sign.WhenAlert = WhenAlert.FirstAndUpdate;

アラートタイミングはデフォルトは「確定時 (足更新時) 」です。タイミングを変えたい場合はWhenAlertプロパティを変更してください。

 

その他

サイン表示だけであればCalculateメソッドは使用しませんが、サンプルではサインのタイミング確認のため、サイン判定に使用するMAを表示させています。この辺りはツールに応じて自由にしてください。

また、サインをトレード検証に使うなら、右下に出現する次のサイン、前のサインにチャートをスクロールするボタンが便利ですので是非ご活用ください。(不要の場合はコンストラクタの3つ目の引数にfalseを指定すれば消えます。)

 

SignIndicatorクラス詳細

細かい設定したい人用に。

プロパティ
(ChartIconType) BuyIcon { get; set; }

買いサインのアイコンを設定します。

(ChartIconType) SellIcon { get; set; }

売りサインのアイコンを設定します。

(Color) BuyColor { get; set; }

買いサインの色を設定します。

(Color) SellColor { get; set; }

売りサインの色を設定します。

(double) DrawMargin { get; set; }

サインの描画Y位置のマージンを設定します。買いサインはローソク足の最安値の下、売りサインはローソク足の最高値の上に表示されますが、その時価格からどのくらい空けて表示するか設定します。

(int) JumpMargin { get; set; }

◀▶ボタン押したときにサインの右側に何本分のローソク足を表示させるか設定します。

(WhenAlert) WhenAlert { get; set; }

アラートを出すタイミングを設定します。デフォルトはUpdate(バー更新後確定時のみ)。設定できるのはFirstTime(最初に条件満たしたとき)、FirstAndUpdate(最初に条件満たしたとき+確定時)、EveryTime(条件満たす度毎回)のいずれかです。

(string) SoundFile {get; set;}

アラートに音声を使用する場合、音声ファイル名を指定します。フルパス指定推奨ファイル名のみの場合、C:¥Windows¥Mediaフォルダ内のwavファイルを探します

(Color) AlertColor {get; set;}

アラート時にチャート色を変える場合の色を設定します。

(WrapPanel) ButtonPanel

ボタンを表示しているパネルを取得します。ボタン位置を変更したいときなどに。

 

メソッド

パブリックメソッドはありません。コンストラクタが一つあるのみです。

SignIndicator(Algo algo, Func<int , TradeType?> judgeMethod, [bool showButton])

1つ目の引数はIndicator本体を渡します。Algo型を取るため、cBotのRobotクラスでも使えます

2つ目の引数はサイン条件判定用メソッドです。indexを受け取ってTradeTypeかnullを返すメソッドなら何でも構いません。

3つ目の引数はジャンプボタンを使用するかどうかのオプションです。省略するとtrueになります。使用しない場合はfalseを渡してください。


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

新しいコメント

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

cTrader's Life

© 2026 ajinori